用户态数据捕获工具-eCapture


eCapture 是一款基于 eBPF 技术实现的用户态数据捕获工具,始发于2022年3月。不需要 CA 证书即可捕获 https/tls 的通讯明文。eCapture 的中文名字为旁观者,即「当局者迷,旁观者清」,与其本身功能旁路、观察契合,且发音与英文有相似之处。

其使用 eBPFUprobe/Traffic Control 技术,实现各种用户空间/内核空间的数据捕获,无需改动原程序。主要功能包括:捕获 OpenSSL、GnuTLS 的密钥、明文通讯,支持 HTTP/3 QUIC、IPv6、TLS 1.3 等。采用C、Go语言开发并在ApacheV2.0协议下授权使用。

作用
不需要 CA 证书,即可捕获 HTTPS/TLS 通信数据的明文。
在 bash 审计场景,可以捕获 bash 命令。
数据库审计场景,可以捕获 mysqld/mariadDB 的 SQL 查询。

产品架构
eCapture 系统用户态程序使用 Golang 语言开发,具有良好的系统兼容性,无依赖快速部署,更适合云原生场景。 内核态代码使用 C 编写,使用 clang/llvm 编译,生产 bpf 字节码后,采用 go-bindata 转化为 golang 语法文件,之后采用 ehids/ebpfmanager 类库,调用 bpf syscall 进行加载、HOOK、map 读取。 golang 编译后,无其他任何依赖即可运行,兼容 linux kernel 4.18 以上所有版本。

功能介绍
eCapture 有三个模块
tls/ssl 明文数据捕获
bash 命令审计
mysqld 数据库审计

第一个功能适用于基于 tls/ssl 解密需求的运维监控、故障排查、抽样分析场景。
第二个功能适用于安全领域的 bash 入侵发现场景,这里只是简单的功能,可以在此基础上增加其他功能。
第三个功能适用于数据库审计场景,尤其是做数据安全、数据防泄漏,甚至入侵检测等。同样可以在此基础上扩充其他功能。
其命令行中有四个全局参数,分别为:
--debug , 用于启动调试日志
--help , 查看帮助
--hex ,按照 hex 模式打印字符,用与查看不可见字符
--pid ,用于针对特定进程进行数据捕获
关于eBPF
关于 eBPF 详细加载机制,可到其官网查阅相关原理。
实现原理
如工作原理的图所示,在用户态的加密解密函数中下钩子。tcpdump (libpcap) 是在数据包接收到,XDP 处理后,进行 clone packet,进行包的复制,发送给用户态进程。二者工作的所在层不一样。
HOOK 机制
eCapture 采用 eBPF uprobe 相关函数进行 HOOK,故需要目标用户态函数信息,包含函数符号表 (symbol table),函数偏移地址 (offset)。 在大部分 linux 发行版中,使用的二进制可执行文件 (ELF) 都是包含符号表的;少部分发行版,会去掉 ELF 中的符号表。那么针对这种场景,就需要用户自行定位目标函数所在 ELF/SO 中的偏移地址,通过工具的参数来指定。
对于 ELF 文件,可以将目标类库静态编译到自身,也可以通过动态链接库的方式引用。那么对于这两种形式,eCapture 根据不同场景进行自动查找。若查找不到,用户可以通过命令行参数指定。
故 eCapture 支持 HOOK ELF,以及 HOOK SO 两种模式。会自动分析 ELF 文件,读取.dynamic 和.dynsym 等段信息,查找相关链接库名以及函数名、偏移地址。
查找原理如下图:

tls/ssl
ecapture tls 命令用于启动 tls/ssl 模块,支持了三类 tls/ssl 加密类库,分别是:
openssl ,动态链接库名字为 libssl.so
gnutls ,动态链接库名字为 libgnutls.so
nss/nspr ,动态链接库名字为 libnspr4.so

