本篇内容
这篇文章会简单地描述如何使用pyshark进行网络包的分析。
如何用pyshark包进行网络包的解析
- 为什么要用pyshark包:
使用tcpdump得到的包是二进制格式的,并且网络包每一层协议都有其结构,我们需要一个包分析工具将其层次化处理。 - 我们要用pyshark包得到什么:
目前阶段我们的目标只有http请求中明文提交的账号和密码。 - 我们如何得到:
明文提交的帐号和密码只会出现在解析结果的 "URLENCODED-FORM"层。我们用一些类似于“u”,“username”,“userid”的规则去匹配,如果得到了账号和密码,就回到HTTP层去获取其HOST。然后将其存入数据库,我们就得到了一只可爱的小绵羊了!
具体代码
代码清单一:
cap = pyshark.FileCapture(filename)
for pkt in cap:
if pkt.highest_layer == "URLENCODED-FORM":
layer = pkt[pkt.highest_layer]
layer_generator = layer._get_all_field_lines()
text = ""
for line in layer_generator:
text += line
上面这段代码中我们得到了一个包中的POST方法提交的表中内容的字符串格式。在开发过程中我发现pyshark并没有提供一个封装好的接口用于获取包中的内容。而他提供的用于获取field内容的get_field函数并不能满足要求。
代码清单二:
def get_field(self, name):
"""
Gets the XML field object of the given name.
"""
for field_name, field in self._all_fields.items():
if self._sanitize_field_name(name) == self._sanitize_field_name(field_name):
return field
def _get_all_field_lines(self):
"""
Returns all lines that represent the fields of the layer (both their names and values).
"""
for field in self._get_all_fields_with_alternates():
if field.hide:
continue
if field.showname:
field_repr = field.showname
elif field.show:
field_repr = field.show
else:
continue
yield '\t' + field_repr + os.linesep
这两个函数是由pyshark提供的函数。但很遗憾get_field()只返回第一个内容,因此我们需要自己通过调用其私有函数_get_all_field_lines()去获取其文本完成内容匹配,虽然这并不是一种很良好的做法。
代码清单三:
for usernamePat in userNamePatternList:
if usernamePat in text:
prePos = text.find(usernamePat)
username = text[text.find('=',prePos)+3:text.find('\n\t',prePos)-1]
break;
这段函数中我检查所有预定义的用户名样式有没有出现,如果出现我就用字符串提取将他们提取出来。之后就是将他们存入数据库中供webUI显示了。
完整的代码可以在github上看到:
Wi-Fi sheep
下一篇内容
我是如何对这个项目进行优化的
网友评论