reverse-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
148
vendor-new/rev-skills/.claude/skills/re-netcap/SKILL.md
Normal file
148
vendor-new/rev-skills/.claude/skills/re-netcap/SKILL.md
Normal file
@@ -0,0 +1,148 @@
|
||||
---
|
||||
name: re-netcap
|
||||
description: >
|
||||
网络流量捕获:tcpdump/Wireshark/抓包。
|
||||
触发词:抓包、tcpdump、wireshark、流量分析、pcap
|
||||
capabilities: [network-capture]
|
||||
---
|
||||
|
||||
# 网络流量捕获
|
||||
|
||||
## 何时使用 / 何时不用
|
||||
|
||||
- 用:任何需要拿到网络流量的任务——恶意样本回连观察、固件通信分析、协议逆向的原料获取
|
||||
- 用:已有 pcap 需要导出/统计/过滤(tshark 环节)
|
||||
- 用:HTTPS/TLS 通信需要解密看明文(mitmproxy 中间人)
|
||||
- 不用:流量已解密/无加密且只要协议语义(直接 [[re-proto-rev]])
|
||||
- 不用:样本不联网(静态分析先做 [[re-triage]])
|
||||
- 不用:只要抓一个包的 quick look(`tcpdump -i any -c N` 一次搞定,不必搭全流程)
|
||||
|
||||
## 工具准备
|
||||
|
||||
所有工具先验证再使用。运行样本抓包默认在沙箱内([[re-sandbox]] 网络隔离,[[re-analyze/platform-tips]] 最高原则)——捕获环境与隔离环境要同时就绪。
|
||||
|
||||
### tcpdump —— 命令行抓包主力
|
||||
|
||||
- Linux: `apt install tcpdump` / `dnf install tcpdump` / `pacman -S tcpdump`
|
||||
- macOS: `brew install tcpdump`(或系统自带版本)
|
||||
- Windows/WSL: WSL 内 Linux 版;Windows 本机用 Wireshark 或 Npcap 自带 dumpcap
|
||||
- 验证: `tcpdump --version`;`tcpdump -D` 列出接口
|
||||
|
||||
### wireshark / tshark —— GUI + CLI 分析(tshark 用于导出与统计)
|
||||
|
||||
- Linux: `apt install wireshark tshark` / `dnf install wireshark-cli wireshark` / `pacman -S wireshark-cli wireshark-qt`(Arch 已拆分为 wireshark-cli + wireshark-qt;Debian 安装时选"允许非 root 抓包",或 `sudo dpkg-reconfigure wireshark-common` 后把用户加入 wireshark 组)
|
||||
- macOS: `brew install --cask wireshark`(含 tshark CLI;或 `brew install wireshark` 仅 CLI)
|
||||
- Windows: `choco install wireshark`(或官方安装包);WSL 内用 Linux 版
|
||||
- 验证: `tshark --version`;`tshark -D` 列出接口;`dumpcap -D`
|
||||
- 同族 CLI:`capinfos`(pcap 元信息:包数/时长/截断)、`mergecap`(合并)、`editcap`(切分/去重/改写时间戳),随 Wireshark 一起安装
|
||||
|
||||
### mitmproxy —— HTTPS/TLS 中间人解密
|
||||
|
||||
- 全平台: `pip install mitmproxy`(**当前 12.x 要求 Python >=3.12**;旧 Python 环境需 pin 对应的旧版本)
|
||||
- macOS: `brew install mitmproxy`
|
||||
- Windows: pip 版即可(或官方安装包);WSL 内 pip 版
|
||||
- 验证: `mitmproxy --version`;`mitmdump --version`
|
||||
|
||||
### nfqueue —— 内核态流量转发/中间人抓包点(Linux)
|
||||
|
||||
- Linux: `apt install iptables libnetfilter-queue1 python3-netfilterqueue` / `dnf install iptables libnetfilter_queue-devel python3-netfilterqueue` / `pacman -S iptables libnetfilter_queue python-netfilterqueue`;或 `pip install NetfilterQueue`(需内核 nfnetlink_queue 支持)
|
||||
- macOS/Windows: 不支持(用 WSL2 内核或 Linux VM 做转发点)
|
||||
- 验证: `python3 -c "from netfilterqueue import NetfilterQueue"`;`iptables -L -n | grep -i NFQUEUE` 能看到规则
|
||||
|
||||
## 操作步骤
|
||||
|
||||
按顺序执行,每步记下结果。捕获产物(pcap 路径 + sha256)存档供 [[re-proto-rev]] / [[re-crypto-decrypt]] 使用。
|
||||
|
||||
1. **选择抓包点(本机 / 网关 / 中间人)**:
|
||||
- 本机: 目标程序跑在本机 → `tcpdump -i eth0 host <目标IP>`(或 Wireshark 选接口直接抓)
|
||||
- 网关/转发点: 目标在沙箱 VM / 其他主机 → 在网关主机或 VM 虚拟网卡(virbr0 / vboxnet0)抓,`tcpdump -i virbr0`
|
||||
- 中间人: 需要看 HTTPS 明文 → mitmproxy 透明代理把目标流量强制引到本机(见步骤 4、5);纯包级截获(不拆 TLS)才用 nfqueue handler
|
||||
- 沙箱场景: 抓包点在沙箱虚拟网卡 + [[re-sandbox]] 的 INetSim/fake DNS 落点(见步骤 5)
|
||||
- 决策记录:写下抓包点与理由(为什么这个点能同时看到请求与响应)
|
||||
|
||||
2. **tcpdump 过滤语法(先过滤再存盘)**:
|
||||
```sh
|
||||
sudo tcpdump -i eth0 -w out.pcap # 全量(先别这么干,见坑 4)
|
||||
# 常用过滤:
|
||||
sudo tcpdump -i eth0 host 1.2.3.4 -w out.pcap # 按 IP
|
||||
sudo tcpdump -i eth0 port 443 -w out.pcap # 按端口
|
||||
sudo tcpdump -i eth0 host 1.2.3.4 and tcp port 8080 # 组合,先屏显验证再存
|
||||
sudo tcpdump -i eth0 -c 500 -w out.pcap # 限包数
|
||||
```
|
||||
- BPF 语法要点:`and/or/not`、`host/port/proto`、括号分组;先不带 `-w` 屏显验证过滤命中目标再写盘
|
||||
- 组合多个条件用括号: `tcpdump -i eth0 '(host 1.2.3.4 or host 5.6.7.8) and not port 53' -w out.pcap`
|
||||
- 抓包期选项:`-n` 禁反向 DNS 解析(避免解析延迟与结果污染);`-s 200` 限定捕获长度(默认 262144 全包长);长时抓包加 `-C 100 -W 10` 按 100MB 轮转、保留 10 个文件防爆盘
|
||||
|
||||
3. **tshark 导出与统计(从已有 pcap 提取关键流)**:
|
||||
```sh
|
||||
tshark -r out.pcap -T fields -e ip.src -e ip.dst -e tcp.dstport | sort | uniq -c | sort -rn # 会话统计(目标端口字段名是 tcp.dstport / tcp.port,不存在 tcp.dport 字段)
|
||||
tshark -r out.pcap -Y 'http.request' -T fields -e http.host -e http.request.uri # 只看 HTTP 请求
|
||||
tshark -r out.pcap -Y 'tls.handshake.type == 1' -T fields -e tls.handshake.extensions_server_name # SNI
|
||||
tshark -r out.pcap -q -z conv,tcp -z io,phs # 会话表 + 协议层级统计(-q 静默,只出统计)
|
||||
tshark -r out.pcap -T json -e ip.src -e dns.qry.name -Y dns | jq . # JSON 输出(脚本后续处理)
|
||||
tshark -r out.pcap -w filtered.pcap -Y 'ip.addr == 1.2.3.4' # 按显示过滤导出子集(display filter 语法,`host` 是 BPF 捕获语法不适用)
|
||||
capinfos out.pcap # pcap 元信息:包数/时长/是否截断
|
||||
```
|
||||
- 字段名以 `tshark -G fields | grep <关键字>` 核验为准——写错字段名 tshark 直接报 "Some fields aren't valid",不会静默
|
||||
- 统计结论(会话数、协议分布、异常连接)记入分析笔记,是 [[re-proto-rev]] 步骤 1 的输入
|
||||
- 复杂交互分析(Follow TCP Stream、协议解码跳转)用 Wireshark GUI 打开同一 pcap
|
||||
|
||||
4. **HTTPS 解密准备(mitmproxy CA)**:
|
||||
```sh
|
||||
mitmproxy -p 8080 --mode transparent # 透明模式(配合步骤 5 的 nat REDIRECT 引流)
|
||||
# 或
|
||||
mitmproxy --set console_eventlog_verbosity=error --listen-port 8080 --mode regular # 常规代理模式
|
||||
```
|
||||
- 首次运行生成 CA 于 `~/.mitmproxy/mitmproxy-ca-cert.pem`;把该 CA 装进目标系统/进程信任库(沙箱内 `cp mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/ && update-ca-certificates`)
|
||||
- 验证: 目标进程访问 HTTPS 站点,mitmproxy 界面出现明文请求(未出现 = 证书未信任或流量没引过来,见坑 2)
|
||||
- 目标进程需要代理时: 设置 `HTTP_PROXY`/`HTTPS_PROXY` 环境变量或系统代理;不走代理的进程用透明模式
|
||||
|
||||
5. **沙箱内隔离抓包([[re-sandbox]] 网络隔离)**:
|
||||
- 前置:按 [[re-sandbox]] 步骤 2 做**默认拒绝出站(default-deny egress)**——只放行分析基础设施(INetSim / 代理 / 抓包主机)的白名单,其余出站一律丢弃。**不要用"断网 / fake DNS / INetSim 三选一"的心智模型**,三者解决的不是同一件事:
|
||||
- **纯断网**(Host-only / `--net=none`):样本根本无法回连——**要抓 C2 就不能纯断网**
|
||||
- **fake DNS**(/etc/hosts 或 dnsmasq):只影响域名解析,**挡不住硬编码 IP 的 C2**
|
||||
- **INetSim**:模拟服务,但如果不是"默认拒绝 + 只放行它",样本仍可能直连真实网络
|
||||
- 正确形态:**默认拒绝 + 白名单到 INetSim**(示例按实际网段调整):
|
||||
```sh
|
||||
sudo iptables -P FORWARD DROP # 默认拒绝转发(或等价的路由/防火墙策略)
|
||||
sudo iptables -A FORWARD -d <INetSim_IP> -j ACCEPT # 只放行到分析基础设施
|
||||
sudo iptables -A FORWARD -s <INetSim_IP> -j ACCEPT
|
||||
```
|
||||
- 抓包点:INetSim 主机侧抓全量(`tcpdump -i eth0 -w c2.pcap`),同时拿到样本请求与模拟响应——C2 分析标准做法
|
||||
- 验证:**必须分三条独立验证,且 `ping 不通`不构成任何一条**(ICMP 与 TCP/UDP 是不同通路,被分别放行/阻断是常态):
|
||||
- **TCP 出站**:从沙箱内 `nc -zv <外部IP> 443` 应失败
|
||||
- **UDP 出站**:从沙箱内 `nc -zuv <外部IP> 53` 应失败(UDP 最常被漏测)
|
||||
- **硬编码 IP 直连**:不依赖 DNS 直接连外部 IP,仍应失败(对应"fake DNS 挡不住硬编码 C2")
|
||||
- 同时确认:沙箱内样本回连被 INetSim 记录,且 pcap 有对应流量([[re-analyze/platform-tips]] 最高原则)
|
||||
- 需要透明代理(mitmproxy)时用 nat REDIRECT 引流到其监听端口(mitmproxy 不消费 NFQUEUE 队列):
|
||||
```sh
|
||||
sudo sysctl -w net.ipv4.ip_forward=1
|
||||
# 明文 HTTP 与 TLS 两条都要引——只写 80 是最常见的失误:目标访问 443 时根本不会进入 mitmproxy
|
||||
sudo iptables -t nat -I PREROUTING -p tcp -m multiport --dports 80,443 -j REDIRECT --to-port 8080 # 网关入口
|
||||
sudo iptables -t nat -I OUTPUT -p tcp -m multiport --dports 80,443 -j REDIRECT --to-port 8080 # 本机出站(按需)
|
||||
# 样本可能使用非标准 TLS 端口(8443 等)或纯明文的其它端口——按实际观测补齐,或直接对全部 TCP 引流
|
||||
```
|
||||
mitmproxy 以透明模式监听 8080 承接;分析完清理 nat 规则并还原 ip_forward
|
||||
- NFQUEUE 仅留给显式绑定的用户态 handler(如 python `netfilterqueue` 对每个包返回 verdict),无 handler 时流量阻塞:
|
||||
```sh
|
||||
sudo iptables -I FORWARD -j NFQUEUE --queue-num 1 # 转发链
|
||||
sudo iptables -I OUTPUT -j NFQUEUE --queue-num 1 # 本机出站(按需)
|
||||
```
|
||||
分析完需同时删除 FORWARD 与 OUTPUT 两条规则
|
||||
|
||||
## 跨域联合
|
||||
|
||||
- [[re-protocol]]:本技能是其工作流第 1 步(捕获)——所有协议分析的原料入口
|
||||
- [[re-malware]]:C2 回连捕获——re-malware 工作流第 4 步的捕获环节,配合 [[re-sandbox]] INetSim/fake DNS 环境
|
||||
- [[re-firmware]]:固件通信捕获——仿真环境的虚拟网卡抓包([[re-fw-emulate]] 启动后在本机抓)
|
||||
- [[re-sandbox]]:网络隔离是捕获的前置(INetSim / fake DNS / 断网),防真外联([[re-analyze/platform-tips]] 最高原则)
|
||||
- 捕获产物供 [[re-proto-rev]](明文)与 [[re-crypto-decrypt]](密文)消费
|
||||
|
||||
## 常见坑与陷阱
|
||||
|
||||
- **沙箱网络不隔离 → 真外联**:现象——样本真实访问了外网 C2,行为结果与流量都不可信;原因——跳过 [[re-sandbox]] 网络隔离直接联网跑(NAT 默认允许出站),**或只做了"断网 / fake DNS / INetSim"其中之一就以为隔离完成**(三者不等价:纯断网抓不到 C2、fake DNS 挡不住硬编码 IP);对策——抓包前落地**默认拒绝出站 + 白名单到分析基础设施**,并**分别**验证 TCP、UDP、硬编码 IP 直连三条路径都不通——**只测 `ping` 不构成结论**(ICMP 与 TCP/UDP 是不同通路)
|
||||
- **TLS/HTTPS 抓包只见密文**:现象——pcap 里全是 TLS 握手与加密记录,看不到明文协议内容;原因——没有中间人,TLS 会话两端加密;对策——步骤 4 上 mitmproxy 透明/常规代理,目标信任 mitmproxy CA 后再抓,界面应出现明文
|
||||
- **过滤表达式写错漏关键流**:现象——抓了半天 pcap 里没有目标流量(比如只按了 IP 没按端口,或 `and/or` 优先级用错);原因——BPF 语法组合错误且没先屏显验证;对策——先不带 `-w` 屏显跑几秒确认命中目标(IP/端口/方向都对)再写盘
|
||||
- **抓包文件巨大 → 分析卡死**:现象——全量抓包 pcap 几十 GB,tshark 统计/导出长时间无响应;原因——没先过滤就存盘(步骤 2 的正确做法是先过滤再存);对策——用 BPF 过滤 + `-c` 限包数 + `-s` 限捕获长度,先按会话统计缩小范围再导出子集(步骤 3)
|
||||
- **DoH/DoT 回连抓不到查询内容**:现象——fake DNS/INetSim 日志零查询,pcap 里只有到 dns.google / cloudflare-dns.com 的 443(DoH)或 853(DoT/DoQ)密文流,样本回连域名线索完全缺失;原因——样本实现自有 DNS 客户端直连加密解析器,不经系统 resolver——DNS 层监控看不到查询,内容又被 TLS 加密;对策——把"已知 DoH 端点 + 无 SNI 的 TLS 握手 + 非浏览器进程直连 DoH 解析器"当 C2 信号捕获(DoT/DoQ 的 853 端口可防火墙直断,DoH 只能重定向端点 IP 或 mitmproxy 中间人 443),配合信标周期分析补内容缺失,单凭"查询内容"定位回连在此场景不成立
|
||||
- 命令族速查与操作序列见 [[commands]];工具特有坑与版本差异见 [[gotchas]]
|
||||
@@ -0,0 +1,113 @@
|
||||
# tcpdump / tshark / mitmproxy 命令速查与操作序列
|
||||
|
||||
工具族分工:tcpdump(捕获 + BPF 捕获过滤)→ tshark/capinfos(pcap 分析与导出)→ mitmproxy(TLS 中间人)。字段名一律用 `tshark -G fields | grep <关键字>` 核验;显示过滤语法随版本演进(4.x 变化见 [[gotchas]])。
|
||||
|
||||
## 命令族速查
|
||||
|
||||
### tcpdump —— 捕获(BPF 捕获过滤,内核侧生效)
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| 列接口 | `tcpdump -D` / `dumpcap -D` |
|
||||
| 按 IP 抓 | `sudo tcpdump -i eth0 host 1.2.3.4 -w out.pcap` |
|
||||
| 按端口抓 | `sudo tcpdump -i eth0 port 443 -w out.pcap` |
|
||||
| 组合 + 排除 | `sudo tcpdump -i eth0 '(host A or host B) and not port 53'`(shell 里括号要引号) |
|
||||
| 限包数 | `-c 500` |
|
||||
| 禁反向解析 | `-n`(`-nn` 连端口服务名也不解析) |
|
||||
| 限捕获长度 | `-s 200`(默认 262144 全包长) |
|
||||
| 轮转写盘 | `-C 100 -W 10`(100MB×10 文件);`-G 60 -w out-%H%M%S.pcap`(按秒切) |
|
||||
| 离线读 | `tcpdump -r out.pcap -n -c 20` |
|
||||
| 抓回环 | `-i lo`(本机自连流量必经) |
|
||||
| 抓所有接口 | `-i any`(多网卡排障先用它) |
|
||||
|
||||
### tshark —— 分析/导出(显示过滤,用户态生效)
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| 字段导出 | `tshark -r f.pcap -T fields -e ip.src -e ip.dst -e tcp.dstport` |
|
||||
| 显示过滤 | `-Y '<filter>'`(如 `ip.addr == 1.2.3.4`、`tcp.port == 8080`、`dns.qry.name contains "evil"`) |
|
||||
| 会话统计 | `-q -z conv,tcp`(`conv,ip` 按 IP 对) |
|
||||
| 协议层级 | `-q -z io,phs` |
|
||||
| HTTP 请求列表 | `-Y 'http.request' -T fields -e http.host -e http.request.uri` |
|
||||
| SNI 列表 | `-Y 'tls.handshake.type == 1' -T fields -e tls.handshake.extensions_server_name` |
|
||||
| DNS 查询名 | `-Y dns -T fields -e dns.qry.name` |
|
||||
| JSON 输出 | `-T json -e ip.src -e dns.qry.name -Y dns \| jq .`(脚本消费) |
|
||||
| 导出子集 pcap | `-w sub.pcap -Y '<display filter>'` |
|
||||
| 字段名查证 | `tshark -G fields \| grep -P '\t<字段名>\t'` |
|
||||
|
||||
### capinfos / mergecap / editcap —— pcap 管理(同族)
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| pcap 元信息 | `capinfos f.pcap`(包数/时长/时间戳范围/截断标志) |
|
||||
| 合并 | `mergecap -w all.pcap a.pcap b.pcap` |
|
||||
| 切分 | `editcap -c 100000 big.pcap split`(每 10 万包一个文件) |
|
||||
| 改写时间戳 | `editcap -t +2 f.pcap out.pcap`(漂移校正) |
|
||||
|
||||
### mitmproxy —— TLS 中间人
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| 常规代理 | `mitmproxy --listen-port 8080 --mode regular` |
|
||||
| 透明代理 | `mitmproxy -p 8080 --mode transparent`(配合 nat REDIRECT 引流) |
|
||||
| 脚本化 | `mitmdump -s script.py`(Python 插件:记录/改写请求) |
|
||||
| 无界面面板 | `mitmweb`(浏览器查看实时流) |
|
||||
|
||||
### NFQUEUE —— 内核态包截获/转发点
|
||||
|
||||
```sh
|
||||
sudo iptables -I FORWARD -j NFQUEUE --queue-num 1 # 转发链
|
||||
sudo iptables -I OUTPUT -j NFQUEUE --queue-num 1 # 本机出站(按需)
|
||||
# 用户态 handler(python NetfilterQueue)逐包 verdict;无 handler 时流量阻塞
|
||||
# 用完必须同时删除两条规则;TLS 中间人走 nat REDIRECT,不经 NFQUEUE(两套规则会互相干扰)
|
||||
```
|
||||
|
||||
## 常用操作序列
|
||||
|
||||
### 1. 沙箱内 C2 回连捕获(隔离 → 抓包 → 验证)
|
||||
|
||||
```
|
||||
[[re-sandbox]] 网络隔离(INetSim / fake DNS / 断网)就绪
|
||||
→ 抓包点:INetSim 主机或沙箱虚拟网卡,tcpdump -i eth0 -w c2.pcap
|
||||
→ 运行样本(沙箱内)→ 验证 ping 8.8.8.8 不通、INetSim 有查询日志、pcap 有流量
|
||||
→ tshark -q -z conv,tcp -z io,phs 出会话与协议分布 → 记入分析笔记
|
||||
```
|
||||
|
||||
### 2. HTTPS 明文解密(mitmproxy CA + 透明引流)
|
||||
|
||||
```
|
||||
mitmproxy -p 8080 --mode transparent(首次生成 ~/.mitmproxy/mitmproxy-ca-cert.pem)
|
||||
→ 沙箱内把 CA 装入信任库(cp ... && update-ca-certificates)
|
||||
→ sysctl net.ipv4.ip_forward=1 + iptables -t nat PREROUTING/OUTPUT REDIRECT --to-port 8080
|
||||
→ 运行目标 → 界面出现明文请求;未出现 = 证书未信任或流量没引过来
|
||||
→ 分析完清理 nat 规则并还原 ip_forward
|
||||
```
|
||||
|
||||
### 3. 大 pcap 分诊(先统计再子集)
|
||||
|
||||
```
|
||||
capinfos 看规模 → tshark -q -z conv,tcp 会话表 → -q -z io,phs 协议分布
|
||||
→ 按目标会话导出子集:tshark -w sub.pcap -Y 'ip.addr == X'
|
||||
→ 子集上 -T fields 提取 URL/SNI/长度 → 喂给 [[re-proto-rev]]
|
||||
```
|
||||
|
||||
### 4. 协议逆向原料导出(字段 → 结构化)
|
||||
|
||||
```
|
||||
tshark -r f.pcap -Y '<协议过滤>' -T fields -e <字段> -E header=y -E separator=, > flows.csv
|
||||
# 自定义协议逐层确认字段名(-G fields 查证),或 -T json 全量输出给 jq 提取
|
||||
```
|
||||
|
||||
## 实现教训(内化)
|
||||
|
||||
- 捕获过滤(-f/BPF)在内核侧丢弃不匹配包,误抓不可逆;显示过滤(-Y)pcap 仍在——宁宽抓窄析
|
||||
- 字段名是硬约束:写错直接报 "Some fields aren't valid" 或取不到值——用 `-G fields` 查,别凭记忆
|
||||
- 统计类结论用 `-q -z` 直接输出,别拿 `-T fields` 手工聚合
|
||||
- 中间人改变流量特征(TLS 指纹/证书/时序),目标有 TLS 指纹校验时会被发现(见 [[re-tls]])
|
||||
- 先屏显后写盘:`-w` 之前先不带 `-w` 跑几秒确认过滤命中
|
||||
|
||||
## 使用注意
|
||||
|
||||
- 全部在沙箱内执行([[re-analyze/platform-tips]] 最高原则);抓包前确认网络隔离就绪
|
||||
- 产物(pcap 路径 + sha256)入档([[re-triage]] 惯例);结论写 [[re-analyze/analysis-contract]]
|
||||
- 版本相关行为(显示过滤语法、字段名)以本机 Wireshark 版本为准(见 [[gotchas]])
|
||||
@@ -0,0 +1,41 @@
|
||||
# tcpdump / tshark / mitmproxy 工具特有坑与边界
|
||||
|
||||
## 捕获层:权限、丢包与轮转
|
||||
|
||||
- **普通用户抓不到包**:需要 CAP_NET_RAW——加 `sudo`,或 Debian 系把用户加入 wireshark 组(`sudo usermod -aG wireshark $USER` 后重登);WSL1 不支持原生抓包,WSL2 可用
|
||||
- **抓包点不在流量必经路径**:交换机端口/无线网卡不保证把流量镜像给本机——本机抓包只能看到本机收发;跨主机目标在网关/虚拟网卡(virbr0/vboxnet0)抓;物理旁路用 tap 或交换机镜像口
|
||||
- **轮转切文件丢会话**:`-C`/`-G` 轮转只按大小/时间切,不感知会话边界——长抓包后会话可能被腰斩,先 capinfos 核对时长再下结论
|
||||
- **接口选错静默无流量**:VM 桥接/多网卡宿主常见——先用 `tcpdump -i any` 确认流量在哪个接口出现
|
||||
|
||||
## 过滤层:语法与字段名
|
||||
|
||||
- **捕获过滤 ≠ 显示过滤**:`host`/`port`/`net` 是 BPF 语法,只能用于 `tcpdump -i` 与 `tshark -f`;`-Y` 与 Wireshark 过滤框用字段语法(`ip.addr == ...`/`tcp.port == ...`)——混用报 filter error 或静默无结果
|
||||
- **字段名易错三例**:`tcp.dport` 不存在(合法名 `tcp.dstport`/`tcp.srcport`/`tcp.port`,`tshark -e tcp.dport` 直接报错);`ip.addr` 匹配源或目标任一端,单侧用 `ip.src`/`ip.dst`;Wireshark 3.x 起协议名 `ssl` 全部改 `tls`(`tls.handshake.*` 而非 `ssl.*`)
|
||||
- **BPF 括号被 shell 吃掉**:`( )` 在 shell 里是子 shell——过滤表达式整体加引号
|
||||
- **过滤语法版本差异**:4.0 起 AND 优先级高于 OR(旧写法需加括号);仅空白分隔(如 `ip.addr 10.0.0.1`)为语法错误;集合元素须逗号分隔;`ip.addr==1.2.3.4` 无空格写法在 3.x 同样合法
|
||||
|
||||
## 中间人层:TLS 解密边界
|
||||
|
||||
- **证书不信任则无明文**:证书固定/自有 CA/内置证书库的客户端,mitmproxy 解不开——先评估目标证书校验强度([[re-tls]]);固定证书场景放弃中间人,改抓 SNI 与元数据
|
||||
- **透明代理只覆盖命中的端口**:REDIRECT 规则按 dport 匹配,漏配端口的流量原样直连;QUIC/HTTP3(UDP 443)不在 TCP REDIRECT 范围内,需要 QUIC 专用中间人或降级目标
|
||||
- **TLS 1.3 ECH 隐藏 SNI**:加密 ClientHello 场景下 SNI 过滤失效(DoH/DoT 同理,见 SKILL.md 坑)——靠端点 IP 与信标周期补线索
|
||||
- **NFQUEUE 与透明代理互相干扰**:NFQUEUE 需要用户态 handler 逐包 verdict(无 handler 流量阻塞);mitmproxy 透明模式走 nat REDIRECT 不消费 NFQUEUE——两套规则并存时行为不可预测,只保留需要的一套
|
||||
|
||||
## pcap 分析层:数据质量
|
||||
|
||||
- **截断包缺负载**:snaplen 过小时长度字段在但负载缺失,字段导出出现空值——先 capinfos 看 "Capture length" 与包长是否一致
|
||||
- **时间戳漂移**:抓包机时钟不准则会话时序失真——跨源关联(INetSim/系统日志)时核对各自时间基准
|
||||
- **巨大 pcap 卡死**:几十 GB 直接开 GUI 必卡——capinfos → 统计 → 子集三步走(见 [[commands]] 序列 3)
|
||||
- **半路抓包缺握手**:TLS 解密、会话重建都依赖完整握手——抓包点要在客户端同一侧从头抓
|
||||
|
||||
## 版本差异
|
||||
|
||||
- **Wireshark/tshark 4.x**:显示过滤空白要求收紧(仅空白分隔在 4.0 起为语法错误,3.6 起弃用);AND 优先级高于 OR(旧写法需加括号);协议名 `ssl` 已于 3.x 改名 `tls`,4.x 不再兼容旧名;4.2+ 持续新增字段与导出格式
|
||||
- **tcpdump/libpcap**:默认 snaplen 262144(1.x 起);`-C` 单位 MB、`-G` 单位秒——单位写错会多写/少写轮转文件
|
||||
- **mitmproxy**:新版统一 `--mode regular|transparent` 显式指定(旧版 `--transparent` 独立参数形式随版本移除,以本机 `mitmproxy --help` 为准);CA 在 `~/.mitmproxy/`,旧版本 CA 文件名有差异,信任库导入前先 `ls ~/.mitmproxy/` 核对
|
||||
- **字段名跨版本漂移**:升级 Wireshark 后旧过滤/导出脚本失效,先 `tshark -G fields` 对一遍再跑
|
||||
|
||||
## 使用注意
|
||||
|
||||
- 全部在沙箱内执行([[re-analyze/platform-tips]] 最高原则)
|
||||
- 捕获产物 sha256 与路径入档;过滤与统计结论记入分析笔记([[re-triage]] / [[re-analyze/analysis-contract]])
|
||||
Reference in New Issue
Block a user