九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

admin 2023年12月25日21:28:23评论101 views字数 2166阅读7分13秒阅读模式

九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

 

简 介

本文介绍了一种通过进程注入实现强制关闭部分杀软进程的方法(文中以某安全卫士和某杀毒软件为例),实现过程使用了thread-hijacking等技术。

 

 

研究初衷

 

最近看到一些师傅分享的关于致盲EDR或使杀软失效的文章,从中学习到很多。想起去年在复现网上公开的免杀思路时,偶然发现的一种可以强制终结部分杀软进程的方法,此方法无需驱动程序,仅需管理员权限即可,近几天抽时间对方法进行了一些优化,然后通过文章和开放源代码的方式,分享给大家。方法公布以后肯定会随之失效,但希望笔者的研究过程对大家有所启发。

 

文中相关代码已开源在笔者的Github(见下文网址),以防大家没有安装Visual Studio,编译好的EXE也一并分享了。

项目开源地址:https://github.com/1y0n/AVKiller

 

研究始于一次dump系统密码的学习,大概原理就是将自己编写的dll注入到lsass进程中,让其dump自己的内存,复现过程很顺利。但是复现完成后,笔者突然萌生了一个想法,如果注入的dll不是dump内存,而是执行shellcode或者进行一些其他操作,会怎么样呢?

 

 

思路验证

 

思路明确,代码编写也非常简单,因为要注入DLL到lsass进程中,所以我们需要编写两块代码,一个是注入器,一个是DLL。注入器的作用是将DLL注入到lsass进程中,DLL的作用是结束杀软相关的进程。

 

笔者使用的语言是C++,但是同样的思路可以很方便地用其他语言实现,IDE是Visual Studio 2022,全部默认配置。建议读者在复现时使用VS 2019及以上版本。本文以某安全卫士和某杀毒软件为例,但是经过测试同样的方法也可以终结部分其他杀软如某擎等。

 

注入器的话,在网上能搜到一大堆开源的代码,所以直接Ctrl C + V大法,核心功能代码如下(当然,后续我们会发现没有这么简单,这里先用简单的代码做测试):

九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

 

代码很好懂,所以没写注释,这里简单说下流程:

获取debug权限获取lsass的进程句柄在lsass进程中申请内存将我们的DLL写入到这个内存中并执行

 

接下来是DLL代码,结束进程的API是TerminateProcess(),所以只需要调用此API结束掉某软件相关的几个进程即可(因仅做示范,并无针对该软件之意,此处以XXX代替):

XXXrp.exeXXXrps.exeXXXsd.exeXXXtray.exeZXXDXXFXXYX.exe

 

在测试中,笔者发现即使终结掉了这些进程,它们也会在一段时间后自动重启。我们加个死循环,这样无论自动重启还是手动重启都不用担心了。简单修改后,DLL的核心代码如下:

九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

 

编译EXE和DLL文件,准备开始测试。

 

注意!

此方法可能导致操作系统无法正常关机重启,只能强制断电,且在电脑重启前,某安全卫士无法再次运行,谨慎使用自己的电脑测试。

 

该软件设置为关闭自动上传可疑样本(作用不大,懂的都懂),启用自我保护,启用核晶,其他保持默认:

九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

 

可以看到相关进程目前是正常运行的状态:

九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

 

使用管理员权限启动cmd,运行注入程序,等待几秒,除了ZXXDXXFXXYX.exe,其他几个进程都被关闭,虽然ZXXDXXFXXYX进程还运行着,但是测试发现不会再起到防护作用:

九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

 

此时,执行任何敏感操作都不会再受限制:

九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

 

这证明我们的思路没有问题的,现在还有两个细节问题需要解决:

1. 此方法需要两个文件,一个DLL,一个EXE,稍显臃肿,最好改成单文件的形式;

2. 注入lsass进程时,安全卫士会检测到注入行为,并且弹出拦截提示。

 

接下来让我们分别解决这两个问题。

首先是注入拦截的问题。

推测该安全卫士HOOK了NtCreateRemoteThreadEx之类的API,不过我们有特殊的注入姿势,对代码做一下修改,成功完成注入。

九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

 

接下来是第二个问题——单文件。

有两个思路可以实现单文件,一个是将EXE和DLL打包在一起,EXE运行时将DLL释放到硬盘中,然后从硬盘中加载;另一个思路是将DLL转换成shellcode,将shellcode注入到进程,DLL不落地。

 

笔者这里选择将DLL转换成shellcode,DLL转shellcode可以使用@hasherezade的pe_to_shellcode工具,也可以使用@TheWover的donut工具,两个工具都可以在Github搜到,用法不再赘述。

 

DLL转换完成后,编写代码将shellcode注入到lsass进程中,这个过程与平常制作的shellcode loader一模一样,所以代码只改动几行就可以。具体代码已在Github开源,就不再截图了。

 

 

修复建议

 

1.建议 HOOK 以下API:

- NtCreateRemoteThreadEx

- NtSuspendThread

- NtResumeThread

- NtQueueApcThreadEx

- TerminateProcess

2.从驱动层面保护自身进程,阻止来自lsass.exe对进程的访问和操作。

3.除NtCreateRemoteThreadEx外,建议同时拦截NtSuspendThread和NtResumeThread。

 

 


 

原文始发于微信公众号(安恒信息安全服务):九维团队-红队(突破)| 通过进程注入方法绕过杀软测试

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月25日21:28:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-红队(突破)| 通过进程注入方法绕过杀软测试http://cn-sec.com/archives/2333288.html

发表评论

匿名网友 填写信息