eCapture用戶態(tài)數(shù)據(jù)捕獲工具
eCapture 是一款基于 eBPF 技術(shù)實現(xiàn)的用戶態(tài)數(shù)據(jù)捕獲工具。不需要 CA 證書,即可捕獲 https/tls 的通訊明文。
項目在2022年3月中旬創(chuàng)建,一經(jīng)發(fā)布,廣受大家喜愛,至今不到兩周已經(jīng)1200多個Star。
作用
- 不需要CA證書,即可捕獲HTTPS/TLS通信數(shù)據(jù)的明文。
- 在bash審計場景,可以捕獲bash命令。
- 數(shù)據(jù)庫審計場景,可以捕獲mysqld/mariadDB的SQL查詢。
官網(wǎng)
代碼倉庫見:https://github.com/ehids/ecapture 。
產(chǎn)品架構(gòu)
eCapture系統(tǒng)用戶態(tài)程序使用Golang語言開發(fā),具有良好的系統(tǒng)兼容性,無依賴快速部署,更適合云原生場景。 內(nèi)核態(tài)代碼使用C編寫,使用clang/llvm編譯,生產(chǎn)bpf字節(jié)碼后,采用go-bindata轉(zhuǎn)化為golang語法文件,之后采用ehids/ebpfmanager類庫,調(diào)用bpf syscall進行加載、HOOK、map讀取。 golang編譯后,無其他任何依賴即可運行,兼容linux kernel 4.18以上所有版本。
eBPF加載機制
關(guān)于eBPF詳細加載機制,可到https://ebpf.io/ 查閱相關(guān)原理。
實現(xiàn)原理
如工作原理的圖所示,在用戶態(tài)的加密解密函數(shù)中下鉤子。 tcpdump(libpcap)是在數(shù)據(jù)包接收到,XDP處理后,進行clone packet,進行包的復制,發(fā)送給用戶態(tài)進程。二者工作的所在層不一樣。
功能介紹
eCapture有三個模塊
- tls/ssl明文數(shù)據(jù)捕獲
- bash命令審計
- mysqld數(shù)據(jù)庫審計
第一個功能適用于基于tls/ssl解密需求的運維監(jiān)控、故障排查、抽樣分析場景。
第二個功能適用于安全領(lǐng)域的bash入侵發(fā)現(xiàn)場景,這里只是簡單的功能,可以在此基礎(chǔ)上增加其他功能。
第三個功能適用于數(shù)據(jù)庫審計場景,尤其是做數(shù)據(jù)安全、數(shù)據(jù)防泄漏,甚至入侵檢測等。同樣,可以在此基礎(chǔ)上擴充其他功能。
查看其使用說明,如下
cfc4n@vm-desktop:~/ehids/ecapture$ ./bin/ecapture
NAME:
ecapture - capture text SSL content without CA cert by ebpf hook.
USAGE:
ecapture [flags]
VERSION:
0.1.5-20220325-47edbed
COMMANDS:
bash capture bash command
help Help about any command
mysqld56 capture sql queries from mysqld >5.6 .
tls alias name:openssl , use to capture tls/ssl text content without CA cert.
DESCRIPTION:
ecapture是一款無需安裝CA證書,即可抓去HTTPS、TLS等明文數(shù)據(jù)包的工具。
也可以捕獲bash的命令,適用于安全審計場景。包括mysqld的數(shù)據(jù)庫審計等。
倉庫地址: https://github.com/ehids/ecapture
OPTIONS:
--debug[=false] enable debug logging
-h, --help[=false] help for ecapture
--hex[=false] print byte strings as hex encoded strings
-p, --pid=0 if target_pid is 0 then we target all pids
其中,有四個全局參數(shù),分別是
- --debug , 用于啟動調(diào)試日志
- --help , 查看幫助
- --hex ,按照hex模式打印字符,用與查看不可見字符
- --pid ,用于針對特定進程進行數(shù)據(jù)捕獲
HOOK機制
eCapture采用eBPF uprobe相關(guān)函數(shù)進行HOOK,故需要目標用戶態(tài)函數(shù)信息,包含函數(shù)符號表(symbol table),函數(shù)偏移地址(offset)。 在大部分linux發(fā)行版中,使用的二進制可執(zhí)行文件(ELF)都是包含符號表的;少部分發(fā)行版,會去掉ELF中的符號表。那么針對這種場景,就需要用戶自行定位目標函數(shù)所在ELF/SO中的偏移地址,通過工具的參數(shù)來指定。
對于ELF文件,可以將目標類庫靜態(tài)編譯到自身,也可以通過動態(tài)鏈接庫的方式引用。那么對于這兩種形式,eCapture根據(jù)不同場景進行自動查找。若查找不到,用戶可以通過命令行參數(shù)指定。
故eCapture支持HOOK ELF,以及HOOK SO兩種模式。會自動分析ELF文件,讀取.dynamic和.dynsym等段信息,查找相關(guān)鏈接庫名以及函數(shù)名、偏移地址。
查找原理如下圖:
tls/ssl
ecapture tls命令用于啟動tls/ssl模塊,支持了三類tls/ssl加密類庫,分別是
- openssl ,動態(tài)鏈接庫名字為
libssl.so - gnutls ,動態(tài)鏈接庫名字為
libgnutls.so - nss/nspr ,動態(tài)鏈接庫名字為
libnspr4.so
在不同的linux發(fā)行版中,因為各種原因,會選擇不同的類庫。比如wget程序,在ubuntu跟centos中就會使用不同的類庫。有的是openssl,有的是gnutls,甚至兩個庫都引入了。
具體情況,你可以使用ldd $ELF_PATH | grep -E "tls|ssl|nspr|nss"來查看一個ELF文件使用類庫情況。
cfc4n@vm-desktop:~$ 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類庫依賴情況,那么,你可以使用sudo pldd $PID | grep -E "tls|ssl|nspr|nss" 來查看
cfc4n@vm-desktop:~$ ps -ef|grep firefox
cfc4n 6846 1432 45 17:50 ? 00:00:04 /usr/lib/firefox/firefox -new-window
cfc4n@vm-desktop:~$ sudo pldd 6846 |grep -E "tls|ssl|nspr|nss"
/usr/lib/firefox/libnspr4.so
/usr/lib/firefox/libnssutil3.so
/usr/lib/firefox/libnss3.so
/usr/lib/firefox/libssl3.so
/lib/x86_64-linux-gnu/libnss_files.so.2
/lib/x86_64-linux-gnu/libnss_mdns4_minimal.so.2
/lib/x86_64-linux-gnu/libnss_dns.so.2
/usr/lib/firefox/libnssckbi.so
eCapture的tls模塊命令行參數(shù)如下,用戶可以使用默認配置外,也可以根據(jù)自己環(huán)境自行指定。
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命令即可。
在linux上,firefox程序中,有很多通訊都使用了/usr/lib/firefox/libnspr4.so,但實際上業(yè)務(wù)請求是可以通過Socket Thread進程來發(fā)送的。可以通過這個特點來過濾,對于chrome程序,相信細心的你,也能搞定。
bash
筆者在安全部門工作,接到過bash審計需求,其實現(xiàn)方法無非是修改系統(tǒng)類庫、使用內(nèi)核模塊等技術(shù)實現(xiàn),對系統(tǒng)穩(wěn)定性有一定風險?;趀BPF技術(shù)實現(xiàn),可以避開這些問題。這里的bash命令的監(jiān)控,是作為eBPF技術(shù)在安全審計場景中的一個探索。
eCapture在實現(xiàn)時首先查找ENV的$SHELL值,作為bash的二進制文件路徑進行HOOK。對于bash加載了libreadline.so的場景,也會自動分析,進行符號表查找、offset定位,再進行HOOK。
bash模塊的參數(shù)有三個,用戶可以自定義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模塊一樣,也是作為數(shù)據(jù)庫審計的一個探索。筆者環(huán)境為ubuntu 12.04,mysqld也因為協(xié)議關(guān)系,使用了衍生的MariadDB,用戶也可以根據(jù)自己實際場景,使用命令行參數(shù)進行指定。
mysqld模塊,核心原理是HOOK了dispatch_command函數(shù),
- 第一個參數(shù)為CMD類型,值為COM_QUERY時,為查詢場景,即審計需求的查詢類型。
- 第二個參數(shù)是THD的結(jié)構(gòu)體,在這里我們用不到。
- 第三個是查詢的SQL語句
- 第四個參數(shù)是SQL語句的長度,
// https://github.com/MariaDB/server/blob/b5852ffbeebc3000982988383daeefb0549e058a/sql/sql_parse.h#L112
dispatch_command_return dispatch_command(enum enum_server_command command, THD *thd,
char* packet, uint packet_length, bool blocking = true);
mysqld審計模塊參數(shù)如下:
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這個函數(shù)名每次編譯都是變化的,故不能寫死。
eCapture的查找方式是讀取mysqld二進制的.dynamic段信息,正則語法\\w+dispatch_command\\w+去匹配所有符號信息,找到其函數(shù)名、偏移地址,再使用。
你也可以通過objdump命令來查找,再通過命令行參數(shù)自行指定funcname。
mariadbd version : 10.5.13-MariaDB-0ubuntu0.21.04.1 objdump -T /usr/sbin/mariadbd |grep dispatch_command 0000000000710410 g DF .text 0000000000002f35 Base _Z16dispatch_command19enum_server_commandP3THDPcjbb
即offset為0x710410,函數(shù)名為_Z16dispatch_command19enum_server_commandP3THDPcjbb。
使用
下載二進制包
eCapture發(fā)布在https://github.com/ehids/ecapture/releases ,目前最新版為eCapture v0.1.5。
可在linux kernel 4.18以上版本運行。
二進制包地址:
https://github.com/ehids/ecapture/releases/download/v0.1.5/ecapture_v0.1.5.zip
國內(nèi)加速地址: https://github.do/https://github.com/ehids/ecapture/releases/download/v0.1.5/ecapture_v0.1.5.zip
自行編譯
代碼倉庫在https://github.com/ehids/ecapture ,可以自行修改源碼編譯。
演示視頻:
