这里说明的数据包伪造只是伪造数据包发送的源地址。网络上有一些有人说可以对数据包内容的伪造(修改)和转发,不过目前还没找到这一点是如何完成的,甚至是在官方提供的文档上也没有看到这一类操作的说明。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
本文作者:Coding-Naga
发表日期: 2016年4月20日
本文链接:http://blog.csdn.net/lemon_tree12138/article/details/51198116
来源:CSDN
更多内容:分类 >> 黑客的隐形衣
(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 协议可以正常捕获网络数据包。
(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 通信时的三次握手。当服务器无法与客户端之间进行三次握手操作时,通信将不能继续进行下去。
(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 协议的通信正常。接收端可以接收到发送端发送的数据。
(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 中则可以。