Home

Sauvetage d'un serveur

Un petit déterrage pour ce premier post de 2015. Il s'agit là simplement d'un article que j'avais rédigé dans un wiki, et qui est resté depuis le seul article du dit wiki. Plutôt donc de le laisser moisir, je le ressors ici, où il aura un peu plus sa place... :)

Récupération d'un serveur perdu

Le problème

Au cours de manipulation visants à augmenter la sécurité du serveur, j'ai malheureusement un peu trop joué avec les droits, ce qui fait qu'en essayant de se connecter via ssh, celui-ci, après avoir afficher les quelques lignes de bienvenue et au moment de lancer le shell:

/bin/zsh: permission denied
connection to pike.tf closed

Plutôt problématique, n'est-ce pas?

La solution

Comme tout problème a une solution, il fallait donc la trouver. Fort heureusement, on pouvait toujours envoyer des fichiers par FTP dans le dossier root d'apache, donc on pouvait uploader un script PHP qui nous sauverait la vie.

J'ai testé quelques script codés moi même, mais finalement, j'ai plutôt utilisé un reverse shell, bien plus pratique pour tester différentes commandes. Le script est dispo ici : http://pentestmonkey.net/tools/web-shells/php-reverse-shell . Tout y est très bien expliqué et l'on obtient rapidement un pseudo shell sur notre machine locale.

Un autre problème se posait alors à moi: il fallait que j'execute une commande avec les droits root pour chmoder les fichiers de zsh. Pour cela, deux options: 'su' et 'sudo'. Mais en faisant 'su', la commande nous répond

su: must be run from a terminal

Pour sudo, le problème est différent. La commande fonctionnait tout à fait, sauf que le script qui l'execute est lancé par www-data, l'user d'apache, et celui-ci n'est pas dans le sudoers, donc il ne peut rien faire.

J'ai donc trouvé une nouvelle astuce sur cette page : http://evertpot.com/189/ , qui donne deux lignes à rentrer dans notre pseudo shell pour executer un "vrai" shell via python. Bien sûr, il faut que Python soit installé sur le serveur, ce qui était notre cas. La première ligne créer un script placé dans /tmp, et la deuxième l'execute, nous donnant un shell dans lequel on peut ensuite executer 'su' sans aucun problème.

En résumé

  • Uploader la page de script du reverse-shell une fois modifiée, comme indiquée sur le site, en spécifiant l'adresse IP de la machine local sur laquelle vous obtiendrez le pseudo shell, ainsi qu'un port disponible sur lequel vous allez pouvoir faire écouter votre machine. Attention, si vous êtes derrière une box, penser à forwarder le port!
  • Lancer la commande 'nc' avec les options qui vont bien sur votre machine pour qu'elle soit prête à écouter sur le port, par exemple avec le port 1234:
nc -v -n -l -p 1234
  • Lancer le script en accédant à son URL dans votre naviguateur, votre pseudo-shell est alors disponible là où vous aviez lancé netcat
  • Executer les deux commande Python pour avoir ensuite un vrai shell et pouvoir lancer 'su'
echo "import pty;
pty.spawn('/bin/bash')" > /tmp/asdf.py
python /tmp/asdf.py

Voilà, vous pouvez désormais récupérer votre serveur!

Merci à Dustri pour les nombreuses indications fournies pendant la récupération! :)