在不同的 linux 发行版中,因为各种原因,会选择不同的类库。比如 wget 程序在 ubuntu 跟 centos 中就会使用不同的类库。有的是 openssl,有的是 gnutls,甚至两个库都引入了。
具体情况可以使用 ldd $ELF_PATH | grep -E "tls|ssl|nspr|nss" 来查看一个 ELF 文件使用类库情况。
ldd `which wget` |grep -E "tls|ssl|nspr|nss"
libssl.so.1.1 => /lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f50699f6000)
对于 firefox、chrome 这种进程,需要在程序启动后才能看到 tls 类库依赖情况,那么可以使用 pldd $PID | grep -E "tls|ssl|nspr|nss" 来查看。
tls 模块命令行参数如下,用户可以使用默认配置外,也可以根据自己环境自行指定。
OPTIONS:
--curl="" curl or wget file path, use to dectet openssl.so path, default:/usr/bin/curl
--firefox="" firefox file path, default: /usr/lib/firefox/firefox.
--gnutls="" libgnutls.so file path, will automatically find it from curl default.
-h, --help[=false] help for tls
--libssl="" libssl.so file path, will automatically find it from curl default.
--nspr="" libnspr44.so file path, will automatically find it from curl default.
--wget="" wget file path, default: /usr/bin/wget.
使用方法也比较简单,./ecapture tls --hex 命令即可。
bash
通常为 bash 审计需求,其实现方法无非是修改系统类库、使用内核模块等技术实现,对系统稳定性有一定风险。基于 eBPF 技术实现,可以避开这些问题。这里的 bash 命令的监控,是作为 eBPF 技术在安全审计场景中的一个探索。
eCapture 在实现时首先查找 ENV 的 $SHELL 值,作为 bash 的二进制文件路径进行 HOOK。对于 bash 加载了 libreadline.so 的场景,也会自动分析,进行符号表查找、offset 定位,再进行 HOOK。
bash 模块的参数有三个,用户可以自定义 bash、readlineso 的路径。
OPTIONS:
--bash="" $SHELL file path, eg: /bin/bash , will automatically find it from $ENV default.
-h, --help[=false] help for bash
--readlineso="" readline.so file path, will automatically find it from $BASH_PATH default.
mysql/mariadb
与 bash 模块一样,也是作为数据库审计的一个探索。mysqld 模块,核心原理是 HOOK 了 dispatch_command 函数。
第一个参数为 CMD 类型,值为 COM_QUERY 时,为查询场景,即审计需求的查询类型
第二个参数是 THD 的结构体,在这里用不到
第三个是查询的 SQL 语句
第四个参数是 SQL 语句的长度
mysqld 审计模块参数如下:
OPTIONS:
-f, --funcname="" function name to hook
-h, --help[=false] help for mysqld56
-m, --mysqld="/usr/sbin/mariadbd" mysqld binary file path, use to hook
--offset=0 0x710410
其中,--mysqld 是用来指定 mysqld 的路径。mysqld 二进制程序符号表里虽然有 dispatch_command 信息,但 dispatch_command 这个函数名每次编译都是变化的,故不能写死。
eCapture 的查找方式是读取 mysqld 二进制的.dynamic 段信息,正则语法 \\w+dispatch_command\\w+ 去匹配所有符号信息,找到其函数名、偏移地址,再使用。也可以通过 objdump 命令来查找,再通过命令行参数自行指定 funcname。
最新版本:1
2025年3月下旬发布的 v1.0.0 版本更新内容如下:
新增功能
支持 Docker 镜像,简化部署和使用。
新增对 OpenSSL 3.4.0 和 GnuTLS 的密钥捕获支持。
支持 IPv6 数据包捕获,扩展网络协议支持。
增加 Zsh 命令审计功能,提升安全监控能力。
关键修复
修复 Ubuntu 24.04 系统上初始化脚本的兼容性问题。
解决 ARM64 版本无法正常工作的问题。
优化构建过程,提升整体稳定性和性能。
项目主页:https://github.com/gojue/ecapture

其使用 eBPFUprobe/Traffic Control 技术,实现各种用户空间/内核空间的数据捕获,无需改动原程序。主要功能包括:捕获 OpenSSL、GnuTLS 的密钥、明文通讯,支持 HTTP/3 QUIC、IPv6、TLS 1.3 等。采用C、Go语言开发并在ApacheV2.0协议下授权使用。

作用
不需要 CA 证书,即可捕获 HTTPS/TLS 通信数据的明文。
在 bash 审计场景,可以捕获 bash 命令。
数据库审计场景,可以捕获 mysqld/mariadDB 的 SQL 查询。

产品架构
eCapture 系统用户态程序使用 Golang 语言开发,具有良好的系统兼容性,无依赖快速部署,更适合云原生场景。 内核态代码使用 C 编写,使用 clang/llvm 编译,生产 bpf 字节码后,采用 go-bindata 转化为 golang 语法文件,之后采用 ehids/ebpfmanager 类库,调用 bpf syscall 进行加载、HOOK、map 读取。 golang 编译后,无其他任何依赖即可运行,兼容 linux kernel 4.18 以上所有版本。

功能介绍
eCapture 有三个模块
tls/ssl 明文数据捕获
bash 命令审计
mysqld 数据库审计

第一个功能适用于基于 tls/ssl 解密需求的运维监控、故障排查、抽样分析场景。
第二个功能适用于安全领域的 bash 入侵发现场景,这里只是简单的功能,可以在此基础上增加其他功能。
第三个功能适用于数据库审计场景,尤其是做数据安全、数据防泄漏,甚至入侵检测等。同样可以在此基础上扩充其他功能。
其命令行中有四个全局参数,分别为:
--debug , 用于启动调试日志
--help , 查看帮助
--hex ,按照 hex 模式打印字符,用与查看不可见字符
--pid ,用于针对特定进程进行数据捕获
关于eBPF
关于 eBPF 详细加载机制,可到其官网查阅相关原理。
实现原理
如工作原理的图所示,在用户态的加密解密函数中下钩子。tcpdump (libpcap) 是在数据包接收到,XDP 处理后,进行 clone packet,进行包的复制,发送给用户态进程。二者工作的所在层不一样。
HOOK 机制
eCapture 采用 eBPF uprobe 相关函数进行 HOOK,故需要目标用户态函数信息,包含函数符号表 (symbol table),函数偏移地址 (offset)。 在大部分 linux 发行版中,使用的二进制可执行文件 (ELF) 都是包含符号表的;少部分发行版,会去掉 ELF 中的符号表。那么针对这种场景,就需要用户自行定位目标函数所在 ELF/SO 中的偏移地址,通过工具的参数来指定。
对于 ELF 文件,可以将目标类库静态编译到自身,也可以通过动态链接库的方式引用。那么对于这两种形式,eCapture 根据不同场景进行自动查找。若查找不到,用户可以通过命令行参数指定。
故 eCapture 支持 HOOK ELF,以及 HOOK SO 两种模式。会自动分析 ELF 文件,读取.dynamic 和.dynsym 等段信息,查找相关链接库名以及函数名、偏移地址。
查找原理如下图:

