CybSec16

La Cybsec16 est maintenant terminée et toute l’équipe SCRT présente a de nouveau passé un bon moment en compagnie de différents acteurs du monde de la sécurité en suisse romande (et un peu au delà). Une excellente organisation, des conférences intéressantes et diversifiées ainsi que les divers events “networking” ont largement contribué au succès de l’événement.

Comme plusieurs personnes sont venues me demander les slides de ma présentation, les voici:

https://download.scrt.ch/cybsec16/chlam2308161-1_cybsec_swisscom.pdf

En extra, les slides de ma rump session préparée à la dernière seconde:

https://download.scrt.ch/cybsec16/chlam0311161-1_cybsec_rump.pdf

Merci aux organisateurs et à l’année prochaine!

Insomni’hack 2016 teaser results

Last weekend saw the year’s CTF competitions begin with our very own Insomni’hack teaser. Given some of the recent absurdities (http://weputachipinit.tumblr.com/) we decided to go with the Internet of Things as our theme this year.

Before going into some of the details, we’d like to congratulate Dragon Sector for taking the first place once again, finishing in front of Tasteless and KITCTF who complete our podium.

Screenshot from 2016-01-18 10:54:48

The full scoreboard can be found here: https://teaser.insomnihack.ch/scoreboard, and also on CTFtime.

When entering the contest, participants were greeted by a kitchen, where several connected objects (tasks) could be attacked.

Screenshot from 2016-01-18 10:13:00
Nearly 850 teams registered for the teaser, with 245 of them scoring at least once.

Overall, 8 tasks were given in Web, Crypto and Pwning fields, and teams had 36 hours (from 9h UTC, the 16th of January until 21h on the 17th) to complete as many as possible (and as quickly as possible) to get the top spots.

To give an idea of the complexity of each task, the following list shows which team was the first to solve it and at what time:

  • smartcat1: solved by dcua after 16 minutes
  • Bring the noise: solved by 217 after 27 minutes
  • Greenbox: solved by Dragon Sector after 1 hour and 7 minutes
  • smartcat2: solved by dcua after 1 hour and 10 minutes
  • Fridginator 10k: solved by n0n3m4 after 3 hours and 32 minutes
  • toasted: solved by 0x8F after 6 hours and 1 minute
  • rbaced1: solved by Dragon Sector after 6 hours and 25 minutes
  • rbaced2: solved by Dragon Sector after 20 hours and 19 minutes

We quickly notice that smartcat1 and Bring the noise were the easiest tasks, while the two rbaced tasks were the toughest. This also shows with the number of times each task was solved over the course of the weekend:

  • smartcat1 (Web): 209
  • Bring the noise (Crypto): 173
  • smartcat2 (Web): 132
  • Fridginator 10k (Web/Crypto): 52
  • Greenbox (Web): 33
  • toasted (Pwning): 15
  • rbaced1 (Pwning): 12
  • rbaced2 (Pwning): 2

After completing all the tasks, your kitchen looked like this:

Screenshot from 2016-01-18 11:27:45

Writeups for some of the challenges can be found here:

https://github.com/ctfs/write-ups-2016/tree/master/insomnihack-teaser-2016

The event ran rather smoothly, with only a few services needing to be restarted every now and then.

Do note that this is not a qualification round, as anyone can participate in the finals (18th of March, Geneva, Switzerland) and it is entirely free. We’re looking forward to seeing you there!

SCRT @ DEFCON 2015

Cet été, 4 ingénieurs de l’équipe se sont rendus à Las Vegas pour les finales du concours de Capture the Flag (CTF) organisé par Legit BS à DEFCON. Ils se sont qualifiés en 10ème position avec l’équipe 0daysober.

Sur place, le concours s’est déroulé sur 3 jours, où chaque équipe était responsable d’un serveur sur lequel tournaient plusieurs services différents. Chacun d’entre eux était vulnérable à une ou plusieurs vulnérabilités. Le but du concours est donc de patcher ses propres services et d’exploiter les failles chez les autres équipes pour marquer des points.

Les services rencontrés cette année tournaient sur différentes architectures. Un premier binaire linux x86_64, “rxc”, suivit ensuite d’un autre service “ombdsu” tournant sur mips32le. Nous avons pu rapidement rejouer un exploit sur ce dernier, nous permettant de scorer quelques points. Un troisième service x86 “tachikoma” a été fournit à la fin de la première journée, ou nous terminons en 3ème position.

Aidé par plusieurs personnes à distance, nous avons pu patcher et exploiter une faille dans “rxc”, une nouvelle faille dans “ombdsu” et rejouer un exploit dans “tachikoma” dès le début de la deuxième journée. Un challenge ARM64 hébergé sur l’infrastructure de LegitBS a été proposé afin de séléctionner les 4 équipes les plus rapides. Nous avons heureusement été séléctionné, et les 4 équipes finalistes devaient s’affronter dans un livectf ou une personne représentait l’équipe et le gagnant remportait 1000 points. Etant extrêmement proche du but, notre coéquipier s’est malheureusement fait dépasser par un membre des PPP, qui nous devance ainsi de 7 points au terme de la deuxième journée, ou nous terminons en troisième position.
Trois autres services ont été mis en place sur cette deuxième journée:
– “hackermud”, une sorte de jeu d’aventure en Linux x86
– “badlogger”, un service de journalisation en Windows arm32
– “irkd”, un client IRC en Linux mips32le

Le troisième jour, nous avions corrigés 2 failles dans badlogger, nous évitant ainsi l’exploitation immédiate faite par DEFKOR et PPP. Nous n’avons malheureusement pas réussi à l’exploiter faute de matériel (Raspberry Pi 2) pour mieux analyser l’exploitation. Nous avions cependant deux nouveaux exploits dans tachikoma et ombdsu, nous permettant de scorer encore quelques équipes n’ayant pas patché toutes les failles. Pour préserver le suspens, ni score ni classement n’était affiché. Seule l’animation 3d tournant sur Unreal Engine de Legit BS permettait de voir si les équipes validaient beaucoup de flag. C’était aussi un bon moyen de voir si on se faisait voler des flags et par qui, les fusées représentant un flag ou exploit validé sur une équipe :

Au final, l’équipe sur place s’est en grande partie concentrée sur la défense, en patchant les binaires et en analysant les captures réseau. D’après ce que nous avons pu observer, nous n’avons eu que quelques vols de flag entre le samedi 12h et la fin du CTF le dimanche à 14h.

Autre nouveauté cette année, une version customisée de xinetd par LegitBS. En gros les fonctionnalités ajoutées sont :
– Limitation du nombre de connexions par source (2)
– Limitation de la durée d’exécution du service
– Limitation des syscalls autorisés pour le service
Les deux premières fonctionnalités étaient parfaites pour éviter les DoS. Pas besoin de surveiller la charge de la machine ni la durée des processus, ce qui était relativement couteux en temps et en SLA l’an passé.
Concernant la limitation des syscalls, le service xinetd créait une sorte de sandbox SECCOMP pour limiter les appels fait par le service. Le but principal étant d’empêcher que les équipes mettent en place leur propre sandboxing au moyen de qemu ou autre.

Cette année encore, nous avons utilisé Kibana pour grapher quelques indicateurs, tel que la validation de chaque flag par équipe et par service. Le pie chart suivant rassemble la totalité des flags que nous avons pu valider :
flags
Vous pouvez cliquez sur le lien pour visualisez les détails.

Au final, l’équipe a terminé en 3ème position, juste derrière DEFKOR et PPP.

 

PHDays Finals 2014 Homepage + Breadcrumbs Tasks Writeup

We’re going to look at two of the tasks of the PHDays finals, namely breadcrumbs which we solved and homepage, which unfortunately we were not able to solve during the CTF, though the solution seems to be correct. If you have any additional information on this particular task, I’d love to have your comments : @plopz0r.

Breadcrumbs

This was a forensics task where a full virtual machine was provided to us. We were simply told that the task started with the user “user”. So after extracting the VM’s disk, we started by searching in that user’s home directory. Easily enough, we discover a file named simple_bsl.png.

simple_bsl

 

In a comment section of the image, we can find :

Next breadcrumb is located at /usr/share/doc/ranger/
But first find password...

And in this folder, there is a file named “hacking.gpg” which obviously needs a password. The name of the first image points in the direction of information being hidden in the least-significant bit of each pixel (bsl -> lsb). The answer is not quite as straight forward though, as actually only the first 8 out of every 9 bits must be considered to find the password.

The file then decrypts this message:

here is md5 sum of file you need to find: 30055312e086ea49424c759f3deb751a. Password is the name of the folder, where file is located. Let the force be with you, good luck, etc 🙂

We can easily find this file with the following command:

find . | xargs md5sum | grep 30055312e086ea49424c759f3deb751a

The file is /etc/magic, it is also a GPG encrypted file. We can decrypt it with “etc” as a password. This now reveals:

Now you need to collect parts of the flag that are located in this folder. Valid flag's parts can contain ONLY alphabet symbols, underscore ("_") and exclamation ("!") mark. First part of the flag is "Not_". Good luck!

We quickly see that Not_ is prepended by Key_part: and so we grepped for all “Key_part: ” followed by alphabet, underscore and exclamation mark characters. This however reveals way too many results to find the flag immediately… So we tried ordering the parts by file modification date, or line number within the file, but this didn’t really give any results, so we proceeded with a bit of guessing.

The flag starts with “Not_” and there is a key part “_nor_” and another one “tel!”. So we decided it was likely that the flag would be of the format “Not_XXXXX_nor_YYYYYtel!”

One other key part is “gre”, which can be added before “tel!” to give “gretel!”.  Since the name of the task is “breadcrumbs”, We guessed the flag was “Not_hansel_nor_gretel!”, which was correct!

Homepage

This was a web task and when you connect to the application, there is not much you can do. Essentially, create a user, login with that user, view a blog page in english or russian, and send a message to the admin. The blog page itself talks about XSS, CSRF, Response Splitting and Clickjacking. There is an admin page, but we cannot access the contents.

We first started looking for XSS flaws in the site, but to no avail, everything is correctly encoded. We tried sending messages to the admin and noticed that he would click on links that are sent to him (though this did not seem to work at the start of the CTF), therefore allowing us to do CSRF attacks on the site. How could we exploit this?

We noticed that there is a session fixation flaw in the login mechanism, as the JSESSIONID is not regenerated when a user logs in.And the only remaining action that can be done on the website is to change the language that is set for the blog page. This is done through a parameter named “locale” which then has the server set a cookie for the user:

Set-cookie: locale="XXX"; path=/HomePage/blog/; HttpOnly

Could we maybe directly inject new HTTP headers and set the admin’s JSESSIONID cookie into the response by inserting CR/LF characters? The answer is no… They are converted to “space” characters in the response, so no new lines allowed 🙁

Pretty much any other characters are allowed though. So we tried to set multiple cookies in a single set-cookie header, but again this failed. However, it turns out that Tomcat will accept “,” as a cookie separator when a request is received. So it is actually possible to smuggle several cookies into a single one! Pretty cool! For example, if you decide to set the locale like this:

?locale=en", JSESSIONID=XXXXXXXXXXXXXXXXXXXXXX, toto="

When your browser sends this cookie to the server, it will look like this:

Cookie: locale="en", JSESSIONID=XXXXXXXXXXXXX, toto=""; JSESSIONID=origsessionid

The server will then see three different cookies, and only take the first JSESSIONID which is the one set by us! We’re definitely on the right track.

The only problem is the cookie that we set for the locale is only set for /HomePage/blog/ and none of the other pages of the site. No login, no access to the admin interface, nothing. So even if we can force the admin to use a specific sessionid, it will only be used on a page that doesn’t interest us…

At this point, we’re pretty sure we’re on the right track and that we just have to find a way to set the cookie for the whole domain instead of the blog page. Once that is done, we can get the admin to click our link, set the cookie and just wait for him to login again and we can reuse the sessionid to access the page as an admin (because of the session fixation flaw).

Now this took ages and a little hint from the organisers to actually get it done. We tried adding various cookie parameters such as an additional path, or domain, secure and so on, but apparently the browser will only use the last path that is specified if there are more than one 🙁

But (and this is where the orgas gave us a little hint) if you add the path parameter multiple times, Chrome will actually ignore the last one and select one of the ones that was specified before hand. Wtf?

I’m not quite sure what the exact number is, but if you set the following locale, you will actually end up with a JSESSIONID that is valid for the whole web site (at least in the latest version of Chrome).

?locale=en", JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXXXX, toto="; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/;

This was discovered 10 minutes before the end of the CTF, so I quickly sent the link to an admin with my own JSESSIONID in there and waited for him to click and hope that he then logged in to the site again. Unfortunately nothing happened, I never got the admin privs and couldn’t access the admin page to get the flag. So I’m wondering if I’m still missing something or if the challenge was broken?

Interesting challenge though!

 

 

Finales PHDays 2014

S’étant qualifiés en ligne pour les finales, quelques ingénieurs de SCRT se sont rendus à Moscou pour participer avec l’équipe “w3stormz” à la finale du concours de piratage éthique PHDays.

BoOpw2CIcAANsbv

Le format de la finale était de type “Attaque/Défense” avec un certain nombre de tâches annexes qui pouvaient être débloquées une fois que l’équipe avait récupéré suffisamment de points avec l’attaque et/ou la défense. En parallèle, certaines quêtes étaient accessibles pendant un temps limité.

20140521_090820

Au final, ce sont (encore) les Dragon Sector qui l’ont emporté devant les Int3pids et BalalaikaCr3w. Après un bon départ, nous avons fini en 8ème position sur les 10 équipes présentes.

Malgré une belle diversité des tâches présentes (Web, Reverse, Forensics, Network, Ucucuga, Crypto, Pwn), très peu d’entre elles ont été résolues, même par les premières équipes et c’est au final surtout le score de l’attaque/défense qui a départagé les équipes.

Nous nous sommes par contre démarqués lors du concours “2drunk2hack” en plaçant 4 personnes dans le Top 5! Il s’agit d’un concours basé sur la rapidité et le bypass d’un WAF pour obtenir un max de flags en 30 minutes. Les participants ayant été détectés le plus souvent doivent régulièrement boire un shot de Tequila, d’où le nom du concours. Il faut croire qu’on a su rester discret 🙂

BoP9cCaIIAAhguN

Au final, PHDays est un événement fort intéressant proposant également des conférences et un nombre impressionant de concours annexes. Nous espérons pouvoir nous qualifier de nouveau l’année prochaine.