Feature
- Project
- 2022년 시작된 eBPF 기반 오픈소스 프로젝트로 중국 Meituan Company 의 내부 프로젝트로부터 출발
- 공식 홈페이지 : https://ecapture.cc/
- Using Lang
- Kernel Space : C
- User Space : Go Lang
- Main Spec
- HTTPS 패킷 Capture
- 상위 버전의 CA 인증서가 필요 없음
- Language(예, Python) 종속성 환경을 다운로드하거나 SSL 라이브러리를 다시 패키징 등을 할 필요가 없음.
- 특히 점점 더 까다로워지는 Android 환경에서의 HTTPS Plaintext 패킷 캡쳐를 손쉽게 할 수 있도록 도움을 줌.
- 유사 툴인 ssldump와 비교하여 더 뛰어난 성능과 사용 편리성을 갖춤
- HTTPS 외 Capture
- tls hooking
- Capturing plaintext communication from Golang programs encrypted with TLS/HTTPS.
- eBPF를 활용, CA 인증서 없이 HTTPS/TLS plaintext 를 캡쳐
- bash hooking
- command hooking
- Database hooking
- capture sql queries (MySQL, Postgres)
- It can also capture bash commands, which is suitable for security auditing scenarios, such as database auditing of mysqld, etc
- tls hooking
- HTTPS 패킷 Capture
- eCapture vs ssldump
- eCapture는 ssldump보다 다양한 모듈을 캡쳐 가능
- eCapture는 HTTPS 패킷 캡쳐 시 eBPF를 사용하고 CA 인증서가 필요 없음
(ssldump -Ad -k ~/server.pem -p foobar -i eth0 host myserver) - 출처
https://www.libhunt.com/compare-ecapture-vs-ssldump
Supported Arch
- x86_64
- Linux Kernel 4.18 or higher
- ARM (aarch64)
- Linux/Android Kernel 5.5 or higher
RUNS
- Requirements (on x86_64)
- Linux Kernel 4.18 or higher
- BPF CO-RE 기능 (BTF)
(CO-RE[Compile Once – Run Everywhere] : eBPF 프로그램이 다른 커널 버전간에 동작될 수 있게 하는 기능)- BTF 활성화 여부 확인
# cat /boot/config-`uname -r` | grep CONFIG_DEBUG_INFO_BTF
CONFIG_DEBUG_INFO_BTF=y
CONFIG_DEBUG_INFO_BTF_MODULES=y
- BTF 활성화 여부 확인
- Download & Install
# wget https://github.com/gojue/ecapture/releases/download/v0.6.4/ecapture-v0.6.4-linux-x86_64.tar.gz
# tar zxvf ecapture-v0.6.4-linux-x86_64.tar.gz
# ls
CHANGELOG.md ecapture LICENSE README_CN.md README.md - Test
- Test Env
- Ubuntu 22.04.2 LTS
- 5.15.0-1026-x86_64
- Capture Test - TLS
- matching - application & library
wget - https plain text packet capture- 1) wget이 사용하는 TLS/SSL library 확인
→ wget은 libssl을 사용
2) 모든 프로세스를 대상으로 tls 통신 Capture 대기 (libssl / libgnutls / libnspr4)
3) wget 수행 (다른 tty에서)
Capture 진행
- 1) wget이 사용하는 TLS/SSL library 확인
- firefox - https plain text packet capture (nspr)
- 1) firefox가 사용하는 TLS/SSL library 확인
2) 모든 프로세스를 대상으로 tls 통신 Capture 대기 (libssl / libgnutls / libnspr4)
- 1) firefox가 사용하는 TLS/SSL library 확인
- matching - application & library
- Test Env
- eCapture Architecture
- Work Flow
- compile by clang/llvm → eBPF Byte Code → Go-Bindata 변환 → ehids/ebpfmanager Class Library를 통해 로딩 → Hook 및 Map 읽기를 위해 bpf() syscall
- ( * profiling events (kprobes, uprobes, tracepoints, USDT, perf_events) )
The eBPF networking specific use including loading BPF programs with tc (traffic control) and XDP
- eBPF Loading Mechanism
- User Mode에서 암호화 및 암호 해독 기능을 연결 → tcpdump(libpcap)는 패킷을 수신 → 수신된 패킷을 XDP에서 처리 한 후 패킷을 복제 → 해당 패킷을 복사하여 User Mode 프로세스로 전송
- Hook Mechanism
- eCapture는 eBPF uprobe 관련 함수를 사용하여 HOOK을 수행함
- 따라서 symbol table 및 offset를 포함하는 타겟 User Mode 함수 정보가 필요
- 대부분의 Linux 배포판에서 사용되는 ELF에는 symbol table이 포함되어 있음
- ELF 파일의 경우 대상이 되는 class library는 static하게 컴파일되어 반영되어 있거나 dynamic link library를 통해 참조됨.
Library 참조 형태 두 가지 모두 eCapture는 다양한 시나리오에 따라 자동으로 검색, 만약 찾을 수 없는 경우 사용자는 명령 줄 옵션(매개변수)를 통해 이를 지정할 수 있음.
- ELF 파일의 경우 대상이 되는 class library는 static하게 컴파일되어 반영되어 있거나 dynamic link library를 통해 참조됨.
- eCapture는 두 가지 모드 (HOOK ELF 및 ELF SO) 모두 지원함
- ELF 파일을 자동으로 분석하고, .dynamic 및 .dynsym과 같은 세그먼트 정보를 읽고, 관련 링크 라이브러리 이름, 함수 이름 및 오프셋 주소를 찾음.
- eCapture는 eBPF uprobe 관련 함수를 사용하여 HOOK을 수행함
- Work Flow
Reference
- https://ebpf.io/applications/
- https://www.eet-china.com/mp/a163753.html
- https://github.com/gojue/ecapture/issues/65
- https://ecapture.cc/guide/how-it-works.html
- https://www.cnxct.com/
- https://www.cnxct.com/using-ebpf-tc-to-securely-mangle-packets-in-the-kernel/
- https://liuhangbin.netlify.app/post/ebpf-and-xdp/
- https://mp.weixin.qq.com/s/DvTClH3JmncpkaEfnTQsRg
(★ Explains eCapture's Architecture, eBPF flow, Hook mechanism) - https://zhuanlan.zhihu.com/p/500076412
(eHIDS) - https://www.youtube.com/watch?v=Au1YeB0nz3g
(eCapture - eBPF tracing to uncover container TLS clear text)
eCapture tool, eBPF