http://p6.qhimg.com/t01bb95c97f586e68ac.png

      


内容

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


  这一切都要从这个链接开始:http://www.silaexpert01.fr/silae。

  此链接不能在Chrome、 Firefox 和 Safari上打开,也不能在windows10系统中运行。


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

黑匣子

https://static.jiayezz.com/ab/ed990871c3475a1651a8d5774d64ef

 

    我们可以从Microsoft 中下载一个免费的虚拟机︰ https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/。为此特定目的,VM 与 IE9 在 Windows 7 上会效果更好。


  所以,拥有了虚拟机,也可以运行了,那就可以访问那个url了吧。可是它正在下载一个fat客户端,并且已经开始了某种安装进程。


  最后就可以登录并下载你最后的工资单了。然后下个月这样的过程要再来一遍。如果重置虚拟机,也不行的,因为你没有许可证。


正式开始


  如果你想在不经过VM的情况下直接在自己的Mac或Linux计算机中下载文件。你必须要将正确的请求发送给远程服务器(我还不知道具体的地址,可能被下载的fat客户端编码加密过了)。


  所以,让我们先嗅探一下VM出来的所有网络通信。


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

· Wireshark,可用于大多数系统,但是也有可能矫枉过正。

· Charles Proxy,可用于Mac。

· mitmproxy ,喜欢使用python的人可以选择。

· Fiddler,在windows中使用(试用版可用于Mac和Linux)。


这里用proxy举例:


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


https://static.jiayezz.com/b3/6ce8d465fade0745e8d40bcdd76573

 

  2.启动VM


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


https://static.jiayezz.com/11/155a95597caf4233eb3100c3450c58

 

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


https://static.jiayezz.com/d3/e860fdd6f20921f358fb16efaadaa6

 

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


  现在,如果你登陆到fat客户端下载一张工资单,应该就会有足够的数据来考虑接下来的问题了。

https://static.jiayezz.com/bd/9fc1b40d22df244b572aad96a1df86

 

数据分析


  现在已经拥有客户端和服务器之间完整的交换信息了。


  最先注意到的就是所有的通信都没有进行SSL/TLS 加密,真是轻松获得的数据!也就是说,我们还是可以通过虚拟机上的代理服务器生成假CA来嗅探加密通信。


  我们还会注意到这几件事:


1.单一的web服务终结点:

http://www.silaexpert01.fr/SILAE/IWCF/IWCF.svc,所有请求都会转到这个url。

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

  如果已经做过这件事好几次了,在发送出好多次登录请求之后,你可能会发现这样一个场景。


https://static.jiayezz.com/3d/65ebe5ca12001ed476d04d1e546282

 

  开头几个字节都是 01 00 01 00 00。这可以直接在 base64 中看到︰开头的几个字母都是"AQABAA"。很有趣的是00 01 00 00 是二进制表示形式,转换成十进制就是256。


  我们可能会注意到的另一个就是261 (1 + 4 + 256) 的偏移量,字节总是 20 00 00 00,这是十进制的 32。


  这是天才操作的一部分。一种常见的对称加密系统就是 AES 256,它使用一个初始化向量 (IV) 的32 个字节。


小小的总结一下:


· 第一个字节总是01。

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

· 下面的256字节代表的是实际的AES密钥,使用RSA公钥k加密,这会在第一阶段发送给服务器。

· 再下面4个字节是IV的大小:32字节。

· 下面的32个字节定义IV。

· 剩余的部分还是未知的,可能使用 AES 密钥进行加密的登录名/密码。

  虽然只有一个AES,但是有很多变种。可以将这些变种都试一遍,但是这需要很长的时间和大量的精力。

  到现在为止,我们还没有使用完手中所有的筹码。还记得那个fat客户端吗?这是我们加密问题的关键。

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


  让我们来看看这段代码。可以阅读其他 proxified 请求来获取访问.exe的url。导入反编译的.exe (我是在 Windows VM中使用的试用版.Net 反射器),然后寻找一些有趣的代码,可惜没有发现什么。


  除了这一个小小的 DLL,Sila.WCFDLL.dll。导出它,然后重新将其导入反编译。现在,所有的安全内容就都会被序列化/反序列化程序处理。


  我们得获得正确的AES。它使用的是 AES 加密的 Rijndael 256 变量与自定义序列化程序。


获取信息


  我们没办法解密任何一个AES密钥,因为解密需要使用私人的RSA密钥。要想获取此AES密钥的唯一办法就是编写一个MITM服务器,借此来截获每个客户端和服务器之间的请求。  


https://static.jiayezz.com/d2/302d6a104c1ab97cf2d39b0b7683d9

  一旦该服务器编写完成( https://github.com/kraynel/sila-cli/blob/master/server.js ),并且已经解决了固定缓冲区/字节转换/RSA/mcrypt 的所有问题,就可以再一次重新加载您的 VM 和登录了。


  接下来使用Charles proxy的"地图远程"选项重定向所有 http://www.silaexpert01.fr/SILAE/IWCF/IWCF.svc 到你的本地终结点之间的通信,这些通信将会反过来解密通信并且暴露真正的终结点。


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


https://static.jiayezz.com/39/586d3be8a61ecc7cd14c1b1035cb58

 

序列化/反序列化


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


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


· AcquisitionBulletins,列出可用工资单;

· GenererPdf,下载工资单的pdf文件。

 


文章原文链接:https://www.anquanke.com/post/id/84290