解密TLS HTTPS数据流量

10
我已经实现了一个类似于http://www.freeproject.co.in/source/Network-Packet-Sniffer.aspx?pf=Java&t=webhttp://packetsnifferusingjpcap.blogspot.it/的Java网络数据包嗅探器。
现在,我想解密来自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证书),最好尝试中间人攻击。 - user1516873
@user1516873,您能解释一下如何操作吗?环境如下: 1)我的浏览器连接到一个使用SSL协议传输数据的站点,但端口不是443; 2)我有一个嗅探器可以拦截所有未加密的流量。是否可以在加密数据(浏览器)和嗅探器之间放置代理,以便嗅探器接收解密后的数据?附:使用Wireshark,我能够解密数据。 - famedoro
除非我的 TLS 工作原理理解有误,否则似乎不太可能 Wireshark 能够解密 TLS 上的数据。 - samczsun
@孙山 请查看:https://isc.sans.edu/forums/diary/Psst+Your+Browser+Knows+All+Your+Secrets/16415/ - famedoro
@famedoro MITM - Man In The Middle,即中间人攻击,您伪装成服务器,并获得客户端发送的所有解密数据。但是,您需要 1)像代理一样操作 2)在客户端浏览器中插入自己的根 CA 证书。例如- Fiddler https://en.wikipedia.org/wiki/Fiddler_%28software%29 - user1516873
3个回答

1
由于Wireshark已经实现了所有必要的逻辑,您可以通过tshark将捕获的数据直接传输,并将输出文本解析回您的应用程序中。
您也可以使用加密库(如bouncycastle)自己完成此操作,但这需要很多工作,因为您仍然需要解析握手和其他内容(SSLKEYLOGFILE只包含真正的秘密位,还需要很多上下文才能成功解密流量!)。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - famedoro
你的tshark问题的一个答案表明,你只需要告诉它要解密哪些端口作为ssl。如果你已经捕获了数据包,在Java中检查它们的源IP是否是你感兴趣的IP地址应该很容易,如果是,再查找端口号即可。 - user1531083
当然,这意味着每遇到一个新端口就至少要调用一次tshark,但为了方便起见,您甚至可以为每个TCP连接调用一次(再在自己的代码中跟踪它们)。 - user1531083

0

针对您的具体问题,您需要创建一个TLS客户端。有许多优秀的TLS Java库可用,但在尝试第三方工具之前,您可以尝试使用JRE捆绑的Java安全套接字扩展(JSSE)。JSSE与Java加密工具的其余部分集成得很好。要开始,请使用这些JSSE示例

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

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

注意1:在TLS握手期间创建的短暂密钥仅适用于特定的TLS会话。收集这些临时密钥并不能让您创建一个通用代理,因为Mallory想要发起一次普通的中间人攻击,但它确实为您提供了访问TLS加密信息的权限,因此如果Alice正在登录她的银行,Alice的用户名和密码将成为现在可用的TLS加密数据的一部分。这是一个原因,即使Alice创建了“强密码”,用户名-密码方案仍具有较差的安全特性。

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

注意3:在TLS中,当Alice连接到Bob的服务器时,她必须相信只有Bob可以访问Bob的私钥。如果Chuck获取了Bob的私钥,则Chuck可以代理Bob的站点而不被Alice注意到(不幸的是,Bob通常需要很长时间才能注意到)--不幸的是,有许多IT运营弱点使得这种特定情况相对容易发生,但这并不是针对TLS本身的技术攻击。

注意4:如果客户端易受攻击且服务器同意,Mallory可以使用密钥妥协仿冒攻击作为一种针对TLS的一般中间人技术攻击;目前KCI已经得到了大部分缓解。


0
你可以尝试使用Charles Proxy(30天免费试用),它是用Java编写的,可以检查未加密的https流量,并且比WireShark更加友好。但是请注意,Charles Proxy只处理http/https,而Wireshark则更为通用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接