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的使用套路了。

Scapy的使用的更多相关文章

  1. python脚本执行Scapy出现IPv6警告WARNING解决办法

    安装完scapy,写了脚本执行后执行: WARNING: No route found for IPv6 destination :: (no default route?) 原因是用 from sc ...

  2. Windows下使用scapy+python2.7实现对pcap文件的读写操作

    scapy在linux环境中对pcap文件进行操作非常方便,但在windows下,特别是在python2.7环境下却会碰到各种各样的依赖包无法使用的问题,最明显的可能就属dnet和pcap的pytho ...

  3. 使用它tshark分析pcap的例子以及scapy下载地址

    转一篇cisco工作人员使用tshark分析pcap的文章,以及scapy的下载地址 http://blogs.cisco.com/security/finding-a-needle-in-a-pca ...

  4. 安装scapy遇到的问题

    1. Mac平台 在mac上安装scapy可以说是困难重重,一来因为scapy实在有些小众和老旧,再加上安装说明文档都是python2.5 也没有详细说明一些安装问题. 折腾了大概三个小时之后终于解决 ...

  5. scapy 安装及简单测试

    关于scapy Scapy的是一个强大的交互式数据包处理程序(使用python编写).它能够伪造或者解码大量的网络协议数据包,能够发送.捕捉.匹配请求和回复包等等.它可以很容易地处理一些典型操作,比如 ...

  6. Python模块(scapy)

    scapy scapy相当于linux的tcpdump的功能

  7. 小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy

    四层发现 四层发现的目的是扫描出可能存活的IP地址,四层发现虽然涉及端口扫描,但是并不对端口的状态进行精确判断,其本质是利用四层协议的一些通信来识别主机ip是否存在. 四层发现的优点: 1.可路由且结 ...

  8. 小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy

    主动信息收集 被动信息收集可能不准确,可以用主动信息收集验证   特点:直接与目标系统交互通信,无法避免留下访问痕迹 解决方法:1.使用受控的第三方电脑进行探测,使用代理 (做好被封杀的准备)   2 ...

  9. 小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping

    三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议 ...

  10. scapy流量嗅探简单使用

    官方文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html 参考链接:http://blog.csdn.net/Jeanphorn/ar ...

随机推荐

  1. PyCharm设置Python版本

    PyCharm默认会使用虚拟的Python解释器,即使没有安装也能够运行Python代码,但有强迫症的程序员一定不能忍受Project中存在这么多的文件目录 设置Python版本 File->S ...

  2. C++整形转化成string类型---路径拼接在批处理程序中的应用

    上"酸菜" // show_dateset_image.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include ...

  3. PHP数组转为树的算法

    一.使用引用 function listToTree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0) { $tree = ...

  4. mvc:message-converters简单介绍

    说说@ResponseBody注解,很明显这个注解就是将方法的返回值作为reponse的body部分.我们进一步分析下这个过程涉及到的内容,首先就是方法返回的类型,可以是字节数组.字符串.对象引用等, ...

  5. 查看linux服务器的配置

    https://zhidao.baidu.com/question/489376921.html 1.查看逻辑CPU个数: #cat /proc/cpuinfo |grep "process ...

  6. Winform 基础二 最小化 最大化 关闭 点击任务栏隐藏显示 点击鼠标左键移动窗体

    一 最大化 二 最小化 三 关闭 四 点击任务栏隐藏显示 五 点击鼠标左键移动窗体 六 阴影效果鼠标左键移动窗口 #region UI设置 最大化.最小化.关闭.鼠标移动窗口.点击任务栏切换窗口 th ...

  7. C++基类的析构函数定义为虚函数的原因

    1:每个析构函数只会清理自己的成员(成员函数前没有virtual).2:可能是基类的指针指向派生类的对象,当析构一个指向派生类的成员的基类指针,这时程序不知道这么办,可能会造成内存的泄露,因此此时基类 ...

  8. SkylineGlobe6.5遍历信息树节点方法

    //------------------- //searchGeometries function searchGeometries2(parentNode, callbackFunc) { SGWo ...

  9. 分析网络流量Capsa笔记

    Capsa是一款网络分析仪,允许您监控网络流量,解决网络问题并分析数据包.通过提供生动的图表,通过设计良好的GUI提供丰富的统计信息和实时警报,Capsa可让IT管理员实时识别,诊断和解决有线和无线网 ...

  10. .Net Core 系列之一 hello world

    OS: win10 企业版 中文环境 .Net Core: 切记不要装64版本,否则可能会出现vs2017无法生成.net core 2.0的项目 dotnet-sdk-2.0.0-win-x86.e ...