· 

BND Reversing Challenge - Level 1 - Lösung


Einführung

Der Bundesnachrichtendienst (BND) hat vor einiger Zeit eine Challenge veröffentlicht, um die Eignung eines Bewerbers für den Bereich Reverse Engineering schon im Vorfeld abschätzen zu können. Wollte man seine Bewerbung einreichen, so musste man die aus drei Teilen bestehende Challenge so gut es geht bearbeiten und die Antworten in einem PDF der Bewerbung beifügen. Ein User hat die Challenge auf GitHub veröffentlicht.

 

In dieser dreiteiligen Serie werde wird eine Vorgehensweise zum Meistern der einzelnen Challenges skizziert. Da das Bewerbungsverfahren schon seit längerer Zeit beendet ist, sollte eine Veröffentlichung meiner Lösung kein Problem darstellen. In diesem Teil lösen wir Level 1.


Die Aufgabe

In dem Ordner Level 1 finden Sie ein Programm evil.exe und eine verschlüsselte Datei Urlaubsphoto.png.crypt. Klickt man auf evil.exe öffnet sich ein Fenster, in dem steht, dass unser Urlaubsfoto verschlüsselt wurde und wir doch ein BTC (Bitcoin) zahlen sollen, um das Passwort für die Entschlüsselung zu erhalten. Nach dem aktuellen Wechselkurs wäre das eine ziemlich horrende Summe und für einen findigen Informatiker selbstverständlich keine Option. Generell sollten Sie auf Forderungen von Ransomware nicht eingehen. Niemals!

Ein (naiver) erster Versuch könnte darin bestehen zu prüfen, ob eines der Standard-Passwörter funktioniert. Ich habe es einige Male mit diversen Wordlists zu knacken versucht, jedoch ohne Erfolg. Da es sich nicht umsonst um eine Reverse Engineering Challenge handelt, wäre so eine Vorgehensweise ohnehin nicht akzeptabel. Jedenfalls meldet sich nach jeder Fehleingabe das folgende Fenster:

Genau dann, wenn der richtige Schlüssel eingegeben wurde, entschlüsselt die BND-Ransomware das kostbare Urlaubsfoto. Doch wie kommt man an den Schlüssel?


Die Lösung

Die Antwort ist einfach: Man benötigt den korrekten Schlüssel überhaupt nicht! Es gibt verschiedene Herangehensweisen für die Lösung. Eine besteht z. B. darin die Ransomware so zu modifizieren, dass sie alle Passwörter bis auf das richtige akzeptiert. Wir lösen das Problem, ohne die Datei evil.exe erneut öffnen zu müssen (höchstens in einem Decompiler).

 

Freundlicherweise kann man an dem Dateinamen bereits ablesen, dass es sich vor der Verschlüsselung um ein PNG File gehandelt haben muss (dies könnte aber auch Tarnung sein). Zuerst wird die Datei in einem Hex-Editor betrachtet, wodurch man feststellt, dass nicht die für PNG Files typische Signatur 89 50 4e 47 0d 0a 1a 0a in den ersten 8 Bytes zu sehen ist.

Basierend auf diesen Informationen kann ein Algorithmus entworfen werden, der am Ende die korrekte PNG-Signatur erzeugt oder man analysiert den Source Code der Ransomware. Hierzu bietet sich beispielsweise der .NET Reflector (für VB Code) an, von dem Sie hier eine kostenlose Testversion beziehen können. Mit diesem Tool wird der Source Code der .exe-Datei sichtbar gemacht. Man erkennt recht schnell, dass die Funktion invertGravity für die Verschlüsselung der einzelnen Bytes des Bildes verantwortlich ist. Diese Logik wird adaptiert und in ein kleines Python-Skript gegossen, mit dem die Entschlüsselung losgelöst von dem vorgegebenen Programm durchgeführt werden kann.

# Implementation of the BND decryption function.
def decrypt(to_invert):
        buf = []
        if len(to_invert) % 2 != 0:
                print("Wrong size!")
        else:
                for i in range(0,len(to_invert)//2-1):
                        buf.append(min(to_invert[i*2],to_invert[i*2+1]))
        return buf
        
to_decrypt = open("Urlaubsphoto.png.crypt", "rb")
data = to_decrypt.read()
to_decrypt.close()

decrypted = open("Urlaubsphoto.png", "wb")
decrypted.write(bytes(decrypt(data)))
decrypted.close()

Probieren Sie es selbst einmal aus (entweder mit meiner Python-Variante oder Ihrer Implementierung in einer anderen Programmiersprache). Sie sollten nach dem Entschlüsseln der Datei ohne Probleme erkennen können, dass sich der Urlauber in Paris in Sichtweite des Eifelturms befunden hat. 

Um herauszufinden, welche Antwort der Server bei Eingabe des korrekten Entsperrpassworts liefert, werden die Funktionsaufrufe (Call Trace) des Programms jeweils so lange zurückverfolgt, bis man schlussendlich feststellt, dass die ominöse Funktion installLinux für den Response-String verantwortlich ist.

private string installLinux()
{
    string str = "The iron bank will have its due";
    return (str.Substring(0, 1).Replace('q', 'm').Replace('T', 'A').Replace('e', 'd').Replace('v', 's').Replace('r', 'L').Replace('i', 'a') + str.Substring(3, 1) + str.Substring(13, 1).Replace('i', 'k').Replace('A', 'k').Replace('n', 'q').Replace(' ', 'L').Replace('y', 'd').Replace('v', 'f').Replace('m', 'a').Replace('m', 'e') + str.Substring(10, 1) + str.Substring(7, 1) + str.Substring(7, 1) + str.Substring(4, 1) + str.Substring(0x1a, 1) + str.Substring(0x19, 1) + str.Substring(2, 1) + str.Substring(5, 1) + str.Substring(3, 1) + str.Substring(10, 1) + str.Substring(0x10, 1) + str.Substring(14, 1) + str.Substring(10, 1) + str.Substring(5, 1).Replace('c', 'l').Replace('m', 'v').Replace('d', 'o').Replace('k', 'd').Replace('r', 'y').Replace('u', 'A').Replace('g', 'm') + str.Substring(0x1a, 1) + str.Substring(3, 1) + str.Substring(13, 1).Replace('u', 's').Replace('q', 'A').Replace('k', 'a').Replace('f', 'g').Replace(' ', 'p').Replace('A', 'o').Replace('A', 'r').Replace('m', 'b') + str.Substring(10, 1) + str.Substring(4, 1).Replace('g', 'k').Replace('h', 'p').Replace('i', 'y').Replace('f', 'x').Replace('t', 'g').Replace('j', ' ').Replace(' ', 'b') + str.Substring(0x1a, 1) + str.Substring(3, 1) + str.Substring(1, 1) + str.Substring(4, 1) + str.Substring(0x1a, 1) + str.Substring(3, 1) + str.Substring(0x1c, 1) + str.Substring(2, 1) + str.Substring(9, 1) + str.Substring(0x19, 1) + str.Substring(0x1a, 1));
}

Wer mag, kann sich diese Funktion, die lediglich Security By Obscurity implementiert, gerne selbst nachbauen oder direkt in ein VB-Konsolenanwendungstemplate einfügen und ausführen. Als Ergebnis erhält man den Satz „A Lannister always pays is debts“ (auch beim BND schaut man wohl Game of Thrones :)). Generell ist der Code mit vielen „Nerd-Referenzen“ gespickt.