计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
re-tls【效率与协作】TLS/加密流量深度:指纹、密钥导出、TLS 1.3。 触发词:TLS、SSL、ClientHello、指纹、SSLKEYLOG、证书分析
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
所有工具先验证再使用。
apt install wireshark tshark / dnf install wireshark-cli wireshark / pacman -S wireshark-cli wireshark-qtbrew install --cask wireshark(含 tshark CLI);Windows: choco install wiresharktshark --version;tshark -r out.pcap -Y 'tls.handshake.type == 1' | head -1 能解析 ClientHellotshark -r out.pcap -T fields -e tls.handshake.ja4 | head -1 有输出;本机字段存在性以 tshark -G fields | grep -iE 'ja3|ja4' 为准apt install openssl / dnf install openssl / pacman -S openssl(多数预装)brew install openssl(keg-only,PATH 加 /opt/homebrew/opt/openssl@3/bin(Apple Silicon)或 /usr/local/opt/openssl@3/bin(Intel))choco install openssl.light(PATH 需手动加,见包说明)或 Git for Windows 自带 openssl.exeopenssl versionSSLKEYLOGFILE=/tmp/keys.log(Linux/macOS)或 set SSLKEYLOGFILE=C:\keys.log(Windows)-o tls.keylog_file:...CLIENT_HANDSHAKE_TRAFFIC_SECRET 等行(TLS 1.3)或 CLIENT_RANDOM 行(TLS 1.2)mitmdump --version按顺序执行,每步产物(指纹表/证书/解密流量)存档 sha256 + 路径([[re-ioc]] 证据链要求)。
ClientHello 指纹(JA3/JA4):
# JA3(ClientHello 协商参数哈希,Wireshark 3.6+ 内置)
tshark -r out.pcap -Y 'tls.handshake.type == 1' -T fields \
-e tls.handshake.ja3 -e ip.src -e tls.handshake.extensions_server_name \
| sort | uniq -c | sort -rn
# JA4(Wireshark 4.2+ 原生,客户端侧;含协议/版本/SNI/密码套件数/ALPN 维度)
tshark -r out.pcap -Y 'tls.handshake.type == 1' -T fields -e tls.handshake.ja4 \
| sort | uniq -c | sort -rn
tls.handshake.extensions_server_name)与 IP 一起聚类——同一指纹连不同目标也是信号证书链分析(openssl x509 解析):
# 一个 Certificate 消息常含多张证书,该字段是逗号分隔的十六进制串(hex 带冒号)——先按逗号切行再逐行转 DER
# 链的次序即发送次序,第一行是叶子(服务器)证书;只取叶子在切行后加 | head -1(放在 tr -d ':' 之前)
tshark -r out.pcap -Y 'tls.handshake.type == 11' -T fields -e tls.handshake.certificate \
| head -1 | tr ',' '\n' | tr -d ':' | xxd -r -p > cert_chain.der
openssl x509 -in cert_chain.der -inform DER -text -noout | head -60
# 逐张分别导出(cert_1.der、cert_2.der…)用循环或 csplit 按行切开;
# 不要一次 xxd 把整条链写进同一个文件——多张 DER 拼接不是一个合法的 DER 对象,openssl 只读第一张且可能报错
# 实时抓取(对已知主机)
openssl s_client -connect <host>:443 -servername <host> -showcerts </dev/null 2>/dev/null \
| openssl x509 -noout -text
# 证书链校验结果
openssl s_client -connect <host>:443 -servername <host> -verify_return_error </dev/null 2>&1 \
| grep -i 'verify return'
openssl x509 -noout -fingerprint -sha256)、证书重用(同一证书多个 C2 域 = 批量签发)-Y 'tls.handshake.type == 11' 匹配不到——TLS 1.3 流量需先按步骤 3 解密(SSLKEYLOG)或用 openssl s_client 实时抓取</dev/null 是 POSIX 语法、Windows cmd 不适用——Windows 下用 echo | openssl s_client ... 或去掉 </dev/null 交互式退出SSLKEYLOG 解密(TLS 1.2/1.3 密钥导出):
# tshark 侧解密(keylog 文件 + 重新解析)
tshark -r enc.pcapng -o tls.keylog_file:keys.log -Y 'http' \
-T fields -e http.host -e http.request.uri
# 或 GUI: 首选项 → Protocols → TLS → (Pre)-Master-Secret log filename
CLIENT_RANDOM <hex> <master secret>——主密钥可直接解本会话所有记录CLIENT_HANDSHAKE_TRAFFIC_SECRET / SERVER_HANDSHAKE_TRAFFIC_SECRET / CLIENT_TRAFFIC_SECRET_0 / SERVER_TRAFFIC_SECRET_0 / EXPORTER_SECRET)——没有 1.2 的 master secret,手工推导按 HKDF-Expand(-Label) 从各 traffic secret 派生记录密钥(Extract 是更早阶段的运算,见坑 1);Wireshark/tshark 直接读 keylog 文件可自动处理两代协议加密流量语义还原(应用层协议恢复):
# 解密后按应用层协议还原(TLS 只是载体,语义在 ALPN/上层协议)
tshark -r decrypted.pcapng -Y 'http' -T fields -e http.request.method -e http.host -e http.request.uri
tshark -r decrypted.pcapng -Y 'tls.handshake.extensions_alpn_str' -T fields -e tls.handshake.extensions_alpn_str | sort | uniq -c # ALPN 应用协议:ClientHello 里是客户端候选列表(offered);最终协商结果(negotiated)TLS ≤1.2 在 ServerHello、TLS 1.3 在 EncryptedExtensions
tls.handshake.extensions_alpn_str 同时命中 ClientHello(客户端候选列表)与承载最终结果的那条握手消息,直接统计会把候选当结论。TLS 1.3 的 ALPN 结果不在 ServerHello——ServerHello 只回扩展类型,真正的 ALPN 扩展在 EncryptedExtensions(握手密钥/keylog 解密后才可见);未解密时该字段只能看到 ClientHello 的候选。判最终协议取 negotiated 一侧,或直接看解密后的应用层记录类型恶意 TLS 特征(指纹聚类/异常证书):
-o tls.keylog_file:...)自动处理两代协议;手工推导时按 HKDF-Expand(-Label) 从各 traffic secret 派生各阶段记录密钥(handshake 与 application 阶段密钥不同)