eCapture开源项目三周年, v1.0.0 稳定版发布 eCapture旁观者是一款基于 eBPF 技术的高级网络工具,专注于 SSL/TLS 协议的明文数据捕获与解密。凭借其强大的功能和丰富的特性,eCapture 已成为网络调试和安全分析领域的重要工具。自2022年3月发布至今三年,累计1.4万颗星。 核心功能 1. 多协议支持 加密库支持:兼容 OpenSSL、GnuTLS、BoringSSL 等多种加密库,支持 HTTP/2 和 QUIC 协议捕获。 协议兼容性:涵盖 TLS 1.2 和 TLS 1.3,确保对最新协议的全面支持。 2. 智能数据捕获 eBPF 引擎:基于 eBPF 技术实现高效的网络数据捕获和协议解析。 双栈支持:支持 IPv4 和 IPv6 的双栈模式,确保在不同网络环境中的灵活应用。 四元组过滤:提供灵活的过滤功能,精准捕获目标流量。 3. 主密钥捕获 自动化捕获:自动检测并捕获 TLS 1.2 和 TLS 1.3 的主密钥,实现加密流量的实时解密。 Wireshark 集成:生成与 Wireshark 兼容的流量文件,支持离线解密和分析。 4. 多种捕获模式 Pcap 模式:生成 Pcapng 格式的流量文件,便于后续分析。 Keylog 模式:捕获通信密钥,生成与 Wireshark 兼容的密钥日志文件。 Text 模式:实时输出明文数据,方便开发者快速调试和分析。 5. 跨平台支持 操作系统:支持 Linux 和 Android 系统,确保在不同操作环境中的稳定运行。 架构兼容:兼容 x86_64 和 ARM64 架构,适用于多种设备和服务器环境。 6. 自动化与智能检测 智能模式选择:自动识别 CO-RE 和非 CO-RE 模式,优化运行性能。 内存优化:提供灵活的内存配置选项,提升资源利用率和系统稳定性。 7. 高性能与兼容性 高效处理:基于 eBPF 的高效数据处理,支持大规模并发和长时间抓包。 稳定性提升:经过多次版本迭代和优化,v1.0.0 版本具有更高的稳定性和兼容性。 8. 灵活配置 自定义过滤:支持灵活的数据过滤配置,精准捕获目标流量。 多种输出格式:支持多种数据输出格式,满足不同场景的需求。 日志管理:提供详细的日志记录,方便后续分析和审计。 9. 命令审计 Shell 审计:捕获 Bash 和 Zsh 命令行的输入和输出,支持实时监控和记录。 数据库监控:监控 MySQL 和 PostgreSQL 的 SQL 查询,提供数据库操作审计功能。 10. Wireshark 插件支持 流量分析:生成兼容 Wireshark 的流量文件,方便使用 Wireshark 进行深入分析。 密钥日志集成:支持在 Wireshark 中加载密钥日志,实现加密流量的实时解密。 技术特点 1. 模块化架构 功能扩展:采用模块化设计,便于功能扩展和维护。 灵活配置:支持多种配置选项,满足不同用户的需求。 2. 多语言开发 内核空间:使用 C 语言实现内核空间功能,确保高效和稳定。 用户空间:使用 Golang 和 CGO 实现用户空间功能,提升开发效率和代码维护性。 3. 交叉编译支持 多架构支持:支持在 amd64 和 ARM64 两种架构下进行交叉编译,生成适用于不同平台的二进制文件。 工具链支持:提供丰富的交叉编译工具链,方便用户根据需求进行编译和配置。 版本更新 v1.0.0 版本 新增功能 支持 Docker 镜像,简化部署和使用。 新增对 OpenSSL 3.4.0 和 GnuTLS 的密钥捕获支持。 支持 IPv6 数据包捕获,扩展网络协议支持。 增加 Zsh 命令审计功能,提升安全监控能力。 关键修复 修复 Ubuntu 24.04 系统上初始化脚本的兼容性问题。 解决 ARM64 版本无法正常工作的问题。 优化构建过程,提升整体稳定性和性能。 社区与开发 开源社区 项目星数:自 2022 年 3 月创建以来,累计获得 14,000+ 颗星,社区活跃度高。 贡献者:吸引了众多开发者参与贡献,共同推动项目发展。 作者信息 开发者:由陈驰(CFC4N)开发,详见其个人博客 www.cnxct.com。 开源精神:秉持开源精神,欢迎更多开发者加入社区,共同改进和完善项目。 部署与使用 易用部署 二进制文件:提供预编译的二进制文件,支持 Linux 和 Android 系统。 Docker 镜像:发布 Docker 镜像,简化部署和使用过程。 文档支持:提供详细的使用文档和配置指南,帮助用户快速上手。 总结 eCapture v1.0.0 是一款功能强大、技术先进的网络工具,凭借其多协议支持、智能数据捕获、跨平台兼容性和高性能,成为开发者和安全研究人员的得力助手。通过三年的不断开发和优化,eCapture 在网络调试和安全分析领域树立了良好的口碑。 未来,随着社区的不断贡献,eCapture 将继续保持其技术领先,服务于更多用户。 2025-08-22 0 0
eCapture旁观者:Android HTTPS明文抓包,无需CA证书 前言 Android上抓包HTTPS是不是越来越难了?高版本无法添加CA证书,抓包软件依赖太多,VPN模式、或HOOK程序时,会被APP检测到。对抗成本愈加增高。有什么万能的工具吗? 是的,eCapture for Android来了。以后在Android上抓HTTPS通讯包,再也不用安装CA证书了,再也不用下载一堆python依赖环境了,再也不用重打包ssl类库了,再也不用改一堆手机参数了,一键启用,简单明了。 eCapture简介 eCapture是一款无需CA证书即可抓获HTTPS明文的软件。支持pcapng格式,支持Wireshark直接查看。基于eBPF技术,仅需root权限,即可一键抓包。 eCapture中文名旁观者,即 当局者迷,旁观者清。 2022年年初上海疫情期间,笔者开始编写并开源,至今已经半年,GitHub上已经 4200个星星。 eCapture是基于eBPF技术实现的抓包软件,依赖系统内核是否支持eBPF。目前支持在操作系统上,支持了X86_64\ARM64的Linux kernel 4.18以上内核,支持了ARM64 Android(Linux) kernel 5.4以上版本。最新版是在2022年9月9日发布的v0.4.3版本。 演示视频 下载后,一条命令启动,干净利索。 ./ecapture tls -w ecapture.pcapng 先看演示视频,演示环境为Ubuntu 21.04、Android 5.4 (Pixel 6)。 模块功能 eCapture支持tls、bash、mysqld、postgres等模块的信息提取与捕获。本文仅讨论tls这个HTTPS/TLS明文捕获模块。 加密通讯明文捕获--tls模块 tls模块在加密通讯类库上,支持了openssl、gnutls、nspr/nss、boringssl等类库。 但在Android上,pcapng模式只支持boringssl,文本模式则都支持。 如何使用eCapture 环境依赖 操作系统 Linux kernel 4.18以上,Android kernel 5.4以上。 支持BPF,可选支持BTF(eCapture版本不同) root权限 版本选择 BPF CO-RE特性为BTF通用的格式,用于做跨内核版本兼容。有的Android手机是没开启BTF。可以查看系统配置确认,CONFIG_DEBUG_INFO_BTF=y为开启;CONFIG_DEBUG_INFO_BTF=n为关闭;其他为不支持BPF,无法使用eCapture。 cfc4n@vm-server:~$# cat /boot/config-`uname -r` | grep CONFIG_DEBUG_INFO_BTF CONFIG_DEBUG_INFO_BTF=y Android系统上,config是gzip压缩的,且配置文件目录也变了。可使用zcat /proc/config.gz命令代替。 eCapture默认发行了支持CO-RE的ELF程序。Android版会发行一个5.4内核不支持BTF(即没有CO-RE)的版本。 下载后,可以通过./ecapture -v确认。 非CO-RE版本的version信息中包含编译时的内核版本。 # no CO-RE eCapture version: linux_aarch64:0.4.2-20220906-fb34467:5.4.0-104-generic # CO-RE eCapture version: linux_aarch64:0.4.2-20220906-fb34467:[CORE] 若版本不符合自己需求,可以自行编译,步骤见文末。 全局参数介绍 全局参数重点看如下几个 root@vm-server:/home/cfc4n/# ecapture -h --hex[=false] print byte strings as hex encoded strings -l, --log-file="" -l save the packets to file -p, --pid=0 if pid is 0 then we target all pids -u, --uid=0 if uid is 0 then we target all users --hex 用于stdout输出场景,展示结果的十六进制,用于查看非ASCII字符,在内容加密、编码的场景特别有必要。 -l, --log-file= 保存结果的文件路径。 -p, --pid=0 捕获的目标进程,默认为0,则捕获所有进程。 -u, --uid=0 捕获的目标用户,默认为0,则捕获所有用户,对Android来说,是很需要的参数。 模块参数 root@vm-server:/home/cfc4n/project/ssldump# bin/ecapture tls -h 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. --gobin="" path to binary built with Go toolchain. -h, --help[=false] help for tls -i, --ifname="" (TC Classifier) Interface name on which the probe will be attached. --libssl="" libssl.so file path, will automatically find it from curl default. --nspr="" libnspr44.so file path, will automatically find it from curl default. --port=443 port number to capture, default:443. --pthread="" libpthread.so file path, use to hook connect to capture socket FD.will automatically find it from curl. --wget="" wget file path, default: /usr/bin/wget. -w, --write="" write the raw packets to file as pcapng format. -i参数 -i参数为网卡的名字,Linux上默认为eth0,Android上默认为wlan0,你可以用这个参数自行指定。 输出模式 输出格式支持两种格式,文本跟pcapng文件。有三个参数, 默认,全局参数,输出文本结果到stdout -l 全局参数,保存文本结果的文件路径 -w 仅tls模块参数,保存pcapng结果的文件路径 类库路径 Linux上支持多种类库,不同类库的路径也不一样。 类库 参数路径 默认值 openssl/boringssl --libssl Linux自动查找,Android为/apex/com.android.conscrypt/lib64/libssl.so gnutls --gnutls Linux自动查找,Android pcapng模式暂未支持 nspr/nss --nspr Linux自动查找,Android pcapng模式暂未支持 文本模式 -l 或者不加 -w 参数将启用该模式。 支持openssl、boringssl、gnutls、nspr/nss等多种TLS加密类库。 支持DTLS、TLS1.0至TLS1.3等所有版本的加密协议。 支持-p、-u等所有全局过滤参数。 pcapng模式 -w 参数启用该模式,并用-i选择网卡名,Linux系统默认为eth0,Android系统默认为wlan0, 仅支持openssl、boringssl两个类库的数据捕获。暂不支持TLS 1.3协议。 类库与参数支持 在Linux系统上,大部分类库与参数都是可以支持的。但在Android系统上,因为内核与ARM架构的原因,支持的参数上,有一定的差异。 不同模式的参数支持 -p、-u两个全局参数,支持文本模式,不支持pcapng模式。这是因为pcapng模式是使用eBPF TC技术实现。 模式 -p -u --libsso --port 文本 ✅ ✅ ✅ ✅ pcapng ❌ ❌ ✅ ✅ 不同模式的类库以协议支持 模式 openssl(类库) boringssl(类库) TLS 1.0/1.1/1.2(协议) TLS 1.3(协议) 文本 ✅ ✅ ✅ ✅ pcapng ✅ ✅ ✅ ❌ pcapng模式暂时不支持TLS 1.3,TLS 1.3密钥捕获功能已经开发完成,只是遇到一些BUG,还在解决中。 笔者不是openssl的专家,对TLS 协议也不太熟。需要补充这两块的知识,解决起来成本比较高,也欢迎对这块擅长的朋友一起来解决。 与tcpdump联合使用 eCapture基于eBPF TC,实现了流量捕获,并保存到pcapng文件中。基于eBPF Uprobe实现了TLS Master Secret的捕获。并基于Wireshark的Decryption Secrets Block (DSB)标准,实现了gopacket的DSB功能,合并网络包与密钥,保存到pcapng中。 eCapture在网络包捕获上,没有tcpdump强大,不支持丰富的参数。你可以用eCapture捕获master secrets,用tcpdump捕获网络包,然后使用wiresahrk自定义设置密钥文件,配合使用。 网络包捕获 tcpdump 的常规用法,不再赘述。 密钥捕获 同时启用ecapture ,模式可以选文本或者pcapng,都会保存TLS的master secrets密钥数据到ecapture_masterkey.log中。 网络包查看 用Wireshark打开网络包文件,设置这个master key文件,之后就可以看到TLS解密后的明文了。 配置路径:Wireshark --> Preferences --> Protocols --> TLS --> (Pre)-Master-Secret log filename 参数 指定路径 默认路径 在Android上,Google使用了boring ssl类库,也就是C++语言在libssl基础上的包装。默认情况下,会使用/apex/com.android.conscrypt/lib64/libssl.so路径。 APP的类库确认 你可以使用lsof -p {APP PID}|grep libssl来确认。 若不是默认路径,则可以使用--libssl参数来指定。 高级用法 如果你需要查看的APP是自定义SSL类库,那么你可以自助修改eCapture来实现。 自定义函数名与offset 首先,需要确定HOOK函数的函数名或者符号表地址。 没有源码 如果你没有类库源码可以通过IDA等软件静态分析、动态调试,确定SSL Write的地址offset。在配置填写在user/module/probe_openssl.go文件中,对应的probe配置部分。 { Section: "uprobe/SSL_write", EbpfFuncName: "probe_entry_SSL_write", AttachToFuncName: "SSL_write", UprobeOffset: 0xFFFF00, // TODO BinaryPath: binaryPath, }, offset自动计算 如果你有源码,则可以自行阅读源码确定函数名或者符号表的地址。对于结构体的成员属性读取,则可以通过offsetof宏来自动计算。 // g++ -I include/ -I src/ ./src/offset.c -o off #include <stdio.h> #include <stddef.h> #include <ssl/internal.h> #include <openssl/base.h> #include <openssl/crypto.h> #define SSL_STRUCT_OFFSETS \ X(ssl_st, session) \ X(ssl_st, s3) \ X(ssl_session_st, secret) \ X(ssl_session_st, secret_length) \ X(bssl::SSL3_STATE, client_random) \ X(bssl::SSL_HANDSHAKE, new_session) \ X(bssl::SSL_HANDSHAKE, early_session) \ X(bssl::SSL3_STATE, hs) \ X(bssl::SSL3_STATE, established_session) \ X(bssl::SSL_HANDSHAKE, expected_client_finished_) struct offset_test { /* data */ int t1; bssl::UniquePtr<SSL_SESSION> session; }; int main() { printf("typedef struct ssl_offsets { // DEF \n"); #define X(struct_name, field_name) \ printf(" int " #struct_name "_" #field_name "; // DEF\n"); SSL_STRUCT_OFFSETS #undef X printf("} ssl_offsets; // DEF\n\n"); printf("/* %s */\nssl_offsets openssl_offset_%d = { \n", OPENSSL_VERSION_TEXT, OPENSSL_VERSION_NUMBER); #define X(struct_name, field_name) \ printf(" ." #struct_name "_" #field_name " = %ld,\n", \ offsetof(struct struct_name, field_name)); SSL_STRUCT_OFFSETS #undef X printf("};\n"); return 0; } 参数提取 对于参数,你需要确认被HOOK函数的参数类型,以便确认读取方式,可以参考kern/openssl_kern.c内的SSL_write函数实现。 编译 ARM Linux 编译 公有云厂商大部分都提供了ARM64 CPU服务器,笔者选择了腾讯云的。在广州六区中,名字叫标准型SR1(SR1即ARM 64CPU),最低配的SR1.MEDIUM2 2核2G即满足编译环境。可以按照按量计费方式购买,随时释放,比较划算。 操作系统选择ubuntu 20.04 arm64。 ubuntu@VM-0-5-ubuntu:~$sudo apt-get update ubuntu@VM-0-5-ubuntu:~$sudo apt-get install --yes wget git build-essential pkgconf libelf-dev llvm-12 clang-12 linux-tools-generic linux-tools-common ubuntu@VM-0-5-ubuntu:~$wget https://golang.google.cn/dl/go1.18.linux-arm64.tar.gz ubuntu@VM-0-5-ubuntu:~$sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.18.linux-arm64.tar.gz ubuntu@VM-0-5-ubuntu:~$for tool in "clang" "llc" "llvm-strip" do sudo rm -f /usr/bin/$tool sudo ln -s /usr/bin/$tool-12 /usr/bin/$tool done ubuntu@VM-0-5-ubuntu:~$export GOPROXY=https://goproxy.cn ubuntu@VM-0-5-ubuntu:~$export PATH=$PATH:/usr/local/go/bin 编译方法 ANDROID=1 make 命令编译支持core版本的二进制程序。 ANDROID=1 make nocore命令编译仅支持当前内核版本的二进制程序。 当Wireshark被eBPF增强 Wireshark + eBPF = eCapture 贡献者 感谢chriskaliX 、chenhengqi、vincentmli、huzai9527、yihong0618、sfx(4ft35t)等朋友的贡献。 感谢tiann Weishu在Android这个需求上的推动。 招聘 Leader直招,没有中间商赚差价。面向RASP、HIDS产品,JVM、Linux内核入侵检测等安全研发职位 JAVA资深研发工程师 golang高级工程师 更多职位见 https://www.cnxct.com/jobs/ 2022-09-13 4 0
eCapture的几个好消息,支持Android… 缘起 这个故事要从上海的疫情说起。 三月份,上海爆发了疫情。全市开始封城,停工停课,所有人都不得不居家防疫。离不了家门,意味着空闲时间增多了,也正好可以利用一下,做个小项目之类的。 也正巧,前段时间研究了eBPF攻防的技术,而技术的应用场景最广泛的就是跟踪调试了。广大研发、运维同学们面临的最大场景就是网络抓包,恰恰大量数据包都是HTTPS加密的,这就称为多数人的痛点,那么结合eBPF技术,可以很好的解决这一痛点。 说干就干,三月中旬就发了初版eCapture:无需CA证书抓https网络明文通讯,随着上海封城的持续,空闲时间也多,项目也逐步完善,支持4.X至5.X的内核版本。 最近呢,复工复产了,空闲时间就少了,不过,近期搞到凌晨一两点的情况也是常态。不能半途而废不是嘛。 进展 这几天,有几个好消息分享给大家,有的是付出得到的回报,有的是项目的新功能。 ebpf.io 收录 eCapture项目被 ebpf.io 官网收录了 ,在「Emerging新兴项目」中,暂排第一。是按照Star数量来的,项目复杂度、技术深度不如其他项目,但实用性比较大,深受大家喜欢。 eCapture for Android eCapture也支持了Android的GKI发型版本,你在eCapture v0.1.10 release (Linux x86_64/aarch64, Android GKI)中下载试用。 也就是说,Android 11,Android 12的版本都支持。 4.X内核的Android支持,还会远吗? 有位同学告诉我说,这会让反爬的同学受到很大挑战,eBPF的抓包,APP层很难发现,APP自身没有特征,也很难防御。 我不这么看,我觉得风控对抗上,核心点不该只在端上对抗,而应该在数据分析、好人坏人识别等方向上。地理位置、网络环境、设备型号等问题可以更加综合的考虑。 另外,可以再思考一个问题,这意味着什么? 意味着Linux上的eBPF功能都可以在Android上使用,各种网络管理、监控软件、安全保护等,甚至后门。你觉得,还有什么场景呢? 演示视频 付上一个eCapture for Android的演示视频,是TaiChi Xposed框架作者 weishu 大佬帮测试的,我没有Android手机,对Android生态也不了解,感谢weishu在这个事情上的支持。 eCapture中文名旁观者 eCapture有了中文名,叫「旁观者」,即「当局者迷,旁观者清」,与其本身功能【旁路、观察】契合,且发音与英文有相似之处。 是不是有点信雅达呢? 要不,您给起个名? 加入贡献 现在,还缺少一个官方网站,或者融合中文含义的新LOGO,如有对eCapture开源项目感兴趣的设计师、UI前端工程师,愿意帮助项目设计新页面、新LOGO的同学,可以在微信公众号内留言,我会私聊你,谢谢。 红领巾 又为社会做了一点点贡献,胸前的红领巾更加鲜艳了。 2022-06-22 1 0
手机通讯录,或许可以增加QQ、微信之类IM用户黏度 很多互联网公司,都努力抢占互联网的用户入口,从PC的操作系统Ghost(番茄花园、深度),到PC的浏览器入口(hao123),到PC的桌面程序入口(360安全卫士),再到移动平台的刷机程序(shendu、shuame),这些地方,都陆续成为他们的目标。 在手机上,不管各种刷机程序如何精简软件,都剪不掉通讯录这个程序。如果,在通讯录中,展示当前用户Instant Messenger即时通讯工具中好友的在线状况呢?如果你想给别人打电话,在通讯录里找这个人,找到之后,发下下面有个QQ或者WeChat微信在线的图标,如果事情不紧急的话,你会选择通过QQ语音通话吗? 这得从我去年年底,今年年初买的一部手机说起。 在2012年底,我换了一部Android手机Google Nexus 4,这是我的第一步智能手机,我打算在它上面,做一些移动应用上的尝试。但不知道该做什么样的功能,无意中,看到通讯录中联系人的列表里,如果对方gtalk在线的话,会直接展示出来,而且,还会同步个性签名,这太棒了。 Google Talk在国内,不是很流行,用户基数也少。在国内最流行的,莫过于腾讯的QQ了,以及手机专用的IM --WeChat微信,我也是腾讯的重度老用户。试想着,也把QQ联系人状态显示在通讯录里,一目了然,方便用户,也扩大了腾讯的魔爪。 程序上来说,我初次写android应用,java也已经5、6年没碰过,当初也只是会写个hello world。现在做起来,实在难。还好有google 官方手册,各大开源社区上也有现成的开源项目,照葫芦画瓢,勉强能跑起来。实现IM状态更新到通讯录这比较简单,但获取当前登录QQ、以及登录QQ的联系人在线情况,签名信息这极为困难。腾讯没有提供相应接口。我也不敢逆向手机QQ源码,来获取相应信息,哪怕敢了,也要花费大量精力。哪怕做成了,还是给腾讯做嫁衣。 这么一说,我的第一个移动应用,就这么OVER了。 抛开个人因素,单说这个创意,我认为,是令人震惊的... 如果你想给别人打电话,在通讯录里找这个人,找到之后,发下下面有个QQ在线的图标,如果事情不紧急的话,你会选择通过QQ语音通话吗? (微信没有在线状态一说) 打开对方信息详情页: 如果你输入了号码, 通话界面,直接提醒你 QQ、WeChat在线,可以通过其免费语音通话,那你选择吗?(紧急事情除外) 当用户选择使用QQ、微信图标时,即(在电话接通之前)挂断电话,直接弹出对应的语音通话面板,开始通话。(如果电话接通,则隐藏图标选择界面。) 腾讯,你还等什么...... 如果这样做了,那得劫持多少用户改用QQ啊? 移动、网通恨死IM了。 其实,移动,联通你们也可以的,但你们舍得么?敢吗?有勇气么?有胆识么?以后你们终究会从一张SIM电话卡沦落为移动的上网卡。 可能有人说,用户很少会在通讯录里填上对方的QQ号码,一般只会存个手机号,其他信息都会再输入了。但那是非智能手机的时候,填写联系人信息不方便的做法。现在可以在电脑上输入,云端同步到手机中。实在不行,腾讯不是有手机管家的通讯录管理功能么?腾讯自己就很容易帮用户关联好了吧? 上面提到,紧急事情可以不选择QQ、微信进行语音通话,但以后大家都喜欢这种通话方式,那么电话卡失去打电话功能,只能留下网络支持的功能了,那么移动电话卡变成移动网卡。 PS:就连Photoshop,老衲也用的很流畅,PS的界面也很惊艳,老衲不尽欣赏起自己一番。 2013-02-19 +3 7 0