Scapy 僞造網絡數據包

實驗說明

這裏說明的數據包僞造只是僞造數據包發送的源地址。網絡上有一些有人說可以對數據包內容的僞造(修改)和轉發,不過目前還沒找到這一點是如何完成的,甚至是在官方提供的文檔上也沒有看到這一類操作的說明。


版權說明

著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
本文作者:Q-WHai
發表日期: 2016年4月20日
本文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/51198116
來源:CSDN
更多內容:分類 >> 黑客的隱形衣


目錄

實驗環境

  1. 兩臺 CentOS6.5 虛擬主機
  2. Python 2.6.6
  3. Scapy 2.3.1-dev

實驗過程

基於 TCP 協議正常抓包

(1) 發送端

>>> data = "Hello Scapy"
>>> pkt = IP(src='172.16.2.135', dst='172.16.2.91')/TCP(sport=12345, dport=5555)/data
>>> send(pkt, inter=1, count=1)

(2) 接收端

>>> receive = sniff(filter="tcp and host 172.16.2.135")
>>> receive
<Sniffed: TCP:2 UDP:0 ICMP:0 Other:0>
>>> receive[0]
<Ether  dst=08:00:27:24:b8:a3 src=08:00:27:e2:f7:db type=0x800 |<IP  version=4L ihl=5L tos=0x0 len=51 id=1 flags= frag=0L ttl=64 proto=tcp chksum=0x1dc2 src=172.16.2.135 dst=172.16.2.91 options=[] |<TCP  sport=italk dport=personal_agent seq=0 ack=0 dataofs=5L reserved=0L flags=S window=8192 chksum=0x9b22 urgptr=0 options=[] |<Raw  load='Hello Scapy' |>>>>
>>> receive[0].load
'Hello Scapy'

通過實驗,在正常情況下,基於 TCP 協議可以正常捕獲網絡數據包。

基於 TCP 僞造數據包

(1) 發送端

>>> data = "Hello Scapy"
>>> pkt = IP(src='172.16.2.134', dst='172.16.2.91')/TCP(sport=12345, dport=5555)/data
>>> send(pkt, inter=1, count=1)

(2) 接收端
由於實驗中是修改了源地址進行僞造數據包,所以,這裏需要進行 2 次嗅探操作。如下:

>>> receive = sniff(filter="tcp and host 172.16.2.134")
>>> receive
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:0>
>>> receive = sniff(filter="tcp and host 172.16.2.135")
>>> receive
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:0>

通過實驗,如果源地址被僞造,基於 TCP 協議的通信將會被阻斷。原因就是 TCP 通信時的三次握手。當服務器無法與客戶端之間進行三次握手操作時,通信將不能繼續進行下去。

基於 UDP 協議正常抓包

(1) 發送端

>>> data = "Hello Scapy"
>>> pkt = IP(src='172.16.2.135', dst='172.16.2.91')/UDP(sport=12345, dport=5555)/data
>>> send(pkt, inter=1, count=1)

(2) 接收端

>>> receive = sniff(filter="udp and host 172.16.2.135")
>>> receive
<Sniffed: TCP:0 UDP:1 ICMP:0 Other:0>
>>> receive[0].load
'Hello Scapy'

通過實驗,基於 UDP 協議的通信正常。接收端可以接收到發送端發送的數據。

基於 UDP 協議僞造數據包

(1) 發送端

>>> data = "Hello Scapy"
>>> pkt = IP(src='172.16.2.134', dst='172.16.2.91')/UDP(sport=12345, dport=5555)/data
>>> send(pkt, inter=1, count=1)

這裏與正常情況下唯一的區別在於修改了源 IP 地址。

(2) 接收端
監聽主機 172.16.2.135

>>> receive = sniff(filter="udp and host 172.16.2.135")
>>> receive
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:0>

監聽主機 172.16.2.134

>>> receive = sniff(filter="udp and host 172.16.2.134")
>>> receive
<Sniffed: TCP:0 UDP:1 ICMP:0 Other:0>
>>> receive[0].load
'Hello Scapy'

通過實驗,基於 UDP 協議的網絡通信中。即使僞造了源 IP 地址,接收端仍然可以接收到僞造之後的數據包。

嗅探及僞造

在上面的實驗中,只是對僞造源 IP 地址過程的再現。這裏再做一個在網絡通信的過程中的嗅探與僞造。
這裏的實驗部署如下:

  1. 一臺運行 UDP 接收端 python 程序的主機
  2. 一臺運行 UDP 發送端 python 程序的主機
  3. 在發送端再運行一個 Scapy Sniff 程序
  4. 在發送端向接收端發送一個隨機數據包
  5. 嗅探程序在嗅探的數據中篩選出合適的目標地址和端口
  6. 再由僞造程序向目標地址發送僞造的數據

相關部分的代碼如下:
對 UDP 通信的嗅探腳本

# encoding=utf-8

from scapy.all import *

receive = sniff(filter="udp and host 172.16.2.135", count=100)
receive.show()

通過對 UDP 通信的嗅探,僞造數據包

# encoding=utf-8

from scapy.all import *
import utils
import os

os.system("python sniff_script.py >> sniff.log")

def forge(address, port):
    """ 通過嗅探到的數據,進行僞造數據 """
    forge_data = "This is forge data."
    pkt = IP(src='172.16.2.200', dst=address)/UDP(sport=12345, dport=port)/forge_data
    send(pkt, inter=1, count=3)
    pass

sniff_file = open("sniff.log", "rb")
for data in sniff_file.readlines():
    result = utils.match(data)
    if result is not None and result[0] != '172.16.2.135':
        print(result)
        forge(result[0], int(result[1]))
        pass
    pass

當運行嗅探僞造程序之後,這裏表明截獲了兩條數據。而且,程序已經把僞造的數據發送出去了。
這裏寫圖片描述

下面的信息是在接收端觀察發現的,這裏表明接收端程序已經接收到嗅探僞造程序發送的僞造數據了。
這裏寫圖片描述


結論與總結

通過上面的實驗以及實驗說明,我們可以得出如下幾條結論:

  1. 使用基於 TCP 協議的通信不可以對源 IP 地址進行僞造
  2. 使用基於 UDP 協議的通信可以對源 IP 地址進行僞造

TCP 不能僞造源 IP 地址是因爲 TCP 協議中的三次握手的存在,如果源 IP 地址被修改,那麼三次握手將無法達成。而 UDP 則不同,UDP 中不存在三次握手,那麼發送端就只要發送數據即可,而接收端只要接收數據即可。所以,在 TCP 中不能對源 IP 地址進行僞造,而 UDP 中則可以。


徵集

如果你也需要使用ProcessOn這款在線繪圖工具,可以使用如下邀請鏈接進行註冊:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章