Cyber 2021/2022 G3 : Différence entre versions

De Wiki d'activités IMA
(Espion dans le bus)
(Encore une image en musique)
 
(37 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 +
__TOC__
 +
<br style="clear: both;"/>
 +
 +
Equipe : Louis WADBLED, Clement GODET
 +
 
= Flocons =
 
= Flocons =
  
 
= Espion dans le bus =
 
= Espion dans le bus =
  
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.
+
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 =
 +
 
 +
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 <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 =
 +
 
 +
= 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 <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


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()