任何强制弱 SSL 密码套件的 MITM 工具?

信息安全 tls 中间人 工具 逆向工程
2021-08-23 09:54:36

假设我正在尝试对 Android 应用程序和使用 HTTPS 的 Web 服务器之间的通信进行逆向工程。

一开始,我尝试使用 webmitm 和假证书来做 MITM。但是应用程序无法启动,因为 webmitm 使用的假证书不受应用程序的信任。(假设应用程序有自己的方式来决定它信任的证书,我无法将假证书作为受信任的证书导入 Android)

所以我来了另一种方法。我注意到应用程序和 Web 服务器都支持弱密码(例如 TLS_RSA_EXPORT_WITH_RC4_40_MD5 )。所以我在想,不是使用假证书作为桥接器,而是有任何 mitm 工具只更改客户端 Hello 数据包以强制执行弱密码,并转发服务器的原始证书而不解密或加密中间的任何内容。

换句话说,当app发送“Hello Webserver, I support the following cipher suites: XXX YYY ZZZ. Please choose one your support”时,mitm工具截取这个数据包,并将其更改为“Hello Webserver, I only support TLS_RSA_EXPORT_WITH_RC4_40_MD5”并将其转发到 Web 服务器。由于他们俩都支持此密码套件,因此他们将在其余的通信中使用它。而 mitm 工具只是转发它们之间的所有内容,并记录所有数据包。然后我尝试离线解密记录的数据包。

任何的想法?

1个回答

你正在尝试做的事情将是……困难的。重点是在握手结束时,客户端和服务器Finished在刚刚协商好的算法和密钥的保护下相互发送消息;并且这些消息的内容是对所有先前的握手消息计算的哈希值,包括ClientHelloand ServerHello这相当于如果客户端和服务器没有看到相同的内容ClientHello(因为您在传输过程中对其进行了更改),那么Finished消息内容将不匹配并且握手将失败。

为了成功更改ClientHello,您必须立即破解加密,而不是离线:您必须在握手结束和转发消息之前恢复加密密钥Finished,以便您可以调整内容。

40 位加密在技术上可行的范围内。第一个问题是,对于导出密码套件,40 位密钥只是一个中间密钥;最终密钥扩展为 128 位。蛮力仍然是可行的,但预先计算的表(彩虹表......)不是。一个更大的问题是,由于您必须调整Finished消息的内容,因此您不仅必须破解加密密钥,还要破解 MAC 密钥——而且这些密钥很大(128 位)。

那么,您唯一剩下的选择就是破解服务器使用的 RSA 密钥。理论上,使用TLS_RSA_EXPORT_WITH_RC4_40_MD5时,服务器的公钥最多应该有 512 位。512 位 RSA 密钥是可破解的,但这对于业余爱好者来说仍然是一项艰巨的任务。报道称,单台台式PC可以在两个月内实现;最近,有人在三天内以 75 美元(价值 75 美元的租用 CPU)的价格购买了 512 位 RSA 密钥。如果您尝试使用openssl s_client声称仅支持的客户端(例如 OpenSSL 的命令行工具:)连接到服务器TLS_RSA_EXPORT_WITH_RC4_40_MD5,您将看到服务器发送的证书。如果服务器的公钥只有 512 位,那么您可以设想破解它。但请注意,服务器完全有可能不遵守“出口密码”对 512 位密钥的限制(因为上述出口法规已在十多年前取消)。

如果您可以破解服务器的 RSA 密钥,那么您就可以冒充服务器,即使用服务器自己的证书(在客户端看来必须有效)进行中间人攻击。如果您不能,并且您无法构建客户将接受的假证书,那么我看不出有任何方法可以实现您想要做的事情。