python(22): scapy

模块简介

Scapy是一个由Python编写的强大工具,目前很多优秀的网络扫描攻击工具都使用了这个模块。也可以在自己的程序中使用这个模块来实现对网络数据包的发送、监听和解析。这个模块相对于Nmap来说,更为底层。可以更直观的了解网络中的各类扫描攻击行为。

相对于Nmap来说,Scapy模块只会把收到的数据包展示给你,并不会告诉你这个包意味着什么。

例如,当你去医院检查身体时,医院会给你一份关于身体各项指标的检查结果,而医生也会告诉你得了什么病或者没有任何病。那么Nmap就像是一-个医生,它会替你搞定-切,按照它的经验提供给你结果。而Scapy则像是一个体检的设备, 它只会告诉你各种检查的结果,如果你自己就是-一个经验丰富的医生,显然检查的结果要比同行的建议更值得参考。

可实现功能:

1.发送数据包eth,ip,tcp,udp,dhcp,http等

只发送:

二层:sendp()  //给定网卡接口

 三层:send()   //自动根据路由表进行路由发送

发送并接收:

 二层:

     srp()   //发送包, 返回答复和没有答复的包的数量

     srp1() //发送包, 返回只答复或者发送的包的详细信息| .参数,显示这个参数的返回数据

 三层:

     sr(  )  //发送包, 返回答复和没有答复的包的数量

     sr1( ) //发送包, 返回只答复或者发送的包的详细信息|.参数,显示这个参数的返回数据

2.接收数据包

sr():sr()函数是Scapy的核心,它的返回值是两个列表,第一个列表是收到了应答的包和对应的应答,多伊尔戈列表是未收到应答的包。所以使用两个列表来保存sr()的返回值。

sniff():另外一个十分重要的函数就是sniff(),如果使用过Tcpdump,那么对这个函数的使用就不会感到陌生。通过这个函数可以在自己的程序中捕获经过本机网卡的数据包。

3.数据包文件解析

import scapy
from scapy.all import *
from scapy.utils import PcapReader
packets=rdpcap("./test.pcap")
for data in packets:
  if 'UDP' in data:
    s = repr(data)
    print(s)
    print(data['UDP'].sport)
    break

发送ip包例子:

from scapy.all import send,srp,Ether,ARP,conf,IP,ICMP,TCP

pack = IP(dst='192.168.1.253',ttl=10)
pack1 = IP(dst='baidu.com',ttl=10)
ss = send(pack,return_packets=True)

一.使用scapy发送数据包:

# -- coding: utf-8 --
import time
import threading
import sys
from scapy.all import *


# 数据包应用层数据部分
data = 'wangpeng'
# 发送端IP地址不是本机ip地址   目的端IP地址不详      传输层的TCP并未指明数据包类型:syn fin ack 窗口大小 数据包如果分片,要指明序号
pkt = IP(src='10.0.1.123', dst='11.0.1.111') / TCP(sport=12345, dport=5555) / data
# 间隔一秒发送一次   总共发送5次   发送网卡口:enp1s0
send(pkt, inter=1, count=5, iface="wlan")

注:数据包源ip不需要与网卡一样

使用wireshark抓包可看出发送成功: 

 二.抓包

dpkt = sniff(iface = "wlan",count = 10)
wrpcap("mypack.pcap",dpkt)

 用wireshark打开对应文件

三.解析数据包

dpkt = sniff(iface = "wlan",count = 10)
#wrpcap("mypack.pcap",dpkt)
print(dpkt)
for item in dpkt:
    print(item)
    print("time",item.time)
    print("fields",item.fields)
    print("overload_fields",item.overload_fields)
    print("fields",item.fields)
    print("payload",item.payload)
    print("wirelen",item.wirelen)
    print("==============")
    

结果打印: 

