这里说明的数据包伪造只是伪造数据包发送的源地址。网络上有一些有人说可以对数据包内容的伪造(修改)和转发,不过目前还没找到这一点是如何完成的,甚至是在官方提供的文档上也没有看到这一类操作的说明。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
本文作者:Q-WHai
发表日期: 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
>>> receive[0]
>>>
>>> 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
>>> receive = sniff(filter="tcp and host 172.16.2.135")
>>> receive
通过实验,如果源地址被伪造,基于 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
>>> 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
监听主机 172.16.2.134
>>> receive = sniff(filter="udp and host 172.16.2.134")
>>> receive
>>> receive[0].load
'Hello Scapy'
通过实验,基于 UDP 协议的网络通信中。即使伪造了源 IP 地址,接收端仍然可以接收到伪造之后的数据包。
在上面的实验中,只是对伪造源 IP 地址过程的再现。这里再做一个在网络通信的过程中的嗅探与伪造。
这里的实验部署如下:
相关部分的代码如下:
对 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 地址是因为 TCP 协议中的三次握手的存在,如果源 IP 地址被修改,那么三次握手将无法达成。而 UDP 则不同,UDP 中不存在三次握手,那么发送端就只要发送数据即可,而接收端只要接收数据即可。所以,在 TCP 中不能对源 IP 地址进行伪造,而 UDP 中则可以。
如果你也需要使用ProcessOn这款在线绘图工具,可以使用如下邀请链接进行注册:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d