Cyber 2021/2022 G1 : Différence entre versions
(→Encore une image en musique) |
(→Reverse engineering d'un thermomètre bluetooth) |
||
(13 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
= Challenges ctf = | = Challenges ctf = | ||
+ | |||
+ | Pour valider les challenges nous utilisons le login axel.chemin@polytech-lille.net dans l'équipe "achemin1" . | ||
== Flocons == | == Flocons == | ||
+ | |||
+ | Il faut lire les petits points descendeant sur les deux côtés de l'image | ||
== Espion dans le bus == | == Espion dans le bus == | ||
− | + | https://blog.stayontarget.org/2019/03/decoding-mixed-case-usb-keystrokes-from.html | |
+ | utiliser cette partie du lien | ||
+ | Leftover Capture Data as a column (by right-clicking on one of the entries, and selecting "Apply as Column") then File -> Export Packet Dissections -> As CSV, open the resulting file, | ||
+ | cut the capture data column out and the double-quotes, and the first line that says "Leftover Capture Data" | ||
+ | -or- | ||
+ | I learned a much easier way when researching this write-up was to use tshark to extract the leftover capture data (be sure to pipe to tr -d : to get rid of the colons in the output. | ||
+ | Redirect output to a text file, once you've confirmed it looks good. | ||
+ | taper dans le shell : | ||
+ | tshark -r capture-myst1.pcap -T fields -e usb.capdata | tr -d : | grep "\S" >prkeycodes.txt | ||
+ | car nous voulons récupérer la partie Leftover Capture Data | ||
+ | Nous avons rajouté ceci | grep "\S" pour ne pas avoir des lignes entre les résulats et nous avons redirigé (stocké) les résultats dans un fichier prkeycodes.txt | ||
+ | Nous avons tapé ceci : | ||
+ | cat prkeycodes.txt | ||
+ | pour vérifier que le fichier a mis les résultats à la suite (1 résultat par ligne). | ||
+ | créer le fichier decodeusbkeypress.py et mettre le script donné dans le lien (il a fallu faire quelques modif dans le script car dans le dictionnaire il manque 83 d'où le key error 83) | ||
+ | Taper dans le shell : | ||
+ | python3 decodeusbkeypress.py prkeycodes.txt | ||
+ | on obtient le code dans le shell. | ||
== Travail de serrurerie == | == Travail de serrurerie == | ||
− | Ce | + | ans l'archive data.zip, il y a un fichier "data" . |
+ | |||
+ | Ce fichier est un binaire, dont la commande "file" le décrit comme : | ||
+ | |||
+ | data: DOS/MBR boot sector; partition 1 : ID=0xb, start-CHS (0x0,32,33), end-CHS (0xc,223,19), startsector 2048, 204800 sectors; partition 2 : ID=0x83, start-CHS (0xc,223,20), end-CHS (0x41,69,4), startsector 206848, 841728 sectors | ||
+ | |||
+ | Mais l'astuce proposé est d'utiliser les Network Block Device. | ||
+ | |||
+ | === Installation et démarrage du serveur et du client NBD === | ||
+ | |||
+ | Ajout dans le fichier /etc/nbd-server/config : | ||
+ | |||
+ | [export] | ||
+ | exportname = /home/pifou/Axel_NBD/data | ||
+ | port = 2000 | ||
+ | |||
+ | Et le lancer avec | ||
+ | |||
+ | nbd-server | ||
+ | |||
+ | Pour le client : | ||
+ | |||
+ | nbd-client 127.0.0.1 /dev/nbd0 -name export | ||
+ | |||
+ | Il y a ces fichiers qui ont apparu | ||
+ | |||
+ | # ls /dev/nbd | ||
+ | nbd0 nbd0p2 nbd10 nbd12 nbd14 nbd2 nbd4 nbd6 nbd8 | ||
+ | nbd0p1 nbd1 nbd11 nbd13 nbd15 nbd3 nbd5 nbd7 nbd9 | ||
+ | |||
+ | === Recherche dans les NBD devices === | ||
+ | |||
+ | Ensuite il faut monter les 2 périphériques : | ||
+ | |||
+ | mkdir /tmp/axelNbd1 | ||
+ | mount /dev/nbd0p1 /tmp/axelNbd1 | ||
+ | mkdir /tmp/axelNbd2 | ||
+ | mount /dev/nbd0p2 /tmp/axelNbd2 | ||
+ | |||
+ | Le premier système de fichier présente un seul fichier "code" avec comme contenu "TROPFACILE" | ||
+ | |||
+ | Le second système de fichier est composé d'un dossier lost+found et d'une archive zip "secret.zip" . | ||
+ | |||
+ | "TROPFACILE" n'est pas le mot de passe. Les variations de casse non plus. A ce moment là, il n'y a plus de mot de passe disponible, il est décidé de lancer une bruteforce avec | ||
+ | |||
+ | fcrackzip --charset aA1 --use-unzip secret.zip | ||
== Spécialiste des écoutes == | == Spécialiste des écoutes == | ||
− | + | Le fichier téléchargé extrait.wav est bien un fichier audio, extrait a priori de l'extrait d'un candidat à la présidentielle. Son nom n'est pas le drapeau. | |
+ | |||
+ | On entend tout de suite des sons aigues, le drapeau se trouve donc sûrement dans le flux audio. On repère très bien dans le spectre la partie haute fréquence, qui répète un motif plusieurs fois. | ||
+ | |||
+ | C'est en baissant la fréquence d'échantillonage de la piste à 48kHz que l'on retrouve l'audio caché (par effet repliement de spectre) : Potemkine - Jean Ferrat | ||
== Perçage de coffre == | == Perçage de coffre == | ||
− | + | "file" ne donne pas d'information sur le fichier, à supposer que c'est un système de fichier chiffré avec cryptsetup (on m'a un petit peu aidé, c'est vrai) : | |
+ | |||
+ | On peut tester le mot de passe en essayant d'ouvrir le périphérique et monter le volume : | ||
+ | |||
+ | mkdir pointMontage | ||
+ | cryptsetup open --type plain chiffre pointMontage | ||
+ | |||
+ | (Le mot de passe est demandé) | ||
+ | |||
+ | mount /dev/mapper/pointMontage ./montage | ||
+ | |||
+ | Si et seulement si le mot de passe entré est bon, la dernière commande retourne 0. | ||
+ | |||
+ | Sinon il faut ré-essayer avec un autre mot de passe à 4 chiffres, sans oublier de refermer le périphérique : | ||
+ | |||
+ | cryptsetup close pointMontage | ||
+ | |||
+ | Pour cela j'ai fait un fichier python, trèèèès overkill (et pas si bien). | ||
+ | |||
+ | [METTRE LE SCRIPT] | ||
+ | |||
+ | Si besoin de nettoyer : | ||
+ | |||
+ | umount pointMontage | ||
+ | rm -r pointMontage | ||
+ | |||
+ | Le fichier trouvé contient des informations bancaires | ||
+ | |||
+ | # cat mntA/compte | ||
+ | Code banque : 12345 | ||
+ | Code guichet : 66666 | ||
+ | Numéro de compte : 00001100111 | ||
+ | |||
+ | On complète l'IBAN avec https://www.iban.com/calculate-iban en supposant que le propriétaire est français. | ||
+ | |||
+ | La solution : FR7612345666660000110011189 | ||
== Déchiffrer le manuscrit == | == Déchiffrer le manuscrit == | ||
+ | |||
+ | Commencé, utilisation de cette documentation entre autre : | ||
https://learn.adafruit.com/introducing-bluefruit-ez-key-diy-bluetooth-hid-keyboard/sending-keys-via-serial#raw-hid-mouse-reports-823930-11 | https://learn.adafruit.com/introducing-bluefruit-ez-key-diy-bluetooth-hid-keyboard/sending-keys-via-serial#raw-hid-mouse-reports-823930-11 | ||
Ligne 25 : | Ligne 132 : | ||
== Dessiner avec des sons == | == Dessiner avec des sons == | ||
+ | Commencé, récupération du header de l'image PGM/PPM. | ||
+ | |||
+ | P6 | ||
+ | 225 225 | ||
+ | 255 | ||
+ | |||
+ | Problème de décodage pour le reste. | ||
== Encore une image en musique == | == Encore une image en musique == | ||
− | + | Le fichier audiodump est identifié comme un wav par file ou Audacity. | |
+ | |||
+ | Mais dans les métadonnés du fichier, il apparaît un très long texte dans le champ 'Comment' . | ||
+ | |||
+ | exiftool audiodump.wav | grep "Comment" | cut -d ':' -f2 | ||
+ | |||
+ | En utilisant la recette magique de CyberChef on retrouve une image : https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true)Render_Image('Raw') | ||
+ | |||
+ | Après d'intensives recherches Google sur un "vaisseau bleu avec des crânes", nous découvrons le nom du vaisseau. | ||
== Clef à la loupe == | == Clef à la loupe == | ||
Ligne 35 : | Ligne 157 : | ||
== Filsss fait un sssssomme == | == Filsss fait un sssssomme == | ||
+ | Effectivement, zéro technique ! | ||
+ | |||
+ | Thomas Vantroys avait présenté les techniques d' "ingénierie sociale" | ||
== Existe-til encore de vraies brutes ? == | == Existe-til encore de vraies brutes ? == | ||
+ | Taper dans le shell : | ||
+ | crunch 8 8 bcdfghjklmnpqrstvwxz aeiouy -t @,@,@,@, |grep n > worldlist.txt | ||
+ | Pour trouver le mot de passe, on génère un dictionnaire de 8 caractères alternant consonne voyelle. | ||
+ | -t @,@,@,@, permet de donner le pattern consonne voyelle | ||
+ | grep n permet de sélectionner tous les mots de passe du dictionnaire avec un n aux différentes positions. | ||
+ | on redirige les résultats dans un fichier worldlist.txt | ||
+ | |||
+ | on compte le nombre de résultats (de lignes) du fichier worldlist.txt afin de vérifier que la redirection des résultats dans le fichier s'est bien passé. | ||
+ | wc worldlist.txt | ||
+ | on lance aircrack-ng en essayant les différents résultats du worldlist.txt (=du dictionnaire) sur le ficher wifi_wpa.cap contenant les paquets de connexion WiFi | ||
+ | afin de trouver une clef WPA-PSK de connexion à un réseau WiFi. | ||
+ | aircrack-ng -w worldlist.txt wifi_wpa.cap | ||
+ | |||
+ | |||
+ | |||
+ | Aircrack-ng 1.6 | ||
+ | |||
+ | [00:13:56] 13010880/38463984 keys tested (15802.92 k/s) | ||
+ | |||
+ | Time left: 26 minutes, 50 seconds 33.83% | ||
+ | |||
+ | KEY FOUND! [ lyhanobe ] | ||
+ | |||
+ | |||
+ | Master Key : 2A 21 8E 82 63 B2 FE 97 54 22 62 B0 07 49 59 57 | ||
+ | 4C E0 34 E8 80 AB 79 E8 D4 87 39 1B 75 9D 37 B1 | ||
+ | |||
+ | Transient Key : A6 05 D0 A0 AD 7F E5 E6 8D AD A5 8A 48 83 91 ED | ||
+ | 53 FD 43 CB A5 3F BE 4E 33 FA 4E D4 9B EC 58 4E | ||
+ | BF 65 56 22 3E 36 D8 0C 04 76 C6 7B EE ED 25 C1 | ||
+ | C4 0A 36 7F 8C E1 6B 28 62 50 CE E0 F4 E7 F6 44 | ||
+ | |||
+ | EAPOL HMAC : C7 5A B8 6B 86 A1 00 4C 16 E5 9A 7D B9 05 F7 C3 | ||
+ | |||
+ | historique des commandes : | ||
+ | 2007 crunch 8 8 bcdfghjklmnpqrstvwxz aeiouy -d @,@,@,@ |grep n > worldlist.txt | ||
+ | 2008 crunch 8 8 bcdfghjklmnpqrstvwxz aeiouy -t @,@,@,@ |grep n > worldlist.txt | ||
+ | 2009 crunch 8 8 bcdfghjklmnpqrstvwxz aeiouy -t @,@,@,@, |grep n > worldlist.txt | ||
+ | 2010 wc wordlist.txt | ||
+ | 2011 wc worldlist.txt | ||
+ | 2012 aircrack-ng -w worldlist.txt wifi_wpa.cap | ||
+ | 2013 history | ||
== Déjà vu == | == Déjà vu == | ||
+ | |||
+ | = Reverse engineering d'un thermomètre bluetooth = | ||
+ | |||
+ | Quelques recherches ont été faites avec Alexandre Boé, possibilité de documenter par la suite. |
Version actuelle datée du 20 janvier 2022 à 13:52
Sommaire
- 1 Challenges ctf
- 1.1 Flocons
- 1.2 Espion dans le bus
- 1.3 Travail de serrurerie
- 1.4 Spécialiste des écoutes
- 1.5 Perçage de coffre
- 1.6 Déchiffrer le manuscrit
- 1.7 Dessiner avec des sons
- 1.8 Encore une image en musique
- 1.9 Clef à la loupe
- 1.10 Filsss fait un sssssomme
- 1.11 Existe-til encore de vraies brutes ?
- 1.12 Déjà vu
- 2 Reverse engineering d'un thermomètre bluetooth
Challenges ctf
Pour valider les challenges nous utilisons le login axel.chemin@polytech-lille.net dans l'équipe "achemin1" .
Flocons
Il faut lire les petits points descendeant sur les deux côtés de l'image
Espion dans le bus
https://blog.stayontarget.org/2019/03/decoding-mixed-case-usb-keystrokes-from.html utiliser cette partie du lien Leftover Capture Data as a column (by right-clicking on one of the entries, and selecting "Apply as Column") then File -> Export Packet Dissections -> As CSV, open the resulting file, cut the capture data column out and the double-quotes, and the first line that says "Leftover Capture Data" -or- I learned a much easier way when researching this write-up was to use tshark to extract the leftover capture data (be sure to pipe to tr -d : to get rid of the colons in the output. Redirect output to a text file, once you've confirmed it looks good. taper dans le shell : tshark -r capture-myst1.pcap -T fields -e usb.capdata | tr -d : | grep "\S" >prkeycodes.txt car nous voulons récupérer la partie Leftover Capture Data Nous avons rajouté ceci | grep "\S" pour ne pas avoir des lignes entre les résulats et nous avons redirigé (stocké) les résultats dans un fichier prkeycodes.txt Nous avons tapé ceci : cat prkeycodes.txt pour vérifier que le fichier a mis les résultats à la suite (1 résultat par ligne). créer le fichier decodeusbkeypress.py et mettre le script donné dans le lien (il a fallu faire quelques modif dans le script car dans le dictionnaire il manque 83 d'où le key error 83) Taper dans le shell : python3 decodeusbkeypress.py prkeycodes.txt on obtient le code dans le shell.
Travail de serrurerie
ans l'archive data.zip, il y a un fichier "data" .
Ce fichier est un binaire, dont la commande "file" le décrit comme :
data: DOS/MBR boot sector; partition 1 : ID=0xb, start-CHS (0x0,32,33), end-CHS (0xc,223,19), startsector 2048, 204800 sectors; partition 2 : ID=0x83, start-CHS (0xc,223,20), end-CHS (0x41,69,4), startsector 206848, 841728 sectors
Mais l'astuce proposé est d'utiliser les Network Block Device.
Installation et démarrage du serveur et du client NBD
Ajout dans le fichier /etc/nbd-server/config :
[export] exportname = /home/pifou/Axel_NBD/data port = 2000
Et le lancer avec
nbd-server
Pour le client :
nbd-client 127.0.0.1 /dev/nbd0 -name export
Il y a ces fichiers qui ont apparu
# ls /dev/nbd nbd0 nbd0p2 nbd10 nbd12 nbd14 nbd2 nbd4 nbd6 nbd8 nbd0p1 nbd1 nbd11 nbd13 nbd15 nbd3 nbd5 nbd7 nbd9
Recherche dans les NBD devices
Ensuite il faut monter les 2 périphériques :
mkdir /tmp/axelNbd1 mount /dev/nbd0p1 /tmp/axelNbd1 mkdir /tmp/axelNbd2 mount /dev/nbd0p2 /tmp/axelNbd2
Le premier système de fichier présente un seul fichier "code" avec comme contenu "TROPFACILE"
Le second système de fichier est composé d'un dossier lost+found et d'une archive zip "secret.zip" .
"TROPFACILE" n'est pas le mot de passe. Les variations de casse non plus. A ce moment là, il n'y a plus de mot de passe disponible, il est décidé de lancer une bruteforce avec
fcrackzip --charset aA1 --use-unzip secret.zip
Spécialiste des écoutes
Le fichier téléchargé extrait.wav est bien un fichier audio, extrait a priori de l'extrait d'un candidat à la présidentielle. Son nom n'est pas le drapeau.
On entend tout de suite des sons aigues, le drapeau se trouve donc sûrement dans le flux audio. On repère très bien dans le spectre la partie haute fréquence, qui répète un motif plusieurs fois.
C'est en baissant la fréquence d'échantillonage de la piste à 48kHz que l'on retrouve l'audio caché (par effet repliement de spectre) : Potemkine - Jean Ferrat
Perçage de coffre
"file" ne donne pas d'information sur le fichier, à supposer que c'est un système de fichier chiffré avec cryptsetup (on m'a un petit peu aidé, c'est vrai) :
On peut tester le mot de passe en essayant d'ouvrir le périphérique et monter le volume :
mkdir pointMontage cryptsetup open --type plain chiffre pointMontage
(Le mot de passe est demandé)
mount /dev/mapper/pointMontage ./montage
Si et seulement si le mot de passe entré est bon, la dernière commande retourne 0.
Sinon il faut ré-essayer avec un autre mot de passe à 4 chiffres, sans oublier de refermer le périphérique :
cryptsetup close pointMontage
Pour cela j'ai fait un fichier python, trèèèès overkill (et pas si bien).
[METTRE LE SCRIPT]
Si besoin de nettoyer :
umount pointMontage rm -r pointMontage
Le fichier trouvé contient des informations bancaires
# cat mntA/compte Code banque : 12345 Code guichet : 66666 Numéro de compte : 00001100111
On complète l'IBAN avec https://www.iban.com/calculate-iban en supposant que le propriétaire est français.
La solution : FR7612345666660000110011189
Déchiffrer le manuscrit
Commencé, utilisation de cette documentation entre autre :
Dessiner avec des sons
Commencé, récupération du header de l'image PGM/PPM.
P6 225 225 255
Problème de décodage pour le reste.
Encore une image en musique
Le fichier audiodump est identifié comme un wav par file ou Audacity.
Mais dans les métadonnés du fichier, il apparaît un très long texte dans le champ 'Comment' .
exiftool audiodump.wav | grep "Comment" | cut -d ':' -f2
En utilisant la recette magique de CyberChef on retrouve une image : https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true)Render_Image('Raw')
Après d'intensives recherches Google sur un "vaisseau bleu avec des crânes", nous découvrons le nom du vaisseau.
Clef à la loupe
Filsss fait un sssssomme
Effectivement, zéro technique !
Thomas Vantroys avait présenté les techniques d' "ingénierie sociale"
Existe-til encore de vraies brutes ?
Taper dans le shell : crunch 8 8 bcdfghjklmnpqrstvwxz aeiouy -t @,@,@,@, |grep n > worldlist.txt Pour trouver le mot de passe, on génère un dictionnaire de 8 caractères alternant consonne voyelle.
-t @,@,@,@, permet de donner le pattern consonne voyelle
grep n permet de sélectionner tous les mots de passe du dictionnaire avec un n aux différentes positions. on redirige les résultats dans un fichier worldlist.txt
on compte le nombre de résultats (de lignes) du fichier worldlist.txt afin de vérifier que la redirection des résultats dans le fichier s'est bien passé. wc worldlist.txt on lance aircrack-ng en essayant les différents résultats du worldlist.txt (=du dictionnaire) sur le ficher wifi_wpa.cap contenant les paquets de connexion WiFi afin de trouver une clef WPA-PSK de connexion à un réseau WiFi. aircrack-ng -w worldlist.txt wifi_wpa.cap
Aircrack-ng 1.6
[00:13:56] 13010880/38463984 keys tested (15802.92 k/s)
Time left: 26 minutes, 50 seconds 33.83%
KEY FOUND! [ lyhanobe ]
Master Key : 2A 21 8E 82 63 B2 FE 97 54 22 62 B0 07 49 59 57 4C E0 34 E8 80 AB 79 E8 D4 87 39 1B 75 9D 37 B1
Transient Key : A6 05 D0 A0 AD 7F E5 E6 8D AD A5 8A 48 83 91 ED 53 FD 43 CB A5 3F BE 4E 33 FA 4E D4 9B EC 58 4E BF 65 56 22 3E 36 D8 0C 04 76 C6 7B EE ED 25 C1 C4 0A 36 7F 8C E1 6B 28 62 50 CE E0 F4 E7 F6 44
EAPOL HMAC : C7 5A B8 6B 86 A1 00 4C 16 E5 9A 7D B9 05 F7 C3
historique des commandes :
2007 crunch 8 8 bcdfghjklmnpqrstvwxz aeiouy -d @,@,@,@ |grep n > worldlist.txt 2008 crunch 8 8 bcdfghjklmnpqrstvwxz aeiouy -t @,@,@,@ |grep n > worldlist.txt 2009 crunch 8 8 bcdfghjklmnpqrstvwxz aeiouy -t @,@,@,@, |grep n > worldlist.txt 2010 wc wordlist.txt 2011 wc worldlist.txt 2012 aircrack-ng -w worldlist.txt wifi_wpa.cap 2013 history
Déjà vu
Reverse engineering d'un thermomètre bluetooth
Quelques recherches ont été faites avec Alexandre Boé, possibilité de documenter par la suite.