找回密码
 会员注册
查看: 32|回复: 0

Python灰帽——Scapy模块数据包的构造、发送、接收、捕获

[复制链接]

3

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2024-9-8 17:08:34 | 显示全部楼层 |阅读模式
Scapy库基础"网络神器"scapy是python的一个第三方模块,能够发送、捕获、分析和铸造网络数据包主要功能:扫描、识别、测试、攻击、包铸造、抓包分析数据包的构造在编辑器导入scapy包fromscapy.allimport*fromscapy.layers.inetimport*12简单构造pkt=IP()/TCP()#该包的结构包含IP部分和TCP部分12构造数据包pkt=IP(src="10.9.47.66",dst="10.6.47.88")/TCP()1Scapy中的分层结构OSI模型中的下层协议在前,以/隔开Ether()/IP()/TCP()Ether类用于设置发送方和接收方的MAC地址构造HTTP、ICMP包pkt=IP()/TCP()/"GET/HTTP1.0\r\n\r\n"1pkt=IP(dst="192.168.147.215")/ICMP()res=sr1(pkt)res.show()123数据包的查看查看数据包内容pkt=IP()/TCP()pkt.show()12显示的内容###[IP]###version=4ihl=Nonetos=0x0len=Noneid=1flags=frag=0ttl=64proto=tcpchksum=Nonesrc=127.0.0.1dst=127.0.0.1\options\###[TCP]###sport=ftp_datadport=httpseq=0ack=0dataofs=Nonereserved=0flags=Swindow=8192chksum=Noneurgptr=0options=''1234567891011121314151617181920212223242526查看数据包格式pkt=IP()/TCP()ls(pkt)12显示的内容version:BitField(4bits)=4('4')ihl:BitField(4bits)=None('None')tos:XByteField=0('0')len:ShortField=None('None')id:ShortField=1('1')flags:FlagsField=('')frag:BitField(13bits)=0('0')ttl:ByteField=64('64')proto:ByteEnumField=6('0')chksum:XShortField=None('None')src:SourceIPField='127.0.0.1'('None')dstestIPField='127.0.0.1'('None')optionsacketListField=[]('[]')--sport:ShortEnumField=20('20')dport:ShortEnumField=80('80')seq:IntField=0('0')ack:IntField=0('0')dataofs:BitField(4bits)=None('None')reserved:BitField(3bits)=0('0')flags:FlagsField=('')window:ShortField=8192('8192')chksum:XShortField=None('None')urgptr:ShortField=0('0')options:TCPOptionsField=[]("b''")12345678910111213141516171819202122232425数据包的发送总览发送数据包的函数说明sr(pkt)发送数据包,接收所有返回包返回值时两个列表,第一个列表包含收到了应答的数据包和对应的数据包第二个列表包含未收到应答的数据包sr1(pkt)发送数据包,接收一个返回包send(pkt)发送数据包,不等待返回包srp(pkt)发送2层数据包,等待回应sendp(pkt)发送2层数据包,不等待返回包数据包的发送sr()fromscapy.allimport*fromscapy.layers.inetimport*pkt=IP(dst="192.168.147.215")/ICMP()res,unres=sr(pkt)res.summary()#接收到应答包的数据包和返回包保存到了res列表中,使用res.summary()可查看两个数据包中的内容#未接收到应答的数据包保存到unres列表中123456789send()fromscapy.allimport*fromscapy.layers.inetimport*pkt=IP(dst="192.168.147.215")/ICMP()print(pkt.summary())send(pkt)123456二层数据包的发送(MAC地址作为目标)fromscapy.allimport*fromscapy.layers.inetimport*pkt=Ether(dst="ff:ff:ff:ff:ff:ff")print(pkt.summary())sendp(pkt)123456数据包的接收查看响应包res.show()1fromscapy.allimport*fromscapy.layers.inetimport*pkt=IP(dst="192.168.147.215")/ICMP()res=sr1(pkt)res.show()123456响应状态res.type(回复的ICMP数据包的类型编号及含义)类型(十进制)内容0回送应答3目标不可达4原点抑制5重定向或改变路由8回送请求9路由器公告10路由器请求11超时17地址子网请求18地址子网应答常用函数总览函数名用途lsc()查看常用函数及其使用方法raw()以字节格式显示数据包内容raw(pkt)hexdump()以十六进制数据表示数据包中的内容hexdump(pkt)summary()使用不超过一行的摘要内容来简单描述数据包pkt.summary()show()显示数据包的详细信息pkt.show()show2()相比于show()增加了显示数据包的校验和command()显示出构造该数据包的命令res.command()wrpcap()将数据包存储在文件中wrpcap("tmp.cap",pkts)rdpcap()读取.cap文件中的数据包(注意格式为列表)pkts=rdpcap(temp.cap)raw()pkt=IP()/TCP()print(raw(pkt))12hexdump()pkt=IP()/TCP()print(hexdump(pkt))12summary()pkt=IP()/TCP()print(pkt.summary())12command()pkt=IP(src="192.168.147.238",dst="192.168.147.215")res=sr1(pkt)print(res.command())123数据包文件的存储、读取使用wrpcap()函数存储时,可以将多个pkt使用存储为一个列表使用rdpcap()函数读取数据包时注意为列表格式fromscapy.allimport*fromscapy.layers.inetimport*#IP(src="192.168.147.238",dst="192.168.147.215")pkt1=IP(src="192.168.147.238",dst="192.168.147.215")/TCP()pkt2=IP()/ICMP()pkts=[pkt1,pkt2]#将数据包列表pkts存储在文件中wrpcap("temp.cap",pkts)#读取存储数据包的文件(列表格式)pkt_list=rdpcap("temp.cap")#第一个数据包的摘要print(pkt_list[0].summary())#第二个数据包的详细数据print(pkt_list[1].show())1234567891011121314151617sinff()捕获数据包参数参数名含义filter指定捕获数据包的过滤条件,例如指定捕获特定端口、特定协议等如dsthost192.168.1.1andport8080iface指定要使用的网卡,默认为第一个网卡prn指定一个回调函数,用于处理捕获到的每个数据包count指定捕获的数据包数量filter采用伯克利包过滤机制限定符解释Type表示指代的对象如IP地址(host)、子网(net)或端口P(port)等默认为hostDir表示数据包的传输方向常见scr(源地址)、dst(目的地址)默认为“scrordst”Proto便是数据包匹配的协议类型常见Ether、IP、TCP、ARP过滤语句举例:host192.168.1.1dsthost192.168.1.1srcport8080#以太网(MAC地址)源地址或者目的地址为11:22:33:44:55:66etherhost11:22:33:44:55:66#源MAC为11:22:33:44:55:66的数据包ethersrc11:22:33:44:55:66#源地址在192.168.1.0/24网段的数据包srcnet192.168.1.0/24#还可以使用and、or、not组合过滤host192.168.1.1andport80801234567891011121314151617使用fromscapy.allimport*#定义一个回调函数,输出数据包的概述defcallback(pkt):print(pkt.summary)sniff(filter="icmpandhost192.168.147.215",iface="eth0",prn=callback,count=3)#过滤192.168.147.215的icmp报文#选择监听eth0网卡#指定定义好的回调函数sniff#捕获三个数据包1234567891011运行后,开始监听此时,ping过滤的主机,即可捕获到数据包
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 01:29 , Processed in 0.531209 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表