R0 杀软对抗
由于臭名昭著的Patch Gaurd(PG), 安全软件厂商从长远考虑, 只得使用其他途径实现系统监控, 我将介绍现代杀软的实现原理和技术结构.
技术结构
WIndows并不想将系统权限交出去, 而Linux则相反, 有了root权限, 可以做任何事. 所以Linux rootkit非常昌盛, 不过Windows相比并无太多优势. 为了维持系统稳定和反rootkit, 微软做了很多事情, 包括Patch gaurd, 也包括证书签名要求, 但是这样也限制了安全软件的手脚, 安全软件只能使用Windows提供的通知, 或者事件等进行系统监控, 病毒检测. 核心技术就三种, 掌握这三种技术, 无视杀软就是了.
在R0, 杀软使用Minifilter驱动技术, 监控磁盘文件更改, 在R3发起FS请求后, 由IO管理器(I/O Manager)将请求转发到过滤管理器(Filter Manager), 过滤管理器将把请求发送到Minifilter驱动, 此时杀软可对文件进行检测.
杀软检测到文件改动后, 会对文件进行检测, 这就是静态查杀. 这就是为什么把mimikatz放到杀软环境中, 总是看不到猕猴桃图标就被杀了, 因为文件还未真正写入磁盘, 还在某个缓冲区中, 就被检测随即阻止写入.
这是杀软重要的一环
杀软还会利用Kernel Callback, MSDN称其为Callback Objects. 杀软一般会订阅CreateProcess, CreateThread, LoadImage, Registry等等回调, 以实现对进程和注册表的监控. 杀软收到CreateProcess的回调后, 会将自身DLL注入, 以实现R3 HOOK, 进行更详细的分析.
这一步R0和R3的配合就叫做动态查杀.
我还发现, 现在的主流杀软, 比如卡巴斯基, 基本不依靠ETW进行监控, 因为ETW也靠Kernel Callback进行系统监控, 但是ETW可被轻松绕过, R3和R3属于公平竞争, 详细文章参见@bats3c
的博客: https://blog.dylan.codes/pwning-windows-event-logging
审判杀软
正义终将来临, 了解了杀软的技术结构, 接下来我们将在R0对杀软发起进攻, 此处我们的对手选择卡巴斯基终端安全
要完成攻击, 前提是先让我们的恶意软件落地, 所以我们先将杀软的文件监控给砍掉
此处, 我们使用免费内核研究工具Windows-Kernel-Explorer(WKE)进行实践. 注意, 由于卡巴斯基会阻止WKE的驱动加载, 所以我们需要先启动WKE, 再启动杀软. 在实战环境中, 使用自研的驱动工具, 配合正版签名将无此顾虑, 此处仅为实验.
这些就是卡巴斯基Minifilter驱动所挂载的监控点, 我们将其全部禁用.
临时提一下, 可能有的人会有疑惑, 为什么在R0如此嚣张却不受Patch Guard的制裁呢? 因为Patch Gaurd只检查内核本身, 以及SSDT等不被篡改, 并不在乎对其他驱动发起的攻击, 不是一个帮派的
砍掉Minifilter驱动之后, 我们的恶意软件应该可以平稳着陆, 将mimikatz放进去试试
可以看到, 此时, 猕猴桃图标已经显现
随后我们想要执行mimikatz导出密码, 但是卡巴斯基还有内核回调, 我们运行程序, 卡巴斯基就会收到回调, 从而对mimikatz进行检测, 所以我们下一步要将卡巴斯基的内核回调砍掉
将这些回调订阅全部移除
随后我们运行mimikatz导出密码试试
通畅无阻, 杀软手脚都被砍了
由于卡巴斯基无法接收到新进程创建通知, 所以卡巴斯基不会再进行R3 DLL注入了, 相当于整个杀软如同摆设, 再没有昔日的光辉.
思考
善恶同源, 一套杀软的代码, 只需少数修改, 改变目的, 即是强大的rootkit. 现在大家知道什么是杀软, 同时也知道什么是rootkit了.