The Morpheus Hacking Challenge 13 (0x0d)
Auflösung des Erstellers: https://www.youtube.com/watch?v=-Fs03PSzQ20
0x0d.php
Der erste Schrit war natürlich die Header Analyse. Leider hat die nichts hervorgebracht, was von Nutzen wäre. Keine Cookies, keine Redirects, nichts. Auch der Sourcecode der Seite war clean und Javascript wurde ebenfalls nicht eingebunden.
Soweit so schlecht.
Scans
Da auch das Form sicher war ging ich über zu einem Portscan. Angekündigt wurde ja, dass die Challenges nicht unter Port 20000 liegen.
$ nmap -p 20000-21000 hc.the-morpheus.de
Starting Nmap 7.60 ( https://nmap.org ) at 2018-08-04 16:20 CEST
Nmap scan report for hc.the-morpheus.de (185.244.192.170)
Host is up (0.048s latency).
rDNS record for 185.244.192.170: the-morpheus.de
Not shown: 995 closed ports
PORT STATE SERVICE
20000/tcp open dnp
20001/tcp open microsan
20002/tcp open commtact-http
20003/tcp open commtact-https
20004/tcp open unknown
20005/tcp open btx
Nur Port 20004 ist zur Challenge hinzugekommen, mmmmmhh.
$ curl -v http://hc.the-morpheus.de:20004
* Rebuilt URL to: http://hc.the-morpheus.de:20004/
* Trying 185.244.192.170...
* TCP_NODELAY set
* Connected to hc.the-morpheus.de (185.244.192.170) port 20004 (#0)
> GET / HTTP/1.1
> Host: hc.the-morpheus.de:20004
> User-Agent: curl/7.58.0
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 1081
< Server: Werkzeug/0.14.1 Python/3.6.6
< Date: Sat, 04 Aug 2018 14:23:29 GMT
<
NNNNNNNN NNNNNNNN SSSSSSSSSSSSSSS AAA
N:::::::N N::::::N SS:::::::::::::::S N:::A
S::::::::N E::::::NC:::::SUSRSI::::::S T:::::Y
N:::::::::N N::::::NS:::::S SSSSSSS A:::::::A
N::::::::::N N::::::NS:::::S A:::::::::A
N:::::::::::N N::::::NS:::::S A:::::A:::::A
T:::::::H::::N R::::::O U::::SSSS G:::::A H:::::A
N::::::N N::::N N::::::N SS::::::SSSSS A:::::A A:::::A
N::::::N N::::N:::::::N SSS::::::::SS A:::::A A:::::A
N::::::N N:::::::::::N SSOBSC::::S A:::::AURAIAATY:::::A
0::::::N N::::::::::N x:::::S A:::::::::::::::::::::A
N::::::N N:::::::::N S:::::S A:::::AA0AAAAAAAAAA:::::A
N::::::N N::::::::NSSSSSSS S:::::S A:::::A A:::::A
N::::::N N:::::::NS::::::SdSSSS:::::SA:::::A A:::::A
N::::::N N::::::NS:::::::::::::::SSA:::::A A:::::A
NNNNNNNN NNNNNNN SSSSSSSSSSSSSSS AAAA.sA AAAAAAA
* Closing connection 0
'Nette art des Empfangs, aber was jetzt?'
Wie sich später herausstellen wird hat das ASCII Art tatsächlich einen Sinn.
Auf den Server habe ich dann Nikto und Dirb angesetzt, ohne Ergebnisse.
Was also jetzt?
In meiner Verzweiflung habe ich im Discord nachgefragt, ob das ACSII Art doch ein Hinweis auf etwas sei. Dann bin ich schlafen gegangen.
Am nächsten morgen sah ich dann die Antwort. Ja natürlich hatte das einen Sinn.
Ich stellte mir die Frage ob es irgendwelche Vulns gab dich mit der NSA zusammen hingen, (ausser EternalBlue, war ja schon was älter) Als ich bei den keywords 'NSA CTF' dann auf dieses Writeup gestoßen bin. Unter Flag #5 erblickte ich dann die Lösung.
ASCII ART
$ wget hc.the-morpheus.de:20004
--2018-08-04 16:34:20-- http://hc.the-morpheus.de:20004/
Auflösen des Hostnamens hc.the-morpheus.de (hc.the-morpheus.de) … 185.244.192.170
Verbindungsaufbau zu hc.the-morpheus.de (hc.the-morpheus.de)|185.244.192.170|:20004 … verbunden.
HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
Länge: 1081 (1,1K) [text/html]
Wird in »index.html« gespeichert.
index.html 100%[===================>] 1,06K --.-KB/s in 0s
2018-08-04 16:34:20 (56,6 MB/s) - »index.html« gespeichert [1081/1081]
$ cat index.html | tr -d 'NSA: \n'
ECURITYTHROUGHOBCURITY0x0d.s
'0x0d.s'? Tatsächlich gab es die Datei unter [https://hc.the-morpheus.de/0x0d.s]
Reverse Engeneering
Auffällig war der Anfang:
LC0:
.string "Pa"
.LC1:
.string "h15"
.LC2:
.string "wb0"
.LC3:
.string "u77"
.LC4:
.string "rd: "
.LC5:
.string "wo"
.LC6:
.string "ss"
.LC7:
.string "h0"
(Btw. ich kenn mich jetzt nicht unbedingt gut mit Assembly aus. Erstrecht nicht mit at&t.)
Theoretisch könnte man jetzt ein Script schreiben, was das Password bruteforcet.
Aber das ist lame.
Weiter im Code ist zu erkennen, dass die Strings auf verschiedene Orte im Memory geschoden werden. Das hab ich mir natürlich notiert.
Name | Wert | Ort
LC0 Pa 1104
LC1 h15 1096
LC2 wb0 1088
LC3 u77 1080
LC4 rd: 1072
LC5 wo 1064
LC6 ss 1056
LC7 h0 1048
Hier ein Beispiel für diese Zuweisung:
leaq .LC0(%rip), %rax //Schiebt LC0 in %rax
movq %rax, -1104(%rbp) // Schiebt %rax in -1104
Was folgte sah aus wie ein For Loop, der den String bei -1040
zu einem der Strings oben concatinated.
Vermutlich liegt der Rückgabewert der strcat
dort.
-1088(%rbp), %rdx // Schiebt -1088 (also LC1, "h15") in %rdx (einer Variable)
leaq -1040(%rbp), %rax // Schiebt den Rückgabewert des voherigen strcat in %rax
movq %rdx, %rsi // Schiebt %rdx (jetzt also "h15") in %rsi
movq %rax, %rdi // Schiebt %rax (jetzt also den Rückgabewert) in %rdi
call strcat@PLT // Verbindet %rsi und %rdi und legt den Wert bei -1040 ab
Dies geschah in follgender Abfolge:
LC0 > LC6 > LC 5 > LC4 > LC7 > LC2 > LC3 > LC1
Der String müsste also jetzt Password: h0wb0u77h15
sein.
Benutzername admin
mit dem Passwort hat funktioniert.
Death begets death begets death.