Course hipPIN

Catégorie: Crypto Difficulté: - Flag: ECW{D4mn_I_G0t_D3laaaaays}

Challenge

file-archive
1KB
circle-info

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 65432
circle-exclamation

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 Cyberchefarrow-up-right 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'APDUarrow-up-right, 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