實驗說明
這裏說明的數據包僞造只是僞造數據包發送的源地址。網絡上有一些有人說可以對數據包內容的僞造(修改)和轉發,不過目前還沒找到這一點是如何完成的,甚至是在官方提供的文檔上也沒有看到這一類操作的說明。
版權說明
著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
本文作者:Q-WHai
發表日期: 2016年4月20日
本文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/51198116
來源:CSDN
更多內容:分類 >> 黑客的隱形衣
目錄
實驗環境
- 兩臺 CentOS6.5 虛擬主機
- Python 2.6.6
- 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 地址過程的再現。這裏再做一個在網絡通信的過程中的嗅探與僞造。
這裏的實驗部署如下:
- 一臺運行 UDP 接收端 python 程序的主機
- 一臺運行 UDP 發送端 python 程序的主機
- 在發送端再運行一個 Scapy Sniff 程序
- 在發送端向接收端發送一個隨機數據包
- 嗅探程序在嗅探的數據中篩選出合適的目標地址和端口
- 再由僞造程序向目標地址發送僞造的數據
相關部分的代碼如下:
對 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
當運行嗅探僞造程序之後,這裏表明截獲了兩條數據。而且,程序已經把僞造的數據發送出去了。
下面的信息是在接收端觀察發現的,這裏表明接收端程序已經接收到嗅探僞造程序發送的僞造數據了。
結論與總結
通過上面的實驗以及實驗說明,我們可以得出如下幾條結論:
- 使用基於 TCP 協議的通信不可以對源 IP 地址進行僞造
- 使用基於 UDP 協議的通信可以對源 IP 地址進行僞造
TCP 不能僞造源 IP 地址是因爲 TCP 協議中的三次握手的存在,如果源 IP 地址被修改,那麼三次握手將無法達成。而 UDP 則不同,UDP 中不存在三次握手,那麼發送端就只要發送數據即可,而接收端只要接收數據即可。所以,在 TCP 中不能對源 IP 地址進行僞造,而 UDP 中則可以。
徵集
如果你也需要使用ProcessOn這款在線繪圖工具,可以使用如下邀請鏈接進行註冊:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d