• 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 中则可以。


  • 相关阅读:
    Linux centos 安装php5.4和pthreads
    linux Nginx负载均衡
    linux 部署oracle 11g
    linux shell编程
    Linux 常 用 命 令
    python基础学习笔记的目录
    Python学习笔记之基础篇(-)python介绍与安装
    Python学习笔记之基础篇(二)python入门
    python 的logging 的配置,有这一篇就够了
    selenium+headless+proxy 的出错
  • 原文地址:https://www.cnblogs.com/fengju/p/6335994.html
Copyright © 2020-2023  润新知