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

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

2021-4-1 15:06
7372

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

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


0x0 前言

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

 

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

 

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


0x1 定位密码加密过程

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

 

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

 

noLogin

 

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

 

Login


0x2 登录状态下的密码加密流程

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

0x21 第一部分 (产生aes密钥)

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

    strncmp

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

    login_encrypt_one

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

    login_encrypt_one_in

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

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

0x22 第二部分 (对noLogin的加密结果再进行一层加密)

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

    login_encrypt_two_od

    login_encrypt_two_ida

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

    noLgEnCStrObfuscate

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

    noLgEnCStrObfuscate_ida

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

    aes

    aes_ida

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

    base64_add

  5. 结果

    db


0x3 流程总结

mind

 

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

 

randStr

 

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

0x4 抓取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并会自动下载

 

(注入shellcode时一定要选择父进程的PID, 即没有任何命令行参数的进程)

 

(3) 下载assis2.db

 

登录用户的assis2.db并不在installPath\360se6\User Data\Default\apps\LoginAssis\assis2.db

 

而是在installPath\360se6\User Data\Default\idStr\assis2.db, 路径中的idStr与账号相关, 随机字串
所以需要手动下载

 

同时修改了前辈的c#代码, 支持解密登录状态的密码保存数据库 (详情见附件)


0x5 工具测试

3bpass

 

文章仅作技术分享, 切勿违法, 一切与本人无关!

 

工具仅用于合法渗透测试, 切勿违法, 一切与本人无关!


参考文章

某数字浏览器数据库算法逆向


【看雪培训】《Adroid高级研修班》2022年春季班招生中!

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

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

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

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