MITM 攻击 :对加密服务逆向工程

MITM 攻击 :对加密服务逆向工程,第1张

MITM攻击:对加密服务逆向工程



内容

内容相当简单。Theodo的工资单外包给了另一家公司:Silaexpert。我们已经获得了访问权限,以及一个访问假期和工资表的url。


一切都从这个环节开始:http://www.silaexpert01.fr/silae.


这个链接在Chrome、Firefox、Safari上无法打开,在WindowsS10系统中也无法运行。


似乎只能在windows7的IE浏览器中打开,这对于所有在Theodo中运行Linux或OSX的开发者来说都不是一个好消息。

黑盒

我们可以从微软下载免费的虚拟机:https://developer.Microsoft.com/en-us/Microsoft-edge/tools/VMs/。为此,VM和IE9将在Windows7上更好地工作。


因此,如果您有一个虚拟机并且可以运行它,您就可以访问该url。但是,它正在下载一个胖客户端,并且已经开始了某种安装过程。


最后,您可以登录并下载您的最终工资单。然后下个月再重复这个过程。如果你重置虚拟机,它也不会工作,因为你没有许可证。


正式开始


如果你想直接从你自己的Mac或Linux电脑上下载文件而不通过虚拟机。你必须向远程服务器发送正确的请求(具体地址我还不知道,可能已经被下载的胖客户端代码加密了)。


因此,让我们先嗅一下所有来自虚拟机的网络流量。


您可以在自己的平台上使用任何嗅探工具:

可以在大多数系统中使用的Wireshark可能有些过头了。

查尔斯代理,可用于Mac。

Mitm代理,喜欢用python的人可以选择。

Fiddler,用于windows(试用版可用于Mac和Linux)。


这里以代理为例:


1.首先在主机上启动HTTP代理。输入代理,然后设置代理,注意使用的端口。


2.启动虚拟机


1)打开命令行并运行ipconfig/all,注意默认网关IP。这是你的主机IP。


2)打开IE浏览器,找到互联网选项>;连接>:局域网设置,然后设置代理服务器的IP和端口。


3)完成了!现在,您可以在Charles上看到VM的所有通信。


现在,如果你登录胖客户端,下载一个工资表,应该有足够的数据来考虑下一个问题。

数据分析


现在我们有了客户机和服务器之间完整的信息交换。


首先要注意的是,并非所有的通信都由SSL/TLS加密。真的是很容易的数据!也就是说,我们仍然可以通过虚拟机上的代理服务器生成假CA来嗅探加密通信。


我们也会注意到这些事情:


1.单个web服务端点:

Http://www.silaexpert01.fr/SILAE/IWCF/IWCF.svc,所有的请求都会转到这个网址。

2.使用的协议是SOAP,没有任何web安全模块。

3.登录请求似乎不同于所有其他请求,尽管它们看起来都很相似。

4.还有一堆base64加密的数据。

你可以尝试解码这些base64加密的数据,但是解码后得到的只是一堆不可读的数据,可能只是加密的二进制数据。


登录请求


对服务器的第一个请求只包含一个有趣的数据,它是一个键K:


<RSAKeyValue>   <Modulus>odfDJj...pEQ2RQ==</Modulus>   <Exponent>AQAB</Exponent> </RSAKeyValue>


这个密钥k是客户端使用的RSA公钥。响应还包含一个密钥,使用相同的格式和某种类型的标识符$USR。该密钥是服务器使用的RSA公钥。


我们刚刚见证了RSA的密钥交换。RSA不能用于加密大量数据。数据大小取决于所使用的填充技术。这里,我们使用2048位的密钥,最多可以加密245个字节,不能再多了。


常见的技术是用公钥/私钥RSA密钥加密对称密钥,然后用对称密钥加密交换过程。


很好,现在您已经有了客户端和RSA密钥,下一步是什么?


这个问题问得好。接下来要做的是解码第二条消息的base64二进制。

echo "AQABAAAOE6jZqMmDnFHefXddjDq...W5A=" | base64 -D | hexdump -C


如果您多次这样做,那么在发出许多登录请求后,您可能会发现这样的场景。


前几个字节都是0100010000。这在base64中可以直接看出来:前几个字母是“AQABAA”。有趣的是,00010000是二进制表示,换算成十进制就是256。


另一个我们可能注意到的是偏移量261(1+4+256)。字节始终为20000000,十进制为32。


这是天才行动的一部分。常见的对称加密系统是AES256,它使用32字节的初始化向量(IV)。


简单总结一下:


第一个字节总是01。

接下来的4个字节是AES密钥的大小:256个字节。

接下来的256个字节代表实际的AES密钥,用RSA公钥K加密,将在第一阶段发送到服务器。

接下来的4个字节是IV的大小:32个字节。

接下来的32个字节定义IV。

剩下的就不得而知了。可以用AES密钥加密的登录名/密码。

虽然只有一个AES,但是有很多变体。你可以尝试所有这些变体,但这需要很长的时间和大量的精力。

到目前为止,我们还没有用完所有的筹码。还记得那个胖客户吗?这是我们加密问题的关键。

客户端使用NET语言,当然java也是可以的。


让我们来看看这段代码。您可以读取其他代理请求来获取要访问的url。exe。导入反编译的。exe(我是试用版的。WindowsVM中使用的Netreflector),然后寻找一些有趣的代码,可惜什么都没找到。


除了这个小DLL,Sila.WCFDLL.dll。导出它,然后重新导入进行反编译。现在,所有安全内容都将由串行化器/去串行化器处理。


我们必须获得正确的AES。它使用由AES加密的Rijndael256变量和一个自定义序列化程序。


获取信息


我们不能解密任何AES密钥,因为解密需要私钥RSA。获得这个AES密钥的唯一方法是编写一个MITM服务器来拦截每个客户端和服务器之间的请求。


一旦服务器写好了(https://github.com/kraynel/sila-cli/blob/master/server.js),固定缓冲区/字节转换/RSA/mcrypt的所有问题都解决了,就可以重新加载你的VM,重新登录了。


接下来,使用Charlesproxy的“MapRemote”选项重定向http://www.silaexpert01.fr/SILAE/IWCF/IWCF.svc和您的本地端点之间的所有通信,这将依次解密通信并公开真正的端点。


现在我们已经以二进制形式解密了所有请求。


序列化/反序列化


该请求不可直接读取。它们不是使用xml序列化,而是使用序列化技术自定义编写的。但现在我们有了代码,可以仔细研究了。


现在,我们得到了所有的请求及其响应,以及一个可读的JS。通过使用不同的参数,我们可以发现两个有趣的请求:


采购公告,其中列出了可用的工资单;

下载工资单的pdf文件。




欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/771796.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-02
下一篇 2022-05-02

发表评论

登录后才能评论

评论列表(0条)

保存