游客发表

python嗅探

发帖时间:2026-10-17 04:50:06

用 Python 做嗅探,嗅探最直接的嗅探入口是 socket 库。很多人以为嗅探需要什么高深工具,嗅探其实十几行代码就能抓到本机网卡上流过的嗅探数据包。前提是嗅探你得用 root 或管理员权限跑,否则系统不会把原始帧交给你。嗅探

先看一段能跑的嗅探东西:

import socket # AF_PACKET 是 Linux 下的原始套接字类型 s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3)) while True: raw, addr = s.recvfrom(65535) print(f"来自 { addr} 的 { len(raw)} 字节") print(raw[:14].hex()) # 以太网帧头 

这段代码在 Linux 上直接抓链路层帧。Windows 没这个接口,嗅探得换 WinPcap 或 Npcap 配合 scapy。嗅探Mac 又是嗅探另一套 BPF 设备。跨平台这事,嗅探Python 本身不帮你解决,嗅探得看底层系统给不给面子。嗅探

scapy 把门槛拉低了一截

手动解析以太网头、嗅探IP 头、嗅探TCP 头,写一次两次还行,多了就烦。scapy 直接给你现成的分层对象。抓一个包看看:

from scapy.all import sniff def show(pkt): print(pkt.summary()) sniff(prn=show, count=5) 

五行代码,终端里就会刷出类似 Ether / IP / TCP 10.0.0.5:443 > 10.0.0.1:52344 A 的东西。我第一次跑通的时候盯着屏幕看了半天——原来自己浏览器的每个请求都这么赤裸裸地躺在那里。

scapy 还能干更多。比如只抓 DNS 查询:

sniff(filter="udp port 53", prn=lambda x: x.show()) 

那个 filter 参数走的是 BPF 语法,和 tcpdump 一模一样。会 tcpdump 的人几乎零成本迁移。

抓包只是第一步,解析才是体力活

原始字节流拿到手,真正的麻烦才刚开始。以太网帧头 14 字节,后面跟着 IP 头,IP 头长度不固定因为有选项字段。TCP 头又是 20 字节起步。你得一层层剥。

我写过一个简易解析器,专门看 TCP 载荷里有没有 HTTP 明文。结果发现大部分流量是 TLS 加密的,能直接读的只有 DNS 和一些老旧的 HTTP 站点。这年头,嗅探到的内容比十年前少太多了,全赖 HTTPS 普及。

不过这不妨碍做流量分析。看包的大小分布、时间间隔、源目地址对,照样能画出网络行为画像。比如某台机器每隔 30 秒向一个固定 IP 发 200 字节的包,基本可以判断是心跳或者遥测。

无线那块更麻烦

有线网卡设成混杂模式就能听到同一冲突域的所有帧。无线不一样,802.11 帧默认只收发给自己的。想抓全量得开监听模式,还得看网卡驱动支不支持。我用过一块 RT3070 的老卡,在 Kali 下 iwconfig wlan0 mode monitor 就能切过去。换到新款 Intel 无线网卡,驱动直接告诉你“不支持”。

Python 调无线嗅探,通常还是 scapy 加系统命令切换模式,或者干脆调 tcpdump 子进程。纯 Python 操作无线网卡固件,目前没什么优雅方案。

几个实际会踩的坑

抓包程序跑久了内存会涨。scapy 默认把包存在内存里,得设 store=0。有次我忘了加,跑了半小时吃掉 2G 内存。

还有权限。Linux 下要么 sudo,要么给 Python 解释器加 CAP_NET_RAW 能力。后者更安全,但配置起来多一步。

最后是性能。Python 解析高吞吐流量会丢包。千兆网卡满速跑,scapy 的 sniff() 跟不上。真要干活,还是 tcpdump 写盘,Python 事后读 pcap 文件分析。分工明确,各干各擅长的。

嗅探这件事,工具越方便,你能看到的反而越少——加密把内容藏起来了。但流量模式、协议分布、异常行为这些东西,加密藏不住。Python 在这层的价值,是让你用最少的代码把数据捞出来,剩下的靠脑子想。

    热门排行

    友情链接