Course hipPIN
Catégorie: Crypto Difficulté: - Flag: ECW{D4mn_I_G0t_D3laaaaays}
Challenge
Description
You're looking to physically infiltrate the building that manages the submarine cables on the south coast of France. However, access is protected by a smart card reader. From reliable sources, you know that a secret is embedded in these cards. You must find this secret at all costs!
Your pickpocketing skills have enabled you to steal an employee's access card. However, this card is protected by a pin code. There's got to be a way of finding this code to access the card's secret...
Using your pirate terminal, you can send commands of your choice to this card and observe its responses. You find the source code of the Java Card applet that seems to be used.
You can communicate with the Smart Card's terminal by using netcat. You can provide X hex buffers as parameters. If the port number associated to the docker is 65432, then type:
$ echo "BUFFER1 BUFFER2 BUFFERX" | nc -N localhost 65432Ce challenge tourne sur un docker, disponible sur Github
Solution
Unintended way
Ici, on va exploiter une injection pour exécuter des commandes sur le serveur et récupérer le flag directement depuis les fichiers.
Pour ça, au lieu d'envoyer nos BUFFER, on va envoyer ;whoami comme Proof of Concept :
En se baladant dans les fichiers, on trouve /ressources/flag.jpg, on peut donc le récupérer en l'encodant en base64 :
Direction Cyberchef pour afficher l'image :

Intended way
Il faut dans un premier temps comprendre la structure de ce qu'on doit envoyer. Il s'agit d'APDU, les données sont donc composées :
Nom du champs
Taille (octets)
Description
CLA
1
Classe d'instruction - indique le type de la commande, par exemple "interindustry" ou "proprietary"
INS
1
Code d'instruction - indique le code de commande, "write data" par exemple
P1-P2
2
Paramètres d'instructions pour la commande, par exemple la position du curseur (offset) du fichier où écrire des données
Lc
0, 1 ou 3
Définit le nombre (Nc) d'octets envoyés par la commande
Données envoyées
Nc
Nc octets
Le
0, 1, 2 ou 3
Définit le nombre (Ne) maximum d'octets attendus dans la réponse
Pour récupérer le flag, il faut s'authentifier avec le PIN via la commande VERIFY.
Seulement, cette commande est vulnérable aux attaques par timing, on peut donc tester les 10 chiffres et regarder lequel ajoute un délai à la réponse. Une fois le chiffre trouvé, on passe au suivant et ainsi de suite jusqu'à ce que nous ayons une réponse différente de 0x6300 (ce code correspond à SW_VERIFICATION_FAILED).
Maintenant qu'on a le PIN, il suffit d'envoyer la commande VERIFY puis GET_FLAG en même temps :
Mis à jour