巴蜀网

 找回密码
 免费注册

QQ登录

只需一步,快速开始

开启左侧
查看: 27|回复: 0
 一日三夜 发表于: 2021-5-18 15:13:54|显示全部楼层|阅读模式

[2021年] 数据包处理利器──Scapy基础知识

 [复制链接]
源自: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支持的协议
e07b-kqhwhri7320054.jpg

使用lsc查看scapy支持的函数
065d-kqhwhri7320052.jpg

还可以使用ls获取协议包含的参数
85f8-kqhwhri7320318.jpg
发送和接收数据包
  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.summaryIP/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.summaryIP/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.dstd8:55:a3:fe:80:78:packet[IP].dst8.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)/TCP8.8.8.8:http:f(IP(dst=8.8.8.8)/UDP8.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.1 http/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)beNprYEouTk4sqNTLSaxMLSrWyzHici3JSC3iKmTQDCpk1EiOT85PSU0u5krNAzG4Cpki7BkYGA7PCD20+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.summaryEther/IP/TCP172.17.51.80:54578>60.205.177.168:httpS 可以做类似tcpdump的简单流量分析器:pkts=sniff(count=5,filter=host60.205.177.168,prn=lambdax:x.summaryEther/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.nsummary0000Ether/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
『 巴蜀网 』提醒,在使用本论坛之前您必须仔细阅读并同意下列条款:
  1. 遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规,并遵守您在会员注册时已同意的《『 巴蜀网 』管理办法》;
  2. 严禁发表危害国家安全、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容;
  3. 本帖子由 一日三夜 发表,享有版权和著作权(转帖除外),如需转载或引用本帖子中的图片和文字等内容时,必须事前征得 一日三夜 的书面同意;
  4. 本帖子由 一日三夜 发表,仅代表用户本人所为和观点,与『 巴蜀网 』的立场无关,一日三夜 承担一切因您的行为而直接或间接导致的民事或刑事法律责任。
  5. 本帖子由 一日三夜 发表,帖子内容(可能)转载自其它媒体,但并不代表『 巴蜀网 』赞同其观点和对其真实性负责。
  6. 本帖子由 一日三夜 发表,如违规、或侵犯到任何版权问题,请立即举报,本论坛将及时删除并致歉。
  7. 『 巴蜀网 』管理员和版主有权不事先通知发帖者而删除其所发的帖子。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

© 2002-2021, 蜀ICP备12031014号, Powered by 5Panda
GMT+8, 2021-6-13 18:17, Processed in 0.187200 second(s), 10 queries, Gzip On, MemCache On
快速回复 返回顶部 返回列表