Docs:
Writeup
RCE
Le site nous parle beaucoup de SPIP et en cherchant à peine on trouve de nombreux articles parlant de la CVE-2023-27372 sur les version < 4.2.1 de SPIP qui permet une RCE !
Le endpoint est: /spip/spip.php?page=spip_pass
De www-data à think
On récupère un script qui exploite cette vulnérabilité et on l'améliore pour récupérer le retour des commandes injectés.
On essaie de choper un reverse shell mais rien ne marche...
On chope le premier flag un peu au dessus, dans /home/think/user.txt.
Mais on se souvient qu'il y a un serveur SSH sur la machine donc on jette un oeil au répertoire /home/think/.ssh/ ! Dans le fichier /home/think/.ssh/authorized_keys on voit qu'il y a une clé SSH autorisée et il y a une clé privée dans /home/think/.ssh/id_rsa. On la récupère et on l'utilise:
| Bash | |
|---|---|
1 2 | |
Et ça fonctionne, on est devenu think !
De think à root
On fait tourner linpeas sur la machine et plusieurs éléments ressortent:
-
Fichier SUID étrange:
/usr/sbin/run_container -
AppArmor est activé
On voit (avec strings) que /usr/sbin/run_container utilise /opt/run_container.sh. On peut lire ce fichier mais pas le modifier, ce qui est étrange car a priori on a les droits suffisants :
| Bash | |
|---|---|
1 | |
Et c'est à cause de AppArmor ! En regardant sa config dans /etc/apparmor.d/ on trouve un fichier usr.sbin.ash qui sert à configurer des restrictions pour /usr/sbin/ash (notre shell !) :
| Bash | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
On voit bien que le contenu de /opt/ est interdit en écriture (deny /opt/** w) mais seul le répertoire n'est pas autorisé en lecture (deny /opt/ r) (donc pas de ls /opt). On remarque aussi que bien qu'on ait pas le droit d'écrire sous /tmp, on a le droit d'écrire sous /var/tmp.
Il semblerait qu'on soit coincé... Mais en cherchant sur HackTricks, on trouve une vulnérabilité dans AppArmor ! L'exécution directe (ie sans spécifier l'exécuteur à utiliser) d'un script avec shebang permet de sortir du contexte restreint ! On écrit donc un script Bash qui nous donne un shell Bash (non Ash) et on l'exécute:
| Bash | |
|---|---|
1 2 3 4 | |
La commande ps nous permet de voir qu'on utilise un bash mais c'est la commande ls /opt qui nous permet de assurer qu'on a bien réussi à sortir du contexte restreint de ash ! Il nous reste plus qu'à piéger le fichier /opt/run_container.sh en ajoutant bash -p dedans et à exécuter run_container (qui est SUID et appartient à root). Et le tour est joué nous voilà adminstrateur !