Corrections Esther

This commit is contained in:
Quentin 2018-04-23 18:24:49 +02:00
parent b46692b2e2
commit 080b7087f3

View file

@ -10,22 +10,23 @@ categories:
tags: tags:
--- ---
Le BreizhCTF est une compétition autour de la sécurité, qui a lieu à Rennes tous les ans, où des équipes de 5 personnes se retrouvent face à code obscurcit, des binaires à reverse, des injections diverses et variées... tout ça pour trouver des *flags* et marquer un maximum de points. Le BreizhCTF est une compétition autour de la sécurité, qui a lieu à Rennes tous les ans, où des équipes de 5 personnes se retrouvent face à un code obscurci, des binaires à reverse, des injections diverses et variées... tout ça pour trouver des *flags* et marquer un maximum de points.
L'édition 2018 s'est tenue durant la nuit du 20 au 21 avril dans le hall de l'université de Rennes 1. Vous pouvez trouver la vidéo de l'évènement sur [Vimeo](https://vimeo.com/265870042). L'évènement s'est bien terminé pour notre équipe puisque nous avons fini 7ème (équipe ~). L'édition 2018 s'est tenue durant la nuit du 20 au 21 avril dans le hall de l'université de Rennes 1. Vous pouvez trouver la vidéo de l'évènement sur [Vimeo](https://vimeo.com/265870042). L'évènement s'est bien terminé pour notre équipe puisque nous avons fini 7<sup>e</sup> (équipe ~).
[![scoreboard bzhctf](/assets/images/posts/bzhctf18-scoreboard.jpg)](/assets/images/posts/bzhctf18-scoreboard.jpg) [![scoreboard bzhctf](/assets/images/posts/bzhctf18-scoreboard.jpg)](/assets/images/posts/bzhctf18-scoreboard.jpg)
C'est donc l'occasion pour ma part de faire un compte-rendu des challenges sur lesquelles j'ai travaillé. C'est donc l'occasion pour ma part de faire un compte-rendu des challenges sur lesquels j'ai travaillés.
Mais avant de commencer, les autres write-up de notre équipe sont disponibles ici : Mais avant de commencer, les autres write-ups de notre équipe sont disponibles ici :
* [Trace Me, BabyAPK, Cryptonik et Desprecitor](https://blog.tclaverie.eu/posts/breizh-ctf---write-ups/) par Tristan * [Trace Me, BabyAPK, Cryptonik et Desprecitor](https://blog.tclaverie.eu/posts/breizh-ctf---write-ups/) par Tristan
* [Diskcrypt, Use the luck force, Chinoiseries, Diffie-Failman - strike back](https://blog.lesterpig.com/post/breizhctf-2k18-write-up/) par Loïck
## Baby JS ## Baby JS
Pour ce challenge, on récupérait un texte inconnu et un fichier javascript [baby.js](/assets/code/bzhctf18-baby.js) qui avait l'air bien obscurcit. Pour ce challenge, on récupérait un texte inconnu et un fichier javascript [baby.js](/assets/code/bzhctf18-baby.js) qui avait l'air bien obscurci.
En écrivant ce write-up, je me rends compte qu'il n'a pas été obscurcit à la main mais à l'aide de l'outil [JSFuck](http://www.jsfuck.com/) (merci [Tristan](https://tclaverie.eu/)). En écrivant ce write-up, je me rends compte qu'il n'a pas été obscurci à la main mais à l'aide de l'outil [JSFuck](http://www.jsfuck.com/) (merci [Tristan](https://tclaverie.eu/)).
Voilà à quoi ressemble du code après passage dans JSFuck : Voilà à quoi ressemble du code après passage dans JSFuck :
@ -34,7 +35,7 @@ Voilà à quoi ressemble du code après passage dans JSFuck :
``` ```
Le détail de l'implémentation se trouve sur [le README du projet github de JSFuck](https://github.com/aemkei/jsfuck). Le détail de l'implémentation se trouve sur [le README du projet github de JSFuck](https://github.com/aemkei/jsfuck).
Pensant que ce JS a été obscurcit spécialement pour l'évènement, je me suis mis en quête d'un moyen de le désobscurcir à la main. Pensant que ce JS a été obscurci spécialement pour l'évènement, je me suis mis en quête d'un moyen de le désobscurcir à la main.
Sans pour autant complètement comprendre pourquoi, il apparait que : Sans pour autant complètement comprendre pourquoi, il apparait que :
@ -111,13 +112,13 @@ BZHCTF{0bFu5c4710n_15_n07_53Curi7y_w3lc0m3_t0_JS_w0rld}
## Breizh Coin Miner ## Breizh Coin Miner
Pour ce challenge, l'objectif est de trouver des valeurs de départs dont le hash sha512 commence par `1337`. Pour ce challenge, l'objectif est de trouver des valeurs de départ dont le hash sha512 commence par `1337`.
C'est le principe du proof-of-work utilisé par Bitcoin. La seule façon connue à ce jour est d'essayer plein de valeurs de départ aléatoires, les hasher et regarder si le hash obtenu commence par `1337`. C'est le principe du proof-of-work utilisé par Bitcoin. La seule façon connue à ce jour est d'essayer plein de valeurs de départ aléatoires, les hasher et regarder si le hash obtenu commence par `1337`.
Pour la complexité demandée, un simple programme en javascript suffit. Pour les valeurs aléatoires, je récupère 100 octets depuis `/dev/urandom` que j'encode en base64. Pour la complexité demandée, un simple programme en javascript suffit. Pour les valeurs aléatoires, je récupère 100 octets depuis `/dev/urandom` que j'encode en base64.
C'est cette chaine de caractère en base64 que je vais hasher. C'est cette chaîne de caractères en base64 que je vais hasher.
En effet, pour valider les résultats, il est nécessaire de communiquer avec le serveur en utilisant un protocole texte : si jamais la valeur générée contient un byte interprété comme un retour à la ligne, mon résultat sera tronqué. En effet, pour valider les résultats, il est nécessaire de communiquer avec le serveur en utilisant un protocole texte : si jamais la valeur générée contient un byte interprété comme un retour à la ligne, mon résultat sera tronqué.
En utilisant des chaines en base64, je suis sûr de ne pas avoir de retour à la ligne. En utilisant des chaînes en base64, je suis sûr de ne pas avoir de retour à la ligne.
Le programme final : Le programme final :
@ -171,20 +172,20 @@ En effet, il acceptait uniquement une seule des villes pour un code postal donn
À cela s'ajoute qu'en fonction de la couleur du texte envoyé, il fallait répondre un texte différent. À cela s'ajoute qu'en fonction de la couleur du texte envoyé, il fallait répondre un texte différent.
Si le texte de la question était vert, il fallait renvoyer `YA! Me gwel <nom de la ville> :)`, si il était rouge il fallait renvoyer `NANN! Me ne gwel ket <nom de la ville> :/`. Si le texte de la question était vert, il fallait renvoyer `YA! Me gwel <nom de la ville> :)`, si il était rouge il fallait renvoyer `NANN! Me ne gwel ket <nom de la ville> :/`.
Pour ce qui est de la couleur du texte, il s'agit de code spéciaux interprétés par les émulateurs de terminaux. Pour ce qui est de la couleur du texte, il s'agit de codes spéciaux interprétés par les émulateurs de terminaux.
Pour faire un essai : Pour faire un essai :
``` ```
echo -e "\e[92m vert \e[91m rouge \e[0m" echo -e "\e[92m vert \e[91m rouge \e[0m"
``` ```
Ce sont donc ces caractères que l'on va chercher pour connaitre la couleur du texte. Si vous voulez en savoir plus sur la couleur dans les terminaux, je vous recommande la lecture de [Bash tips: Colors and formatting (ANSI/VT100 Control sequences)](https://misc.flogisoft.com/bash/tip_colors_and_formatting). Ce sont donc ces caractères que l'on va chercher pour connaître la couleur du texte. Si vous voulez en savoir plus sur la couleur dans les terminaux, je vous recommande la lecture de [Bash tips: Colors and formatting (ANSI/VT100 Control sequences)](https://misc.flogisoft.com/bash/tip_colors_and_formatting).
Étant donné que l'on doit répondre à un service TCP avec un protocole texte, j'ai dù utiliser la bibliothèque socket de python également. Étant donné que l'on doit répondre à un service TCP avec un protocole texte, j'ai du utiliser la bibliothèque socket de python également.
Cependant, faisant face à un protocole texte principalement fait pour être utilisé par un humain, il est difficile de savoir combien d'octets il faut lire avant d'avoir tout le message. Cependant, faisant face à un protocole texte principalement fait pour être utilisé par un humain, il est difficile de savoir combien d'octets il faut lire avant d'avoir tout le message.
Pour ma part, je me suis basé sur la présence du prompt ou de certains mots clés dans le buffer. Pour ma part, je me suis basé sur la présence du prompt ou de certains mots clés dans le buffer.
La correspondance ville-codes postal a été récupérée depuis un site internet pointé par le challenge. J'ai converti le tout en CSV : La correspondance ville-code postal a été récupérée depuis un site internet pointé par le challenge. J'ai converti le tout en CSV :
```csv ```csv
Yffiniac,22120 Yffiniac,22120
@ -200,7 +201,7 @@ Séné,56860
... ...
``` ```
Enfin le code python consistait à mettre en place toutes les solution évoquées précédemment : Enfin le code python consistait à mettre en place toutes les solutions évoquées précédemment :
```python ```python
import csv, socket, re import csv, socket, re
@ -252,7 +253,7 @@ Au bout d'un certain nombre de bonnes réponses, on obtient le flag (que je n'ai
## Breizh Path ## Breizh Path
Tout comme le challenge précédent, BreizhPath nécessite d'intéragir avec un protocole texte relativement pratique pour un humain mais pas nécesseraiment facile à automatiser. Tout comme le challenge précédent, BreizhPath nécessite d'interagir avec un protocole texte relativement pratique pour un humain mais pas nécessairement facile à automatiser.
Certaines parties du texte sont colorées, ajoutant à la difficulté. Certaines parties du texte sont colorées, ajoutant à la difficulté.
Le but de ce challenge est de trouver le chemin le plus court entre deux points d'une carte représentée par un quadrillage possédant des murs. Le but de ce challenge est de trouver le chemin le plus court entre deux points d'une carte représentée par un quadrillage possédant des murs.
@ -287,7 +288,7 @@ On nous dit que :
La réponse attendue est donc `jjjjiiij`. La réponse attendue est donc `jjjjiiij`.
Pour l'implementation, j'ai utilisé Dijkstra, mais A* aurait éte suffisant et aurait nécessité moins de ressources. Pour l'implementation, j'ai utilisé Dijkstra, mais A* aurait été suffisant et aurait nécessité moins de ressources.
On suppose que le fichier [implementation.py](https://www.redblobgames.com/pathfinding/a-star/implementation.py) contenant A\* et Dijkstra fourni par Red Blob Games se trouve dans le même dossier que notre solution. On suppose que le fichier [implementation.py](https://www.redblobgames.com/pathfinding/a-star/implementation.py) contenant A\* et Dijkstra fourni par Red Blob Games se trouve dans le même dossier que notre solution.
```python ```python
@ -389,9 +390,9 @@ throw "e"
e e
``` ```
Mais impossible d'aller d'en trouver d'autres. Mais impossible d'en trouver d'autres.
On a donc décidé de voir si il n'était pas possible de sortir de la jail. On a donc décidé de voir s'il n'était pas possible de sortir de la jail.
Notre point de départ était l'article [BreizhCTF 2016 Write-Up PyJail 1, 2, 3](https://securite.intrinsec.com/2016/05/17/breizhctf-2016-write-up-pyjail-1-2-3/) d'Intrinsec. Notre point de départ était l'article [BreizhCTF 2016 Write-Up PyJail 1, 2, 3](https://securite.intrinsec.com/2016/05/17/breizhctf-2016-write-up-pyjail-1-2-3/) d'Intrinsec.
Malheureusement pas de clé `_module` dans dans la classe `warnings.catch_warnings`. Malheureusement pas de clé `_module` dans dans la classe `warnings.catch_warnings`.