您的位置:IT爆料网 > 互联网

数据包处理利器――Scapy基础知识

发布时间:2022-12-17 05:23:52  来源:互联网     背景:

什么 是scapy

Scapy是功能强大的交互式数据包处理程序。它能够伪造或解码各种协议的数据包,在线发送,捕获,匹配请求和响应等。它可以轻松处理大多数经典任务,例如扫描,跟踪路由,探测,单元测试,攻击或网络发现,它可以代替hping,arpspoof,arp-sk,arping,p0f甚至Nmap,tcpdump和tshark的某些部分。。它在其他工具无法处理的许多其他特定任务上也表现出色,例如发送无效帧,组合技术(VLAN跳变+ ARP缓存中毒,WEP加密通道上的VOIP解码等等)

安装scapy

直接pip安装即可,我使用的是python3

pip3 install scapy  scapy基本使用

输入scapy回车进入scapy的shell 可以使用ls()来查看scapy支持的协议

使用lsc()查看scapy支持的函数

还可以使用ls()获取协议包含的参数

发送和接收数据包

send

- 在第3层发送数据包(Scapy创建第2层标头),不接收任何数据包。

loop 参数默认为0,如果它的值不是0,那么数据包将一直循环发送,直到按CTRL-C为止。 count 可用于设置要发送的数据包的确切数量。 inter 可用于设置每个数据包之间的秒数。 >>> send(IP(dst='8.8.8.8')/TCP(dport=53, flags='S')) . Sent 1 packets. >>>  >>> send(IP(dst='8.8.8.8')/TCP(dport=53, flags='S'), count=10) .......... Sent 10 packets. >>> >>> send(IP(dst='8.8.8.8')/TCP(dport=53, flags='S'), loop=1) ......................... [... snipped ...] Sent 1503 packets. 

sendp

与send()相同,但在第2层发送数据包(必须提供第2层标头),不接收任何数据包。 使用iface到设置界面上发送数据包。(如果未设置,将使用conf.iface的值) >>> sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth0") .... Sent 4 packets.  >>> sendp("I’m travelling on Ethernet", iface="eth0", loop=1, inter=0.2)  >>> sendp(rdpcap("/tmp/pcapfile")) # tcpreplay ........... Sent 11 packets. 

sr

发送数据包并接收响应。 sr()返回两个列表,第一个列表包含响应的,第二个列表包含未响应的。 >>> sr(IP(dst="60.205.177.168")/TCP(dport=[21,22,23])) Begin emission: Finished sending 3 packets. ...**...............................^C Received 36 packets, got 2 answers, remaining 1 packets (,  ) >>> ans,unans=_ >>> unans.summary() IP / TCP 172.17.51.80:ftp_data > 60.205.177.168:telnet S >>> ans[0] (>,  >) >>> ans[0][0] > 

sr1

发送所有数据包并仅记录第一个响应。 >>> p=sr1(IP(dst="www.baidu.com")/ICMP()/"asdqwe") Begin emission: Finished sending 1 packets. .* Received 2 packets, got 1 answers, remaining 0 packets 

srloop

循环发送,接收响应并显示响应。 该函数返回几个数据包和响应,以及未响应的。 >>> packet = IP(dst='60.205.177.168')/ICMP() >>> srloop(packet) RECV 1: IP / ICMP 60.205.177.168 > 172.17.51.80 echo-reply 0 RECV 1: IP / ICMP 60.205.177.168 > 172.17.51.80 echo-reply 0 RECV 1: IP / ICMP 60.205.177.168 > 172.17.51.80 echo-reply 0 RECV 1: IP / ICMP 60.205.177.168 > 172.17.51.80 echo-reply 0 ^C         Sent 4 packets, received 4 packets. 100.0% hits. (,  )  使用Scapy创建数据包 Scapy数据包的创建与网络中的分层方法一致。 数据包的基本构建块是一层,而整个数据包则是通过将各个层堆叠在一起而构建的。 scapy通过在TCP / IP的不同层上为每个协议定义数据包头,然后按顺序堆叠这些层,来构造数据包。

