CTF inter iut 2018 - German Of Interest (Forensic)

Challenge qui me dit vaguement quelque chose

Das Deutsche Nationalarchiv gehackt wurde. Finden Sie die gestohlenen Daten.
logs.txt

Was passiert

Le fichier contenait enormément de ligne de log (genre 19083)

10.0.5.4 - admin [14/Sept/2017:13:47:54] GET "http://herausforderung.falshung-standort.de/unterlagen/suche?=TGFpZW52ZXJiYW5kDQ== 200 -
10.0.127.84 - zimmerman [14/Sept/2017:13:47:54] GET "http://herausforderung.falshung-standort.de/unterlagen/suche?=QXJvbWFhdXNwcsOkZ3VuZw0= 200 -
10.0.0.2 - hans [14/Sept/2017:13:47:54] GET "http://herausforderung.falshung-standort.de/unterlagen/suche?=dmFrdXVtJzsgSUYoTEVOR1RIKEtFTk5XT1JUKT0wLCBTTEVFUCgzKSwgU0xFRVAoMSkpIC0tIg== 200 -
10.0.10.5 - kaiser [14/Sept/2017:13:47:55] GET "http://herausforderung.falshung-standort.de/unterlagen/suche?=emVyc2V0emVuSU9YWVcN 200 -
10.0.10.5 - wagner [14/Sept/2017:13:47:55] GET "http://herausforderung.falshung-standort.de/unterlagen/suche?=aG9yc3RiZXRyZXVlcm96bQ0= 200 -

On décode le base64 en paramètre de suche : vakuum'; IF(LENGTH(KENNWORT)=0, SLEEP(3), SLEEP(1)) --". C’est une injection SQL time based, en fonction du temps de réponse du serveur l’attaquant exfiltre des informations. Ici par exemple si le serveur met 3 secondes à répondre on sait que l’information à une taille (LENGTH) de 0.

Il suffit maintenant de récupérer l’ensemble des réponses qui ont validé les requêtes de l’attaquant en se basant sur le temps de réponse du serveur

JAJAJA

import re
import base64
import time
import datetime

password= ""

data =open("logs.txt", "r").read().split("\n")
i = 0
for line in data:

    date = re.findall(r"\[14\/Sept\/2017:(\d+:\d+:\d+)]", line)[0] 
    payload = re.findall(r"suche\?=(.*?)\s", line)[0]
    decoded = base64.b64decode(payload)
    before = time.mktime(datetime.datetime.strptime("2017:09:14 " +date, "%Y:%m:%d %H:%M:%S").timetuple()) # on extrait la date de la requête

    try:
        if decoded.startswith("vakuum';"): # si c'est un injection
            titi = data[i + 1]
            da = re.findall(r"\[14\/Sept\/2017:(\d+:\d+:\d+)]", titi)[0]
            da = "2017:09:14 " + da
            after =  time.mktime(datetime.datetime.strptime(da, "%Y:%m:%d %H:%M:%S").timetuple()) # on regarde le temps de réponse du serveur

            if (after - before) == 3.0:
                password += chr(int(re.findall(r"\=(\d+)", decoded)[0])) # si le temps est égal à 3s, on garde l'information
    except:
        pass

    i+=1

print password 

ENSIBS{I_L0v3_P4rs1ng_L0gF1l3s}

Je pose le script là (je l’ai codé le plus rapidement possible no jugement), vous en faites ce que vous voulez