mcpField
P
protocol-reverse-engineering

protocol-reverse-engineering

github.com/wshobson安全41.9k12.9k 次安装2 周前更新
代码仓库

关于 protocol-reverse-engineering

面向安全研究人员和工程师的网络协议逆向指南,涵盖流量捕获、协议识别、分析、重放、模糊测试与文档编写。

主要功能

  1. 01使用 Wireshark 和 tcpdump 捕获流量
  2. 02用 tshark 和 Scapy 分析数据包
  3. 03识别协议签名与字段
  4. 04模糊测试和重放网络流量
  5. 05记录协议格式

适用场景

  1. 01在安全研究中检查流量
  2. 02排查协议互操作问题
  3. 03梳理未公开的二进制协议

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/wshobson/agents --skill protocol-reverse-engineering

安装后在 Claude Code 中输入/protocol-reverse-engineering确认已加载。

附带文件references/binary-encryption-analysis.mdreferences/protocol-documentation.md

详细介绍

协议逆向工程

介绍捕获、分析和记录网络协议的全面技术,适用于安全研究、互操作性和调试。

流量捕获

Wireshark 捕获
# Capture on specific interface
wireshark -i eth0 -k

# Capture with filter
wireshark -i eth0 -k -f "port 443"

# Capture to file
tshark -i eth0 -w capture.pcap

# Ring buffer capture (rotate files)
tshark -i eth0 -b filesize:100000 -b files:10 -w capture.pcap
tcpdump 捕获
# Basic capture
tcpdump -i eth0 -w capture.pcap

# With filter
tcpdump -i eth0 port 8080 -w capture.pcap

# Capture specific bytes
tcpdump -i eth0 -s 0 -w capture.pcap  # Full packet

# Real-time display
tcpdump -i eth0 -X port 80
中间人捕获
# mitmproxy for HTTP/HTTPS
mitmproxy --mode transparent -p 8080

# SSL/TLS interception
mitmproxy --mode transparent --ssl-insecure

# Dump to file
mitmdump -w traffic.mitm

# Burp Suite
# Configure browser proxy to 127.0.0.1:8080

协议分析

Wireshark 分析
# Display filters
tcp.port == 8080
http.request.method == "POST"
ip.addr == 192.168.1.1
tcp.flags.syn == 1 && tcp.flags.ack == 0
frame contains "password"

# Following streams
Right-click > Follow > TCP Stream
Right-click > Follow > HTTP Stream

# Export objects
File > Export Objects > HTTP

# Decryption
Edit > Preferences > Protocols > TLS
  - (Pre)-Master-Secret log filename
  - RSA keys list
tshark 分析
# Extract specific fields
tshark -r capture.pcap -T fields -e ip.src -e ip.dst -e tcp.port

# Statistics
tshark -r capture.pcap -q -z conv,tcp
tshark -r capture.pcap -q -z endpoints,ip

# Filter and extract
tshark -r capture.pcap -Y "http" -T json > http_traffic.json

# Protocol hierarchy
tshark -r capture.pcap -q -z io,phs
使用 Scapy 进行自定义分析
from scapy.all import *

# Read pcap
packets = rdpcap("capture.pcap")

# Analyze packets
for pkt in packets:
    if pkt.haslayer(TCP):
        print(f"Src: {pkt[IP].src}:{pkt[TCP].sport}")
        print(f"Dst: {pkt[IP].dst}:{pkt[TCP].dport}")
        if pkt.haslayer(Raw):
            print(f"Data: {pkt[Raw].load[:50]}")

# Filter packets
http_packets = [p for p in packets if p.haslayer(TCP)
                and (p[TCP].sport == 80 or p[TCP].dport == 80)]

# Create custom packets
pkt = IP(dst="target")/TCP(dport=80)/Raw(load="GET / HTTP/1.1\r\n")
send(pkt)

协议识别

常见协议特征
HTTP        - "HTTP/1." or "GET " or "POST " at start
TLS/SSL     - 0x16 0x03 (record layer)
DNS         - UDP port 53, specific header format
SMB         - 0xFF 0x53 0x4D 0x42 ("SMB" signature)
SSH         - "SSH-2.0" banner
FTP         - "220 " response, "USER " command
SMTP        - "220 " banner, "EHLO" command
MySQL       - 0x00 length prefix, protocol version
PostgreSQL  - 0x00 0x00 0x00 startup length
Redis       - "*" RESP array prefix
MongoDB     - BSON documents with specific header
协议头模式
+--------+--------+--------+--------+
|  Magic number / Signature         |
+--------+--------+--------+--------+
|  Version       |  Flags          |
+--------+--------+--------+--------+
|  Length        |  Message Type   |
+--------+--------+--------+--------+
|  Sequence Number / Session ID     |
+--------+--------+--------+--------+
|  Payload...                       |
+--------+--------+--------+--------+

在分析二进制协议或加密之前,请阅读解析器、结构识别和 TLS 技术。

在记录协议或编写解析器之前,请阅读规范模板和 Lua 示例。

主动测试

使用 Boofuzz 进行模糊测试
from boofuzz import *

def main():
    session = Session(
        target=Target(
            connection=TCPSocketConnection("target", 8888)
        )
    )

    # Define protocol structure
    s_initialize("HELLO")
    s_static(b"\x50\x52\x4f\x54")  # Magic
    s_word(1, name="version")       # Version
    s_word(0x01, name="type")       # Type (HELLO)
    s_size("payload", length=4)     # Length field
    s_block_start("payload")
    s_dword(0x12345678, name="client_id")
    s_word(0, name="flags")
    s_block_end()

    session.connect(s_get("HELLO"))
    session.fuzz()

if __name__ == "__main__":
    main()
重放与修改
from scapy.all import *

# Replay captured traffic
packets = rdpcap("capture.pcap")
for pkt in packets:
    if pkt.haslayer(TCP) and pkt[TCP].dport == 8888:
        send(pkt)

# Modify and replay
for pkt in packets:
    if pkt.haslayer(Raw):
        # Modify payload
        original = pkt[Raw].load
        modified = original.replace(b"client", b"CLIENT")
        pkt[Raw].load = modified
        # Recalculate checksums
        del pkt[IP].chksum
        del pkt[TCP].chksum
        send(pkt)

最佳实践

分析工作流
  1. 捕获流量:多个会话、不同场景
  2. 识别边界:消息起始/结束标记
  3. 映射结构:固定头部、可变载荷
  4. 识别字段:比较多个样本
  5. 记录格式:创建规范
  6. 验证理解:实现解析器/生成器
  7. 测试边缘情况:模糊测试、边界条件
留意的常见模式
  • 消息开头的幻数/特征码
  • 用于兼容性处理的版本字段
  • 长度字段(通常位于可变数据之前)
  • 用于识别消息的类型/操作码字段
  • 用于排序的序列号
  • 用于完整性校验的校验和/CRC
  • 用于计时的时间戳
  • 会话/连接标识符

评论

支持 Markdown