基于ARP缓存投毒获取教务处网站密码

本文章仅供交流学习使用,本文章实验用的主机也已经经由当事人授权,请勿用于其它用途,否则后果自负。

(真不想罗嗦这一句):-)

第一次写技术性博客,肯定会有一些问题,大家将就着看吧>_<

  周五晚上在图书馆讨论事情的的时候发现:教务处网站的网站使用http协议,post表单是明文传送的。截取表单后发现一个类似IPT_LOGINUSERNAME=×××××××××(×代表帐号)&IPT_LOGINPASSWORD=***********(我的密码)的字符串。于是想着如果能抓包此HTTP post请求,就能筛选出密码。

  于是说干就干,在讨论完后买来一贯啤酒,两包薯片,拿着电脑来到好基友宿舍,开始用基友的WiFi实验了起来。一开始想要用无线混杂模式抓包,但是由于基友用的路由器是三层设备,混杂模式无法抓包,于是开始使用ARP缓存投毒。

  先说一说我对ARP缓存投毒的一点理解:二层以太网的设备是通过MAC识别目标传输IP数据包,因此IP地址与MAC地址存在对应关系,而ARP就是一种对应关系的协议。ARP工作的机制:如果局域网的一台主机想要到达另一台设备,它首先发送数据广播包给所有局域网下的设备,包含目标设备的IP地址,以及自身的mac。目标主机接收到之后会发送一个包含自身IP和mac的ARP包应答。局域网中的网关和主机都存在ARP表,此表中的一行如果一段时间没有使用,就会被清除。而主机接收到ARP包之后无论是不是目标设备发来的都会将对应关系写入ARP表。因此ARP投毒就是不断向网关和被攻击主机发送ARP应答或请求包,使其ARP表中对应的mac变为攻击机的。

  在查阅和参考了相关书籍和大牛的博客之后,写了一个python脚本,实现arp缓存投毒,图片如下(有详细备注):

 

 

 

几处代码的备注:

usage="Usage %prog [-i interface] [-t target] host"
        parser=OptionParser(usage)
        parser.add_option('-i',dest='interface',help='Specify the interface to use')
        parser.add_option('-t',dest='target',help='Specify a particular host to APR posion.(None to send broadcast packet)')
        parser.add_option('-m',dest='mode',default='req',help='Poisoning mode:requests(req) or replies(rep) [default:%default]')
        parser.add_option('-s',action='store_true',dest='summary',default=False,help='Show packet summary and ask for confirmation before poisoning')
        (options,args)=parser.parse_args()

此处使用optionparser包,usage为使用示范,首先创建optionparser对象,使用optionparser.OptionParser方法,参数为usage。使用add_option()方法,-i',dest='interface'表示会将命令行参数 -i 后的内容存储在interface中。帮助文档为help之后的,当属如-h参数时会输出帮助文档。下面的同理。 可以看出parser是一个类似字典对象的对象。然后调用parser_args()方法解析,返回一个字典,一个列表。字典key为dest,值为命令行参数的内容。args为列表,内容是除了字典内容以外的命令行内容。

pkt=Ether(src = mac.dst='ff:ff:ff:ff:ff:ff:)/ARP(hwsrc=mac,psrc=args[0],pdst=args[0])

此为本脚本的关键,ARP包的封装。

首先一个以太网数据包,src为本机mac,pdst为目标主机的mac,此处是广播包,非广播包使用getmacbyip(options.target)转化参数的ip为mac。后面为ARP包。hwscr为源mac,pscr为源ip也就是args·0「

hwdst为目标主机的mac,pdst为目标主机的ip,广播包的此两项不填。

封装好包以后,使用sendp()发送,传入包,inter代表TCP/IP第二层,iface为你的网卡接口。通过终端输入iwconfig查看。

 

在使用时跟命令行参数 -i (此处为你的网卡) -t(攻击目标ip) -m rep (此处为网关地址)对目标主机进行投毒。

然后另一个终端中跟参数 -i (此处为你的网卡) -t(此处为网关地址) -m rep (攻击目标ip)对网卡进行投毒。

:-)

  原谅我忘记截图了,第一次没经验.以后补上

这时候用基友的电脑查看acr表,发现欺骗成功,网关的ip对应的mac为我的电脑的。然而此时用基友的电脑打开百度发现断网了。捣鼓了一会发现时本机未开启ip转发。也就是说基友电脑的数据包会发到我的电脑上,但是不会传出去。与使用sysctl net.ipv4.ipforward=1开启ip转发。此时会把基友的电脑的数据包发给网关,然后把从网关的数据包发给基友。

  ok,万事具备,之前东风。第二个脚本:使用scapy模块的sniff函数将数据包传给解析函数,然后在解析函数中通过python的正则表达式模块re筛选帐号密码。代码图如下:

关于正则表达式的使用请自行百度,现在是下着雨的半夜,只想睡,懒得码字了,原谅我:-)

ok,在通过欺骗手段实现攻击之后,运行此脚本,会一直等待,如果你在此时登录教务出,帐号和密码就会被盗取。之后有用手机连上网登了一遍,没毛病。

关于防御的话:我的想法是写一个脚本,记下网关的mac地址,如果此地址发生变化,就说明你受到攻击。

  当然,这个想法太弱了,因为你出门以后怎么知道你连上的wifi路由器的mac?具体的防御措施可能得到暑假去实验了。写完这第一篇就得进入半个月的低产了(虽然本来就不高产):-),全心全意投入期末考试复习。但我保证暑假的时候绝对一天1~2两篇,包括对网站后端开发和计算机系统原理的相关知识学习总结和实验的文章。

  所以以后出门不要随便连wifi,脸上以后也不要登录什么帐号。就连私密的图片也不要看(指网上的),用一个小工具driftnet就能看到基友打开的图片。

  >_ 就到这里了,有什么问题欢迎讨论。(肯定有写不恰当的地方)

 

!!!修正一个地方Ether()构造arp包的第一个参数是"src "

posted @ 2017-06-25 00:20  GHTHYS  阅读(1211)  评论(0编辑  收藏  举报