
rotgrass@深蓝实验室
0x00 逆向很菜所以想到一条新路子
但是这种方法存在一定的局限性,一是需要一定的逆向基础,要对加解密算法进行逆向,如果碰到比较大型的程序,如各类浏览器或者加壳的程序,分析的难度会大大增加;二是需要有一定的代码基础,把密码抓取方法武器化的时候,要用代码实现解密过程,对于开发能力也是一个不小的挑战(使用c写过算法的朋友应该可以体会)。
所以我在对一些工具进行分析的时候想到,或许存在一种更为简单的密码抓取思路,不需要逆向或者很高的开发能力,就可以对工具进行分析,并开发稳定的武器化利用工具。
0x01 内存就是一个杂货铺
这个方法就是从内存中读取密码。大多数工具会将凭据的密文保存在本地配置文件或者注册表中,需要使用到密码时会先读取密码的密文,通过内置的算法进行解密,最后进行使用。抛开事实不谈,从内存中一定可以找到该凭据的明文。
如果我们可以定位该凭据明文在内存中的地址,并读取该地址的内容,就可以轻松读取到该明文凭据;这么做的好处是可以很好的降低之前密码抓取方法的难度,不需要逆向能力以及不需要使用代码实现各种加解密算法,就可以实现从分析到武器化的全部过程。
话不多说,我们上才艺。
0x02 不说了开冲
以我写了两天凭据密文解密算法仍然报错的ToDesk为例,来展示分析到实现的整个流程。(ToDesk版本为分析时的最新版v4.5.0.2)
ToDesk随机生成的连接密码是8位数的小写字母+数字的组合

在ToDesk运行的时候会启两个进程,用户权限的ToDesk.exe以及system权限的ToDesk_Service.exe

ToDesk_Service的权限比较高,在读取它内存的时候可能会需要一定的权限,所以我们先用ToDesk.exe开刀
用Cheat Engine对ToDesk.exe的内存进行搜索,找到密码字段,一共有两个位置

再更新一次密码,查看两个地址位的变化,DE39BFEBE8的值随着ToDesk密码的变化发生了变化,而1F9CC1DFBB0没有改变,所以以DE39BFEBE8地址位作为突破口

假如该密码对应的内存值是固定的,在Cheat Engine上会显示为基地址+偏移的形式
如微信进程的某些内存字段,基地址是WeChatWin.dll的内存地址,偏移是2BEE0F0,该偏移是固定的;如果想获取这个值,只需要获取WeChatWin.dll的内存地址,用该地址加上偏移再读取该地址在内存中对应的值就可以了

可以把上个例子中的WeChatWin.dll理解为一个“锚点”,然而在ToDesk.exe进程中并某个加载过的dll可以充当锚点,所以我的主要工作就是给连接密码字段的内存位置(DE39BFEBE8)找一个锚点
查看该地址附近的内存

发现的过程比较繁琐和蠢笨,好在经过了一段时间的探索找到了一个,地址位是DE39BFF8B0,对应的值是ToDesk.exe进程对应的用户名
DE39BFF8B0和DE39BFEBE8的偏移量是cc8,在多个操作系统、不同版本的ToDesk进行测试,该偏移量是固定的

锚点找到,实现的思路就比较简单了
0x03 实现过程的一点小细节
工具代码逻辑如下:
1、首先获取到ToDesk.exe进程对应的用户名
2、循环遍历ToDesk.exe进程的所有内存块,并对内存的状态进行判断,如果存在保护或者不可读等限制直接跳过,这样做的目的是为了加快搜索速度
3、从内存块中搜索用户名字段(可能不止一个)
4、循环获取该字段的地址后加上偏移量cc8,再读取新地址的值,如果该值为空就继续循环,不为空则输出这个密码的值。
代码很简单,而且可以快速的复用;如果想要抓取其他程序的凭据,对其进行分析之后如果存在类似的方法,对代码进行一点点修改就能快速武器化
0x04 测试效果还是有点东西的
操作系统版本是win11,ToDesk版本是当前最新的v4.5.0.2,抓取密码测试

手动更新密码之后,再次抓取密码

换一个环境和版本,在win7环境下,ToDesk版本为v4.5.0.0进行测试

0x05 还是存在很多问题啊啊啊啊
这种方法比较投机取巧,所以也存在了不少的问题
1、某些程序内存空间太大,寻找“锚点”的过程可能很繁琐,或者不存在锚点
2、某些程序在使用完明文的凭据后,会直接销毁掉对应的内存空间
3、不同程序版本以及不同的操作系统上,对应的偏移量可能也会不同,还需要进行大量的测
试
往期推荐




