Skip to content

输出格式

eCapture 提供四种不同的输出格式,用于捕获的网络流量、主密钥和审计数据。每种格式服务于特定的使用场景,并与不同的分析工具集成。输出格式决定了数据编码(文本、二进制 PCAP、密钥日志、protobuf)和目标位置(控制台、文件、TCP 套接字、WebSocket)。

输出格式概览

格式主要用途输出目标Wireshark 兼容实时显示
文本交互式调试、日志分析控制台、文件、WebSocket
PCAP网络分析、流量重放PCAP-NG 文件
密钥日志使用外部工具进行 TLS 解密NSS 密钥日志文件是(配合 tcpdump)
Protobuf工具集成、eCaptureQ GUITCP、WebSocket

详细信息请参考各子页面:

来源: README.md:172-253, user/module/probe_openssl.go:58-76, user/config/iconfig.go:73-79

输出格式架构

格式选择与编码流程

以下图表展示了 CLI 标志如何转换为输出编码器和目标写入器:

来源: user/module/probe_openssl.go:109-176, user/config/iconfig.go:95-112, cli/cmd/root.go:178-247

格式类型常量

输出格式使用代码库中的 TlsCaptureModelType 枚举定义:

枚举值常量名称CLI 标志描述
0TlsCaptureModelTypePcappcappcapngPCAP-NG 二进制格式
1TlsCaptureModelTypeTexttext(默认)人类可读文本
2TlsCaptureModelTypeKeylogkeylogkeyNSS 密钥日志格式

CLI 通过 --model/-m 标志接受字符串值:

  • textTlsCaptureModelTypeText → 使用 setupManagersText()
  • pcappcapngTlsCaptureModelTypePcap → 使用 setupManagersPcap()
  • keylogkeyTlsCaptureModelTypeKeylog → 使用 setupManagersKeylog()

