Cobalt Strike – Bypassing Windows Defender 混淆处理
对于所有红色团队成员来说,在交付有效的替代品同时又不拖延延展组织的所有风吹草动始终是一个挑战。就像所有其他安全解决方案一样,Windows Defender在检测由Cobalt Strike等工具生成的通用有效的方面也变得更加出色。
在此示例中,我们将通过Cobalt Strike生成PowerShell负载,并了解如何进行进行操作,从而绕过Windows 10 PC上的Windows Defender执行。这不是从Windows Defender隐藏有效负载的最优雅前后简单的解决方案,而是是我们使用的方法之一,并且可以正常工作。
创建有效负载的过程如下:
这将导致创建包含PowerShell命令的payload.txt。
如果我们尝试在受害PC上运行命令,则Windows Defender会向我们打招呼,从而对其潜在威胁。
为了绕过Windows Defender,我们需要首先了解Cobalt Strike如何创建其有效负载,然后更改其某些签名,希望Windows Defender认为它是安全的。
首先,很明显,通过查看格式或通过* -encodedcommand * PowerShell标志可以对base64编码的有效负载命令进行编码。
要解码命令,我们需要剪切
powershell.exe` `-nop` `-w` `hidden` `-encodedcommand
分开并保留其余部分。
然后使用以下命令解码字符串的其余部分。
echo` `'base64 payload'` `| ``base64` `-d
生成的解码字符串初始包含base64编码的字符串,但尝试解码将不起作用并吐出乱码,因为该字符串也是从IEX明显经过Gzip压缩的(新对象IO.StreamReader(新对象IO。 Compression.GzipStream($ s [IO.Compression.CompressionMode] :: Decompress)))。ReadToEnd()部分,PowerShell命令。
现在我们需要了解此命令中的内容,因为这实际上是触发Windows Defender的部分,即有效负载。通过一些Google搜索,我找到了该PowerShell脚本,它完全可以完成[ http://chernodv.blogspot。 com.cy/2014/12/powershell-compression-decompression.html
](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
该脚本首先将对字符串进行base64解码,然后将其解压缩,从而为我们提供完整的代码。它随后将输出的内容复制到副本,以将其粘贴到文本文件中,以备后用。
在** $ var_code **变量保存正在由Windows Defender的检测有效副本,我们需要换出绕过防御者。
进一步将** $ var_code **解码是多个ASCII字符,但此时不需要完全解码。
$enc``=``[System.Convert]``::FromBase64String(``'encoded string'``)
我们可以通过以下方式阅读部分内容:
$readString``=``[System.Text.Encoding]``::ASCII.GetString(``$enc``)
现在,以上内容显示了有关用户代理和攻击者IP的一些信息。
对于这类工作,最好的工具和首选工具是Daniel Bohannon的 Invoke-Obfuscation。可以在这里找到该项目的Github页面。
以Invoke-Obfuscation开始的命令是:
Import-Module` `.\``Invoke-Obfuscation``.psd1``Invoke-Obfuscation
现在,我们需要定义需要纠正的有效替代部分。可以使用以下命令完成
Set scriptblock ``'final_base64payload'
该工具将使用我们的脚本块,然后询问我们要进行的方式。在这种情况下,我选择了COMPRESS,然后选择了1。这并不意味着其他选项将不起作用,但是在撰写本文中,Inboke-Obfuscation将发挥神奇的作用,并打印出PowerShell命令,该命令经过充分处理,可能会绕过Windows Defender。
然后,只需键入Out,然后输入为其另存为PowerShell脚本的路径即可。
Out c:payload.ps1
先前步骤中当前解压缩的有效负载如下所示。
因此,这全都归结为以下事实:我们需要用我们从Invoke-Obfuscation新创建的有效负载替换** [Byte []] $ var_code = [System.Convert] :: FromBase64String **内容。了一个新变量,我将其称为$煞,然后将Invoke-Obfuscation的输出内容放入其中。
重要提示 –您需要在最后一个|之后移除零件。来自Invoke-Obfuscation的输出,因为这是执行命令的命令。我们将不需要它,因为Cobalt Strike模板将为我们做到这一点。
如果您使用的是@sec_groundzero Aggressor脚本,则结果应为Cobalt Strike中的信标和Slack通知。
如果我们使用Process Hacker来检查原始CS有效负载和修改后的CS有效负载,我们会发现我们没有更改信标的基本行为。