Scapy 伪造网络数据包

实验说明

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


版权说明

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
本文作者:Coding-Naga
发表日期: 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 中则可以。


原文地址:https://www.cnblogs.com/fengju/p/6335994.html