jeudi 13 octobre 2011

Challenge sur intruded - Leviathan

De temps à autre je cherche à résoudre des challenges de sécurité. Il existe multitudes de sites, certains très ludiques, d'autres plus instructifs. On m'a fourni le site intruded.net qui offre un certain nombre de challenges. [update: Le site semble malheureusement down en ce moment :-/] Les machines sont rebootées régulièrement, vérifiez via la commande uptime qu'il reste suffisamment de temps pour pouvoir mener l'exploit à bout. Les mots de passes sont systématiquement enregistrés dans le dossier caché ~/.passwd des utilisateurs.

Les challenges sont classés par difficulté croissante. Le premier, Leviathan, est extrêmement simple. Aussi, je donne la solution des 8 niveaux en un message. Si vous souhaitez faire ce challenge, ne lisez pas plus loin :-)

Le challenge Leviathant est entièrement tourné vers de l'utilisation d'outil *nix. Pas de programmation, pas de failles l33t, juste un peu de curiosité intellectuelle et des connaissances de bases que tout linuxien qui a réussi à installer sa distro doit connaître.



Level1: la connexion se fait sur leviathan:
ssh -p 10101 leviathan.intruded.net -l level1

( pass: leviathan )

Aucune aide n'est donnée, il s'agit donc d'exploration. Un simple ls -la montre un répertoire caché .backup. Dans ce répertoire un fichier, et grep fournit la solution:
grep intruded .backup/bookmarks.html

donne une URL pointant sur nahtaivel.intruded.net (nahtaivel = leviathan à l'envers). Et cette URL contient le password de level2.
Un su - level2 plus tard:

Level2:  Les fichiers à exploiter sont situés dans le dossier /wargame/ (une référence au film éponyme?).
Les droits des fichiers montrent qu'il faut lancer le programme check qui demande un mot de passe. La commande strings appliquée à ce programme permet de trouver ce mot de passe 'sex':
level2@leviathan:/wargame$ ./check
password: sex
sh-3.1$ cat /home/level3/.passwd


Level3: Le programme a lancer est 'prog'. Il semble lire le contenu d'un fichier:
level3@leviathan:~$ /wargame/prog
Cannot find /tmp/file.log
level3@leviathan:~$ echo "abcd" > /tmp/file.log
level3@leviathan:~$ /wargame/prog
abcd

Et l'utilisation d'un simple lien symbolique permet de connaître le mot de passe pour le niveau suivant:
level3@leviathan:~$ ln -s /home/level4/.passwd /tmp/file.log
level3@leviathan:~$ /wargame/prog
G5hMQUAd

Level4: Nous nous trouvons de nouveau face à un programme demandant un mot de passe. L'utilisation de la commande strings fournit plusieurs mots semblant être des mots de passe, mais aucun ne fonctionne. La commande ltrace est disponible toutefois:
level4@leviathan:/wargame$ ltrace ./level4
__libc_start_main(0x8048523, 1, 0xbffffb44, 0x8048650, 0x8048600  
strcmp("h0no33", kakaka") = -1
printf("Enter the password> ") = 20
fgets(Enter the password> bloup
"bloup\n", 256, 0xb7fe1300) = 0xbffff95d
strcmp("bloup\n", "snlprintf\n") = -1
puts("bzzzzzzzzap. WRONG"bzzzzzzzzap. WRONG)= 19
+++ exited (status 0) +++

La fonction strcmp indique immédiatement quelle comparaison est faite.

level4@leviathan:/wargame$ ./level4
Enter the password> snlprintf
[You've got shell]!
sh-3.1$ cat /home/level5/.passwd
58VoEhbS

Level5: De nouveau une partie d'exploration. Un programme est disponible dans la corbeille: .Trash/bin
son exécution affiche des caractères binaires:
level5@leviathan:~/.Trash$ ./bin
01101000 00110110 00110010 01110011 01001010 01000010 01101010 01000011 00001010
armé de n'importe quelle calculette, on transforme ces nombres en hexa, puis en caractères ASCII:
level5@leviathan:~/.Trash$ printf '\x68\x36\x32\x73\x4A\x42\x6A\x43\x0A'
h62sJBjC
Le résultat est tellement proche des autres mots de passe qu'on se logue level6 avec sans se poser plus de questions.

Level6: Nous avons un programme printfile, comme celui du niveau 3. Mais la méthode du lien symbolique ne fonctionne pas car ce programme vérifie les droits du fichiers accédé. ltrace est de nouveau utile pour exploiter ce programme. Une ligne semble intéressante, le snprintf qui ne semble pas bien gérer les fichiers avec espace.
level6@leviathan:/wargame$ ltrace ./printfile /tmp/'abcd efgh'
__libc_start_main(0x8048424, 2, 0xbffffb34, 0x8048570, 0x8048520 <unfinished ...>
access("/tmp/abcd efgh", 0) = 0
snprintf("/bin/cat /tmp/abcd efgh", 511, "/bin/cat %s", "/tmp/abcd efgh") = 23
system("/bin/cat /tmp/abcd efgh"abcd
/bin/cat: efgh: No such file or directory
<unfinished ...>
--- SIGCHLD (Child exited) ---
<... system resumed> ) = 256
+++ exited (status 0) +++
Le /bin/cat va donc mal gérer le nom de fichier transmis en le découpant en deux noms de fichiers via l'espace, de plus il le fait après avoir vérifié les droits du fichier. Exploitation:
level6@leviathan:/wargame$ ln -s /home/level7/.passwd /tmp/efgh
level6@leviathan:/wargame$ cd /tmp
level6@leviathan:/tmp$ /wargame/printfile /tmp/'abcd efgh'
abcd
hMuFM0Sn
level6@leviathan:/tmp$ su - level7

Level7: un simple exercice de boucle. Il faut trouver la bonne valeur comprise entre 0000 et 9999. Un script shell fait l'affaire:
level7@leviathan:/wargame$ for i in `seq -w 0000 9999`; do ./sphinx $i; done
sh-3.1$ cat /home/level8/.passwd
TRwkApSQ

Level8: Le dernier effort d'exploration :-) un ls devrait donner la solution.

Ce challenge est intéressant car pour une fois il n'est pas tourné à 99,9% du temps vers du reverse de code obfusqué.

1 commentaire:

  1. Le site intruded.net semble toujours down (13/10/2011). C'est dommage :-/
    Si quelqu'un a des infos là-dessus..

    RépondreSupprimer