当在 --eventaddr 中使用远程目标(tcp://ws://)时,Protobuf 格式会自动启用。

来源: user/module/probe_openssl.go:58-76, user/config/iconfig.go:73-79

事件结构与序列化

所有捕获的事件都实现了 IEventStruct 接口,该接口定义了多种输出格式的方法:

IEventStruct 接口方法

go
type IEventStruct interface {
    Decode(payload []byte) error
    String() string                    // 文本格式
    StringHex() string                 // 带十六进制转储的文本格式
    Clone() IEventStruct
    EventType() Type
    GetUUID() string
    Payload() []byte
    PayloadLen() int
    Base() Base                        // 公共元数据
    ToProtobufEvent() *pb.Event       // Protobuf 格式
}

按模块分类的事件类型

模块事件结构包含内容输出模式
TLS/SSLSSLDataEvent加密负载、元组、TLS 版本文本、PCAP、Protobuf
TLS/SSLConnDataEvent连接 4 元组(IP:端口对)PCAP、Protobuf
TLS/SSLMasterSecretEvent客户端随机数、主密钥密钥日志、PCAP(DSB)
TLS/SSLTcSkbEvent来自 TC 钩子的原始数据包数据PCAP
GoTLSTlsDataEventGo TLS 明文、连接信息文本、PCAP、Protobuf
GnuTLSGnutlsDataEventGnuTLS 明文文本、Protobuf
NSSNsprDataEventNSS/NSPR 明文文本、Protobuf
BashBashEventShell 命令行文本、Protobuf
MySQLMysqldEventSQL 查询、返回值文本、Protobuf
PostgreSQLPostgresEventSQL 查询文本、Protobuf

每个事件结构为其支持的输出格式实现序列化:

  • String() / StringHex() 用于带可选颜色编码的文本输出
  • ToProtobufEvent() 用于二进制 protobuf 序列化
  • 模块特定方法(saveMasterSecret()dumpTcSkb())用于 PCAP/密钥日志

来源: user/event/event_openssl.go:77-391, user/event/event_masterkey.go:37-273, user/event/event_bash.go:37-133, user/event/event_mysqld.go:68-168

输出目标配置

eCapture 将日志记录(诊断消息)与事件输出(捕获的数据)分离。两者都支持多种目标类型。

目标类型检测

来源: cli/cmd/root.go:68-73, cli/cmd/root.go:178-247

目标类型常量与行为

常量触发模式写入器实现编解码器类型
loggerTypeStdout0空字符串zerolog.ConsoleWriteros.Stdout文本
loggerTypeFile1/path/to/fileos.Create() + 可选 roratelog.Logger文本
loggerTypeTcp2tcp://host:portnet.Dial("tcp", addr)Protobuf
loggerTypeWebsocket3ws://wss://ws.Client.Dial(url)Protobuf

编解码器选择逻辑

目标类型决定用于事件序列化的编解码器:

go
// 在 initLogger() 函数中
if strings.Contains(addr, "tcp://") || strings.Contains(addr, "ws://") {
    // 远程目标使用 protobuf
    module.eventOutputType = codecTypeProtobuf
} else {
    // 本地目标使用文本
    module.eventOutputType = codecTypeText
}

远程目标(tcp://ws://)通过 IEventStruct.ToProtobufEvent() 自动启用 protobuf 编码,而本地目标使用 IEventStruct.String()

日志轮转

文件目标在配置时支持自动轮转:

  • --eventroratesize <MB> - 当文件达到大小限制时轮转
  • --eventroratetime <秒> - 按时间间隔轮转

轮转由文件句柄周围的 roratelog.Logger 包装器处理。

来源: cli/cmd/root.go:68-73, cli/cmd/root.go:178-247, cli/cmd/root.go:151-152

按类型路由事件

事件管道使用三种分类类型将事件路由通过不同的处理阶段:

事件类型常量值处理器目的
TypeOutputevent.TypeOutputmodule.output()预格式化事件,直接输出
TypeEventProcessorevent.TypeEventProcessorEventProcessor.Write()HTTP/HTTP2 解析、协议检测
TypeModuleDataevent.TypeModuleDatamodule.Dispatcher()内部缓存、PCAP 写入、密钥日志

事件在 Clone() 期间被分配类型:

go
// SSLDataEvent 的示例
func (se *SSLDataEvent) Clone() IEventStruct {
    event := new(SSLDataEvent)
    event.eventType = TypeModuleData  // 路由到模块调度器
    return event
}

来源: user/event/event_openssl.go:200-204, user/module/imodule.go:430-447

格式特定使用场景

文本模式

使用场景:

  • 交互式调试和实时监控
  • 基于控制台的流量检查
  • 使用 grep/awk 进行日志文件分析
  • HTTP/HTTP2 协议分析

输出示例:

  • 带颜色编码的纯文本请求/响应体
  • HTTP/1.1 头部和内容
  • 带流 ID 的 HTTP/2 逐帧解码
  • 连接元数据(PID、进程名、IP:端口元组)

有关格式化详细信息、颜色方案和 HTTP 解析,请参阅文本输出模式

来源: user/module/probe_openssl.go:756-775, user/event/event_openssl.go:167-198

PCAP 模式

使用场景:

  • 使用 Wireshark 进行网络分析
  • 流量归档以供后续分析
  • 与现有基于 PCAP 的工具集成
  • 将明文捕获与数据包检查结合

输出结构:

  • 带接口描述块(IDB)的 PCAP-NG 文件格式
  • 用于捕获数据包的增强数据包块(EPB)
  • 包含主密钥的解密秘密块(DSB)
  • 自动密钥到连接的关联

有关文件格式详细信息和 Wireshark 工作流,请参阅 PCAP 集成

来源: user/module/probe_openssl.go:733-754

密钥日志模式

使用场景:

  • 使用 Wireshark 解密现有 pcap 文件
  • 使用 tshark 进行实时解密
  • 符合基于 SSLKEYLOGFILE 的工具
  • 将密钥捕获与数据包捕获分离

输出格式:

CLIENT_RANDOM <32字节十六进制> <48字节十六进制主密钥>
CLIENT_HANDSHAKE_TRAFFIC_SECRET <32字节十六进制> <秘密>
SERVER_HANDSHAKE_TRAFFIC_SECRET <32字节十六进制> <秘密>

有关 TLS 1.2/1.3 密钥提取和集成示例,请参阅 TLS 密钥日志

来源: user/module/probe_openssl.go:482-642

Protobuf 模式

使用场景:

  • eCaptureQ GUI 集成
  • 使用结构化数据进行自定义工具开发
  • 通过 TCP/WebSocket 进行远程监控
  • 事件转发到 SIEM 系统

协议:

  • 通过 pb.Event 消息类型进行二进制 protobuf 编码
  • 字段:timestampuuidpidpnamesrc_ipdst_ippayload
  • 带心跳机制的 WebSocket 帧

有关协议模式和客户端示例,请参阅 Protobuf 与外部集成

来源: user/event/event_openssl.go:237-266, protobuf/PROTOCOLS.md

CLI 配置参考

全局输出标志

标志简写类型默认值描述
--logaddr-lstring""日志记录器目标:文件路径、tcp://host:portws://host:port
--eventaddrstring""事件收集器目标(如果未设置,则使用 --logaddr
--ecaptureqstring""用于 eCaptureQ 集成的本地 WebSocket 服务器
--listenstringlocalhost:28256用于运行时配置更新的 HTTP API 服务器
--eventroratesizeuint160当大小超过 N MB 时轮转事件文件(0=禁用)
--eventroratetimeuint160每 N 秒轮转事件文件(0=禁用)

模块特定格式标志

适用于 tlsgotlsgnutlsnss 模块:

标志简写类型默认值描述
--model-mstringtext格式:textpcappcapngkeylogkey
--pcapfile-wstringecapture_openssl.pcapngPCAP 模式的输出文件
--keylogfilestringecapture_masterkey.log密钥日志模式的输出文件
--hexboolfalse在文本模式下十六进制转储负载

示例命令

bash
# 文本模式输出到控制台
sudo ecapture tls

# 文本模式输出到文件并启用轮转
sudo ecapture tls --eventaddr=/var/log/ecapture.log --eventroratesize=100

# PCAP 模式使用自定义文件
sudo ecapture tls -m pcap -w /tmp/capture.pcapng -i eth0

# 用于 Wireshark 解密的密钥日志模式
sudo ecapture tls -m keylog --keylogfile=/tmp/keys.log

# Protobuf 流式传输到 eCaptureQ
sudo ecapture tls --ecaptureq=:9090

# 远程 TCP 流式传输
sudo ecapture tls --eventaddr=tcp://192.168.1.100:8080

来源: cli/cmd/root.go:136-153, README.md:172-253

输出格式比较

格式CLI 标志需要文件实时显示协议解析主密钥Wireshark 兼容
文本-m text可选✓ 是(stdout)✓ HTTP/1.x、HTTP/2✗ 否(自 v0.7.0)✗ 否
PCAP-m pcap✓ 必需(-w✗ 否✗ 否✓ 是(DSB 块)✓ 是
密钥日志-m keylog✓ 必需✗ 否✗ 否✓ 是(NSS 格式)✓ 是(配合 tcpdump)
Protobuf自动可选✓ 是(TCP/WS)△ 依赖模块✓ 嵌入事件中✗ 否

格式选择指南

选择文本模式的情况:

  • 需要对捕获的流量进行即时视觉反馈
  • 想要通过 grep/搜索 HTTP 请求/响应
  • 正在进行交互式应用程序行为调试
  • 需要 HTTP/2 逐帧分析

选择 PCAP 模式的情况:

  • 需要在 Wireshark 中进行全面的数据包分析
  • 想要归档流量以供后续取证
  • 需要明文和加密数据包数据
  • 想要将主密钥嵌入捕获文件

选择密钥日志模式的情况:

  • 已经使用 tcpdump/tshark 进行捕获
  • 需要与 SSLKEYLOGFILE 兼容的输出
  • 想要解密现有的 PCAP 文件
  • 正在使用 Wireshark 的 TLS 解密功能

选择 Protobuf 模式的情况:

  • 正在与 eCaptureQ 或自定义工具集成
  • 需要结构化的、机器可解析的事件
  • 正在转发到远程系统
  • 想要通过网络进行实时流式传输

来源: README.md:172-253, CHANGELOG.md:487-493, user/config/iconfig.go:73-79

输出格式 has loaded