好友
阅读权限 35
听众
最后登录 1970-1-1
风吹屁屁凉
发表于 2019-6-25 18:46
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 封装成安装档。我们尝试执行安装程式,并在记忆体中直接发现了未加密的安装密码。任务达成!
在透过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 语言的乱数组合:
[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[21]={0};
char bufb[21]={0};
char bufc[21]={0};
char bufd[21]={0};
char bufe[21]={0};
char buff[21]={0};
unsigned int i=0;
while(i<0x100000000)
{
srand(i);
for(size_t n=0;n<20;n++)
{
int key= rand() % 54;
bufa[n]=_a[key];
bufb[n]=_b[key];
bufc[n]=_c[key];
bufd[n]=_d[key];
bufe[n]=_e[key];
buff[n]=_f[key];
}
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 ,就可用下面程式码产生:
[Perl] 纯文本查看 复制代码
#!/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
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。