本文介绍了一种通过进程注入实现强制关闭部分杀软进程的方法(文中以某安全卫士和某杀毒软件为例),实现过程使用了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.exe
XXXrps.exe
XXXsd.exe
XXXtray.exe
ZXXDXXFXXYX.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。
原文始发于微信公众号(安恒信息安全服务):九维团队-红队(突破)| 通过进程注入方法绕过杀软测试
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论