逃避Sysmon DNS监控丨Evading Sysmon DNS Monitoring

2022-04-25 19:41:18 浏览数 (1)

在最近对Sysmon的更新中,引入了一项新功能,允许记录DNS事件。虽然这为防御者提供了一个很好的数据点(向SysInternals团队大声喊叫,继续免费提供和支持这些令人敬畏的工具),对于我们作为攻击者,这意味着如果我们的植入物或有效载荷尝试通过DNS进行通信,BlueTeam有一个获取可能导致检测的指标的潜在方法。

这可能会影响广告系列的一个显而易见的地方是C2 over DNS,其中会记录大量请求,从而可能让游戏消失。如果我在订婚期间遇到这种情况,我想花一点时间了解如何进行逃避检测。在这篇短文中,我将记录一种似乎与Sysmon 10.1一起使用的方法。

但在我们开始寻求逃避Sysmon之前,我们需要首先在实验室环境中部署它。为此,我通常使用@SwiftOnSecurity的sysmon-config,并使用以下命令安装Sysmon:

代码语言:javascript复制
sysmon.exe -accepteula -i rules.xml

随着我们的测试环境的启动和运行,您将开始看到事件正在进行。对事件ID 22的过滤将关注“DNS查询”,它将如下所示:

随着一切正常运行,让我们首先看看如何执行日志记录。

如何执行DNS日志记录?

为了理解逃避检测时可用的选项,我想首先回顾一下解决方案是如何工作的。在Sysmon的情况下,我们从其他很棒的帖子中了解到,ETW大量用于网络连接监控等事情。因此,DNS监控将以类似的方式执行是有道理的。如果我们使用以下命令,我们首先得到ETW是源的指示:

代码语言:javascript复制
logman -ets

在安装Sysmon之后突出的“数据收集器集”是一个奇怪的名字My Event Trace Session。如果我们进一步深入研究,我们发现很可能负责向Sysmon提供DNS数据:

经过一些搜索后,Microsoft-windows-DNS-Client建议在许多地方提供提供商作为表面DNS查询信息的适当位置。但在我们承诺这个方法之前,我通常喜欢与执行集合的服务交叉引用,所以我们去了Ghidra。搜索“我的事件跟踪会话”作为已定义的字符串,我们发现此功能:

在这里,我们有内SysMon64.exe一个函数,它引用了跟踪名称(如一个侧面说明,这个功能和名字也出现相当类似微软的文档中提供的示例代码在这里)。EnableTraceEx2上面调用的第二个参数提供了指向以下数据的指针:

当然,这是在示出的相同的GUID logman上述截图Microsoft-Windows-DNS-Client{1C95126E-7EEa-49A9-A3FE-A378B03DDB4D}。所以我们肯定知道这是DNS查询收集的执行方式。接下来,我们需要了解在请求DNS记录时如何触发这些事件。

Windows如何从DNS激发事件

让我们进行一次常见的DNS API调用,DnsQuery_A并尝试找出ETW数据可能出现的位置。显而易见的起点是内部dnsapi.dll,它承载API调用。将其与PDB一起加载到Ghidra中,我们可以开始查看可能突出显示正在使用的ETW的功能。由于我们知道GUID与DNS事件相关联,因此在尝试查找起点时,我们将使用此作为数据点。有点令人惊讶的是,我们实际上在DLL中找到了这个GUID,并引用了以下符号DNS_CLIENT

如果我们遵循对符号的引用DNS_CLIENT,我们可以看到它在函数中分配McGenEventRegister

调用此函数DllMain,意味着DNS_CLIENT_Context为发送事件而创建handle()。

要查看整个DLL中实际使用此句柄的方法,让我们创建一个小应用程序,它将为我们执行DNS查询:

代码语言:javascript复制
#include <Windows.h>#include <WinDNS.h>int main(){
	DnsQuery_A("blog.xpnsec.com", DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, NULL, NULL);
}

如果我们编译它并在WinDBG中将其旋转,我们可以添加一个断点来在内存读取时触发DNS_CLIENT_Context使用:

代码语言:javascript复制
ba r4 DNSAPI!DNS_CLIENT_Context

恢复执行我们的应用程序,不久我们点击一个断点,显示以下调用堆栈:

具体来说,我们发现自己遵循以下指示:

那么这是什么意思?好吧,看起来事件是Microsoft-Windows-DNS-Client从内部发射的DnsApi.dll,它是在我们控制的攻击者进程中加载的。

我们怎样才能逃避检测?

所以我们知道某些事件是从内部发送的DnsApi.dll。我们知道,如果在我们的进程中调用DLL,我们可以影响它。所以这似乎是修补的主要候选人。

你如何做到这一点取决于个人喜好,但对于我们的快速POC,让我们尝试DNSAPI!McTemplateU0zqxqz在运行时修补以返回执行而不通过发送事件EtwEventWriteTransfer。一个非常简单的方法是使用类似的方法:

随着我们的补丁准备就绪,如果我们尝试执行我们的应用程序进行DNS查询,我们发现我们可以调用DNS客户端API而不会触发任何事件:

视频地址YouTube

当然,这只是显示了一种逃避这种监控的可能方式(Golang粉丝可能想知道所有大惊小怪的事情;),但是如果有一个概述如何在引擎盖下工作,你将有希望能够扼杀你的如果您将来遇到这种日志记录,有效负载将逃避检测。

对于任何想知道你是否应该利用这项技术(或类似技术)的BlueTeam成员......虽然没有什么是100%有效的,但只需看看我们现在需要经历的其他步骤以避免被发现。

原文https://blog.xpnsec.com/evading-sysmon-dns-monitoring/

黑白网翻译

0 人点赞