风吹屁屁凉 发表于 2019-6-25 18:46

破密行动:以不寻常的角度破解IDA Pro 伪随机数

from:https://devco.re/blog/2019/06/21/operation-crack-hacking-IDA-Pro-installer-PRNG-from-an-unusual-way/

前言
Hex-Rays IDA Pro 是目前世界上最知名的反组译工具,今天我们想来聊聊它的安装密码。什么是安装密码?一般来说,在完成IDA Pro 购买流程后,会收到一个客制化安装档及安装密码,在程式安装过程中,会需要那组安装密码才得以继续安装。那么,如果今天在网路上发现一包泄漏的IDA Pro 安装档,我们有可能在不知道密码的状况下顺利安装吗?这是一个有趣的开放性问题。

在我们团队成员脑力激荡下,给出了一个验证性的答案:是的,在有Linux 或MacOS 版安装档的状况下,我们可以直接找到正确的安装密码;而在有Windows 版安装档的状况下,我们只需要十分钟就可算出安装密码。

下面就是我们的验证流程:

* Linux 以及MacOS 版
最先验证成功的是Linux 及MacOS 版,这两个版本都是透过InstallBuilder 封装成安装档。我们尝试执行安装程式,并在记忆体中直接发现了未加密的安装密码。任务达成!

https://devco.re/assets/img/blog/20190621/1.png

在透过Hex-Rays协助回报后,BitRock也在2019/02/11释出了InstallBuilder 19.2.0,加强了安装密码的保护。

* Windows 版
在Windows版上解决这个问题是项挑战,因为这个安装档是透过Inno Setup封装的,其安装密码是采用160-bit SHA-1 hash的方式储存,因此我们无法透过静态、动态程式分析直接取得密码,透过暴力列举也不是一个有效率的方式。不过,如果我们掌握了产生密码的方式,那结果可能就不一样了,我们也许可以更有效率的穷举。

虽然我们已经有了方向是要找出Hex-Rays如何产生密码,但要去验证却是”非常困难”的。因为我们不知道乱数产生器是用什么语言实作的,而目前已知至少有88种乱数产生器,种类太多了。同时,我们也无法知道乱数产生器所使用的字元组和字元顺序是什么。

要找出乱数产生器所使用的字元组是众多困难事中比较简单的一件,首先,我们竭尽所能的收集所有IDA Pro 的安装密码,例如WikiLeaks 所揭露的hackingteam 使用之密码:

FgVQyXZY2XFk ( link )
7ChFzSbF4aik ( link )
ZFdLqEM2QMVe ( link )
6VYGSyLguBfi ( link )
从所有收集到的安装密码中我们整理出所用到的字元组:
23456789ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz

少了1, I, l, 0, O, o, N, n字元,推测这些都是容易混淆的字元,因此不放入密码字元组中是合理的。接着,我们用这些字元组,猜测可能的排列顺序:
23456789ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz
ABCDEFGHJKLMPQRSTUVWXYZ23456789abcdefghijkmpqrstuvwxyz
23456789abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ
abcdefghijkmpqrstuvwxyz23456789ABCDEFGHJKLMPQRSTUVWXYZ
abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ23456789
ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz23456789

最后,我们挑选几个比较常见的语言(c/php/python/perl)并使用上述的字元组实作乱数产生器,列举所有乱数组合,看看我们收集到的安装密码有没有出现在这些组合中。例如我们用下面程式​​码列举C 语言的乱数组合:
#include<stdio.h>
#include<stdlib.h>

char _a[] = "23456789ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz";
char _b[] = "ABCDEFGHJKLMPQRSTUVWXYZ23456789abcdefghijkmpqrstuvwxyz";
char _c[] = "23456789abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ";
char _d[] = "abcdefghijkmpqrstuvwxyz23456789ABCDEFGHJKLMPQRSTUVWXYZ";
char _e[] = "abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ23456789";
char _f[] = "ABCDEFGHJKLMPQRSTUVWXYZabcdefghijkmpqrstuvwxyz23456789";

int main()
{
      char bufa={0};
      char bufb={0};
      char bufc={0};
      char bufd={0};
      char bufe={0};
      char buff={0};

      unsigned int i=0;
      while(i<0x100000000)
      {
                srand(i);

                for(size_t n=0;n<20;n++)
                {
                        int key= rand() % 54;
                        bufa=_a;
                        bufb=_b;
                        bufc=_c;
                        bufd=_d;
                        bufe=_e;
                        buff=_f;

                }
                printf("%s\n",bufa);
                printf("%s\n",bufb);
                printf("%s\n",bufc);
                printf("%s\n",bufd);
                printf("%s\n",bufe);
                printf("%s\n",buff);
                i=i+1;
      }
}

