序言
绵羊墙:一面展示板,将用户设置的不安全的网络用户名与密码公布在上。
这是我在硬土壳安全公司实习期间,与蔡一涵共同完成的一个项目。该项目未来可能应用于信息安全的演示上。在完成项目的过程中,我们得到了刘毅,虾米和花开这三位同事的大力帮助。这些帮助对此项目的完成至关重要,十分感谢。
该项目的代码已经上传至github:
效果图:
我对绵羊墙的理解
我在网上找到了一些资料,但大多不够具体到使我能对这一个项目有一个彻底的理解。在大量的探索和求助后,我的项目的构架大致如下:
绵羊墙的原理就是通过一个Wi-Fi接入点来诱使用户进行连接,当用户通过该Wi-Fi浏览网页的时候就可以读取用户明文传输的帐号密码等信息
通过SSL远程登录一个安装了类linux系统的路由器,在路由器上执行TCPDUMP,将所有的包保存下来
通过一个本地的分析器提取包中的帐号密码以及目标网站,并存入数据库中
通过一个webUI读取数据库中的帐号密码并展示(这只小羊真可爱!)
我对绵羊墙的实现
为了能够在路由器上执行TCPDUMP,我们选择了在路由器上安装一个openWRT系统。在这最开始的第一步我们就遇到了困难:这个路由器的容量并不足以在装上openWRT的系统之后再安装TCPDUMP。当我们考虑使用U盘外接来增大内存的时候,发现甚至无法容纳一个U盘的驱动。在之后随着瞎鼓捣我们似乎损坏了这个Wi-Fi的重启盘,于是我们失去了重新来过的机会。这里要感谢刘毅给我们提供了一个已经配置完毕的路由器。虽然我们可以无障碍的阅读英文,但是无中文文档还是使openwrt在国内的应用受到了限制,在未来的技术道路中培养对于英文网络的情报搜索能力非常重要。
在配置完路由器后我们需要一个脚本语言来常驻地完成“抓包-处理”流程。这里是我的项目的主逻辑:
import os
from analyzer import analyze
iterator = 1
while 1:
os.system("~/Downloads/sshpass-1.05/sshpass -p mypassword ssh myuser@myipaddress 'tcpdump -c 1000 -w - -s 0 port not 22' >> ~/code/py/wifi-sheep/data" + str(iterator) + “.cap")
print("get package " + str(iterator) + " from server")
analyze(iterator)
iterator += 1
为了能让抓包处理包同时处理我们以1000个包为界限进行分包,分包后分别命名以进行处理。但目前的逻辑还是串行处理的,在之后我会阅读一些多线程的资料进行多线程的处理。
python中的os模块中的system函数可以直接进行命令行的输入。我们这里用了一个sshpass的工具,可以通过命令行参数直接输入ssh的命令。这种做法实质上违反了ssh的原理,是很不安全的,brew的软件管理系统也拒绝了这个软件。在一个安全公司做这样不安全的事情,我很惭愧。这是因为我希望迅速地完成第一版的功能,这些缺陷可以在之后的版本中进行修改。
关于ssh可以看这个链接:
www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
我们通过ssh执行了一个tcpdump的命令,这个命令以1000个包为单位将数据包保存到本地的datax.cap
我们使用了pyshark这个包进行了数据的分析,这是一个基于wireshark包装的解析工具。我们用一些规则提取了帐号和密码,存到了数据库
我们采用了django框架开发了一个webUI来完成对数据的展示,虽然这部分很简单但是很重要,因为这个项目的目的是信息安全的展示。蔡一涵完成了前端展示的开发。
可以优化的内容
前面提到的,对抓包与分析的并行处理以及对ssh的不当使用
在迅速的开发中,几乎放弃了所有对性能的考量,之后的优化将会集中在性能上
下一篇的内容
如何完成对包的解析并且提取帐号密码