07 脚本与命令兜底:当"手点"不够用时

数据量大、要批量、要精确提取时,命令行 tshark(装 Wireshark 自带)和一小段 Python 是最强帮手。这一章给你可以直接复用的模板。

本章目录
  1. tshark 高频入门
  2. tshark 提取字段的通用写法
  3. 组合拼接 + 算哈希模板(套路B专精)
  4. 编码一键识别与解码
  5. 导出对象 & 数据段提取
  6. 遇到哈希/爆破怎么办(hashcat)

tshark 高频入门

tshark 语法核心:tshark -r 文件 [-选项]。三个最基本查询:

-r x.pcapng        # 读文件,打印所有包
-r x.pcapng -Y "http"   # -Y 加显示过滤器,只显示 HTTP 包
-r x.pcapng -Y "http.request" -T fields -e http.request.uri -e http.response.code

tshark 提取字段的通用写法

万能格式:

tshark -r 文件 -Y "过滤器" -T fields -e 字段1 -e 字段2 [其他选项]

常用 -e 字段:

字段含义
ip.src ip.dst源/目的 IP
frame.number frame.time_relative包序号 / 相对时间(秒)
tcp.stream所在 TCP 流编号
http.request.uri请求 URI(含参数)
http.request.method http.response.code请求方法 / 响应码
http.file_dataHTTP 响应体内容
dns.qry.name dns.flags.responseDNS 查询名 / 是否响应
mysql.query pgsql.querySQL 语句
data.data tcp.payload原始数据(十六进制串)
-e 全量字段名哪里查?Wireshark 图形里点开某包某层,左下/详情里看到的字段名(如 http.response.code)就是 -e 的值。也可 tshark -G fields | grep http 列全部。

组合拼接 + 算哈希模板(套路B专精)

以挑战18"1000 名身份证泄露按时间排序拼接算 MD5"为例(可直接套用改参数):

# 1) 用 tshark 把每个响应的 idcard 值和相对时间导成两栏,写进 csv
tshark -r x.pcapng -Y "http.response contains \"idcard\"" \
  -T fields -e frame.time_relative -e http.file_data > data.txt
# 2) Python 读入、按(时间,序号)双关键字排序(防同秒乱序)、拼接、算 md5
import hashlib, re
rows = []
for line in open('data.txt', encoding='utf-8', errors='ignore'):
    m = re.search(r'"idcard"\s*:\s*"(\d{18})"', line)   # 按实际字段改
    try: t = float(line.split('\t')[0])
    except: continue
    if m: rows.append((t, len(rows), m.group(1)))

rows.sort(key=lambda r: (r[0], r[1]))           # 关键:双关键字
s = ''.join(r[2] for r in rows)
print(s, len(s))
print('flag{' + hashlib.md5(s.encode()).hexdigest() + '}')
严重提醒:排序必须用 (时间, 序号) 双关键字。只按时间可能因同一秒有 1000 条而同序错乱,导致 MD5 完全不同(这条坑在 08 专讲)。

编码一键识别与解码

# URL 解码
python -c "import urllib.parse,sys;print(urllib.parse.unquote('你的串'))"
# Base64 解码
python -c "import base64,binascii;print(base64.b64decode('串').decode('utf-8','ignore'))"
# Hex 转字节
python -c "print(bytes.fromhex('48656c6c6f'))"
# 自动猜编码(常能一次解多层)
python -c "import base64,urllib.parse
s='一串'
while s!=urllib.parse.unquote(s): s=urllib.parse.unquote(s)   # URL解到不动
print(s)"
识别技巧:以 %→URL;以 = 结尾且只有大小写字母数字+/→Base64;只有 0-9a-f 且偶数长度→Hex;出现大量 \x→可能需先转义处理。多层就层层解,解到能读为止。

导出对象 & 数据段提取

# 导出所有 HTTP 对象到目录
tshark -r x.pcapng --export-objects http,outdir
# 导出 FTP 对象
tshark -r x.pcapng --export-objects tftp,outdir
# 提取所有 TCP payload(十六进制)再转成字节
tshark -r x.pcapng -Y "tcp.payload" -T fields -e tcp.payload > hex.txt
# 只取非 DNS 响应的查询名
tshark -r x.pcapng -Y "dns.flags.response==0" -T fields -e dns.qry.name

遇到哈希/爆破怎么办(hashcat)

若提取到的是口令哈希(NTLM、MySQL4.1+、crypt、bcrypt 等),可用 hashcat 离线爆破(你已熟练)。

依赖提示:tshark 与 Wireshark 同目录安装;Windows 在 PowerShell 里执行时路径可用引号包住 &"…\tshark.exe"。