互联网爱好者创业的站长之家 – 南方站长网
您的位置:首页 >资讯 >

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

时间:2021-05-18 09:45:49 | 来源:TechWeb

原标题:数据包处理利器――Scapy基础知识

什么 是scapy

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

安装scapy

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

pip3installscapy 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')).Sent1packets.>>>>>>send(IP(dst='8.8.8.8')/TCP(dport=53,flags='S'),count=10)..........Sent10packets.>>>>>>send(IP(dst='8.8.8.8')/TCP(dport=53,flags='S'),loop=1).........................[...snipped...]Sent1503packets.

sendp

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

sr

发送数据包并接收响应。 sr()返回两个列表,第一个列表包含响应的,第二个列表包含未响应的。 >>>sr(IP(dst="60.205.177.168")/TCP(dport=[21,22,23]))Beginemission:Finishedsending3packets....**...............................^CReceived36packets,got2answers,remaining1packets(,)>>>ans,unans=_>>>unans.summary()IP/TCP172.17.51.80:ftp_data>60.205.177.168:telnetS>>>ans[0](>,>)>>>ans[0][0]>

sr1

发送所有数据包并仅记录第一个响应。 >>>p=sr1(IP(dst="www.baidu.com")/ICMP()/"asdqwe")Beginemission:Finishedsending1packets..*Received2packets,got1answers,remaining0packets

srloop

循环发送,接收响应并显示响应。 该函数返回几个数据包和响应,以及未响应的。 >>>packet=IP(dst='60.205.177.168')/ICMP()>>>srloop(packet)RECV1:IP/ICMP60.205.177.168>172.17.51.80echo-reply0RECV1:IP/ICMP60.205.177.168>172.17.51.80echo-reply0RECV1:IP/ICMP60.205.177.168>172.17.51.80echo-reply0RECV1:IP/ICMP60.205.177.168>172.17.51.80echo-reply0^CSent4packets,received4packets.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')>>>[aforainpacket][,,,]>>>packet=IP(dst='egadz.metasploit.com/30')

创建一组数据包

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

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

检查数据包

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

>>>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=4ihl=Nonetos=0x0len=Noneid=1flags=frag=0ttl=64proto=tcpchksum=Nonesrc=127.0.0.1dst=127.0.0.1options###[TCP]###sport=ftp_datadport=httpseq=0ack=0dataofs=Nonereserved=0flags=Swindow=8192chksum=Noneurgptr=0options=[]

show2

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

>>>packet.show2()###[IP]###version=4ihl=5tos=0x0len=40id=1flags=frag=0ttl=64proto=tcpchksum=0x7ccdsrc=127.0.0.1dst=127.0.0.1options###[TCP]###sport=ftp_datadport=httpseq=0ack=0dataofs=5reserved=0flags=Swindow=8192chksum=0x917curgptr=0options=[]

summary

显示数据包的简短的摘要

>>>packet.summary()'IP/TCP127.0.0.1:ftp_data>127.0.0.1:httpS'

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

>>>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方法

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

使用in构造

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

数据包处理程序

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

>>>f=lambdax: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=lambdax:x.sprintf("=>{IP:ip=%IP.dst%{UDP:dport=%UDP.dport%}...:...{TCP:%TCP.dport%/%TCP.flags%}{ICMP:type=%r,ICMP.type%}}...:...{!IP:notanIPpacket}")>>>f(IP()/TCP())'=>ip=127.0.0.1http/S'>>>f(IP()/UDP())'=>ip=127.0.0.1dport=domain'>>>f(IP()/ICMP())'=>ip=127.0.0.1type=8'>>>f(Ether()/ARP())'=>notanIPpacket' 导入与导出数据

PCAP格式

从PCAP文件导入数据包。

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

将数据包导出到pcap文件。

wrpcap("temp.cap",pkts)

十六进制转储格式

Scapy允许以各种十六进制格式导出数据包。 使用hexdump()函数使用hexdump格式显示一个或多个数据包: >>>hexdump(s)0000D855A3FE807800163E0CD1AD08004500.U...x..>.....E.001000280001000040068B5EAC1133500808.(....@..^..3P..002008080014005000000000000000005002.....P........P.00302000A00D0000

十六进制字符串

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

>>>s>>>>>str(s)WARNING:Callingstr(pkt)onPython3makesnosense!"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="tcpandhost60.205.177.168andport80")>>>pkts.summary()Ether/IP/TCP172.17.51.80:54578>60.205.177.168:httpS 可以做类似tcpdump的简单流量分析器 >>>pkts=sniff(count=5,filter="host60.205.177.168",prn=lambdax:x.summary())Ether/IP/TCP172.17.51.80:54624>60.205.177.168:httpSEther/IP/TCP60.205.177.168:54624>172.17.51.80:httpSEther/IP/TCP172.17.51.80:http>60.205.177.168:54624SAEther/IP/TCP60.205.177.168:http>172.17.51.80:54624SAEther/IP/TCP172.17.51.80:54624>60.205.177.168:httpA 也可以从pcap文件中嗅探数据包。 pkts=sniff(offline='test.pcap')>>>pkts.nsummary()0000Ether/IP/TCP172.16.16.128:1606>74.125.95.104:httpS0001Ether/IP/TCP74.125.95.104:http>172.16.16.128:1606SA0002Ether/IP/TCP172.16.16.128:1606>74.125.95.104:httpA0003Ether/IP/TCP172.16.16.128:1606>74.125.95.104:httpPA/Raw0004Ether/IP/TCP74.125.95.104:http>172.16.16.128:1606A/Padding>>>sniff(offline='test.pcap',lfilter=lambdas:s[TCP].flags==18,prn=lambdax:x[IP].dst)192.168.1.1

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如有侵权行为,请第一时间联系我们修改或删除,多谢。

猜你喜欢