zin*_*ino 6 linux https network-programming bpf ebpf
是否可以编写一个通用的 EBPF 程序来读取所有用户空间程序的未加密 HTTPS 请求和响应主体?
据我了解,EBPF 处理网络第 2、3 和 4 层的数据包。HTTPS 有效负载在这些数据包中加密,因此 EBPF 可以读取数据包元数据,但不能读取构成 HTTPS 请求/响应的有效负载?
这样做是将日志记录添加到用户空间程序的唯一方法吗?
正如 @Qeole 和 @Maxim 所解释的,如果有效负载在用户空间中加密,您将不得不求助于中间人。但还有另一种情况:有效负载可能在内核中使用kTLS进行加密。
如果用户空间进程依赖kTLS,那么握手仍然在用户空间中执行,但后续消息将在内核中加密。在这种情况下,您可以在内核中的TLS ULP 层附加 BPF 类型的程序。BPF_PROG_TYPE_SK_MSG
您可以在内核测试中找到此类设置的示例,即test_sockmap. 在该示例中,TLS 连接是在sockmap_init_ktls(). 相应的BPF程序位于test_sockmap_kern.h.
kTLS 相对较新,因此在我撰写此答案时它显然是一个极端情况。然而,随着用户空间库开始透明地使用它,它可能会变得更加常见。例如,OpenSSL一年多前就合并了对 kTLS 的支持。
正如您所提到的以及其他人所证实的,在数据包传递到内核之前,数据在用户空间中进行了加密,因此在使用 eBPF 处理数据包时您无法检查未加密的数据(或者实际上,您需要进行一些 MitM 黑客攻击) 。
但请记住,eBPF 也可用于跟踪,无论是内核还是用户空间程序。特别是,BCC 框架有一个非常有趣的sslsniff示例,其中 eBPF 程序(通过用户探针)直接挂钩到 SSL/TLS 库(在运行时,库不需要重新编译),以便拦截之前的未加密数据。被加密。您可能想看看它附带的示例输出,也许这个工具可以帮助解决您的问题。
有一种方法可以制作通用解决方案来读取加密流量(SSL / TLS)的内容。
老派的 MiTM 设置sslsplit将为您完成所有肮脏的工作。
您可以完全控制 DUT(被测设备),因此您始终可以将假根 CA 证书添加到系统中,以便 sslsplit 动态生成假证书。
这确实是通用解决方案,允许拦截任意平台(Windows、iOS、MacOS、Linux、Android)的 DUT 流量。
我在云中使用小型 VPS 来制作具有 MiTM 功能的流氓 VPN 服务器(即在其上运行 sslsplit)。
要拦截(和解密)DUT 的流量,您只需激活与特定 MiTM 服务器的 VPN 连接。
当然,您可以在办公室/家里使用虚拟机来代替基于云的 VPS。由于灵活性,我选择了云 VPS - 即我可以在实验室环境之外随时随地记录 Android 的流量。
有很多关于如何配置 VPN 服务器和 sslsplit 的教程。最有可能的是有现成的 docker 或 vagrant 镜像来设置此类拦截服务器。这是一个示例: https: //github.com/praetorian-code/mitm-vm
以下是我当前服务器中相关部分的复制粘贴:
ufw allow 10443
ufw allow 10080
iptables -t nat -A PREROUTING -i tun0 \
-p tcp --dport 443 -j REDIRECT --to-port 10443
iptables -t nat -A PREROUTING -i tun0 \
-p tcp --dport 80 -j REDIRECT --to-port 10080
Run Code Online (Sandbox Code Playgroud)
sslsplit -D \
-l /root/mitm/logs/connections`date +%Y-%m-%d_%H-%M`.log \
-S /root/mitm/recorded/ \
-L /root/mitm/logs/log`date +%Y-%m-%d_%H-%M`.bin \
-F /root/mitm/recorded/%T_%d.raw \
-k /root/mitm/ca.key \
-c /root/mitm/ca.crt \
https 0.0.0.0 10443 \
http 0.0.0.0 10080 \
> /root/mitm/logs/`date +%Y-%m-%d_%H-%M`.log2 2>&1
Run Code Online (Sandbox Code Playgroud)
新年快乐,黑客快乐!:-)
| 归档时间: |
|
| 查看次数: |
1280 次 |
| 最近记录: |