tl; dr我可以吗?给定原始二进制访问纯文本SSL?
#1 楼
如果在二进制文件运行时可以访问它,则即使具有完美的前向保密性,也完全有可能提取出解密SSL / TLS会话所需的密钥。有一个48字节的密钥,称为主密钥,由双方共享,用于生成连接的会话密钥。如果应用程序使用标准的Win32 API进行SSL连接时,拦截密钥生成的点位于
lsass.exe
内部,位于:Caller: ncrypt!_Tls1ComputeMasterKey@32+0x57
EIP: ncrypt!_PRF@40+0x11a
Azure”。
更一般地说,我(与几位杰出的合著者)最近开发了一种技术,用于扫描所有内存访问以查找有趣的数据,例如SSL / TLS密钥。关于此的论文(“ Tappan Zee(北)桥:挖掘用于自省的内存访问”)已在CCS上发布,并且可以在github上找到进行此操作的软件:PANDA / TZB。特别要看一下
keyfind
插件,该插件获取一个样本(加密)数据包,并扫描内存访问以获取TLS主密钥。查找在新应用程序中发生TLS主密钥的位置的过程是:
使用PANDA创建建立加密连接的应用程序的记录,并保存数据包捕获(在QEMU监视器
begin_record <session_name>
中,运行该应用程序,然后运行end_record <session_name>
。在数据包捕获上运行
scripts/list_enc.py
以提取keyfind
插件所需的信息,然后将此信息放置在keyfind_config.txt
中。使用命令行中指定的
begin_replay <session_name>
运行会话的重播(QEMU监视器中的-panda-plugin x86_64-softmmu/panda_plugins/panda_keyfind.so
)。一个(很长)的时间,它将吐出已读取或写入匹配的TLS密钥的代码位置key_matches.txt
。该文档目前还很粗略,但是查看源代码可以解决您有任何疑问(请随时在此处进行澄清!)。
有关为此使用熊猫的更多信息,请参见:此处
#2 楼
正确实现的SSL流量具有前向保密性。这意味着即使您拥有整个数据包转储和必需的私钥,也无法对其解密。正如Brendan Dolan-Gavitt在回答中指出的那样,您需要在二进制文件运行时访问它。
您可以尝试使用ettercap之类的工具设置SSL mitm。根据SSL的实现,可能涉及到其中的部分内容,但可能无法正常工作。
现在,不是您问题的直接答案,但它可能会帮助您实现所需的目标:
您可以做的另一件事,因为您的目标是分析潜在问题协议是在更高级别上进行挂钩。我之前使用过oSpy做类似的工作。
oSpy是一个工具,可以对在Windows平台上运行的软件进行逆向工程。随着当今存在的专有系统的数量(同步协议,即时消息等),当开发可互操作的解决方案时,保持传统系统所需的大量工作将很快成为一大负担。但是,当在API级别完成嗅探时,它可以让您更精细地了解正在发生的事情。
评论
应该在第一句中强调适当实施;)
– 0xC0000022L♦
13年8月26日在18:08
确认并更正:)
–0xea
13年8月26日在21:16
评论
要回答标题中的问题:不,如果没有密钥,则无法解密SSL连接。蛮力将花费比宇宙时代更多的时间。吉尔斯:我在拆解过程中还能有运气吗?
@bobbybee-否。请参阅此线程:SSL如何工作?那里有三个极好的答案。 ;)
实际上,您的问题更多:«如何通过对客户端进行反向工程来破解SSL连接? »。因为确实知道,当您尝试从外部破解SSL时,SSL是安全的,但是当您完全控制连接的一侧时会发生什么呢?这是您必须调查的内容(以这种方式编辑和重新说明您的问题,您将获得更多相关的答案)
@吉尔斯:我不同意最后一句话。它应包括“以当前的计算速度”之类的内容。我们也不能排除将来会解决素数分解问题。