CobaltStrike-用“混淆”绕过Windows防火墙

对所有红队成员来说,在不惊动组织的情况下传输载荷是项永恒的挑战。像所有其他安全方案一样,Windows防火墙利用CobaltStrike工具后也在检测通用有效载荷方面效果更明显了。

在这个例子中,我们将探讨用Cobalt Strike生成一个Pwershell,并展示我们如何对其操控,让其执行绕过Windows10电脑的防火墙。但这还不是从Windows防火墙中隐藏自己载荷最优雅或简单的方案,只能说是办法之一,且行之有效。

创建载荷的过程如下:

截屏时间:3月14日16:50:50

这样就生成了带有一个Powershell命令的载荷文本

如果在感染者电脑上运行该命令,Windows防火墙会将其视为威胁,发出警告内容。

为了绕过Windows防火墙,我们需要首先理解CobaltStrike生成载荷的原理,然后再更改其中的一些签名,希望让Windows防火墙认为是安全的。

首先,显而易见的是载荷命令的格式是基于64位编码,或者通过编码命令Powershell标记看到。

想解码该命令,我们需要裁掉powershell.exe -nop -w hidden –encodedcommand这部分,保留其它部分。

然后用以下命令解码其他字符串。

echo ‘base64 payload’ | base64 –d

得到的字符串包含了一个64位解码串,但不能进行解码和spit out gibberish,因为这个字符串夜视Gzip压缩,从PowerShell命令的IEX(New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s[IO.Compression.CompressionMode]::Decompress))).ReadToEnd())部分看是可以看见的。

现在我们需要理解一些命令中是什么,因为这其实是触发Windows防火墙的部分。例如:载荷。通过一些谷歌搜索,我发现这个PowerShell脚本正是做这个的:

http://chernodv.blogspot.com.cy/2014/12/powershell-compression-decompression.html

$data = [System.Convert]::FromBase64String(‘gzip base64’)

$ms = New-Object System.IO.MemoryStream

$ms.Write($data, 0, $data.Length)

$ms.Seek(0,0) | Out-Null

$sr = New-Object System.IO.StreamReader(New-Object System.IO.Compression.GZipStream($ms, [System.IO.Compression.CompressionMode]::Decompress))

$sr.ReadToEnd() | set-clipboard

这个脚本首先是基于64位解码字符串,将其解压,整个代码就都呈现给我们了。其也会将输出内容复制到剪切板并粘贴到一个文本文件中,留着备用。

被Windows防火墙检测出来的$var_code变量承有载荷,我们需要更换一下,以绕过防火墙。

解码$var_code后是一系列ASCII字符,但完全解码并不是这里所需要的。

我们可以通过以下部分进行阅读:

$readString=[System.Text.Encoding]::ASCII.GetString($enc)

上述内容显示的是用户代理和我们攻击者IP的一些信息。

现在的目标是将目前的载荷取走,并让其混淆,迷惑Windows防火墙。这种情况最好的工具由Daniel Bohannon开发的Invoke Obfuscation.项目的Github页面可以在此找到。

开始Invoke-Obfuscation命令的是:

Import-Module .\Invoke-Obfuscation.psd1

Invoke-Obfuscation

现在我们需要确定需要混淆的载荷。可以通过以下命令

Set scriptblock ‘final_base64payload’

该工具需要我们的脚本(script block),然后问我们如何进行。这种情况下,我选择了压缩,然后1。这并不意味着其他选项不行,但我发现这个在写的时候可以用。Invoke-Obfuscation可以展现其魔法,然后打印出来一个PowerShell命令,这个很可能绕过Windows防火墙。

然后打出来,以及你想保存作为PowerShell脚本的路径。

Out c:\payload.ps1

目前解压载荷就是这样。

所以,我们还是需要将“[Byte[]]$var_code = [System.Convert]::FromBase64String”这段内容用从Invoke-Obfuscation中新建的载荷来替换。为了达到这一点,我确定了一个新的变量,我称其为$evil,只需要将内容从Invoke-Obfuscation中输出。

重要—在Invoke-Obfuscation的输出中,你需要清除最后面的部分,因为那是执行命令的命令。我们不需要这个,因为Cobalt Strike模板会为我们做这些。

保存编辑好的脚本,放入到PowerShell中,并执行。在CobaltStrike中,结果应该是一个浮标,如果你用的是@sec_groundzeroAggressor Script,则是一个马虎的通知。

如果我们用Process Hacker检查vanilla CS载荷和修改的CS载荷。注意不要改变浮标下划线的行为。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180320B1MNA100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券