CHALLENGE INFORMATION

AOC25 - Day-14 LogoPlatform: TryHackMe
Event: Advent of Cyber 2025
Day: 14
Title: Containers - DoorDasher’s Demise
Bonus: Bonus Task

Description

Continue your Advent of Cyber journey and learn about container security.

Summary

Here we start with a quick container theory overview, then we investigate a defaced website and discover it to be hosted in a Docker container with a critical vulnerability: the Docker socket is exposed to the container, giving us full access to the Docker Engine.

Using this access, we escalate privileges to a more privileged container, recover the original website by running a recovery script, and grab the flag. As a bonus, we find a hardcoded password on another service and use it to take over the deployer user account.

AOC25 - Day-14 Hero

Storyline

DoorDasher, a Wareville food delivery service, has been hijacked and rebranded as Hopperoo by King Malhare. The takeover replaced menu items with bizarre ingredients (including Santa’s beard fragments), causing choking incidents and health violations. When a security engineer attempted to restore the system, Sir CarrotBaine locked him out. The SOC team must now escape their monitoring container, escalate privileges, and restore the site.

Theory

Containers are isolated packages bundling applications with their dependencies, solving installation, troubleshooting, and version conflict problems.

They share the host OS kernel (unlike VMs with full guest OSs), making them lightweight and fast.

Why Containers Matter

Microservices architecture breaks applications into independently scalable components. Containers’ lightweight nature makes scaling specific parts efficient without scaling the entire application.

Docker

Docker is the popular container engine that builds, runs, and manages containers using Dockerfiles – text scripts defining app environments and dependencies for consistent deployment across systems.

Security Risk

Container escape is an attack where code inside a container exploits vulnerabilities to access the host kernel or other containers. This occurs when attackers communicate with the container runtime’s Unix sockets, which expose the API server managing containers.

Challenge

Let us start by examining the defaced website running on the target on port 5001.

Figure 1: Hopperoo defacement page replacing the legitimate DoorDasher website

Figure 1: Hopperoo defacement page replacing the legitimate DoorDasher website

As we can see, the benign DoorDasher website was replaced by a malicious Hopperoo website.

Given our access to the target system, let us check the running Docker containers with docker ps.

Figure 2: Output of docker ps showing running containers including uptime-checker and deployer

Figure 2: Output of docker ps showing running containers including uptime-checker and deployer

The guide nudges us toward the uptime-checker service, which has port mapping 0.0.0.0:5003->80/tcp, so let us try to access it via our browser on port 5003.

Figure 3: Uptime-checker web interface displaying DoorDasher service compromise warnings

Figure 3: Uptime-checker web interface displaying DoorDasher service compromise warnings

The web interface reports multiple warnings and a system compromise for the DoorDasher service.

Let us try to access the container and see if we can obtain execution inside the container with docker exec -it uptime-checker sh.

To break it down: docker exec executes a command in a running container; -i makes it interactive; -t allocates a pseudo-TTY; uptime-checker is the container in which we want to run the command; and lastly, sh is the basic shell we want to run.

Once we run it, we are welcomed with root access and dropped into the root directory (/).

Figure 4: Root shell obtained inside the uptime-checker container showing the root directory

Figure 4: Root shell obtained inside the uptime-checker container showing the root directory

The next thing to check is socket access, which we can verify by running ls -la /var/run/docker.sock.

To simplify: the Docker socket is a file that allows communication with the Docker Engine through an API. When a container has access to this socket, it can create, manage, and control other containers.

Figure 5: Docker socket file permissions

Figure 5: Docker socket file permissions

By default, Docker’s Enhanced Container Isolation feature blocks socket access – meaning the socket file is not mounted into the container.

In this instance, however, the socket file was mounted, and we should have management access to the Docker Engine from within the uptime-checker container.

Given our elevated privileges, let us try to access and run commands in the privileged deployer container.

Let us use Bash this time instead of the basic sh: docker exec -it deployer bash.

It worked, and now we have command execution inside the deployer container.

Figure 6: Interactive Bash shell established inside the deployer container

Figure 6: Interactive Bash shell established inside the deployer container

Once we perform quick reconnaissance – whoami to check who we are logged in as and pwd to get the full path to our current working directory – we follow up by examining the root directory (/) with ls -hla.

Figure 7: Root directory listing revealing flag.txt and recovery_script.sh files

Figure 7: Root directory listing revealing flag.txt and recovery_script.sh files

There are two notable discoveries here:

  • flag.txt: Probably the flag for one of the questions below.
  • recovery_script.sh: The recovery script that hopefully can fully restore the DoorDasher original website.

Let us first retrieve the flag with cat flag.txt and then try to restore the website by running sudo ./recovery_script.sh, which runs the recovery script with elevated privileges.

If we take a closer look at the script and its privileges, we can note that root owns the script both in user and group, but everybody (other) has permission to execute it – even us – logged in as the deployer user.

Figure 8: Recovery script execution output indicating successful website restoration

Figure 8: Recovery script execution output indicating successful website restoration

The script reports a successful recovery, and when we check the website again on port 5001 via browser, indeed, it has been fully restored.

Figure 9: Legitimate DoorDasher website fully restored after running recovery script

Figure 9: Legitimate DoorDasher website fully restored after running recovery script

Questions and Answers

Question-1: Continue your Advent of Cyber journey and learn about container security.

docker ps

Question-2: What file is used to define the instructions for building a Docker image?

Dockerfile

Question-3: What’s the flag?

<redacted-flag>

Question-4: Liked the content? We have plenty more where this came from! Try our Container Vulnerabilities room.

No answer needed

Bonus Task

Bonus-Question: There is a secret code contained within the news site running on port 5002; this code also happens to be the password for the deployer user! They should definitely change their password. Can you find it?

DeployMaster2025!

Lastly, the bonus question mentions a news website running on port 5002. Let us check it out.

Figure 10: News website article with suspiciously highlighted words forming the password

Figure 10: News website article with suspiciously highlighted words forming the password

There are a couple of words highlighted here: ‘Deploy’, ‘Master’, ‘2025!’.

If we concatenate them, it looks like a password, which could be potentially dangerous. Let us verify it by attempting a password change with passwd:

Figure 11: Password change confirmation showing successful authentication with discovered credentials

Figure 11: Password change confirmation showing successful authentication with discovered credentials

It worked; DeployMaster2025! was truly the deployer user’s password, and we changed it to a password that we now control.