QQ盗号木马动静态分析流程
小小的记录一下~~
分析对象
动态分析 – 测试电脑环境
测试电脑运行环境:Win10_64位机
木马分析工具:火绒剑5.0.74,dnSpy
木马动态分析
运行时提示加载失败,该文件未释放任何文件,且在注册表,计划任务,服务项,用户组内未发现恶意内容存在。
木马静态分析
将木马拖入DIE中进行检查,发现其为32位.Net木马程序,且不存在加壳保护。时间戳为2058-09-27,时间戳混乱。
将文件拖入dnSpy中进行反编译,检查其代码。其程序入口处为BingNav.Program.Main,进入程序入口处继续分析,发现其实际运行函数为BingNav()。
BingNav()函数中只有两步代码,第一行负责初始化一个Windows窗口,即动态分析中跳出的Windows窗口,第二行则是进入功能函数BingNavWorkJob(),继续跟进该函数。
该函数中尝试执行实际的功能函数BingNavExcuteBingNav(),如果执行中发生了错误,则执行函数BingNavShowErrMesgBingNav(),该函数主要负责返回错误提示信息窗口。
BingNavExcuteBingNav()函数中则实现了该程序的主要功能逻辑,函数较为复杂且部分敏感字符串是被AES加密后再以字节数据格式写在程序中,以下是对该函数的功能分析:
- 获取当前进程并匹配目标进程(chyed.exe,qq.exe,tim.exe):该函数首先使用CreateToolhelp32Snapshot创建当前计算机中系统进程的快照,并通过Process32First和Process32Next遍历每个进程。随后使用SelfDec函数解密字节数组,并进行匹配。
SelfDec函数内定义了一个AES-ECB模式的解密方法,接收加密的字节数组,并解密为UTF8编码的字符串。在本地实现该解密函数,其三个字节数组的实际内容为:
bytes1 = chyed.exe;
bytes2 = qq.exe(QQ进程);
bytes3 = tim.exe(QQ tim进程)
说明该程序匹配的是这三个与QQ相关的进程,获取到当前电脑存在匹配进程后进入后续操作。
- 读取匹配进程的内存数据,搜索并提取特定数据字符串:该函数在匹配到目标进程后,继续获取此进程的内存数据,随后在该内存数据中使用BingNavGetIDXByComBingNav函数进行匹配,被匹配的字节数组为array。
BingNavGetIDXByComBingNav函数负责在传入的内存数据中查找另一个字节序列的首次出现位置,并返回匹配序列末尾的索引,完成寻找特定的数据块这一行为。
array字节数组并未进行加密操作,其字节数据转为UTF8字符串为:msg.fcg?clientuin=,pattern字节数组解密后是一串正则表达式:clientuin=[0-9]*,即匹配以字符串“clientuin=“开始的一串阿拉伯数字字符串,这些字符串可能与劫持QQNT、TIM、QQ客户端的QQClientKeys/QQKey相关,相关文章:
https://www.cnblogs.com/RainbowTechnology/p/17947778
https://cloud.tencent.com/developer/article/2150324
根据代码和文章可得,此步主要行为是遍历进程的内存数据,并在内存数据中查找字符串msg.fcg?clientuin=,最后获取到的内容为当前受害者电脑中的QQ号码。
接下来函数再次进行匹配,进行的操作与上一步匹配类似,只是第一次匹配的字节数组换为bingNavMatchBingNav,解析出的16进制字符串为“70000000700000000001“,匹配到该16进制字符串后继续获取该字符串后1024字节的数据,并在该数据内搜索被解密的bytes4字节数组,该字节数组实际内容为“700000007000000000016”,在网上搜索未发现有关内容,可能和QQ进程的cookie或key值有关。最后程序在匹配到的结果中提取从第16个字符开始的到第224个字符,可能是存在其固定的数据格式。
如果两个匹配都匹配到目标数据后,函数则将提取的信息添加到列表中,并构造一个特定格式的字符串(10@{第一个匹配的QQ号码数据}@{第二个匹配的16进制字符串数据)),然后终止循环。
- 构造和发送HTTP请求到固定的URL,并解析响应包获取客户段密钥:此部分中函数使用了多个加密的字节数组(从byte5到byte14),这里先列出这些字节数组对应的明文内容:
bytes5 = https://localhost.ptlogin2.qq.com:4301/pt_get_st?callback=
bytes6 = https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=
bytes7 = https://xui.ptlogin2.qq.com
bytes8 = pt_local_token=
bytes9 = &pt_local_tk=
bytes10 = "uin"😦\d+)
bytes11 = clientkey=(\w+);
bytes12 = Cookie
bytes13 = GET
bytes14 = GetResponse
继续分析函数实现逻辑,其主要完成了使用解密的字节数组去构建HTTP请求包,并使用正则表达式提取用户ID和客户端密钥,本次请求中其访问的URL为https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=,
根据相关文章:
https://www.cnblogs.com/qiyeboy/p/9496262.html
发现得,此URL和端口指向本地127.0.0.1上的QQ监听端口4301,归属于QQ快速登录协议,攻击者构造此HTTP请求包从而获取本地QQ用户的用户ID和客户端密钥。
随后该函数根据获取到的用户ID构建第二次请求,可能用来验证用户 ID 或获取更多数据,本次请求中其访问的URL为:
https://localhost.ptlogin2.qq.com:4301/pt_get_st?callback=
随后将响应包内容的数据使用正则表达式进行提取,获取客户端密钥,并存储到列表中。
- 传递用户端数据回给攻击者服务器:当列表内存在数据时,其指向函数BingNavDestroyBingNav(),继续分析该函数。
BingNavDestroyBingNav()函数中也存在多个加密的字节数组,这里将其列出:
CreateDirectory = C:\bing
text =
domain = http://fa****.cn/user/home
WriteAllText = c:\bing\index.html
该函数主要完成了将QQ用户敏感数据构造为JS脚本标签,这些脚本标签指向特定的URL(该URL通过AES加密后又加了一层base64编码)。它将这些JS脚本写入一个HTML文件,随后其打开该HTML文件,即向回连服务器传递QQ客户端ID和密钥数据,到这里整个流程就结束了。
木马验证
注册新QQ用户验证上述逻辑,发现确实创建HTML文件,且里面URL为目标服务器URL。