【问题标题】:Decrypt TLS https data traffic解密 TLS https 数据流量
【发布时间】:2016-04-03 09:08:31
【问题描述】:

我已经实现了一个 Java 网络数据包嗅探器,类似于 http://www.freeproject.co.in/source/Network-Packet-Sniffer.aspx?pf=Java&t=webhttp://packetsnifferusingjpcap.blogspot.it/

现在我想解密来自 https 的数据流,为此我设置了变量 SSLKEYLOGFILE,这样浏览器会将用于生成 TLS 会话密钥的值写入由指示的文件这个变量见https://isc.sans.edu/forums/diary/Psst+Your+Browser+Knows+All+Your+Secrets/16415/

正如https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format中解释的那样

SSLKEYLOGFILE 指示的文件是一系列行。注释行以尖字符 ('#') 开头。否则,该行采用这些格式之一。

RSA <space> <16 bytes of hex encoded encrypted pre master secret> <space> <96 bytes of hex encoded pre master secret>

CLIENT_RANDOM <space> <64 bytes of hex encoded client_random> <space> <96 bytes of hex encoded master secret>

如何使用 SSL / TLS 机密日志文件来解密 java 代码中的网络包?

【问题讨论】:

  • 如果您可以控制网络(安装代理)和客户端计算机(安装您自己的 CA 证书),最好尝试 MITM 攻击。
  • @user1516873 你能解释一下怎么做吗?环境是:1)我的浏览器连接到使用 ssl 协议传输数据的站点,尽管在 443 以外的端口上 2)我有一个嗅探器,可以拦截所有未加密的流量 可以在加密数据之间放置一个代理(浏览器)和嗅探器,以便嗅探器接收解密数据?附:使用wireshark我可以解密数据
  • Wireshark 似乎不太可能通过 tls 解密数据,除非我对 tls 工作原理的理解存在缺陷。
  • @Sam Sun 看到这个:isc.sans.edu/forums/diary/…
  • @famedoro MITM - 中间人,您将自己伪装成服务器并解密客户端发送的所有数据。但是您需要 1) 像代理一样行事 2) 在客户端浏览器中插入您自己的根 CA 证书。例如 - 提琴手en.wikipedia.org/wiki/Fiddler_%28software%29

标签: java ssl encryption packet-sniffers tls1.2


【解决方案1】:

您可以使用Charles Proxy(30 天免费),它是用 Java 编写的,可以检查未加密的 https 流量,并且比 WireShark 友好得多。但是 Charles Proxy 只处理 http/https,wireshark 更通用。

【讨论】:

    【解决方案2】:

    要回答您的具体问题,您需要创建一个 TLS 客户端。有许多不错的 TLS Java 库可用,但在尝试第三方工具之前,您可以先尝试一下 JRE 捆绑的 Java 安全套接字扩展 (JSSE)。 JSSE 与其他 Java 加密工具有很好的集成。要开始使用,您可以使用these JSSE samples

    如果默认 JSSE 实现中的 API 不能满足您的需求,请查看以下两个优秀的 Java 开源 TLS 库:

    一旦您解密了数据包,您当然还需要处理 HTTP 流量。为此,您可以将数据包交回浏览器或其他 HTTP 客户端库。

    注意 1:在 TLS 握手期间创建的临时机密仅适用于特定的 TLS 会话。收集这些短暂的秘密不允许您创建通用代理,如Mallory would want to mount a generic man-in-the-middle attack,但它确实允许您访问 TLS 加密的信息,因此如果 Alice 登录她的银行,Alice 的用户名和密码将是其中的一部分现在可用的 TLS 加密数据。这是原因之一,即使 Alice 创建了一个“强”密码,用户名密码方案的安全特性也很差。

    注意 2:在 TLS 中,Alice 必须信任她的 TLS 客户端,即当 Alice 使用公共终端时,Alice 信任她的浏览器是谷歌版的 Chrome,而不是 Chuck's or Malloy's 版的 Chromium。

    注意 3:在 TLS 中,Alice 必须信任只有 Bob 在连接到 Bob 的服务器时才能访问 Bob 的私钥。如果 Chuck 获取了 Bob 的私钥,那么 Chuck 可以在 Alice 没有注意到的情况下代理 Bob 的站点(遗憾的是,Bob 通常需要很长时间才能注意到)——不幸的是,存在许多 IT 运营弱点这使得这个特定场景相对容易,但这不是对 TLS 本身的技术攻击。

    注意 4:如果客户端易受攻击且服务器有义务,Mallory 可以使用Key Compromise Impersonation attack 作为对 TLS 的一般中间人技术攻击;在这一点上,KCI 基本上得到了缓解。

    【讨论】:

      【解决方案3】:

      由于wireshark 已经实现了所有必要的逻辑,您只需将捕获的数据通过tshark 管道传输,然后将输出文本解析回您的应用程序。

      您也可以借助 bouncycastle 之类的加密库自行完成,但这需要付出很多努力,因为您仍然需要解析握手和所有内容(SSLKEYLOGFILE 仅包含真的秘密位,成功解密流量仍然需要大量上下文!)。

      【讨论】:

      • 感谢您的回复:我已经考虑过这种可能性(参见ask.wireshark.org/questions/48767/…),但我不知道如何重定向文件,所有来自固定IP地址的解密数据包。 Wireshark 仅在对特定数据包提供“关注流”后解密数据包(如果我错了,请纠正我),而我想解码来自给定 Ip 的所有数据包。
      • 对您的 tshark 问题的一个答案表明您只需要告诉它哪些端口可以解密为 ssl。如果你有捕获的数据包,在 Java 中检查它们的源 ip 是否是你感兴趣的,如果是,查找端口号应该是微不足道的。
      • 当然这意味着你遇到的每个新端口至少调用一次 tshark,但为了方便你甚至可以为每个 tcp 连接调用一次(再次在你自己的代码中跟踪这些)。跨度>
      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 2018-04-15
      • 2015-07-22
      • 2019-10-05
      相关资源
      最近更新 更多