首页
社区
课程
招聘
[原创] 某数字浏览器数据库算法逆向Plus (登录状态)
发表于: 2021-4-1 15:06 14393

[原创] 某数字浏览器数据库算法逆向Plus (登录状态)

2021-4-1 15:06
14393

根据前辈的文章(没登录时浏览器密码保存的加密流程), 我尝试逆出了登录状态密码保存的加密流程, 若有不对的地方请大家多多指出

本次逆向的环境为: win7 x64 pro

浏览器版本为: 12.2.1678.0、13.1.1186.0、13.1.1234.0

关于sqlite3_key的部分前辈的文章写的已经很清楚了,这里主要写一下登录状态下对密码的又一层加密流程

在sql语句里有"passencode"函数, 搜索这个字符串可以看到passencode绑定到了sub_115D73F0这个函数

在sub_115D73F0中, 若没有登录会调用encryptProc_noLogin函数对密码进行加密(如前辈文章中所分析的),

noLogin

如果登录了,则还会进入下面的流程对noLogin加密的结果再进行一层加密:

Login

本例中经过noLogin加密的结果: (4B01F200ED01)J1rQAkGUN4Jg4fsy+3FtFiHnCHKZnfw9aDpQLj1XbnY=

将noLogin的加密结果与(51637587F6BB463a92D17DD7903A1F6F)字符串比较

strncmp

之后通过全局变量获取一个随机字符串(randStr),并将randStr 和一个固定的字符串当作参数, 调用login_encrypt_one函数

login_encrypt_one

跟进login_encrypt_one函数: 此函数内的加密算法都可以通过常量值和动态调试猜出来, 这里直接贴上ida重命名后的截图

login_encrypt_one_in

整体逻辑为: ①先把randStr和constStr进行拼接 ②将拼接后的字符串进行sha256摘要 ③将sha256的结果再进行md5摘要运算 ④将md5的hex结果转为字符串返回

login_encrypt_one的结果将当作第二部分加密的密钥

将noLogin加密的结果, 和第一部分login_encrypt_one的结果作为参数, 调用login_encrypt_two

login_encrypt_two_od

login_encrypt_two_ida

跟进login_encrypt_two函数, 首先将noLgin加密的结果进行了奇偶混淆:

noLgEnCStrObfuscate

这一点通过ida也能看出来,跟进noLgEnCStrObfuscate函数体内, 反编译结果和未登录流程里的奇偶混淆代码反编译结果几乎一样:

noLgEnCStrObfuscate_ida

之后进行aes加密(aes_128_ecb_pkcs7_encrypt): 密钥为第一部分(sha256+md5)结果的前16个字符

aes

aes_ida

最后将aes加密的结果进行base64编码并拼接上(51637587F6BB463a92D17DD7903A1F6F):

base64_add

结果

db

mind

问题在于要通过randStr来产生aes的密钥, randStr是怎么生成的

randStr

通过切换账号可以发现, randStr也会变化, 所以肯定和用户信息有关, 所以randStr的生成算法也就没必要逆向了

脚本用于CobaltStrike

(1) Beacon为32位

会执行BOF, bof32GetRandStr.o, 从外部读取randStr


(2) Beacon为64位
写了个shellcode用来读取并保存, 因为从外部读取ReadProcMemory会失效(64位程序读32位程序? 具体什么原因没有深究),所以将shellcode注入到360safe.exe中同进程读取

randStr会保存在目标主机的C:\Users\Public\Downloads\360config.txt并会自动下载


[注意]APP应用上架合规检测服务,协助应用顺利上架!

最后于 2021-4-7 18:47 被0xEEEE编辑 ,原因: 修改未完成点, 更新CobaltStrike脚本
上传的附件:
收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 5122
活跃值: (996)
能力值: ( LV8,RANK:143 )
在线值:
发帖
回帖
粉丝
2
感谢分享!
2021-4-7 19:08
0
雪    币: 148
活跃值: (1185)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
mark
2021-12-11 08:55
0
雪    币: 0
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
如何版本不是您给出的3个版本,我应该怎么指定生成相应的bin呢。
2022-4-1 15:41
0
雪    币: 0
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果版本不是您给出的三个版本的话,我们应该通过什么步骤获得版本的对应的偏移量呢?//Get offset [12.2.1678.0->388C26C] [13.1.1186.0->0x71420D4] [13.1.1234.0->0x713F114]
2022-4-1 16:01
0
雪    币: 0
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
2022-4-1 16:01
0
雪    币: 4511
活跃值: (4259)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
7
wx_kx35779 如果版本不是您给出的三个版本的话,我们应该通过什么步骤获得版本的对应的偏移量呢?//Get offset [12.2.1678.0->388C26C] [13.1.1186.0->0x71 ...

这得你自己去逆向一下了,在chrome.dll中,就按图片里这行,找到var = &dword_171420D4这个语句, 这个dword_171420D4就是存储那个账号相关的字符串的

不过现在都过去一年了,最新版的加密算法很可能已经变了哦

2022-4-4 17:06
0
雪    币: 0
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
大佬您好,想请教一个问题,x64_shellcode该如何编译生成bin文件啊,我使用gcc无法编译成功。
2022-6-17 15:21
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码