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