Cyber 2021/2022 G3 : Différence entre versions
(→Espion dans le bus) |
(→Encore une image en musique) |
||
(32 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
__TOC__ | __TOC__ | ||
<br style="clear: both;"/> | <br style="clear: both;"/> | ||
+ | |||
+ | Equipe : Louis WADBLED, Clement GODET | ||
= Flocons = | = Flocons = | ||
Ligne 6 : | Ligne 8 : | ||
= Espion dans le bus = | = Espion dans le bus = | ||
− | On télécharge le fichier et sur wireshark, application du filtre : <code>((usb.transfer_type == 0x01) && (frame.len==72)) && !(usb.capdata == 00:00:00:00:00:00:00:00)</code>. Grâce à ce filtre, on trouve tous les paquets contenant des "Leftover Capture Data", ce sont les touches du clavier qui ont été utilisées (et non pas les caractères ASCII). Il faut maintenant trouver les caractères selon les touches utilisées. Et on prend le 4ème caractère sur chaque ligne pour trouver le | + | On télécharge le fichier et sur wireshark, application du filtre : <code>((usb.transfer_type == 0x01) && (frame.len==72)) && !(usb.capdata == 00:00:00:00:00:00:00:00)</code>. Grâce à ce filtre, on trouve tous les paquets contenant des "Leftover Capture Data", ce sont les touches du clavier qui ont été utilisées (et non pas les caractères ASCII). Il faut maintenant trouver les caractères selon les touches utilisées. Et on prend le 4ème caractère sur chaque ligne (lorsque celui ci est différent de 0) pour trouver le flag. |
= Travail de serrurerie = | = Travail de serrurerie = | ||
+ | |||
+ | On désarchive le .zip puis on déchiffre le fichier à l'aide des commandes suivantes : | ||
+ | $ modprobe nbd | ||
+ | permet de créer un fichier /dev/nbd0 | ||
+ | |||
+ | $ qemu-nbd -c /dev/nbd0 data --format=raw | ||
+ | génère les partitions /dev/nbd0p1 et /dev/nbd0p2 | ||
+ | |||
+ | On monte ensuite les partitions : | ||
+ | $ mkdir /mnt/data1 /mnt/data2 | ||
+ | $ mount /dev/nbd0p1 /mnt/data1 | ||
+ | $ mount /dev/nbd0p2 /mnt/data2 | ||
+ | |||
+ | En inspectant les dossiers fraichement montés, on trouve une archive qui nous demande un mot de passe. | ||
+ | Le mot de passe se trouve dans un fichier qui n'apparait pas, même en faisant 'ls -la' | ||
+ | Le fichier a probablement été masqué grâce à la commande 'rm' | ||
+ | On utilise l'utilitaire photorec pour retrouver le fichier supprimé : | ||
+ | $ photorec /dev/nbd0 | ||
+ | En spécifiant /dev/nbd0, on permet à l'utilitaire de retrouver uniquement les fichiers appartenant à ce disque, ce qui est quand même plus rapide que de scanner toute la zabeth. | ||
+ | On trouve alors le MDP pour ouvrir l'archive | ||
= Spécialiste des écoutes = | = Spécialiste des écoutes = | ||
+ | |||
+ | A une certaine vitesse d'écoute, on peut entendre une autre mélodie. En cherchant un peu la mélodie sur internet, on peut trouver la personne que l'on entend. | ||
= Perçage de coffre = | = Perçage de coffre = | ||
+ | |||
+ | On désarchive l'archive. Il s'agit d'un fichier que l'on peut décrypter avec crytsetup en mode "plain" en spécifiant un mot de passe. | ||
+ | On teste ensuite la valeur de retour de "mount". Si il y a une erreur, la clé utilisée par cryptsetup est érronée. On efface alors le fichier créé avec cryptsetup close. | ||
+ | |||
+ | On utilise le script suivant pour forcer le coffre : | ||
+ | #!/bin/sh | ||
+ | i=0 | ||
+ | while [ $i -lt 10000 ] | ||
+ | do | ||
+ | echo $i | cryptsetup plainOpen chiffre chiffre | ||
+ | if [ $? -ne 0 ]; | ||
+ | then | ||
+ | echo "Erreur lors du crytpsetup" | ||
+ | exit | ||
+ | fi | ||
+ | |||
+ | mount /dev/mapper/chiffre /mnt/chiffre | ||
+ | if [ $? -eq 0 ]; then | ||
+ | echo "Succes: $i" | ||
+ | exit | ||
+ | else | ||
+ | cryptsetup close chiffre chiffre | ||
+ | fi | ||
+ | |||
+ | i=$(( i+1 )) | ||
+ | done | ||
+ | |||
+ | Une fois le code trouvé, on a un dossier monté. | ||
+ | A partir des infos fournies dans le dossier, on reconstitue l'IBAN au complet | ||
= Déchiffrer le manuscrit = | = Déchiffrer le manuscrit = | ||
+ | |||
+ | On utilise Wireshark pour visualiser les trames. | ||
+ | On remarque un échange entre un périphérique et l'ordinateur. | ||
+ | La seule data qui change est contenue à la fin du packet. | ||
+ | Les PID et VID au début de la communication nous informent que le périphérique est une souris. | ||
+ | On essaye d'interpréter la donnée qui varie. Puisqu'il s'agit d'une souris, il y aura un octet pour representer les boutons appuyés ou non, et un certain nombre d'octets pour la direction en X et Y | ||
+ | On garde à l'esprit qu'une souris bouge dans les 2 sens, et donc que l'information du capteur peut etre positive OU négative. De plus, on essaye d'interpréter la data en little ET en big endian étant donné que l'on ne connait pas la convention utilisée. | ||
+ | En prenant en compte les points pour lesquels le bouton de la souris est enfoncé, on trouve un lien qui nous donne le drapeau. | ||
= Dessiner avec des sons = | = Dessiner avec des sons = | ||
+ | |||
+ | En lisant le fichier octet par octet, on trouve des paquets de 4 octets qui se répetent | ||
+ | On simplifie le motif en supprimant toutes les occurences superflues. On obtient une suite de symboles que l'on essaye d'interpréter comme soit des 0 soit des 1. | ||
+ | On se retrouve donc avec un fichier binaire. En interprétant ce dernier comme de l'ASCII on trouve un en-tête de la forme : | ||
+ | P6 | ||
+ | 225 225 | ||
+ | 255 | ||
+ | //le reste du code binaire | ||
+ | |||
+ | Cela fait penser à la trame d'un fichier ppm en nuance de gris | ||
+ | Lorsqu'on l'affiche comme tel, on n'obtient malheuresement pas une image lisisble | ||
= Encore une image en musique = | = Encore une image en musique = | ||
+ | |||
+ | On affiche le fichier .wav dans le terminal. | ||
+ | |||
+ | cat audiodump.wav | tail -400 | ||
+ | |||
+ | En remontant un peu dans le terminal, on trouve un bloc un peu bizarre très bien arrangé pour un fichier de ce type. | ||
+ | |||
+ | On trouve sur internet de quel type de donnée il s'agit pour le bloc (qui se termine par <code>==</code> donc base64), que l'on peut convertir en image (https://base64.guru/converter/decode/image). L'image nous donne ensuite le flag (avec un peu de recherche sur l'image aussi). | ||
= Clef à la loupe = | = Clef à la loupe = | ||
= Filsss fait un sssssomme = | = Filsss fait un sssssomme = | ||
+ | |||
+ | Voir le cours sur une technique pas technique pour abuser de certaines personnes. | ||
= Existe-t-il encore de vraies brutes ? = | = Existe-t-il encore de vraies brutes ? = | ||
+ | |||
+ | On écrit un programme C pour générer un dictionnaire prennant en compte les informations fournies sur le mot de passe. | ||
+ | Une fois le dictionnaire généré, on le teste face aux trames receptionnées grâce à l'utilitaire aircrack. | ||
+ | Au bout d'une trentaine de minutes, la clé est cassée. | ||
+ | |||
+ | Code C : | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int main() { | ||
+ | char v[] = "aeiouy"; | ||
+ | char x[] = "zrtpqsdfghjklmwxcvbn"; | ||
+ | |||
+ | for (int a = 0; a < 20 ; a++) { | ||
+ | for (int b = 0;b<6; b++) { | ||
+ | for (int c = 0; c < 20 ; c++) { | ||
+ | for (int d = 0;d<6; d++) { | ||
+ | for (int e = 0; e < 20 ; e++) { | ||
+ | for (int f = 0;f<6; f++) { | ||
+ | for (int g = 0; g < 20 ; g++) { | ||
+ | for (int h = 0;h<6; h++) { | ||
+ | if (a==19 || c==19 || e==19 || g==19) | ||
+ | printf("%c%c%c%c%c%c%c%c\n", x[a],v[b],x[c],v[d],x[e],v[f],x[g],v[h]); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return 0; | ||
+ | } | ||
= Déjà vu = | = Déjà vu = | ||
+ | |||
+ | Avec le <code>GET DESCRIPTOR Response DEVICE</code> (taille 82), on trouve l'idVendor (Mad Catz) et avec le <code>GET DESCRIPTOR Response CONFIGURATION</code> (taille 98), on voit que le périphérique utilisé est une souris. On exporte tous les paquets ayant une <code>frame.len==71</code> car ce sont eux qui contiennent des HID DATA. Dans les HID DATA, on trouve les boutons appuyés par la souris ainsi que ses déplacements. Avec un script python sur ces données, on peut trouver le dessin du flag. | ||
+ | |||
+ | Script python utilisé sur le fichier 'test.json' comportant les données exportées en JSON : | ||
+ | |||
+ | import itertools | ||
+ | import json | ||
+ | import matplotlib.pyplot as plt | ||
+ | |||
+ | def main(): | ||
+ | packets_export_file = open('test.json') | ||
+ | packets = json.load(packets_export_file) | ||
+ | |||
+ | x_offsets = [int(p["_source"]["layers"]["usbhid.data_tree"]["usbhid.data.axis.x"]) | ||
+ | for p in packets] | ||
+ | |||
+ | y_offsets = [-int(p["_source"]["layers"]["usbhid.data_tree"]["usbhid.data.axis.y"]) | ||
+ | for p in packets] | ||
+ | |||
+ | x_positions = list(itertools.accumulate(x_offsets)) | ||
+ | y_positions = list(itertools.accumulate(y_offsets)) | ||
+ | |||
+ | plt.plot(x_positions, y_positions) | ||
+ | plt.title("Mouse position") | ||
+ | plt.xlabel("X") | ||
+ | plt.ylabel("Y") | ||
+ | plt.show() | ||
+ | |||
+ | main() |
Version actuelle datée du 20 janvier 2022 à 13:10
Sommaire
Equipe : Louis WADBLED, Clement GODET
Flocons
Espion dans le bus
On télécharge le fichier et sur wireshark, application du filtre : ((usb.transfer_type == 0x01) && (frame.len==72)) && !(usb.capdata == 00:00:00:00:00:00:00:00)
. Grâce à ce filtre, on trouve tous les paquets contenant des "Leftover Capture Data", ce sont les touches du clavier qui ont été utilisées (et non pas les caractères ASCII). Il faut maintenant trouver les caractères selon les touches utilisées. Et on prend le 4ème caractère sur chaque ligne (lorsque celui ci est différent de 0) pour trouver le flag.
Travail de serrurerie
On désarchive le .zip puis on déchiffre le fichier à l'aide des commandes suivantes :
$ modprobe nbd
permet de créer un fichier /dev/nbd0
$ qemu-nbd -c /dev/nbd0 data --format=raw
génère les partitions /dev/nbd0p1 et /dev/nbd0p2
On monte ensuite les partitions :
$ mkdir /mnt/data1 /mnt/data2 $ mount /dev/nbd0p1 /mnt/data1 $ mount /dev/nbd0p2 /mnt/data2
En inspectant les dossiers fraichement montés, on trouve une archive qui nous demande un mot de passe. Le mot de passe se trouve dans un fichier qui n'apparait pas, même en faisant 'ls -la' Le fichier a probablement été masqué grâce à la commande 'rm' On utilise l'utilitaire photorec pour retrouver le fichier supprimé :
$ photorec /dev/nbd0
En spécifiant /dev/nbd0, on permet à l'utilitaire de retrouver uniquement les fichiers appartenant à ce disque, ce qui est quand même plus rapide que de scanner toute la zabeth. On trouve alors le MDP pour ouvrir l'archive
Spécialiste des écoutes
A une certaine vitesse d'écoute, on peut entendre une autre mélodie. En cherchant un peu la mélodie sur internet, on peut trouver la personne que l'on entend.
Perçage de coffre
On désarchive l'archive. Il s'agit d'un fichier que l'on peut décrypter avec crytsetup en mode "plain" en spécifiant un mot de passe. On teste ensuite la valeur de retour de "mount". Si il y a une erreur, la clé utilisée par cryptsetup est érronée. On efface alors le fichier créé avec cryptsetup close.
On utilise le script suivant pour forcer le coffre :
#!/bin/sh i=0 while [ $i -lt 10000 ] do echo $i | cryptsetup plainOpen chiffre chiffre if [ $? -ne 0 ]; then echo "Erreur lors du crytpsetup" exit fi mount /dev/mapper/chiffre /mnt/chiffre if [ $? -eq 0 ]; then echo "Succes: $i" exit else cryptsetup close chiffre chiffre fi i=$(( i+1 )) done
Une fois le code trouvé, on a un dossier monté. A partir des infos fournies dans le dossier, on reconstitue l'IBAN au complet
Déchiffrer le manuscrit
On utilise Wireshark pour visualiser les trames. On remarque un échange entre un périphérique et l'ordinateur. La seule data qui change est contenue à la fin du packet. Les PID et VID au début de la communication nous informent que le périphérique est une souris. On essaye d'interpréter la donnée qui varie. Puisqu'il s'agit d'une souris, il y aura un octet pour representer les boutons appuyés ou non, et un certain nombre d'octets pour la direction en X et Y On garde à l'esprit qu'une souris bouge dans les 2 sens, et donc que l'information du capteur peut etre positive OU négative. De plus, on essaye d'interpréter la data en little ET en big endian étant donné que l'on ne connait pas la convention utilisée. En prenant en compte les points pour lesquels le bouton de la souris est enfoncé, on trouve un lien qui nous donne le drapeau.
Dessiner avec des sons
En lisant le fichier octet par octet, on trouve des paquets de 4 octets qui se répetent On simplifie le motif en supprimant toutes les occurences superflues. On obtient une suite de symboles que l'on essaye d'interpréter comme soit des 0 soit des 1. On se retrouve donc avec un fichier binaire. En interprétant ce dernier comme de l'ASCII on trouve un en-tête de la forme :
P6 225 225 255 //le reste du code binaire
Cela fait penser à la trame d'un fichier ppm en nuance de gris Lorsqu'on l'affiche comme tel, on n'obtient malheuresement pas une image lisisble
Encore une image en musique
On affiche le fichier .wav dans le terminal.
cat audiodump.wav | tail -400
En remontant un peu dans le terminal, on trouve un bloc un peu bizarre très bien arrangé pour un fichier de ce type.
On trouve sur internet de quel type de donnée il s'agit pour le bloc (qui se termine par ==
donc base64), que l'on peut convertir en image (https://base64.guru/converter/decode/image). L'image nous donne ensuite le flag (avec un peu de recherche sur l'image aussi).
Clef à la loupe
Filsss fait un sssssomme
Voir le cours sur une technique pas technique pour abuser de certaines personnes.
Existe-t-il encore de vraies brutes ?
On écrit un programme C pour générer un dictionnaire prennant en compte les informations fournies sur le mot de passe. Une fois le dictionnaire généré, on le teste face aux trames receptionnées grâce à l'utilitaire aircrack. Au bout d'une trentaine de minutes, la clé est cassée.
Code C :
#include <stdio.h> int main() { char v[] = "aeiouy"; char x[] = "zrtpqsdfghjklmwxcvbn"; for (int a = 0; a < 20 ; a++) { for (int b = 0;b<6; b++) { for (int c = 0; c < 20 ; c++) { for (int d = 0;d<6; d++) { for (int e = 0; e < 20 ; e++) { for (int f = 0;f<6; f++) { for (int g = 0; g < 20 ; g++) { for (int h = 0;h<6; h++) { if (a==19 || c==19 || e==19 || g==19) printf("%c%c%c%c%c%c%c%c\n", x[a],v[b],x[c],v[d],x[e],v[f],x[g],v[h]); } } } } } } } } return 0; }
Déjà vu
Avec le GET DESCRIPTOR Response DEVICE
(taille 82), on trouve l'idVendor (Mad Catz) et avec le GET DESCRIPTOR Response CONFIGURATION
(taille 98), on voit que le périphérique utilisé est une souris. On exporte tous les paquets ayant une frame.len==71
car ce sont eux qui contiennent des HID DATA. Dans les HID DATA, on trouve les boutons appuyés par la souris ainsi que ses déplacements. Avec un script python sur ces données, on peut trouver le dessin du flag.
Script python utilisé sur le fichier 'test.json' comportant les données exportées en JSON :
import itertools import json import matplotlib.pyplot as plt def main(): packets_export_file = open('test.json') packets = json.load(packets_export_file) x_offsets = [int(p["_source"]["layers"]["usbhid.data_tree"]["usbhid.data.axis.x"]) for p in packets] y_offsets = [-int(p["_source"]["layers"]["usbhid.data_tree"]["usbhid.data.axis.y"]) for p in packets] x_positions = list(itertools.accumulate(x_offsets)) y_positions = list(itertools.accumulate(y_offsets)) plt.plot(x_positions, y_positions) plt.title("Mouse position") plt.xlabel("X") plt.ylabel("Y") plt.show() main()