在一行中创建数据包

>>> packet = Ether()/IP(dst='8.8.8.8')/TCP(dport=53,flags='S') 

分别创建每个图层并使用'/'运算符将它们堆叠

>>> l2 = Ether() >>> l3 = IP(dst='8.8.8.8/30') >>> l4 = TCP(dport=53, flags = 'S') >>> packet = l2/l3/l4 

Scapy IP表示法

Scapy接受普通的IP表示法,CIDR表示法,主机名。

>>> packet = IP(dst = '8.8.8.8') >>> packet = IP(dst = 'scanme.nmap.org') >>> packet = IP(dst = '8.8.8.8/30') >>> [a for a in packet] [, , , ] >>> packet = IP(dst = 'egadz.metasploit.com/30') 

创建一组数据包

我们可以使用Scapy创建一组数据包

>>> pkts = IP(ttl=[1,3,5,(7,10)])/TCP() >>> [pkt for pkt in pkts] [>,  >,  >,  >,  >,  >,  >]  >>> packet=IP(dst="192.168.*.1-10")/TCP(dport=(0,100))  >>> [a for a in packet] [>,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >,  >, ... 

检查数据包

获取数据包的详细说明以及数据类型

>>> packet = IP()/TCP() >>> ls(packet) version    : BitField             = 4               (4) ihl        : BitField             = None            (None) tos        : XByteField           = 0               (0) len        : ShortField           = None            (None) id         : ShortField           = 1               (1) flags      : FlagsField           = 0               (0) frag       : BitField             = 0               (0) ttl        : ByteField            = 64              (64) proto      : ByteEnumField        = 6               (0) chksum     : XShortField          = None            (None) src        : Emph                 = '127.0.0.1'     (None) dst        : Emph                 = '127.0.0.1'     ('127.0.0.1') options    : PacketListField      = []              ([]) [-- snipped --] 

show

显示详细的包头

>>> packet.show() ###[ IP ]###    version= 4   ihl= None   tos= 0x0   len= None   id= 1   flags=    frag= 0   ttl= 64   proto= tcp   chksum= None   src= 127.0.0.1   dst= 127.0.0.1   options ###[ TCP ]###       sport= ftp_data      dport= http      seq= 0      ack= 0      dataofs= None      reserved= 0      flags= S      window= 8192      chksum= None      urgptr= 0      options= [] 

show2

与show()类似,但可以组装数据包并计算校验和和IHL(报头长度,最小值是5)。

>>> packet.show2() ###[ IP ]###    version= 4   ihl= 5   tos= 0x0   len= 40   id= 1   flags=    frag= 0   ttl= 64   proto= tcp   chksum= 0x7ccd   src= 127.0.0.1   dst= 127.0.0.1   options ###[ TCP ]###       sport= ftp_data      dport= http      seq= 0      ack= 0      dataofs= 5      reserved= 0      flags= S      window= 8192      chksum= 0x917c      urgptr= 0      options= [] 

summary

显示数据包的简短的摘要

>>> packet.summary() 'IP / TCP 127.0.0.1:ftp_data > 127.0.0.1:http S' 

与数据包内部的字段进行交互

>>> Ether(dst="d8:55:a3:fe:80:78")/IP(dst="8.8.8.8") > >>> packet=_ >>> packet.dst 'd8:55:a3:fe:80:78' >>> packet[IP].dst '8.8.8.8' 

检查数据包中是否存在层

haslayer方法

>>> if packet.haslayer(IP): ...:     print (packet[IP].dst) ...:  8.8.8.8 

使用in构造

>>> pkt = IP()/TCP()/DNS() >>> DNS in pkt True  Scapy的sprintf sprintf()方法是Scapy的强大功能之一,在编写自定义工具时非常方便。 sprintf 用数据包中的值填充格式字符串,就像C语言库中的sprintf一样,不同的是这里用数据包中的字段值填充格式字符串。 >>> packet.sprintf("Ethernet source is %Ether.src% and IP proto is %IP.proto%") 'Ethernet source is 00:16:3e:0c:d1:ad and IP proto is tcp' >>> a.sprintf("%dst% %IP.dst% vlan=%Dot1Q.vlan%") '00:00:d4:ae:3f:71 192.168.0.1 vlan=42' >>> >>>a.sprintf(" %TCP.flags% | %5s,TCP.flags% | %#05xr,TCP.flags%") ' RA | RA    | 0x014' 

数据包处理程序

我们可以使用lambda函数编写处理TCP数据包的数据包处理程序,但该功能仅适用于TCP数据包。

>>>  f=lambda x:x.sprintf("%IP.dst%:%TCP.dport%") >>> f(IP(dst="8.8.8.8")/TCP()) '8.8.8.8:http' >>> f(IP(dst="8.8.8.8")/UDP()) '8.8.8.8:??' 

还可以使用sprintf()中的条件子字符串来实现处理其它层的目的。条件子字符串仅在数据包中存在某个层时才触发,否则将被忽略。还可以!用于检查是否缺少图层。条件子字符串格式: {[!]层:子字符串}

>>> f=lambda x: x.sprintf("=> {IP:ip=%IP.dst% {UDP:dport=%UDP.dport%} ...: ... {TCP:%TCP.dport%/%TCP.flags%}{ICMP:type=%r,ICMP.type%}} ...: ... {!IP:not an IP packet}") >>> f(IP()/TCP()) '=> ip=127.0.0.1 http/S' >>> f(IP()/UDP()) '=> ip=127.0.0.1 dport=domain' >>> f(IP()/ICMP()) '=> ip=127.0.0.1 type=8' >>> f(Ether()/ARP()) '=> not an IP packet'  导入与导出数据

PCAP格式

从PCAP文件导入数据包。

pkts = rdpcap("temp.cap") pkts = sniff(offline="temp.cap") 

将数据包导出到pcap文件。

wrpcap("temp.cap",pkts) 

十六进制转储格式

Scapy允许以各种十六进制格式导出数据包。 使用hexdump()函数使用hexdump格式显示一个或多个数据包: >>> hexdump(s) 0000  D8 55 A3 FE 80 78 00 16 3E 0C D1 AD 08 00 45 00  .U...x..>.....E. 0010  00 28 00 01 00 00 40 06 8B 5E AC 11 33 50 08 08  .(....@..^..3P.. 0020  08 08 00 14 00 50 00 00 00 00 00 00 00 00 50 02  .....P........P. 0030  20 00 A0 0D 00 00        

十六进制字符串

还可以使用str()函数将整个数据包转换为十六进制字符串

>>> s >> >>> str(s) WARNING: Calling str(pkt) on Python 3 makes no sense! "b'\xd8U\xa3\xfe\x80x\x00\x16>\x0c\xd1\xad\x08\x00E\x00\x00(\x00\x01\x00\x00@\x06\x8b^\xac\x113P\x08\x08\x08\x08\x00\x14 \x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xa0\r\x00\x00'" 

Base64

Scapy可以使用export_object()函数导出数据包的base64编码数据。 >>> export_object(s) b'eNprYEouTk4sqNTLSaxMLSrWyzHici3JSC3iKmTQDCpk1EiOT85PSU0u5krNAzG4Cpki7BkYGA7PCD20+PC+Qw0VDGJ2PIcnHlrLweDKwKDBwMjA4MB2qDvu0BpB4wAOIGAQYQhggIIAJgWGQwt4GRgKmSPYgPycxJLMPMNClrZC1qBCNnfHGxoeDcsdkv2AoKSQPUkPALURLMU=' >>> new_pkt = import_object  嗅探

Sniff()

sniff()函数可帮助我们捕获所有流量: 包括count,filter,iface,lfilter,prn,timeout选项。 >>> sniff(count=4, iface='eth0')  

可以添加过滤以捕获需要的数据包,使用标准的tcpdump / libpcap语法:

>>> pkts = sniff(count=1,filter="tcp and host 60.205.177.168 and port 80") >>> pkts.summary() Ether / IP / TCP 172.17.51.80:54578 > 60.205.177.168:http S  可以做类似tcpdump的简单流量分析器 >>>  pkts = sniff(count=5,filter="host 60.205.177.168",prn=lambda x:x.summary()) Ether / IP / TCP 172.17.51.80:54624 > 60.205.177.168:http S Ether / IP / TCP 60.205.177.168:54624 > 172.17.51.80:http S Ether / IP / TCP 172.17.51.80:http > 60.205.177.168:54624 SA Ether / IP / TCP 60.205.177.168:http > 172.17.51.80:54624 SA Ether / IP / TCP 172.17.51.80:54624 > 60.205.177.168:http A  也可以从pcap文件中嗅探数据包。 pkts = sniff(offline='test.pcap') >>> pkts.nsummary() 0000 Ether / IP / TCP 172.16.16.128:1606 > 74.125.95.104:http S 0001 Ether / IP / TCP 74.125.95.104:http > 172.16.16.128:1606 SA 0002 Ether / IP / TCP 172.16.16.128:1606 > 74.125.95.104:http A 0003 Ether / IP / TCP 172.16.16.128:1606 > 74.125.95.104:http PA / Raw 0004 Ether / IP / TCP 74.125.95.104:http > 172.16.16.128:1606 A / Padding >>> sniff(offline='test.pcap', lfilter = lambda s: s[TCP].flags == 18, prn = lambda x: x[IP].dst) 192.168.1.1  

 


本文标题:数据包处理利器――Scapy基础知识 - 互联网
本文地址:www.itbaoliao.com/hlw/12787.html

返回网站首页

本文评论
苹果上线编程一小时报名页面:在这里你能学到这些
11月27日上午消息,苹果公司在官网上线了“编程一小时”(Hour of Code)活动,即日起用户可以报名参加“编程一小时”免费讲座,并到苹果Apple Store零售店参加这些活动。...
日期:12-06
坚果TNT工作站到底是什么?坚果TNT工作站功能有哪些
2018年5月15日,锤子科技在北京国家体育场举办了新品发布会。期间除了次时代旗舰手机坚果R1正式亮相外,神秘的重头戏坚果TNT工作站也终于揭开真容。...
日期:10-24
首家眼镜电商艾视网将被收购 “买主”成秘
近日消息,首家眼镜电商艾视网将于近日被收购,而幕后的收购方还未可知。眼镜业垂直电商在整个电商行业中并不起眼,该收购事件是否会把整个行业带入红海还需要时间来证实。据了解,成立于2005年的艾视网是国内首家眼镜业的垂直电商,该网站自成立之日起...
日期:11-30
中国人寿被举报造假 当事人回应:本人已离职,将起诉对方
【TechWeb】2月25日消息,中国人寿因一封员工举报信登上新浪微博热搜,一名自称在中国人寿嫩江支公司工作16年的员工在举报信中称,嫩江支公司总经理孙小刚涉保费造假,骗保套钱谋取私利等问题。记者联系到孙小刚本人求证,孙小刚称,上述举报人...
日期:12-07
全民枪战血蟒全方位评测
Hello,My Name Is 晨小小,今天小小来给大家推送一把炫酷武器——血蟒。虽然没有华丽的击杀板,没有炫酷的击杀火焰,但是它却有着华丽的外观特效,炫酷的换弹特效。红色的皮肤,莫名的...
日期:12-08
金山毒霸推“肉鸡检测器”软件 江民指其炒作
江民公司一位发言人表示,这类检测软件的原理“无非是检查一下系统漏洞,检查是否有非常用的端口向外发送数据,是否有隐藏文件或隐藏注册表之类的……”他认为,金山公司对这类软件进行宣传只是一种炒作而已。...
日期:12-09
再会的喜悦 重温《封神榜2》之感受
漫漫修仙路,岁月穿云间。《封神榜2》伴随大家一起走过了两个年头,风风雨雨、悲欢离合、爱恨情仇、点点滴滴。凭栏回首,往事难以忘记。您的支持是封神成长的源泉,您的意见是封神前进的动力。你心中是否有一丝丝牵挂还在《封神榜2》...
日期:10-27
百度随心听电台悄然升级
腾讯科技讯 1月17日消息,在豆瓣FM Pro收费、虾米网被阿里收购传闻之际,百度音乐的电台产品近日已悄然升级,官方内部人士透露,2013年仍将坚持免费策略。2013年开始,各大公司在数字音乐领域的竞争正日趋激烈,各音乐厂商不约而同在探索数...
日期:11-28
OKWAP孔凡刚:已推出最轻薄OPhone手机
OKWAP英华通(南京)科技有限公司TD-SCDMA销售总监孔凡刚孔凡刚接受记者采访  新浪科技讯 10月12日上午消息,2010年北京国际通信展于10月11日-15日在北京...
日期:11-02
360雷电应用搜索上线 应用安装捆绑手机助手
【TechWeb报道】7月18日消息,360旗下雷电手机搜索今日正式上线,包括游戏、应用、电子书、音乐、铃声、壁纸、主题、论坛七类手机资源,均支持一键安装到手机,但前提是需要用户事先安装360手机助手。如图:要安装360手机卫士,点&...
日期:12-02
疯狂网购140万 网购成瘾使家庭发生变化
家住厦门的刘成今年37岁,有一份收入可观的工作,妻子月入近万元,三口之家住的是一套200多平方米的楼中楼,市中心还有一套小两房。这本是一个让人羡慕的小康家庭;然而由于女方网购成瘾;这个家庭发生了变化。...
日期:10-19
锯锁私享共享单车 贪小便宜吃大亏
据新华网报道,近日,深圳一市民因锯锁并企图将两辆共享单车据为己有,被深圳市龙岗区人民法院以盗窃罪判处有期徒刑6个月,并处罚金人民币3000元。...
日期:12-06
《绝地求生》Steam版打折价格 吃鸡降价多少钱?
《绝地求生》Steam版打折价格 吃鸡降价多少钱? 作为一款火爆的游戏,PUBG《绝地求生》的价格也是非常坚挺,此前Steam国区一直维持在98元无优惠。...
日期:12-01
三星对芯片厂增投:增加芯片工厂80亿美元投资 应对来年中国厂商挑战
12月13日消息,据外媒报道,三星电子公司拟将在中国芯片工厂的投资增加到80亿美元,以提高NAND闪存芯片产量。...
日期:11-13
LV推出售价8200元草帽 网友:明目张胆抄袭村头大爷作品
日前,LV在春夏男士时装秀上推出了一款复古风男士草帽产品——LV GARDENING帽子。该产品由Virgil Abloh创造,由针织材质汲取灵感。介绍显示,帽子由100%稻草构成,绳扣与线绳端头饰有路易威登标...
日期:12-04
我酷网获500万美元融资
天极ChinaByte 4月11日消息(熊海燕) 今天,我酷网对外宣布获得A轮融资,融资金额为500万美元。不过,我酷网此次没有透露投资方的信息。  我酷网CEO韩潼彤向Chinabyte表示,我酷网前身是139.com...
日期:11-27
闪充闪连18小时长续航售价399 荣耀xSport PRO运动蓝牙耳机正式发布
10月22日,荣耀在北京举行新品发布会,不仅带来了荣耀20青春版手机,还正式发布了荣耀xSport PRO运动蓝牙耳机。...
日期:12-12
滴滴顺风整改方案:近乎完备 推女性专属保护计划
7月18日消息,滴滴顺风车经过近乎一年的整改,目前终于提出了一份滴滴顺风车阶段性的整改方案。...
日期:11-29
QQ再曝新漏洞:可根据QQ号查用户真实姓名和从业经历
国内安全问题反馈平台乌云(WooYun)今天下午再次曝料,称腾讯QQ存在重大安全隐患,可导致群关系数据,根据QQ号就能获得相应的大量个人隐私。该漏洞是刚刚发现并提交的,目前已经将细节通知腾讯并等待处理,而根据乌云平台的流程,具体情况要等到...
日期:11-29