The Morpheus Hacking Challenge 13 (0x0d)

Max Baumann

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 strcatdort.

-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.