tls/ssl
ecapture tls 命令用于启动 tls/ssl 模块,支持了三类 tls/ssl 加密类库,分别是:
openssl ,动态链接库名字为 libssl.so
gnutls ,动态链接库名字为 libgnutls.so
nss/nspr ,动态链接库名字为 libnspr4.so

在不同的 linux 发行版中,因为各种原因,会选择不同的类库。比如 wget 程序在 ubuntu 跟 centos 中就会使用不同的类库。有的是 openssl,有的是 gnutls,甚至两个库都引入了。
具体情况可以使用 ldd $ELF_PATH | grep -E "tls|ssl|nspr|nss" 来查看一个 ELF 文件使用类库情况。
ldd `which wget` |grep -E "tls|ssl|nspr|nss"
libssl.so.1.1 => /lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f50699f6000)
对于 firefox、chrome 这种进程,需要在程序启动后才能看到 tls 类库依赖情况,那么可以使用 pldd $PID | grep -E "tls|ssl|nspr|nss" 来查看。
tls 模块命令行参数如下,用户可以使用默认配置外,也可以根据自己环境自行指定。
OPTIONS:
--curl="" curl or wget file path, use to dectet openssl.so path, default:/usr/bin/curl
--firefox="" firefox file path, default: /usr/lib/firefox/firefox.
--gnutls="" libgnutls.so file path, will automatically find it from curl default.
-h, --help[=false] help for tls
--libssl="" libssl.so file path, will automatically find it from curl default.
--nspr="" libnspr44.so file path, will automatically find it from curl default.
--wget="" wget file path, default: /usr/bin/wget.
使用方法也比较简单,./ecapture tls --hex 命令即可。
bash
通常为 bash 审计需求,其实现方法无非是修改系统类库、使用内核模块等技术实现,对系统稳定性有一定风险。基于 eBPF 技术实现,可以避开这些问题。这里的 bash 命令的监控,是作为 eBPF 技术在安全审计场景中的一个探索。
eCapture 在实现时首先查找 ENV 的 $SHELL 值,作为 bash 的二进制文件路径进行 HOOK。对于 bash 加载了 libreadline.so 的场景,也会自动分析,进行符号表查找、offset 定位,再进行 HOOK。
bash 模块的参数有三个,用户可以自定义 bash、readlineso 的路径。
OPTIONS:
--bash="" $SHELL file path, eg: /bin/bash , will automatically find it from $ENV default.
-h, --help[=false] help for bash
--readlineso="" readline.so file path, will automatically find it from $BASH_PATH default.
mysql/mariadb
与 bash 模块一样,也是作为数据库审计的一个探索。mysqld 模块,核心原理是 HOOK 了 dispatch_command 函数。
第一个参数为 CMD 类型,值为 COM_QUERY 时,为查询场景,即审计需求的查询类型
第二个参数是 THD 的结构体,在这里用不到
第三个是查询的 SQL 语句
第四个参数是 SQL 语句的长度
mysqld 审计模块参数如下:
OPTIONS:
-f, --funcname="" function name to hook
-h, --help[=false] help for mysqld56
-m, --mysqld="/usr/sbin/mariadbd" mysqld binary file path, use to hook
--offset=0 0x710410
其中,--mysqld 是用来指定 mysqld 的路径。mysqld 二进制程序符号表里虽然有 dispatch_command 信息,但 dispatch_command 这个函数名每次编译都是变化的,故不能写死。
eCapture 的查找方式是读取 mysqld 二进制的.dynamic 段信息,正则语法 \\w+dispatch_command\\w+ 去匹配所有符号信息,找到其函数名、偏移地址,再使用。也可以通过 objdump 命令来查找,再通过命令行参数自行指定 funcname。
最新版本:1
2025年3月下旬发布的 v1.0.0 版本更新内容如下:
新增功能
支持 Docker 镜像,简化部署和使用。
新增对 OpenSSL 3.4.0 和 GnuTLS 的密钥捕获支持。
支持 IPv6 数据包捕获,扩展网络协议支持。
增加 Zsh 命令审计功能,提升安全监控能力。
关键修复
修复 Ubuntu 24.04 系统上初始化脚本的兼容性问题。
解决 ARM64 版本无法正常工作的问题。
优化构建过程,提升整体稳定性和性能。
项目主页:https://github.com/gojue/ecapture