My computer is talking
Catégorie: Forensic Difficulté: - Flag: -
Challenge
Le fichier est trop large, il est disponible sur MEGA
Description
Mon ordinateur semble discuter avec un serveur, et lui transmettre une sorte de.... code ?
What is that shit??
Solution
Exploration globale
Il faut commencer par étudier les requêtes avec un outil comme Wireshark. Si l'on regarde les objets échangés en HTTP, on s'aperçoit de beaucoup de requêtes d'un octet avec l'IP 192.168.168.128
.

On peut faire le même constat en allant regarder les Statistiques > Conversations

Exploration de 192.168.168.128
Maintenant qu'on a une IP suspecte, il faut savoir qu'est-ce qui est échangé. Pour ça on part sur le filtre ip.addr == 192.168.168.128 and http
:

On peut voir tout un tas de requêtes POST
depuis le PC vers cette IP suspecte et comme vu avec les objets tout à l'heure, il n'y a qu'un seul octet envoyé : un caractère. Dans le premier POST par exemple, c'est 0x4c
, c'est-à-dire un L
.
L'autre chose importante
à remarquer, c'est que la réponse diffère entre 0
comme dans le paquet 215
, et 1
, comme dans le 300
.
En somme, il nous faut récupérer tous les caractères envoyés en POST
et dont la réponse du serveur est 1
. Pour ça, on va partir sur un script python, mais avant ça, faire un export de notre .pcapng
avec notre filtre pour éviter de traiter 300K requêtes.

Récupération du flag
Pour parser le fichier .pcap
, on peut utiliser scapy
. Il faut noter que les paquets HTTP se divisent en plusieurs segments TCP. Dans Wireshark ces segments sont rassemblés, mais avec scapy
on va les lire individuellement, il faut donc prendre en compte que le premier segment contient les entêtes et le suivant contient la donnée (ou les suivants si la donnée est trop grande).
from scapy.utils import rdpcap
from scapy.layers.http import HTTPRequest
from scapy.layers.inet import TCP
from base64 import b64decode
# Parsing du fichier exporté
packets = rdpcap('talking_http.pcap')
encoded_data = ''
i = 0
while i < len(packets):
try:
request = packets[i]
# On s'assure que le paquet est bien une requête HTTP en POST
assert request.haslayer(HTTPRequest) and request[HTTPRequest].Method == b'POST'
request_data = packets[i+1] # Le paquet suivant contient les données envoyées
response = packets[i+2] # Encore après ce sont les headers de réponse
response_data = packets[i+3] # Et là les données de la réponse (0 ou 1 dans notre cas)
i += 3 # Pour skip ces paquets au prochain tour de boucle
posted_data = bytes(request_data[TCP].payload).decode()
request_data = int(bytes(response_data[TCP].payload).decode()[0])
assert request_data == 1
encoded_data += posted_data # On ajoute le caractère aux autres déjà récupérés
except:
pass
finally:
i += 1 # On passe au paquet suivant
# Les caractères qu'on a récupéré sont de la base64
flag = b64decode(encoded_data[:-1])[:30].decode() # Décode la base64
print(flag)
Dernière mise à jour
Cet article vous a-t-il été utile ?