diff --git a/_posts/2017-06-25-ndh.md b/_posts/2017-06-25-ndh.md index 2754619..df4b10b 100644 --- a/_posts/2017-06-25-ndh.md +++ b/_posts/2017-06-25-ndh.md @@ -51,7 +51,7 @@ def encode(a): return base64.b64encode(marshal.dumps(a)) ``` -Pour la suite, nous nous sommes basé sur le [Write-Up du Breizh-Camp 2016 d'Intrinsec](https://securite.intrinsec.com/2016/05/17/breizhctf-2016-write-up-pyjail-1-2-3/). +Pour la suite, nous nous sommes basés sur le [Write-Up du Breizh-Camp 2016 d'Intrinsec](https://securite.intrinsec.com/2016/05/17/breizhctf-2016-write-up-pyjail-1-2-3/). On a donc : @@ -124,7 +124,7 @@ main: la $30, MEM # ... ``` -En recherchant les intrusctions sur Google, on comprend qu'il s'agit d'une architecture MIPS. En s'intéressant à ce que notre gestionnaire de paquet nous propose sur MIPS : +En recherchant les instructions sur Google, on comprend qu'il s'agit d'une architecture MIPS. En s'intéressant à ce que notre gestionnaire de paquet nous propose sur MIPS : ```raw dnf search mips @@ -164,7 +164,7 @@ On apprend sur Wikipedia que [Modbus](https://en.wikipedia.org/wiki/Modbus) est Il permet de lire ou d'écrire plusieurs valeurs sur des automates connectés à un serveur. Souvent la requête consiste à dire où l'on veut lire : *discrete inputs*, *coils*, *input registers* ou *holding registers*. -Pour communiquer avec le serveur qui nous ai donné, nous avons utilisé la bibliothèque python pymodbus : +Pour communiquer avec le serveur qui nous est donné, nous avons utilisé la bibliothèque python pymodbus : ```raw dnf install pymodbus @@ -172,7 +172,7 @@ dnf install pymodbus Pour commencer, nous avons suivi [la documentation de la bibliothèque](https://pymodbus.readthedocs.io/en/latest/index.html), particulièrement [l'exemple d'un client synchrone](https://pymodbus.readthedocs.io/en/latest/examples/synchronous-client.html) pour se familiariser avec la bibliothèque. -Nous n'avons pas trouvé tout de suite des informations intéressantes, nous avons donc utiliser le code d'un [Scraper Modbus fourni par la documentation](https://pymodbus.readthedocs.io/en/latest/examples/modbus-scraper.html) qui nous a permis de trouver des valeurs qui se convertissaient bien en ascii. Ce dernier ne récupérant que 8 caractères, nous n'avions pas le flag entier. Nous avons par contre modifier le parser pour afficher l'appel exact réalisé. +Nous n'avons pas trouvé tout de suite des informations intéressantes, nous avons donc utilisé le code d'un [Scraper Modbus fourni par la documentation](https://pymodbus.readthedocs.io/en/latest/examples/modbus-scraper.html) qui nous a permis de trouver des valeurs qui se convertissaient bien en ascii. Ce dernier ne récupérant que 8 caractères, nous n'avions pas le flag entier. Nous avons par contre modifié le parser pour afficher l'appel exact réalisé. Nous avons pu ensuite écrire le script suivant pour récupérer le flag : @@ -184,7 +184,7 @@ with ModbusClient('ndh.intrinsec.com', 5020) as client: print ''.join([chr(x) for x in rr.registers]) ``` -Le flag était donc stocké dans un *input register*, peut importe *l'unit* et il fallait récupérer les valeurs depuis 0, jusqu'à 21. Ensuite on convertit le tableau de bytes en tableau de char que l'on transforme en string. +Le flag était donc stocké dans un *input register*, peu importe *l'unit* et il fallait récupérer les valeurs depuis 0, jusqu'à 21. Ensuite on convertit le tableau de bytes en tableau de char que l'on transforme en string. ## Challenges officiels @@ -192,7 +192,7 @@ Le flag était donc stocké dans un *input register*, peut importe *l'unit* et i Ce challenge nous a donné plus de fil à retordre que prévu. Nous partions d'un PDF sur Kev Adams. -Nous avons commencé par extraire l'image, un fichier jpg. Nous avons regardé si des informations n'étaient pas cachées dedans en changeant la luminosité, ou ajoutées à la fin du fichier mais rien. +Nous avons commencé par extraire l'image, un fichier jpg. Nous avons regardé si des informations n'étaient pas cachées dedans en changeant la luminance, ou ajoutées à la fin du fichier mais rien. En revenant sur l'analyse du fichier PDF en lui même, nous découvrons plusieurs polices au nom étrange (Comic Sans Kev2, Comic Sans Gad). Nous les extrayons avec l'outil pdf-parser.py mais rien de concluant. @@ -206,6 +206,13 @@ Ce qui nous permet d'obtenir le flag : ```bash echo "Kev-is-my-god" |sha1sum +3d723704f9c1aa8d3ff8b6bcb71c0fa2558f47e2 - +``` + +Le flag final est donc le hash sha1 avec `ndh2k17_` devant : + +```raw +ndh2k17_3d723704f9c1aa8d3ff8b6bcb71c0fa2558f47e2 ``` ### So easy @@ -222,7 +229,7 @@ Je commence donc part isoler ce bout de l'image et à y appliquer les différent [![Étape 1](/assets/images/posts/ndh-chall_soeasy-step.png)](/assets/images/posts/ndh-chall_soeasy-step.png) -Ensuite, on peut soit baisser son écran pour lire le texte, soit redimenssioner les images (outil de mise à l'échelle). L'idée étant de réduire de beaucoup réduire la hauteur et d'augmenter beaucoup la largeur : +Ensuite, on peut soit baisser son écran pour lire le texte, soit redimensionner les images (outil de mise à l'échelle). L'idée étant de beaucoup réduire la hauteur et de beaucoup augmenter la largeur : [![Étape finale](/assets/images/posts/ndh-chall_soeasy-final.png)](/assets/images/posts/ndh-chall_soeasy-final.png) @@ -251,7 +258,7 @@ Nous avons donc un système de fichier. Un seul fichier possède un nom avec du FILETYPE="PNG" ``` -On suppose donc que le fichier à trouver est un fichier PNG. Cependant, il y a beaucoup trop de fichier pour les vérifier un à un manuellement. J'ai fais le choix d'automatiser la recherche avec python : +On suppose donc que le fichier à trouver est un fichier PNG. Cependant, il y a beaucoup trop de fichiers pour les vérifier un à un manuellement. J'ai fait le choix d'automatiser la recherche avec python : ``` from os import listdir @@ -324,7 +331,7 @@ file content.dat [![Image pastebin](/assets/images/posts/ndh-pastebin.png)](/assets/images/posts/ndh-pastebin.png) -On comprend alors que le fichier est une image PNG. En l'ouvrant, il est possible de lire une phrase avec des mots en couleur. En réduisant la luminosité dans GIMP sous Teintes-Saturation, certaines lettres et chiffres apparaissent d'une couleur différente : +On comprend alors que le fichier est une image PNG. En l'ouvrant, il est possible de lire une phrase avec des mots en couleur. En réduisant la luminance dans GIMP sous Teintes-Saturation, certaines lettres et chiffres apparaissent d'une couleur différente : [![Image pastebin](/assets/images/posts/ndh-pastebin2.png)](/assets/images/posts/ndh-pastebin2.png)