The Insomni’Hack Teaser 2018 took place last weekend and with Securimag, we finished 21st among 433 participating teams. With my friend depierre (who says he wants to do more exploit/reverse but always solely look at the web challenges… :D) we looked at FileVault. It was a tricky challenge and I thought that it deserved a writeup.

The challenge consisted in a simple web page where we could upload files to the server.

Fiddling around, we see that the information about our virtual vault is stored client-side, in a PHP object, serialized. With access to the source (every good web challenge should provide its source IMHO), we understand that the serialized object is HMACed, preventing us from tampering with it.

Going through the source, there are multiple restrictions. First, the serialized object is secured with a HMAC and there is no way to forge our own valid signature. Secondly, a ‘.htaccess’ file is created in our sandbox to disable PHP execution. As such, even though we can upload PHP files to our sandbox, it will never be executed.

There are a few elements in the source code that caught our attention. First, the call to str_replace, which seems to attempt to prevent path traversal, can easily be bypassed using ‘…/’. But even then, since the content of the file is never read by the application, we could not actually exploit the path traversal (cf. s_serialize function above)
Second, the application resets twice our cookie when we want to clear our vault, and this doesn’t make sense to me even after solving the challenge.

Third, when calling open, the application will use the name of the object specified in the serialized object and call its open method. While this could be explained by trying to be flexible and support future classes, it did not make sense to call open with two attributes of the class, instead of two actual parameters, which hinted us towards exploiting the s_unserialize function.

Then we realized that the call to str_replace was done **after** the object was serialized. Why is that a problem? Well, str_replace would be reducing the size of our string if it contained ‘../’ but it would not update the information of the PHP serialized object it just modified.

Here is a simple VaultFile being serialized. You can quickly see that PHP serialization is mostly of the form TYPE:LENGTH:VALUE.

Let’s now create a VaultFile that contains a series of ‘../’ in its fakename.

After str_replace has been called, the serialized object now contains:

As we can see, our string object is now of size 24 but the information still says 31, meaning that unserialize will attempt to read a string of 31 characters, although the string is in fact shorter, and consume the next serialized object. With the example above, the unserialization fails:

So, how can we exploit this issue? Well, we can manipulate the serialized object so that our fakename, when being unserialized, will consume part of the original realname object placed after it.

In addition, we can inject a string containing our crafted serialized PHP object in the extension of our file, since it is kept by the application and appended to the realname. All in all, we could trick unserialize to consider that string as the actual serialized object to unserialize!

One thing we couldn’t understand at first was how we could « comment out » the trailing part of the original serialized object. Then I realized that simply closing the original array (by injecting ‘”;}})’) would stop unserialized from parsing the trailing part.

So let’s assume for a second that we can indeed trick unserialize to unserialize arbitrary objects. What then? There is no class with magic methods (e.g. __construct) that we can leverage, which greatly reduces our playground. However, that call to open we mentioned earlier could be very useful. It provides us with the following property: call the open method of an arbitrary class (declared in the application or in PHP obviously) with 2 parameters that we control.

While we couldn’t find a way to actually read arbitrary files, we found ZipArchive that had a matching open method. The first parameter is the file to open, while the second parameter is the mode. By using ZipArchive::OVERWRITE (8), we could override the .htaccess file with nothing, therefore removing the restriction preventing us from executing PHP code!

I came up with the following code to generate our payload:

We used the original upload, s_serialize and s_unserialize functions to make sure that everything would match what’s being executed on the server. It gave us the following output:

The first array is the legitimate array of files we plan to upload. The second one is the result of our injected PHP object, after the function s_unserialized was called.

Because our injected PHP object would be in the extension of the file, we cannot have any ‘.’ or PHP will only keep whatever is after the last dot as the extension. But we can get around that restriction by calling changename after injection our PHP object and renaming our ZipArchive fakename to .htaccess.

Due to the fact ‘.htaccess’ is created each time we access the PHP page, we first had to upload our go-to PHP shell (the most advanced you have ever seen):

And retrieve its path:

Then we did our dance with the PHP serialization vulnerability and called open, which returned 1, meaning that ZipArchive::open was indeed successful!

Flag: INS{gr4tz_f0r_y0ur_uns3ri4l1z1ng_tal3nts}

And there you have it! It was a very well crafted challenge in our opinion. Everything appeared almost exploitable but not exploitable enough, making you wonder if you were missing the obvious or some PHP obscure shenanigans. You had to really understand implication of str_replace to find how to actually exploit anything. Even then, you had to think hard about how to leverage the unserialize with all the restrictions in place (cannot read the content of a file, no classes with __construct available, only one call with 2 parameters, etc.)

Kudos to the creator(s)!

Pièces jointes

Yop,

Voici le lien vers quelques write-ups que nous avons fait pour le ctf d’Internetwatche, l’équipe est arrivée 18ème et a réussi à accomplir toutes les taches en un peu plus de 27 heures.

Hésitez pas à faire un tour sur le chan #ctf si vous êtes intéressés pour nous rejoindre sur les suivants.

 

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

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

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 →

Dans le cadre du CTF « open to all »  : http://ctf2.opentoall.net/

Dans la catégorie MISC pour  200 points :

La seule indication en notre possession pour ce challenge est une IP ainsi qu’un numéro de port :

 104.131.107.153 : 12121

Une connexion avec un simple Telnet nous renvoie le message suivant :

Hey dude, can you help me with my math homework? I have a few addition problems to do…
You have 10.000000 seconds to solve this problem: 714 + -479

Read More →

Pièces jointes

Mobius-Strip[1]

Après épluchage des quelques 60 propositions qui nous sont parvenues, voici le script vainqueur du while not challenge (proposé par perdu):

file = open('/dev/random')
file.read()

Les slides de la présentation des résultats (présentation des différentes idées reçues): ici

L’intégralité des propositions reçues: ici

Merci à tous pour votre participation !

Pièces jointes