大约一个月的运算,我们终于成功利用Perl乱数产生出IDA Pro的安装密码,而正确的字元组顺序为abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ23456789。例如hacking team泄漏的IDA Pro 6.8安装密码是FgVQyXZY2XFk,就可用下面程式码产生:
#!/usr/bin/env perl
#
@_e = split //,"abcdefghijkmpqrstuvwxyzABCDEFGHJKLMPQRSTUVWXYZ23456789";

$i=3326487116;
srand($i);
$pw="";

for($i=0;$i<12;++$i)
{
      $key = rand 54;
      $pw = $pw . $_e[$key];
}
print "$i $pw\n";

透过这些资讯,我们可以建立一个用来暴力列举安装密码的字典档,缩短暴力列举的时间,实作方式可参考inno2john专案。在一般情况下,约十分钟即可算出windows安装档的安装密码。

在回报Hex-Rays 后,他们立刻表示之后将会使用更安全的安装密码。

总结
本篇文章提出了一个开放性问题:在未知安装密码的情况下可不可以安装IDA Pro?结果我们在Linux 以及MacOS 版发现可以从记忆体中取得明文密码。而在Windows 版本中,我们黑箱找到了安装密码产生的方式,因此我们可以建立一份字典档,用以缩短暴力列举安装密码的时间,最终,我们约十分钟可解出一组密码,是一个可以接受的时间。

我们真的很喜欢这样的过程:有根据的大胆猜测,竭尽全力用任何已知资讯去证明我们的想法,不论猜测是对是错,都能从过程中获得很多经验。这也是为什么我们这次愿意花一个月时间去验证一个成功机率不是很高的假设。附带一提,这样的态度,也被运用在我们红队演练上,想要试试吗:p

写在最后,要感谢Hex-Rays很友善且快速的回应。即使这个问题不包含在Security Bug Bounty Program里面,仍然慷慨的赠送Linux和MAC版IDA及升级原有Windows版至IDA Pro。再次感谢。

时间轴
Jan 31, 2019 - 向Hex-Rays 回报弱点
Feb 01, 2019 - Hex-Rays 说明之后会增加安装密码的强度,并协助通报BitRock
Feb 11, 2019 - BitRock 释出了InstallBuilder 19.2.0

smile1110 发表于 2019-6-26 15:03

本帖最后由 smile1110 于 2019-6-26 16:14 编辑

天蝎浪花 发表于 2019-6-26 00:06
刚在smile那边下载完IDA就看到这边另一高手的破解记录,厉害了,我大中华需要更多这样的高手!
我并没有破译innosetup的解压密码,这是国外大佬用弱位元法穷举出来的,这是sha1的非共有信息后,首次因伪随机和有限位元问题被破译,虽然国内有大神俩月前分析过其三次sha1加密过程,也拿到了160bit返回值的密文,不可逆原因依旧没有下文,而上面这种方法是从密码学角度用c类算法破译的,只是拿到解压密码相当于授权之后,去掉了该实验室版本的一些限制,并且这份授权半年后过期,只能出此下策,还有苏紫姐姐帮忙写的高科技补丁哦.

天蝎浪花 发表于 2019-6-26 22:21

smile1110 发表于 2019-6-26 15:03
我并没有破译innosetup的解压密码,这是国外大佬用弱位元法穷举出来的,这是sha1的非共有信息后,首次因伪随 ...

感谢偶像大佬回复!{:1_893:}虽说没有破译解压密码,但去除该版本的几项限制还有以往作品在我等小菜眼里就是高不可及神一般的存在啊!{:1_921:}还有苏紫姐姐,IT界的女神想必定是性感御姐,崇拜ING{:1_899:}。不敢想啥时候有你们这般水平,还是老老实实争取自己每天都有进步吧:Dweeqw

FleTime 发表于 2019-6-25 19:05

加密与解密,保护和破解,加壳和脱壳
两者之间对抗了很久了。。。

6767 发表于 2019-6-25 22:32

这是不是用自己日自己的操作hhh

天蝎浪花 发表于 2019-6-26 00:06

刚在smile那边下载完IDA就看到这边另一高手的破解记录,厉害了,我大中华需要更多这样的高手!

七度空间 发表于 2019-6-26 07:51

学习了 谢谢大佬

digitalhouse 发表于 2019-6-26 08:12

不就是文章英翻中嗎...

学士天下 发表于 2019-6-26 08:17

已学习,多谢啦!!!

hinome 发表于 2019-6-26 11:11


学习了,多谢啦!!!

Aug6thSml 发表于 2019-6-26 11:22

最近都在关注smile和法王的帖子,今天发现你,学习了,谢谢~
页: [1] 2
查看完整版本: 破密行动:以不寻常的角度破解IDA Pro 伪随机数