<Sniffed: TCP:10 UDP:0 ICMP:0 Other:0>
WARNING: Calling str(pkt) on Python 3 makes no sense!
b'\x124Vx\x90\x12<F\xd8\x11J\xdc\x08\x00E\x00\x004\x00\x00@\x009\x06V^\xb7$r-\xc0\xa8\x01l\x00P\xc6v\x9c-\x05\xa9d\x96\r\xbd\x80\x12r\x106\xb1\x00\x00\x02\x04\x05\x9c\x01\x01\x04\x02\x01\x03\x03\x08'
time 1627232132.407267
fields {'dst': '12:34:56:78:90:12', 'src': '3c:46:d8:11:4a:dc', 'type': 2048}
overload_fields {<class 'scapy.layers.l2.Ether'>: {'type': 1}, <class 'scapy.layers.l2.CookedLinux'>: {'proto': 1}, <class 'scapy.layers.l2.MPacketPreamble'>: {}, <class 'scapy.layers.l2.GRE'>: {'proto': 25944}, <class 'scapy.layers.l2.SNAP'>: {'code': 1}, <class 'scapy.layers.vxlan.VXLAN'>: {'flags': 12, 'NextProtocol': 3}}
fields {'dst': '12:34:56:78:90:12', 'src': '3c:46:d8:11:4a:dc', 'type': 2048}
payload b'E\x00\x004\x00\x00@\x009\x06V^\xb7$r-\xc0\xa8\x01l\x00P\xc6v\x9c-\x05\xa9d\x96\r\xbd\x80\x12r\x106\xb1\x00\x00\x02\x04\x05\x9c\x01\x01\x04\x02\x01\x03\x03\x08'
wirelen None
==============
WARNING: Calling str(pkt) on Python 3 makes no sense!
WARNING: more Calling str(pkt) on Python 3 makes no sense!
b'<F\xd8\x11J\xdc\x124Vx\x90\x12\x08\x00E\x00\x00(]\xa4@\x00@\x06\xf1\xc5\xc0\xa8\x01l\xb7$r-\xc6v\x00Pd\x96\r\xbd\x9c-\x05\xaaP\x10@\x82\xa8\xfa\x00\x00'
time 1627232132.407463
fields {'dst': '3c:46:d8:11:4a:dc', 'src': '12:34:56:78:90:12', 'type': 2048}
overload_fields {<class 'scapy.layers.l2.Ether'>: {'type': 1}, <class 'scapy.layers.l2.CookedLinux'>: {'proto': 1}, <class 'scapy.layers.l2.MPacketPreamble'>: {}, <class 'scapy.layers.l2.GRE'>: {'proto': 25944}, <class 'scapy.layers.l2.SNAP'>: {'code': 1}, <class 'scapy.layers.vxlan.VXLAN'>: {'flags': 12, 'NextProtocol': 3}}
fields {'dst': '3c:46:d8:11:4a:dc', 'src': '12:34:56:78:90:12', 'type': 2048}
payload b'E\x00\x00(]\xa4@\x00@\x06\xf1\xc5\xc0\xa8\x01l\xb7$r-\xc6v\x00Pd\x96\r\xbd\x9c-\x05\xaaP\x10@\x82\xa8\xfa\x00\x00'
wirelen None
==============
b'<F\xd8\x11J\xdc\x124Vx\x90\x12\x08\x00E\x00\x032]\xa5@\x00@\x06\xee\xba\xc0\xa8\x01l\xb7$r-\xc6v\x00Pd\x96\r\xbd\x9c-\x05\xaaP\x18@\x82\xceK\x00\x00POST /imewis/msugg?ifc=4&em=4 HTTP/1.1\r\nUser-Agent: SogouPSI\r\nHost: www.sogou.com\r\nAccept: */*\r\nAccept-Encoding: gzip,deflate\r\nContent-Length: 579\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\nx\x9c\x05\xc1G\x82\x820\x00\x00\xc0\x07q\xa0h\x94\x1c\xe9\xbd\t\x84r\xa3\x08,J3Q \xaf\xdf\x99^\x92\x05\xa2w\xaf/\xbe\xca\x1fEZpx\x94\xd1U\x1a\xa8FY\xe4\xee\xea\x13\t\xc3}\xddvq\xff\xf6\x03\x9a\x8bJ6\x8a\x8c#<x \x83\x0b\xad\xea\xfb\x18\xcb\xbcV\x95\xf1\x1b,h\xf0Y\x05\x8dR\xff\x00\x7fwZ\x90\x1f\xd9&U\xf4\x15\xe0\x08\n3\xb7N\xf9\xddq\x08[\xa3\xd9\x92y\xe6\x855l/\xcc\x901\x8f\x86!\x1b\x04\xe6\xc7i=M\xe5YCY\xc6\xac{r<\xbc\x10\x04\xe1\x1cQ\xaf`\xa2\xe9\x16\x98\x84\x9a\x82D\xb8\x80@\x11&\x06\xe6\xba\xe3\xecL$V\x1da\xf1\xf1\x8b\xce\x18\xe5}\xfc\x96\xe2\x88\x1dLM=\xdf\x1b\xbbN\xa1-\xbe\xf9@\x97;\xfdZs\x8d\x11\xef\x06&\xb4b\x13\x8b\xc9\x82}\xf5\xf2\xc9op0\x1bc)H\xed\xc3\x19\x9dG\xa7\x82\xe3pn\x1c\'\xde\x8b<\x19Ab\xfb\x11^\x087A2\xa5\xe7\xfe\xe9O\xb0\x84\x9d\xa6\xd1Y\xeeS;\xd8\xd8\x87c\xbf\xb8\xf4N\x1c\xbb\xd7o\x96\xbb\xc9\xbc\x87P\x03%\xd3\x9d\xc4x_\xfa\xeb\xaf>6\xda\xde|\xf9\xec\x9b\xde\xfe\x9c9\x00\xa8\x98H\x1a\xdd\xca\xce)\x9d\x02\xd4\xac\xad_\xc7f\xf9\xc0\xa6\x12\x04`}\xcf\x10?k1T\xc4\x84a%\x9b\x97x+\xf9\xe2;\x03)\xf2o\xe7\x85\xa8\xf9\x08\x86\xdb\xdd\x8f\xea\x03\x97\xd3\xb2\xde\x06\xc6\xe6\xd9W)\x831X\x13\xaf\xd4-\'\x03\xb4\r\x95\xf8MJB\x18.\xcb=w\xf5\x1d\xc9\xaa\xa2\xae7^\x1a:\xcc\xe3\x1b\xb7\xeb\x06\x07\x9er\xe7"\x13\xed\xc0\xd7g\xf5\x88\x13\x1a/4\xec\x9c\x1a\xdbw\x96\xf9\xc1\xf6i\xa7\xf3\x05*\xe2\x10\xe6\xeb\x0e\xac\xda\xc4!\x03\xef\xcc\xdfZk4\xf7\xcb\x9e$\x1a\x926\x97)!u\xb7\xce\xfe\xeb\x7f\x99\x85|\xf3iy\x8d{\xbe\'\xed\xbb#\xc9[\nOt\x80\x9eTP?\xd2\xcc\xc3m\xa1UM\x1fT\xefC\xe2\x94-\xdc7\xe0}\x9eC\xf4F#\xa0GF\xe7\xd4\xed\x06h\xa7E\xf6\x8c\xa1?\x95\xc6\x0e^\xe2\xae\xf7C\xe4\xe3\x9di\xfc\x81\x91\x85T{\xef*\xdb\x88\xaeQ\x0c\x95\xb3\xab#^\xa9\x96\x98{b]\x04g\xc1\xff\xa7\x18\xf3\xe0'
time 1627232132.407733

解析本地数据包文件

pcap = sniff(offline = "xx/xx.pcap")`

参考:

python中的scapy模块 - _云中鹤 - 博客园

scapy发包:用Python脚本构造带有私有协议头(直接带十六进制数据)的报文_Tasdily的博客-CSDN博客

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值