【问题标题】:Is it possible to intercept unencrypted HTTPS request body of local programs?是否可以拦截本地程序未加密的 HTTPS 请求体?
【发布时间】:2020-04-21 12:47:03
【问题描述】:

是否可以编写一个通用的 EBPF 程序来读取所有用户空间程序的未加密 HTTPS 请求和响应体?

据我了解,EBPF 适用于网络第 2、3 和 4 层的数据包。 HTTPS 有效负载在这些数据包中进行了加密,因此 EBPF 可以读取数据包元数据,但不能读取构成 HTTPS 请求/响应的有效负载?

将日志记录添加到用户空间程序是唯一的方法吗?

【问题讨论】:

  • SSL/TLS 有效负载(例如 HTTPS 使用的有效负载)在进入网络之前在用户空间中进行了加密。所以是的,您必须在程序本身内添加未加密数据的日志记录

标签: linux https network-programming bpf ebpf


【解决方案1】:

有一种方法可以制作读取加密流量(SSL / TLS)内容的通用解决方案。

带有sslsplit 的老式 MiTM 设置将为您完成所有肮脏的工作。

您可以完全控制 DUT(被测设备),因此您可以随时将假根 CA 证书添加到您的系统中,以便 sslsplit 即时生成假证书。

这确实是通用解决方案,允许拦截任意平台的 DUT 流量 - Windows、iOS、MacOS、Linux、Android。

我在云中使用小型 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
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

新年快乐,黑客快乐! :-)

【讨论】:

    【解决方案2】:

    正如您提到的和其他人所确认的,数据在数据包传递到内核之前在用户空间中加密,因此在使用 eBPF 处理数据包时您无法检查未加密的数据(或者实际上,您需要做一些MitM 黑客攻击)。

    但请记住,eBPF 也可以用于跟踪,无论是内核还是用户空间程序。特别是,BCC 框架有一个非常有趣的sslsniff example,其中 eBPF 程序(通过用户探测)直接连接到 SSL/TLS 库(在运行时,库不需要重新编译),以便拦截未加密的数据在它被加密之前。你可能想看看它附带的the sample output,也许这个工具可以帮助你解决问题。

    【讨论】:

      【解决方案3】:

      正如@Qeole 和@Maxim 所解释的,如果有效载荷在用户空间中加密,您将不得不求助于中间人。不过还有另一种情况:可以在内核中使用 kTLS 对有效负载进行加密

      如果用户空间进程依赖于 kTLS,那么握手仍然在用户空间进行,但后续消息将在内核中进行加密。在这种情况下,您可以在内核中的 TLS ULP 层附加BPF_PROG_TYPE_SK_MSG 类型的 BPF 程序

      您可以在内核测试中找到此类设置的示例,即test_sockmap。在该示例中,TLS 连接是在sockmap_init_ktls() 的用户空间中设置的。对应的BPF程序在test_sockmap_kern.h

      kTLS 相对较新,因此在我撰写此答案时,这显然是一个极端情况。然而,随着用户空间库开始透明地使用它,它可能会变得更加普遍。例如,OpenSSL 一年多前合并了support for kTLS

      【讨论】:

        猜你喜欢
        • 2020-08-26
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 2019-01-09
        相关资源
        最近更新 更多