eBPF HOOK uprobe实现的各种用户态进程的数据捕获,无需改动原程序。
- SSL/HTTPS数据导出功能,针对HTTPS的数据包抓取,不需要导入CA证书。
- bash的命令捕获,HIDS的bash命令监控解决方案。
- mysql query等数据库的数据库审计解决方案。
依赖BPF BTF 格式,仅支持linux kernel 5.8以上内核版本,即以下linux发行版。
- CentOS 8.2
- CentOS Stream 8.3
- Alma 8.3
- Fedora 32
- Ubuntu 20.10
需要内核开启BTF支持。
cat /boot/config-`uname -r` | grep BTF
CONFIG_VIDEO_SONY_BTF_MPX=m
CONFIG_DEBUG_INFO_BTF=y
CONFIG_PAHOLE_HAS_SPLIT_BTF=y
CONFIG_DEBUG_INFO_BTF_MODULES=y
参考ebpf官网的介绍
本项目hook了/lib/x86_64-linux-gnu/libssl.so.1.1
的SSL_write
、SSL_read
函数的返回值,拿到明文信息,通过ebpf map传递给用户进程。
Probes: []*manager.Probe{
{
Section: "uprobe/SSL_write",
EbpfFuncName: "probe_entry_SSL_write",
AttachToFuncName: "SSL_write",
//UprobeOffset: 0x386B0,
BinaryPath: "/lib/x86_64-linux-gnu/libssl.so.1.1",
},
{
Section: "uretprobe/SSL_write",
EbpfFuncName: "probe_ret_SSL_write",
AttachToFuncName: "SSL_write",
//UprobeOffset: 0x386B0,
BinaryPath: "/lib/x86_64-linux-gnu/libssl.so.1.1",
},
{
Section: "uprobe/SSL_read",
EbpfFuncName: "probe_entry_SSL_read",
AttachToFuncName: "SSL_read",
//UprobeOffset: 0x38380,
BinaryPath: "/lib/x86_64-linux-gnu/libssl.so.1.1",
},
{
Section: "uretprobe/SSL_read",
EbpfFuncName: "probe_ret_SSL_read",
AttachToFuncName: "SSL_read",
//UprobeOffset: 0x38380,
BinaryPath: "/lib/x86_64-linux-gnu/libssl.so.1.1",
},
/**/
},
hook了/bin/bash
的readline
函数。
安装使用,可以选择编译,也可以直接下载二进制包。
笔者环境ubuntu 21.04
, linux kernel 5.10以上通用。
推荐使用UBUNTU 21.04
版本的linux测试。
- gcc 10.3.0
- clang 12.0.0
- cmake 3.18.4
- clang backend: llvm 12.0.0
- gcc 5.1 以上
- clang 9
- cmake 3.14
git clone [email protected]:ehids/ecapture.git
cd ecapture
make
bin/ecapture
执行任意https网络请求即可使用。
wget https://www.qq.com
https://v.qq.com/txp/iframe/player.html?vid=m33278fdqt8
ps -ef|grep foo
运行时报错cannot resolve /bin/bash library call 'readline', consuder orivudubg the offset via options: not supported
,原因为/bin/bash
文件中的readline
函数在符号表里找不到,多数是被strip去掉了。可以自行用IDA定位readline
函数偏移地址,填写到user/probe_bash.go
的83行附近的UprobeOffset
中。
不同发行版linux的bash不一样,笔者无法完全给出,请自行解决。
也可以在main.go
中33行,配置EBPFProbeBash
关闭bash模块,再重新编译。