Fix css + relecture breizhctf

This commit is contained in:
Quentin 2018-04-22 18:19:53 +02:00
parent 49781af6e8
commit 7d04a07844
2 changed files with 17 additions and 12 deletions

View file

@ -95,6 +95,10 @@ if ('DECRYPT' == method) {
Il suffit alors d'appeler la fonction breizHash avec le message encodé pour obtenir le flag. Il suffit alors d'appeler la fonction breizHash avec le message encodé pour obtenir le flag.
```javascript
console.log(breizHash("3d25373c2b39044f1d390a4a1c4b484e4f11204e4a20114f48204a4c3c0a0d16480620084c131c4f124c200b4f20352c20084f0d131b02","DECRYPT"));
```
## 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éparts dont le hash sha512 commence par `1337`.
@ -102,10 +106,10 @@ C'est le principe du proof-of-work utilisé par Bitcoin. La seule façon connue
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 chaine de caractère en base64 que je vais hasher.
En effet, le serveur validant les résultats en utilisant un protocole texte, si jamais la valeur générée contient un byte interprété comme un retour à la ligne, je ne pourrai pas soumettre mon résultat. 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 chaines en base64, je suis sûr de ne pas avoir de retour à la ligne.
Le programme ressemble donc à ça : Le programme final :
```javascript ```javascript
const crypto = require('crypto'); const crypto = require('crypto');
@ -166,10 +170,9 @@ Ce sont donc ces caractères que l'on va chercher pour connaitre la couleur du t
É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. É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 dur 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 dur 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 de certains mots clés dans le buffer ou du prompt. Pour ma part, je me suis basé sur la présence du prompt ou de certains mots clés dans le buffer.
Ainsi je lis jusqu'à obtenir un caractère précis, comme le prompt ou jusqu'à un message d'erreur identifié.
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 ressemblant à : 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 :
```csv ```csv
Yffiniac,22120 Yffiniac,22120
@ -185,7 +188,7 @@ Séné,56860
... ...
``` ```
Puis 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 solution évoquées précédemment :
```python ```python
import csv, socket, re import csv, socket, re
@ -245,7 +248,7 @@ Il nous faut donc un algorithme de "path finding", on peut citer entre autre Bre
Pour gagner du temps, on peut récupérer l'implémentation python sur [la page dédiée](https://www.redblobgames.com/pathfinding/a-star/implementation.html#python). Pour gagner du temps, on peut récupérer l'implémentation python sur [la page dédiée](https://www.redblobgames.com/pathfinding/a-star/implementation.html#python).
Ensuite il nous reste à récupérer le labyrinth depuis le socket, le stocker dans un format de donnée compatible avec notre implémentation, puis récupérer le résultat et le convertir au format attendu. Ensuite il nous reste à récupérer le labyrinthe depuis le socket, le stocker dans un format de donnée compatible avec notre implémentation, puis récupérer le résultat et le convertir au format attendu.
Voilà à quoi pouvait ressembler une carte : Voilà à quoi pouvait ressembler une carte :
@ -358,7 +361,7 @@ Une fois connecté à ce challenge en telnet, on était dans une jail python.
On nous demandait de déclencher 35 exceptions Python différentes. Bien entendu, impossible de lever ses propres exceptions. On nous demandait de déclencher 35 exceptions Python différentes. Bien entendu, impossible de lever ses propres exceptions.
J'ai commencé par essayer ce qui me passait par la tête : J'ai commencé par essayer ce qui me passait par la tête :
``` ```python
throw throw
throw "e" throw "e"
5/0 5/0
@ -376,11 +379,13 @@ Notre point de départ était l'article [BreizhCTF 2016 Write-Up PyJail
Malheureusement pas de clé `_module` dans dans la classe `warnings.catch_warnings`. Malheureusement pas de clé `_module` dans dans la classe `warnings.catch_warnings`.
La jail possède une liste noire de mots clés, dont `os`. Il existe plusieurs solutions pour contourner cette limitation quand il s'agit d'une chaine de caractère, comme une concaténation : `'o'+'s'` ou encore en utilisant les codes ASCII `'\x6F\x73'`.
En cherchant, [Maximilien](http://mricher.fr/) a trouvé un article nommé [Python Sandbox Escape](http://blog.orleven.com/2016/10/27/python-sandbox-excape/) (en chinois !) qui nous a permis de trouver l'inspiration. En cherchant, [Maximilien](http://mricher.fr/) a trouvé un article nommé [Python Sandbox Escape](http://blog.orleven.com/2016/10/27/python-sandbox-excape/) (en chinois !) qui nous a permis de trouver l'inspiration.
Nous avons finalement trouvé une variable qui contenait le module `os` qui nous a permis d'exécuter des commandes et, finalement, de lire le flag. Nous avons finalement trouvé une variable qui contenait le module `os` qui nous a permis d'exécuter des commandes et, finalement, de lire le flag.
La jail possède une liste noire de mots clés, dont `os`. Il existe plusieurs solutions pour contourner cette limitation quand il s'agit d'une chaine de caractère, comme une concaténation : `'o'+'s'` ou encore en utilisant les codes ASCII `'\x6F\x73'`.
Finalement, la ligne suivante nous a permis de lire le flag :
```python ```python
print ()\ print ()\
.__class__ \ .__class__ \
@ -392,4 +397,4 @@ print ()\
.__dict__['system']('cat *') .__dict__['system']('cat *')
``` ```
Et voilà, c'est la fin ! Et voilà, c'est tout !

View file

@ -291,7 +291,7 @@ hr {
background: #eee; background: #eee;
} }
span.code, code { font-family:Menlo, Monaco, Courier; color: #ffffff; padding: 6px 3px 3px 3px; background-color:#272b2d; font-size:14px; } span.code, code { font-family:Menlo, Monaco, Courier; color: #ffffff; padding: 6px 0px 3px 0px; background-color:#272b2d; font-size:14px; }
pre { pre {
font-family:Menlo, Monaco, Courier; font-family:Menlo, Monaco, Courier;