您的位置:首页 > 理论基础 > 计算机网络

Scapy 伪造网络数据包

2016-04-20 10:02 357 查看

实验说明

这里说明的数据包伪造只是伪造数据包发送的源地址。网络上有一些有人说可以对数据包内容的伪造(修改)和转发,不过目前还没找到这一点是如何完成的,甚至是在官方提供的文档上也没有看到这一类操作的说明。

版权说明

著作权归作者所有。

商业转载请联系作者获得授权,非商业转载请注明出处。

本文作者:Coding-Naga

发表日期: 2016年4月20日

本文链接:http://blog.csdn.net/lemon_tree12138/article/details/51198116

来源:CSDN

更多内容:分类 >> 黑客的隐形衣

目录

实验说明

版权说明

目录

实验环境

实验过程
基于 TCP 协议正常抓包

基于 TCP 伪造数据包

基于 UDP 协议正常抓包

基于 UDP 协议伪造数据包

嗅探及伪造

结论与总结

实验环境

两台 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 地址过程的再现。这里再做一个在网络通信的过程中的嗅探与伪造。

这里的实验部署如下:

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 中则可以。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: