-
2021-01-29 14:42:19
importosimportdpktimportsocketimportdatetimeimportuuidfrom scapy.sendrecv importsnifffrom scapy.utils importwrpcapdefget_local_ip():
hostname=socket.gethostname()#获取本机内网ip
local_ips = socket.gethostbyname_ex(hostname)[-1]returnlocal_ipsdefbody_transfer(body):
str_body=body.decode()
body_ls= str_body.split("&")for item inbody_ls:
key_, value_= item.split("=")print("%s: %s"%(key_, value_))defget_dpkt():
dpkt_= sniff(count = 100) #这里是针对单网卡的机子,多网卡的可以在参数中指定网卡,例:iface=Qualcomm QCA9377 802.11ac Wireless Adapter
_uuid =uuid.uuid1()
filename= f"{_uuid}.pcap"wrpcap(filename, dpkt_)returnfilenamedefprint_pcap(pcap):try:
local_ips=get_local_ip()for timestamp, buf inpcap:
eth= dpkt.ethernet.Ethernet(buf) #获得以太包,即数据链路层包
#print("ip layer:"+eth.data.__class__.__name__) #以太包的数据既是网络层包
#print("tcp layer:"+eth.data.data.__class__.__name__) #网络层包的数据既是传输层包
#print("http layer:" + eth.data.data.data.__class__.__name__) #传输层包的数据既是应用层包
# #print('Timestamp: ',str(datetime.datetime.utcfromtimestamp(timestamp))) #打印出包的抓取时间
if notisinstance(eth.data, dpkt.ip.IP):print('Non IP Packet type not supported %s' % eth.data.__class__.__name__)continueip=eth.data
src_ip=socket.inet_ntoa(ip.src)
dst_ip=socket.inet_ntoa(ip.dst)
do_not_fragment=bool(ip.off &dpkt.ip.IP_DF)
more_fragments=bool(ip.off &dpkt.ip.IP_MF)
fragment_offset= ip.off &dpkt.ip.IP_OFFMASKifisinstance(ip.data, dpkt.tcp.TCP):#Set the TCP data
tcp =ip.data#Now see if we can parse the contents as a HTTP request
#看看是否可以将内容解析为HTTP请求
try:
request=dpkt.http.Request(tcp.data)print('IP: %s -> %s (len=%d ttl=%d DF=%d MF=%d offset=%d)' % (src_ip + "(本机)" if src_ip in local_ips elsesrc_ip, dst_ip, ip.len, ip.ttl, do_not_fragment, more_fragments,fragment_offset))print("URL: %s" % request.headers.get("host") +request.uri)print("METHOD: %s" %request.method.upper())print("Headers:")for key, value inrequest.headers.items():print("%s: %s" %(key, value))print("Body:")
body_transfer(request.body)print("Data:")
body_transfer(request.data)#print('HTTP request: %s\n' % repr(request))
print()except(dpkt.dpkt.NeedData, dpkt.dpkt.UnpackError):continue
#Pull out fragment information (flags and offset all packed into off field, so use bitmasks)
exceptException as error:pass
defmain():whileTrue:
filename=get_dpkt()
with open(filename,"rb") as f:
pcap=dpkt.pcap.Reader(f)
print_pcap(pcap)
os.remove(filename)if __name__ =='__main__':
main()
更多相关内容 -
使用Python实现windows下的抓包与解析
2020-12-31 02:31:07如果你习惯于用python3,数据包的分析完全可以放在3下面做,因为抓包和分析是两个完全独立的过程。 需要的python包:scapy和dpkt 抓包代码: from scapy.sendrecv import sniff from scapy.utils import wrpcap ... -
python实现抓包工具 基于winpcap
2021-06-02 16:08:39一、介绍 平时发网络数据都是基于应用层的收发,如果要进行底层发送和接收必须使用另外的工具,这里以winpcap介绍tcpip底层的收发 二、安装包 pip install winpcapy 三、代码编写 1、导入库 from winpcapy import ...一、介绍
平时发网络数据都是基于应用层的收发,如果要进行底层发送和接收必须使用另外的工具,这里以winpcap介绍tcpip底层的收发二、安装包
pip install winpcapy
三、代码编写
1、导入库from winpcapy import WinPcapUtils
2、发数据
arp_request_hex_template = "%(dst_mac)s%(src_mac)s08060001080006040001" \ "%(sender_mac)s%(sender_ip)s%(target_mac)s%(target_ip)s" + "00" * 18 packet = arp_request_hex_template % { "dst_mac": "aa"*6, "src_mac": "bb"*6, "sender_mac": "bb"*6, "target_mac": "cc"*6, # 192.168.0.1 "sender_ip": "c0a80001", # 192.168.0.2 "target_ip": "c0a80002" } # Send the packet (ethernet frame with an arp request) on the interface WinPcapUtils.send_packet("*Ethernet*", bytes.fromhex(packet))
3、收数据
from winpcapy import WinPcapUtils # Example Callback function to parse IP packets def packet_callback(win_pcap, param, header, pkt_data): # Assuming IP (for real parsing use modules like dpkt) ip_frame = pkt_data[14:] # Parse ips src_ip = ".".join([str(ord(b)) for b in ip_frame[0xc:0x10]]) dst_ip = ".".join([str(ord(b)) for b in ip_frame[0x10:0x14]]) print("%s -> %s" % (src_ip, dst_ip)) WinPcapUtils.capture_on("*Ethernet*", packet_callback)
指定网卡名称
from winpcapy import WinPcap device_name = '\\Device\\NPF_{AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE}' with WinPcap(device_name) as capture: capture.send(bytes.fromhex('ff'*6))
git链接
https://github.com/orweis/winpcapy -
python 抓包保存为pcap文件并解析的实例
2020-09-19 00:06:40今天小编就为大家分享一篇python 抓包保存为pcap文件并解析的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
Python Charles抓包配置实现流程图解
2020-12-16 23:06:01配置 大佬的博客真的很详细很详细,我就不重复造轮子了,看这里 补充解释 在这一步疑问很多,大佬说的不是很详细,就由我来补充下吧~ ... 之后会这样提示:我们要记住图中的红色方框圈起来的! 第一个是手机代理IP和... -
Python抓包
2021-12-06 08:15:05Python抓包使用Python进行数据爬取时,很多情况下需要登录或需要某些Cookie,如果直接从浏览器中复制Cookie的话每次都要重新复制,使用selenium比较慢,这样很麻烦。因此考虑使用Python抓包,这样的话每次只需要在程序运行后手动登录或点击一次,下面就可以自动进行了。
依赖的包
- scapy (用于抓包)
- dpkt (用于分析)
- socket (用于获取数据包的IP)
抓包代码
from scapy.sendrecv import sniff from scapy.utils import wrpcap import dpkt import socket ifs = 'Intel(R) Ethernet Connection (5) I219-LM' # 网卡 ip_dst = 'xx.xx.xx.xx' # 目标ip地址 d = sniff(iface=ifs, count=10) wrpcap("demo.pcap", d) #保存为pcap文件
分析代码
可以使用dpkt或scapy中的rdpcap进行分析
scapy中rdpcap分析
d = rdpcap('demo.pcap') res = [] for pkt in d.res: try: # 只要应用层数据包,因此如果不包含应用层数据包则进入except IP_pkt = pkt.payload # 获取IP层数据包 TCP_pkt = IP_pkt.payload # 获取TCP层数据包 Raw_pkt = TCP_pkt.payload # 获取应用层数据包 data = Raw_pkt.load # 获取包内具体数据 res.append(data.decode(errors='ignore')) # Bytes解码为str except AttributeError: pass for r_i in range(len(res)): # 上面得到的数据每一条都是不完整的,下面就是进行具体筛选和拼接 getIndex = res[r_i].find('*****这里放入筛选语句') if getIndex != -1: p_get = res[r_i][getIndex:-1] count = 1 while res[r_i + count].find(r'HTTP/1.1 200 OK') == -1: # 直到遇到下一个数据包开头 p_get += res[r_i + count] count += 1 break
dpkt分析
cookie = '' with open("demo.pcap", "rb") as f: pcap = dpkt.pcap.Reader(f) for timestamp, buf in pcap: eth = dpkt.ethernet.Ethernet(buf) # 获得以太包,即数据链路层包 if not isinstance(eth.data, dpkt.ip.IP): # 判断是否是网络层数据 continue ip = eth.data dst_ip = socket.inet_ntoa(ip.dst) if dst_ip == ip_dst and isinstance(ip.data, dpkt.tcp.TCP): # 判断是否是传输层且是否符合目标IP(使用sniff过滤器也是一样的) tcp = ip.data try: request = dpkt.http.Request(tcp.data) # 请求包 for key, value in request.headers.items(): # 请求头 if key == 'cookie': cookie = value print(f'找到Cookie = {cookie}') except (dpkt.dpkt.NeedData, dpkt.dpkt.UnpackError): continue if cookie != '': break if cookie != '': try: # 这里放置测试采集代码 print('Cookie正确,开始采集数据') break except: cookie = '' print('Cookie不正确,继续获取')
全部代码
ifs = 'Intel(R) Ethernet Connection (5) I219-LM' # 网卡 ip_dst = 'xx.xx.xx.xx' # 目标ip地址 while 1: d = sniff(iface=ifs, count=100) wrpcap("demo.pcap", d) #保存为pcap文件 cookie = '' with open("demo.pcap", "rb") as f: pcap = dpkt.pcap.Reader(f) for timestamp, buf in pcap: eth = dpkt.ethernet.Ethernet(buf) # 获得以太包,即数据链路层包 if not isinstance(eth.data, dpkt.ip.IP): # 判断是否是网络层数据 continue ip = eth.data dst_ip = socket.inet_ntoa(ip.dst) if dst_ip == ip_dst and isinstance(ip.data, dpkt.tcp.TCP): # 判断是否是传输层且是否符合目标IP tcp = ip.data try: request = dpkt.http.Request(tcp.data) # 请求包 for key, value in request.headers.items(): # 请求头 if key == 'cookie': cookie = value print(f'找到Cookie = {cookie}') except (dpkt.dpkt.NeedData, dpkt.dpkt.UnpackError): continue if cookie != '': break if cookie != '': try: # 这里放置测试采集代码 print('Cookie正确,开始采集数据') break except: cookie = '' print('Cookie不正确,继续获取')
-
python实现——windows下批量抓包
2021-12-16 18:35:05希望能有一个工具简化抓包过程。 思路1:本地开启web服务,如果是开启wireshark,然后批量爬虫的话,会得到包含多个追踪流的数据包,如果借助scapy进行拆包,要处理的异常情况太多。放弃。 思路2:使用sniffer抓包。...需求描述
最近项目支撑,需要针对各类ms漏洞、webshell、k8等工具编写防御规则,我们统一把恶意工具下载到本地,在本地开一个web服务。每针对一个工具开发一条规则,就需要捕获一个数据包,而且必须是经过过滤处理的单独的数据包。希望能有一个工具简化抓包过程。
思路1:本地开启web服务,如果是开启wireshark,然后批量爬虫的话,会得到包含多个追踪流的数据包,如果借助scapy进行拆包,要处理的异常情况太多。放弃。
思路2:使用sniffer抓包。缺陷是存在漏包,访问了某个地址之后,产生的流量没有被sniffer抓到。
思路3:使用tcpdump。缺陷是每次工作都得开个虚拟机,并且不便于移植到同事的电脑上。
思路4:使用windump,一个windows版本的tcpdump。缺陷是:我物理机下不能运行,虚拟机运行时,过滤器与保存文件的操作不能同时使用,工具的奇怪bug太多。
思路5:使用tshark实现windows下抓包,代替tcpdump 😃
实现逻辑
tshark相当于是命令行版的wireshark,不需要额外安装,在安装wireshark的时候就会安装上这个工具。那么,先开启tshark抓包,然后python爬取一个目标路径,最后tshark停止抓包,并将抓取的内容写入到电脑上。这里最大的问题是如何停止抓包,我是用的方法是设置抓包时间,让它到时间就停止。
关于tshark:
- tshark的位置
请使用Everything等工具直接搜索出来。 - 使用
tshark.exe -D
命令查看电脑上有哪些网卡。
我这里是以太网抓包,因此脚本中指定\Device\NPF_{FA29BC17-7BFC-4CE8-BB48-71174A6BDA54}
即可指定抓取的网卡是以太网
\Device\NPF_{FA29BC17-7BFC-4CE8-BB48-71174A6BDA54}
这串东西是接口名称,通过wireshark可以看到,如下图,点击一下“管理接口”即可看到。
代码设计
我一开始设计的是windump,tshark的代码是同事做的,这里介绍的是tshark,使用中有些注意事项:
工具总共涉及到3个文件:脚本、脚本配置文件、目标url地址。
只需修改配置文件和目标url地址即可,脚本无需修改(注意安装相关库文件),可以直接运行。- 填写配置文件:
cfg.yaml
指明tshark的绝对路径
指明要抓包的网卡接口名称
指明本机地址,充当捕获过滤器
指明服务器,即目的地址,既用来拼接爬虫url,又用来充当捕获过滤器
# tshark 路径 tshark_path: "D:\\Program Files\\Wireshark\\tshark.exe" # 网卡名称(tshark -D 查看网卡) iface: r"\Device\NPF_{FA29BC17-7BFC-4CE8-BB48-71174A6BDA54}" # 本机ip地址 localhost: "10.71.35.238" # 服务器IP serverIP: "10.8.144.32" # 服务器端口 port: "8085"
- 填写url地址:
item.txt
下面的地址用来跟cfg.yaml
中的服务器IP进行拼接
/webtrojan/web-malware-collection-13-06-2012/PHP/SyRiAn.Sh3ll.v7.txt /webtrojan/web-malware-collection-13-06-2012/PHP/ugdevil.v2.0.txt /webtrojan/web-malware-collection-13-06-2012/PHP/up.php /webtrojan/web-malware-collection-13-06-2012/PHP/uploader.txt
- 脚本内容如下:
要注意修改第80行的休眠时间,休眠时间过短的话,有可能抓不到包
import threading import time import requests import os import yaml from subprocess import PIPE, Popen # 导入配置文件 def load_cfg(): with open('cfg.yaml', 'r', encoding='utf-8') as f: con = f.read() cfg = yaml.safe_load(con) # print(cfg['tshark_path']) return cfg # 爬虫批量访问指定url def request_url(url): url = 'http://' + url try: res = requests.get(url=url, timeout=5) except: print('failed to get' + url) return False if res.status_code == 200: return True else: print('访问失败,请重试:' + url) # 使用tshark抓包 def tshark_cap(filename): # 提取url中最后一个斜线后面的内容作为文件名。如果文件名存在空格,就进行替换 filename = filename.replace(' ', '_') # 默认是一个空格,如果文件名中存在多个空格,请手动更改url或者修改代码 filename = filename + '.pcap' # 拼接出文件名 file_path = 'pcaps/' # 抓包的包放在pcaps文件夹下。pcaps是与脚本在同一路径下 file = file_path + filename # 拼接出文件的绝对路径 cfg = load_cfg() tshark_path = cfg['tshark_path'] tshark_path = tshark_path.strip() iface = cfg['iface'] iface = iface.strip() localhost = cfg['localhost'] localhost = localhost.strip() serverIP = cfg['serverIP'] serverIP = serverIP.strip() filt = '"host ' + localhost + ' and host ' + serverIP + '"' # 拼接出过滤器,用来过滤数据包 command = tshark_path + ' -i ' + iface + ' -f ' + filt + ' -a duration:2 -w ' # 设定tshark抓包2秒,2秒之后自动关闭 # command = r'"C:\\Program Files\\Wireshark\\tshark.exe" -i \Device\NPF_{144EC01C-9E64-43EC-AFA0-531860514A37} -f "host 10.71.35.157 and host 10.253.251.97" -a duration:3 -w ' command = command + file # print(command) p = Popen(command, stdout=PIPE, stderr=PIPE) stdout, stderr = p.communicate() def main(): if not os.path.exists('pcaps'): os.mkdir('pcaps') print("请创建 item.txt 文件,并将表格中的内容粘贴进文件中....") os.system("pause") print('running....') with open('item.txt', 'rb') as f: contents = f.read() filenames = contents.decode('utf-8') filenames = filenames.split('\r\n') host = load_cfg()['serverIP'] + ":" + load_cfg()['port'] for filename in filenames: if len(filename) < 1: continue filename = filename.strip() url = host + filename pname = filename.split('/')[-1] req = threading.Thread(target=request_url, name='request', args=(url,)) cat = threading.Thread(target=tshark_cap, name='catpcap', args=(pname,)) cat.start() # 请注意,休眠时间不足的话,会导致抓到的数据包是空包 # 不同的电脑上,此时的休眠时间不同。我同事是2秒就行,我的是5秒才行. # 你需要通过输入不同的休眠时间来测试,究竟休眠多少时间才能抓到数据包 time.sleep(5) req.start() req.join() cat.join() # time.sleep(1) if __name__ == '__main__': print(''' 本工具为批量抓包工具,访问一次指定地址,抓一次数据包。 ============================================================== 使用说明: 安装wireshark时会默认安装“tshark.exe”(一个命令行版的wireshark), 你可以使用everything搜索出其位置,在终端中运行它,如“.\tshark.exe -D”获取本地网卡,选择你像抓取的网卡编号 脚本使用GET方法每访问一次目标地址,就会调用tshark抓一次包 数据包会导出在与脚本同目录下的“pcaps”文件夹下 1. 使用方法:python 批量抓包-1112项目专用.py 2. 注意:使用前请先配置 cfg.yaml(此文件需要与脚本位于同一目录下) 3. 在“item.txt”中输入你要访问的url地址(此文件需要与脚本位于同一目录下) ''') main() print('enjoy it :)') # os.system("pause")
效果演示
- tshark的位置
-
python实现linux下抓包并存库功能
2020-09-15 03:28:38主要为大家详细介绍了python实现linux下抓包并存库功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Python抓包程序mitmproxy安装和使用过程图解
2021-01-20 01:48:28一个是mitmdump,它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理。另一个是mitmweb,它是一个Web程序,通过它我们可以清楚观察mitmproxy捕获的请求。 mitmproxy的功能: 1、... -
python抓包_python 抓包_python 抓包库 - 云+社区 - 腾讯云
2020-12-02 13:22:19用python抓包实现知乎的私信发送功能!?...作者:elliot,一个有着全栈幻想的新零售产品经理github:https:github.combkidydida_spider说起python爬虫,很多人第一个反应可能会是scrapy或者pyspider,但是今天文章里... -
抓包_pythonsniff抓包_抓包_
2021-10-01 16:50:21获取指定网卡上数据刘,解析出其中的 tcp封包信息 -
python爬虫学习——HTTP抓包工具Fiddler
2022-03-30 22:06:14 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和... 简单的说,它是一款强大的Web调试工具(包含的抓包功能),能记录所有客户端和服务器的HTTP请求和响应,还能模拟HTTP请求的发送。 ... -
利用python socket实现五元组抓包实验数据
2021-03-16 17:14:04python socket实现多台主机的相互之间的tcp通信 -
python 网络抓包
2020-12-02 13:22:20Python下的网络抓包库pylibpcap、pypcap、pycap这些库其实这些都是libpcap的Python绑定实现,libpcap才是真正的核心。pypcap目前pypcap和pylibpcap比较流行,特别说一下pypcap在Linux上的编译安装时,首先用python ... -
http&https,python抓包知多少
2020-12-07 19:41:42https,python抓包知多少在有些情景下,需要拦截所有的http包和https数据包,http包很好抓,但是https包相对比较复杂,在此文章中,主要介绍http和https混合代理。首先简单介绍下https,https=http+ssl,整体认证过程很复杂... -
python基于winpcap的抓包和发包
2016-12-20 16:23:18该脚本使用python通过winpcap和网卡驱动交互,从而实现抓包和跨协议栈的发包功能; 在入口函数中增加了脚本使用说明和举例! s = SNIFFER(interface)#设置待监听的网卡 s.start()#设置启动线程开始监听网卡 time.... -
python tcp 实时抓包
2020-12-10 12:59:56问题:之前我们系统上线后,因为是旧的系统,没有加统计的功能,比如用户喜欢那个页面,是哪些...3,采用python脚本来处理,直接抓包80端口,加上一些处理,入库之内。环境搭建:1,使用到的第三方包:dpkt-1.8.8.ta... -
python如何抓包
2020-12-10 13:38:55系统环境:windows7,选择windows系统是因为我对自己平时日常机器上的流量...如果你习惯于用python3,数据包的分析完全可以放在3下面做,因为抓包和分析是两个完全独立的过程。需要的python包:scapy和dpkt抓包代码... -
调用wireshark接口(tshark.exe)抓包,实现深度自定义,使用python处理抓包数据
2022-04-14 11:34:07network_name, item_filter): """ :param network_name: 网卡名称 :param item_filter: 抓包过滤条件/规则同wireshark """ tshark_path = r"D:\Program Files\Wireshark\tshark.exe" # wireshark安装路径下的tshark... -
【python教程入门学习】浏览器实现抓包过程详解
2021-10-11 19:13:40几乎所有浏览器都提供了抓取数据包的功能,因为浏览器为抓包提供了一个专门的操作界面,因此这种抓包方式也被称为“控制台抓包”。本节以 Chrome 浏览器为例进行抓包演示。 控制台抓包指的是利用浏览器开的发者调试... -
python学习笔记——pcap抓包
2020-12-02 13:22:19今天看看如何用python实现抓包。以前我们曾用过winpcap实现抓包,其实今天我们还是用它,只不过是它在python下的模块,在用之前我们必须先下载两个库,pcap库和dpkt库,这个可以在Googlecode里很容易找到,需要注意... -
fiddler4_3259_python抓包_fildder结合python_fiddler_python开发工具_fiddle
2021-10-04 05:02:09抓包工具,结合python开发,实现网页流分析并抓包数据 -
Python爬虫抓包工具使用
2020-09-03 19:35:10Python爬虫抓包工具使用 一. 常用的工具 python pycharm 浏览器 chrome 火狐 fiddler 2 fiddler的使用 二. 操作界面 三.界面含义 1. 请求 (Request) 部分详解 2. 响应 (Response) 部分详解 四. 设置 1. 如何... -
python抓包(sniff)-----实现wireshark抓包功能
2020-10-31 20:19:39iface: 指定在哪个网络接口上抓包 count: 表示要捕获数据包的数量。默认为0(不限制数量) filter: 流量的过滤规则。使用的是BPF的语法 prn: 定义回调函数,使用lambda表达式来写回调函数(当符合filter的流量被捕获时... -
自己编写的简单网络协议解析器,用于抓包并解析数据包
2018-05-26 22:35:03在抓包的同时解析数据包(不能等抓包停止后才解析),可判断IP、TCP或UDP数据包的校验和是否正确;支持BPF过滤器,抓包过程可以暂停和停止;可将数据包存储在pcap文件中,以供wireshark或其它数据包解析工具分析;可以...