forked from quentin/quentin.dufour.io
Fix css + relecture breizhctf
This commit is contained in:
parent
49781af6e8
commit
7d04a07844
2 changed files with 17 additions and 12 deletions
|
@ -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 !
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue