-
Writeup RingZer0 CTF : Don't flip out, Thomas!
Description du challenge : The aliens’ capabilities have advanced and they’ve decided to improve the reliability of their transmissions. Can you crack their message?
Le challenge est disponible à cette adresse.
Pour comprendre le writeup, il est important de comprendre la notion de modulation, alors n’hésite pas à jeter un oeil sur ce cours :)
Le challenge commence avec un fichier sdr-challenge3.cfile.
Ouvrons-le avec Universal Radio Hacker.
Comme pour les 2 précédents challenges, on a plusieurs morceaux, zoomant sur l’un d’entre eux.
Ça ressemble clairement à de l’ASK. Si ce type de modulation ne te dit rien, je t’invite à d’abord lire le writeup de ce challenge qui traite d’ASK.
On peut alors sélectionner ASK comme type de modulation et pour le Samples/Symbol, on peut le faire manuellement en sélectionnant le morceau le plus petit pour noter le nombre entouré en rouge.
On met la vue en ASCII pour voir ce que donne notre signal décodé. On obtient 3 lignes similaires mais qui ne veulent pas dire grand chose.
J’oublie pas que durant le premier challenge, j’avais pris du temps à comprendre pourquoi ça décoder pas car j’avais laissé le Pause Threshold à 8. Donc, je le remets à 0 pour le désactiver. Et à présent, le signal décodé donne ça :
Bon, ok pas ouf MAIS, on sait que ce challenge est le dernier de sa série et au vu de la description, les aliens ont “amélioré” la fiabilité de leur transmission.
Donc je me dis que ça doit être la méthode pour encoder les données qui n’est pas bonne.
Attention, il ne faut pas confondre la modulation avec la méthode d’encodage.
Pour envoyer un message binaire qui à la base est donc un signal numérique, on va l’encoder, il faut le voir comme la manière dont les bits sont organisés. par exemple, le morse est une forme d’encodage.
Et c’est après qu’on vient moduler le signal numérique en ASK (par exemple) pour le “transformer” en une onde radio qui puisse être transmise.
Dans le cas d’Universal Radio Hacker, il utilise par défaut comme méthode pour décoder le NRZ (Non Return To Zero). On peut le voir dans l’onglet Analysis souligné en rouge :
URH a déjà des presets de quelques méthode d’encodage connues comme le codage de Manchester. Pour ce dernier, un bit à 0 est représenté avec une transition de bas en haut (0 à 1) au milieu de l’intervalle. Pour un bit à 1, c’est l’inverse.
A noter, les traits blancs qui ne font pas partie de l’encodage, ils sont juste là pour relier deux mêmes valeurs consécutives.
Sur URH, on a le Manchester 1 et le Manchester 2 (Le Differential Manchester c’est autre chose).
La différence entre le Manchester I et 2 c’est juste que le Manchester 2 inverse les bits. Donc les 0 deviennent des 1 et les 1 des 0.
Et si on choisit le Manchester 2, on voit que le flag apparaît :)
Et voilà pour ce dernier challenge de transmission alien.
-
Writeup RingZer0 CTF : Let's Get Scwhifty!
Description du challenge : The aliens are on to us… They’ve started wearing tin foil hats and switched things up with their radio transmission. Can you crack their latest message?
Le challenge est disponible à cette adresse.
Pour comprendre le writeup, il est important de comprendre la notion de modulation, alors n’hésite pas à jeter un oeil sur ce cours :)
Le challenge commence avec un fichier sdr-challenge2.cfile.
Ouvrons-le avec Universal Radio Hacker.
On retrouve plusieurs morceaux similaires, en zoomant sur l’un d’entre eux, on remarque beaucoup de bruit, rien qui puisse nous aider dans l’état actuel.
Je décide de l’ouvrir avec Inspectrum afin d’afficher le spectrogramme. Par défaut, il ouvre le signal hyper zoomé donc on voit rien, faut scroll avec le curseur du bas pour atteindre un des morceaux et obtenir ceci :
Sachant que pour le Sample Rate, j’ai mis au pif, c’est pas très grave, ça permet de faire apparaître au moins les fréquences.
Donc nous voilà avec un spectrogramme qui montre l’intensité du signal en fonction du temps (axe horizontal) et de la fréquence (axe vertical).
Déjà, on voit plus de choses intéressantes. Notamment le fort signal en bas (trait rouge que l’on voit pas très bien) qui alterne de manière brusque entre 2 fréquences. On peut alors supposer qu’il s’agit d’une modulation FSK (Frequency Shift Keying).
Ce type de modulation numérique utilise une fréquence pour représenter un 0 et une autre pour représenter un 1.
Faisons un clic droit dessus, puis Add Derived plot et Add Frequency Plot. Et on peut par la suite, sélectionner uniquement le bout du signal qui nous intéresse.
Cela nous permet de faire une analyser plus précise en observant clairement la puissance du signal varier au fil du temps à une fréquence spécifique.
Et au vue de la forme, on est à présent sur qu’il s’agit d’une modulation FSK, on peut alors extraire uniquement cette partie du signal en faisant un clic droit sur le morceau du haut (pas celui du bas !), puis Export samples to file.... On le laisse en .f32.
À présent, ouvrons le à nouveau avec Universal Radio Hacker :
À partir de là, je vais aller plus vite car j’avais déjà expliqué comment trouver les bons paramètres dans le précédent challenge donc n’hésite pas à y jeter un coup d’oeil si tu comprends pas tout ce qui suit.
Donc, on sélectionnes comme modulation FSK, on peut cliquer sur Autodetect parameters ce qui permet de trouver le Samples/Symbol tout seul et en basculant la vue de Bits en ASCII, on obtient direct le flag :)
-
Writeup RingZer0 CTF : You Turn Me On And Off
Description du challenge : We captured alien radio data… Can you crack their message?
Le challenge est disponible à cette adresse.
Pour comprendre le writeup, il est important de comprendre la notion de modulation, alors n’hésite pas à jeter un oeil sur ce cours :)
Le challenge commence avec un fichier sdr-challenge1.cfile.
Ouvrons-le avec Universal Radio Hacker.
Ok, on a plusieurs morceaux, en zoomant sur l’un d’entre eux, on peut supposer le type de modulation.
Il s’agit d’une modulation ASK (Amplitude Shift Keying) et plus précisément une modulation OOK (On Off Keying).
En ASK, de manière générale, on utilise l’amplitude du signal porteur pour représenter les données, où différentes amplitudes représentent différents bits.
Et donc, en OOK, pour représenter un bit à 1, on va envoyer un signal (on) et pour représenter un 0, on envoie rien (off).
Ce type de modulation est très utilisé pour envoyer des données numériques comme avec des clés de portail.
Du coup, depuis URH, on peut sélectionner comme type de modulation ASK. On peut aussi changer le Show data as en sélectionnant ASCII en bas à gauche afin de pouvoir lire les données en clair.
Mais autre truc important à trouver, c’est le Samples/Symbol qui fait référence au nombre de fois que le signal est mesuré (échantillonné) pour chaque symbole transmis. Par symbole, on entend “unité de transmission”.
Genre, nous comme c’est une modulation binaire, si on met le Samples/Symbol à 10, ça veut dire que pour chaque bit transmis, le signal sera échantillonné 10 fois.
Enfin bref, cette valeur est super importante à trouver puisque c’est grâce à elle qu’on pourra correctement décoder notre signal. Pour la trouver, soit on clique sur Autodetect, des fois ça marche (comme ici où il me trouve 200) mais apprenons à le faire manuellement quand même :)
Pour ce faire, on va devoir repérer le plus petit morceau de signal.
Zoomons sur le premier morceau de l’image précédente qui semble faire partie des plus petits. Et on sélectionne “à peu près” ce morceau pour regarder en bas la valeur qui nous est affichée. Ici, 210, donc avec mes mots, on peut dire que le 210 c’est la taille du plus petit mot qu’on puisse faire et donc la taille d’1 symbole. Si on veut faire des mots plus grands, leur taille sera un multiple de 210.
Bref, changeons notre Samples/Symbol avec cette valeur.
A noter que c’est pas la valeur exacte, c’est une valeur approximative, j’ai pas le tricks pour trouver exactement la bonne valeur, et d’ailleurs, ce que je trouve est légèrement différent de ce que nous donnait l’Autodetect.
Pas grave, on voit qu’au niveau de ce qui est décodé, ça veut pas dire grand chose mais hors mis la dernière, chaque ligne est similaire. Le même signal est répété.
Pendant longtemps, je n’ai pas compris pourquoi je n’arrivais pas à mettre la main sur le flag, surtout qu’en mettant le Samples/Symbol à 190, j’obtiens des valeurs comme celle-ci :
On voit qu’une bonne partie est constituée de “vrais” caractères, et non, c’est pas de l’hexa que je peux décoder…
Après pas mal de recherches, j’ai finis par trouver un paramètre qui change la donne.
En cliquant sur la clé à molette à droite du type de modulation, on peut désactiver la valeur Pause Threshold. Et en faisant, ça toutes les données s’affichent plus que sur une ligne avec dedans le flag !
Ce paramètre sert à déterminer les pauses ou les intervalles de silence entre les données du signal. C’est en gros le nombre minimum d’échantillons de silence consécutifs qu’il faut pour dire “Ah ! là y a une pause” dans la transmission.
Par défaut, URH met cette valeur sur 8, donc pour lui, il y a une pause tous les 8 échantillons consécutifs où le signal est en dessous d’un certains niveau (considéré comme silence).
Bref, en désactivant cette contrainte, URH ne cherche plus de pauses et réussi à décoder le signal.
Et voilà pour ce challenge :)
-
Writeup HackTheBox : Walkie Hackie
Description du challenge :
Our agents got caught during a mission and found that the guards are using old walkie-talkies for their communication. The field team captured their transmissions. Can you interrupt their communication to help our agents escape from the guards?
Pour ce challenge, on nous fournit 4 transmissions audio au format complex.
On a aussi accès à une instance web :
On peut tester avec des valeurs randoms pour voir comment ça réagit mais rien de spécial se produit.
Il faut sûrement y mettre un préambule spécifique ou je sais pas. Bref, allons voir de plus près les signaux avec Universal Radio Hacker.
Donc, on ouvre nos 4 fichiers avec URH. Exemple avec le premier :
En affichant les données en hexadécimal, on constate que les 4 signaux fournis suivent une même logique :
Signal 1 : aaaaaaaa73214693a1ff14
Signal 2 : aaaaaaaa73214693a2ff84
Signal 3 : aaaaaaaa73214693b2ff24
Signal 4 : aaaaaaaa73214693b1ff57
Ça a l’air de matcher avec nos 3 paramètres, pour le signal 1, aaaaaaaa serait le préambule, 73214693 le sync word et a1ff14 le payload.
Je réessaie mais toujours rien.
Par contre, on remarque que les payloads, suivent eux aussi une logique, avec 2 caractères hexa, ff, et 2 autres caractères hexa.
On pourrait se créer une wordlist pour brute-force tous les payloads possibles et voir si une page réagit différemment.
Créons d’abord une wordlist avec crunch :
crunch 6 6 0123456789ABCDEF -t @@FF@@ -o pouet
Passons au bruteforce avec ffuf. Mais d’abord, il nous faut récupérer le nom des paramètres pour la requête POST. Plusieurs possibilités, perso, j’utilise l’onglet Network présent sur n’importe quel navigateur en lançant une requête avec des paramètres au pif. On peut voir le nom de nos 3 paramètres, pa, sw et pl.
Bref, voici la commande pour le bruteforce, sans oublier le Content-Type sinon, il ne se passera rien :
ffuf -c -w pouet -u http://94.237.56.188:40252/transmit -X POST -d "pa=aaaaaaaa&sw=73214693&pl=FUZZ" -H "Content-Type: application/x-www-form-urlencoded"
On note la taille d’une requête type qui fait 2831, CtrlC puis on refait la même commande en y rajoutant le -fs 2831 pour voir si une requête a une taille différente.
On laisse mijoter et là, on voit que TOUS les payloads qui ont leur deuxième partie à F9 ont une size différente.
<SNIP>
[Status: 200, Size: 2896, Words: 420, Lines: 134, Duration: 25ms]
* W1: 9B
* W2: F9
[Status: 200, Size: 2896, Words: 420, Lines: 134, Duration: 23ms]
* W1: A7
* W2: F9
[Status: 200, Size: 2896, Words: 420, Lines: 134, Duration: 25ms]
* W1: BE
* W2: F9
Reste plus qu’à rentrer les bonnes valeurs avec un payload qui finit par F9 et obtenir notre flag :)
On peut aussi faire un curl pour que ça fasse + hacker :
curl -X POST http://94.237.56.188:40252/transmit -d 'pa=aaaaaaaa&sw=73214693&pl=a2fff9'
Touch background to close