zoukankan      html  css  js  c++  java
  • Scapy的使用

    0.前言

    最近现场测试项目时,突如其来需要伪造IGMP报文,骗取交换机相关组播流量,慌忙之下学习了Scapy的使用,以及相关快速学习的方法,在这里分享下。

    1.Scapy库安装

    github地址https://github.com/secdev/scapy

    安装过程:见官方文档

    笔者方案

    $ git clone https://github.com/secdev/scapy.git
    $ cd scapy
    $ sudo python setup.py install
    

    2.模拟发送报文

    理论上Scapy可以发送任意报文,但相对造轮子的工作较为辛苦,幸运的是,官方提供了现成的报文库,我们可以利用这些轮子轻松造出符合期待的报文。在选择想要发送的报文时,最好在scapy贡献库上看下相关字段及协议,否则会出现造好报文无法发送的情况下。


    下面以发送IGMP Membership Report 报文为例,分享下使用的心得。

    2.1 IGMPv3 Membership Report

    官方贡献库igmpv3.py

    我们在官方库里发现了有好几个类,比如:IGMPv3 、IGMPv3mq 、IGMPv3mr ,可是要怎么用呢?虽然了解了相关协议的构建,但是看了这些使用起来还是略吃力,比如我们要发送IGMPv3 Membership Report可能要用到IGMPv3gr 这个类,于是笔者跟着自己的理解以及网上的教程试了起来,发现还是没有成功发出去,一度怀疑人生。情急之下便将IGMPv3gr作为关键字在github进行搜索,看下有没有相关例子,结果老天还是可怜笨小孩,搜完后竟发现了新天地,下面贴个链接,大家可从链接发现大量的IGMPv3gr相关的例子,笔者对着github公开的代码示例进行了尝试,不过一会便成功了,这里感谢github这个优异的社区,下面贴下笔者模仿写的发送报文:

    from scapy.all import *
    from scapy.contrib.igmpv3 import IGMPv3,IGMPv3mq,IGMP,IGMPv3gr
    from scapy.contrib.igmpv3 import IGMPv3mr
    
    p_join = Ether(dst='01:00:5e:00:00:16', src='00:0c:29:c8:31:8a') / IP(src='192.168.204.139', dst='224.0.0.22', tos=0xc0) /IGMPv3() /IGMPv3mr(numgrp=1) /IGMPv3gr(rtype=4, maddr="239.1.1.1")
    p_join.show()
    sendp(p_join,iface='eth0')
    

    编写完毕,执行sudo python xxx.py,便可将报文发送出去,可通过wireshark或tcpdump验证报文是否发送。

    2.2 IGMPv2 Membershrp Report

    官方贡献库igmp.py

    根据以上方法,同样收到igmp的使用方法,下面贴下代码:

    from scapy.all import *
    from scapy.contrib.igmpv3 import IGMPv3,IGMPv3mq,IGMP,IGMPv3gr
    from scapy.contrib.igmpv3 import IGMPv3mr
    from scapy.contrib.igmp import IGMP
    import time
    import IPy
    
    testIpArr = ["238.1.3.21"]
    
    while True:
        for i in range(len(testIpArr)):
            ip = testIpArr[i]
            ipIpy = IPy.IP(ip);
            ipYan = ipIpy.strBin()[-23:];
            ipYan = '0000000100000000010111100' + ipYan
            mac = hex(int(ipYan, 2))[2:]
            if (len(hex(int(ipYan, 2))[2:]) < 12):
                for j in range(12 - len(hex(int(ipYan, 2))[2:])):
                    mac = '0' + mac
            mulMac = mac[0:2] + ':' + mac[2:4] + ':' + mac[4:6] + ':' + mac[6:8] + ':' + mac[8:10] + ':' + mac[10:12]
    
            print ip
            print mulMac
            p_join = Ether(dst=mulMac, src='a0:8c:fd:9e:2d:f1') / IP(src='10.0.0.123', dst=ip, ttl=1) /IGMP(type=0x16,gaddr=ip,mrcode=0x00)
            sendp(p_join,iface='eth0')
            print '----------------'
        time.sleep(5)
    

    其中IPy是有关代码IP地址的转换的库,大家可参照这篇博文:Python之实用的IP地址处理模块IPy。IGMPv2需要注意目的IP及目的Mac的对应关系,否则会出现报文虽发送了,却被交换器丢弃,从而无法骗取流量的情况,具体可以参考这篇博文:组播IP地址与组播MAC地址之间的换算方法

    结语

    笔者学习scapy的方法较为讨巧,对于初学者来说较为友好,不过相对考验github上scapy的资源,当然用多了渐渐也就能学会scapy的使用套路了。

  • 相关阅读:
    Atitit 编程语言编程方法的进化演进 sp  COP ,AOP ,SOP
    Atitit 2016年attilax事业成就表
    Atitit 知识管理的重要方法 数据来源,聚合,分类,备份,发布 搜索
    Atitit webservice发现机制 WS-Discovery标准的规范attilax总结
    Atitit 多元化战略 适合我们发展 的核心业务attilax总结
    Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结
    Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx
    Atitit zxing二维码qr码识别解析
    Atitit Data Matrix dm码的原理与特点
    Atitit 常用二维码对比(QR、PDF417、DM、汉信码 Aztec code maxicode
  • 原文地址:https://www.cnblogs.com/wpqwpq/p/9019516.html
Copyright © 2011-2022 走看看