美文网首页路由器路由联盟
绵羊墙(Wi-Fi sheep)搭建其二

绵羊墙(Wi-Fi sheep)搭建其二

作者: Zzifan | 来源:发表于2017-01-18 15:52 被阅读0次

    本篇内容

    这篇文章会简单地描述如何使用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

    下一篇内容

    我是如何对这个项目进行优化的

    相关文章

      网友评论

        本文标题:绵羊墙(Wi-Fi sheep)搭建其二

        本文链接:https://www.haomeiwen.com/subject/zfqbbttx.html