Da ich schon lange keine CTFs mehr gemacht habe, wollte ich mit etwas einfachem anfangen. Da sah mir RickdiculouslyEasy einfach genug und trotzdem vielversprechend aus.
Aufbau: Neben RickdiculouslyEasy benutze ich Kali, als Penetration Server. Beides läuft innerhalb Virtualbox unter Linux Mint. Die Kali VM und die RickdiculouslyEasy VM befinden sich im gleichen Netz. Sicherheitshalber kann nur die Kali VM mit dem Internet kommunizieren.
Anmerkung: Da ich festgestellt habe das ich mich ohne gute Dokumentation heillos verzettele, benutze ich Freeplane um den Überblick zu behalten. Das hilft mir ungemein Schritte nicht doppelt zu machen und Ideen nicht zu vergessen. Ich weiß natürlich, das Dokumentation vom Teufel ist 😉 und niemand es gerne tut, aber bei mir erhöht es deutlich den Spaßfaktor. Aber es ist natürlich kein muss um RickdiculouslyEasy zu knacken.
Mich würde interessieren, wie Ihr es mit Dokumentation handhabt und was Ihr dazu benutzt. Gerne in den Kommentaren!
So nun aber zum CTF hacken.
Schritt 1 – Ziel IP
Als erstes brauche ich die IP der RickdiculouslyEasy VM. Dazu benutze ich gerne netdiscover. nmap, ping o.ä. wären andere Möglichkeiten um die IP herauszufinden.
Die beiden ersten IPs sind Router und VM Host. Also bleibt nur noch 192.168.1.163 als RickdiculouslyEasy VM IP übrig.
Schritt 2 – Offene Ports
Als nächstes wüsste ich gerne, welche Services mir die VM anbietet. Dazu ist nmap natürlich das Tool der Wahl.
# nmap -T4 -A -p1-65535 192.168.1.163
Wau, direkt 2 Treffer und ein Bonus. Das geht richtig gut los. Der CTF Bauer weiß zu motivieren 😉
Aber der Reihe nach:
- 21/tcp
FTP Server der anonymes Login erlaubt und scheinbar ein Flag enthält. - 22/tcp
SSH Server der etwas schräg aussieht. Den schaue ich mir später an. - 80/tcp
Apache Web Server - 9090/tcp
Noch ein Webserver. Cockpit! Noch nie davon gehört. Schaue ich mir auch später an. - 13337/tcp
Keine Ahnung was das ist, aber ein Flag zu bekommen ohne wirklich was gemacht zu haben, da sagt man doch Danke. Die ersten 10 von 130 Punkten gefunden. Auch den Services werde ich mir später genauer anschauen.
FLAG:{TheyFoundMyBackDoorMorty}-10Points
- 22222/tcp
OpenSSH Server. Interessant! Auf dem SSH Port 22 läuft etwas komisches, aber auf 22222 läuft ein OpenSSH. Da hat man wohl Security by Obscurity betrieben und den SSH Port verbogen. Schaue ich mir auch später an. - 60000/tcp
Auch hier läuft etwas interessantes, das mit „Welcome to Ricks half baked reverse shell…“ eine Reverse-Shell vorgaukelt. Das dürfte noch interessant werden.
Schritt 3 – Port 21
Wo fangen ich an? Am Besten wird der Reihe nach jedem Service einen Besuch abgestatten.
Als erstes ftp. Der Plan ist FLAG.txt runter zu laden und nachzusehen, was in pub steht.
Siehe da, das Flag lässt sich runter laden und voila es enthält auch, was der Name verspricht.
FLAG{Whoa this is unexpected} - 10 Points
Jetzt sind es schon 20 von 130 Punkten. Langsam wird’s was!
Leider ist das Verzeichnis pub leer.
Schritt 4 – Port 80
Da ich für ssh bestimmt länger brauche, nehme ich mir erst mal die „Low hanging fruits“ vor.
Weiter geht es mit dem Apache auf Port 80. Der einfachste Test, ist die Seite im Browser aufzurufen. Interessantes Bild aber nichts zu klicken. Auch der Seiten Source ist eher unspektakulär. Ich könnte jetzt versuchen mit einem Spider z.B. dirb und einer geeigneten Wortliste alle Seiten zu finden, die der Webserver bereitstellt. Aber ich versuche erst mal mein Glück mit der robots.txt Datei.
# wget http://192.168.1.163/robots.txt
Eventuell steht da was interessantes drin.
Eine Rootshell!?! Das wäre zu schön um wahr zu sein. Ist es auch. Sie funktioniert nicht.
Aber auch das tracertool sieht interessant aus.
Und jetzt mal ausprobieren, wie pingelig die Eingabeüberprüfung ist, sprich ob Command Injection funktioniert. Dazu habe ich einfach Semikolon ls eingegeben. Und siehe da Command Injection funktioniert.
An dieser Stelle ließe sich wunderbar eine Reverse-Shell aufbauen. Ich wollte aber erst mit simplen Mitteln schauen, was der Webserver sonst noch hergibt. Daher habe ich einfach das ls verändert und bin damit im Verzeichnisbaum hin und her gewandert, um dabei ziemlich schnell folgendes zu entdecken.
Dann wollen wir doch noch mal den Browser an schmeißen und nachschauen, ob FLAG.txt (http://192.168.1.163/passwords/FLAG.txt) ein Flag enthält und passwords.html (http://192.168.1.163/passwords/passwords.html) Passworte.
Voila, wieder eines gefunden. Und da waren es schon 30 von 130.
FLAG{Yeah d- just don't do it.} - 10 Points
Wie sieht’s aus mit dem Passwort File.
Das wäre auch zu schön gewesen um wahr zu sein.
Aus Routine schaue ich mir den Source der Datei an. Manchmal findet man dort interessante Kommentare o.ä.
Das ist ja mal ein Volltreffer. Da hat doch jemand ein Passwort für irgend einen Account hinterlassen. Aber für welchen? Eine Liste mit Accounts wäre jetzt super. Klassischerweise stehen die auf UNIX System in der Datei /etc/passwd. Aber wie komme ich da dran.
Vielleicht hilft auch hier das tracertool von vorher.
Erstmal testen, ob die Datei /etc/passwd für den Webserver Benutzer lesbar ist.
Klappt! Jetzt noch versuchen den Inhalt anzuzeigen.
cat zeigt eine Katze. Nicht was ich erwartet habe. Irgendwas stimmt nicht mit dem cat. Versuchen wir einen anderen Weg. Wie wäre es mit tail.
Das klappt ja super! Und was fällt ins Auge? Richtig, die drei Benutzer Konten für RickSanchez, Morty und Summer.
Summer? Da muss man nicht Sherlock Holmes sein, um einen Zusammenhang mit dem vorher gefunden Passwort winter herzustellen. Das wird dokumentiert um später getestet zu werden.
Das war erst einmal alles was Port 80 hergibt.
Schritt 5 – Port 9090
Auf Port 9090 scheint der Webserver cockpit zu laufen. Auch hier ist der Zugriff via Browser die erste Wahl.
Und da fällt mir eine Flag direkt vor die Füße. Das war schon etwas arg einfach. Aber ich will mich nicht beschweren. Es geht auch anders … 😉
FLAG {There is no Zeus, in your face!} - 10 Points
Viel mehr konnte ich aus der Seite nicht herauskitzeln. Auch der Source ist nicht ergiebig, also war es das für Port 9090.
Schritt 6 – Port 13337
Der Port 13337 hat schon ein Flag beim nmap Scan gezeigt. Weil ich keine Ahnung habe was auf dem Port läuft, versuche ich mit netcat/nc eine Verbindung hinzubekommen.
# nc 192.168.1.163 13337
Aber mehr als das Flag gibt der Port nicht her.
FLAG:{TheyFoundMyBackDoorMorty}-10Points
Schritt 7 – Port 22222
Wir haben 3 User, ein Passwort und einen SSH Port. Was liegt näher als zu versuchen sich mit den Usern einzuloggen.
# ssh -l Summer -p 22222 192.168.1.163
Und drin bin ich! Gleich mal mit ls schauen, ob es was Interessantes gibt.
Das sieht ganz nach einem Flag aus. Allerdings scheint cat nicht zu funktionieren. Wie auch im Browser behelfe ich mir hier mit tail. Da ich jetzt einen ssh Zugang habe, könnte ich mir aber auch ein funktionierendes cat von einer anderen Maschine hier her kopieren.
FLAG{Get off the high road Summer!} - 10 Points
Wenn ich richtig mit gerechnet habe sind das nun 60 von 130 Punkten. Das Ziel kommt näher.
Den Zugang werde ich bestimmt später noch brauchen, aber vorerst kümmere ich mich um den letzten offenen Port.
Schritt 8 – Port 60000
Wieder etwas unbekanntes. Das Tool der Wahl ist wieder netcat.
# nc 192.168.1.163 60000
In der Tat, das könnte eine vergessene Reverse Shell sein.
Erst mal etwas umschauen.
Und schon wieder ein Flag gefunden. Aber interessant sind auch die anderen Informationen. Wenn die Shell eine echte Shell ist, könnte das Programm auf dem Port als root User laufen und ein Arbeitsverzeichnis unterhalb /root haben. Das schreit förmlich nach höheren Privilegien, sprich Privilege Escalation. Da werde ich wohl später noch mal ran müssen.
FLAG{Flip the pickle Morty!} - 10 Points
Damit habe ich alle Port geprüft und die erste Hälfte der Punkte sind gefunden.
Schritt 9 – Userverzeichnisse
Da durch SSH ein lokaler Zugang zur VM besteht, bietet es sich an das Filesystem etwas genauer unter die Lupe zu nehmen. Naheliegend sind die schon gefunden Benutzer und ihre Home Verzeichnisse zu durchsuchen.
Als erstes muss Morty dran glauben. In das Verzeichnis gewechselt und den Inhalt angezeigt. Ein Zip und ein Bild. Das Zip verlangt ein Passwort, das ich (noch) nicht kenne. Schade!
Das Bild ziehe ich lokal auf meinen Rechner, um es mir anzuschauen. Doch da sehe ich nichts interessantes. Ebenso zeigt mir exiftool nichts spannendes an. Letzte Hoffnung ist strings. Und siehe da, ganz am Anfang von Strings steht noch etwas, das zwar ungewöhnlich für ein Bild ist aber gut für mich. Und das sogar mit dem Hinweis, wozu das Passwort gehört.
Zurück zum Zip und das neue Passwort ausprobiert. Und schon klappt es auch mit dem Öffnen der Datei. Und wieder ist ein Flag gefunden. Diesmal für 20 Punkte. Allerdings sieht das Flag etwas anderes aus, als die die vorher gefunden wurden. Eventuell sollte ich mir das noch mal extra merken 😉
FLAG: {131333} - 20 Points
Als nächstes ist RickSanchez an der Reihe. Gleiche Vorgehensweise.
Natürlich habe ich erst einmal /home/RickSanchez/ThisDoesntContainAnyFlags untersucht, aber dort ist wirklich kein Flag und nichs interessantes.
Aber in RICKS_SAFE ist eine Datei safe, die ich zwar lesen aber nicht ausführen darf. Die ziehe ich erst mal auf meinen lokalen Rechner, um sie dort laufen zu lassen.
Anmerkung: Das ist natürlich potentiell gefährlich, weil ich nicht weiß was das Programm macht. Aber da meine lokale Maschine auch eine VM ist, bin ich da etwas relaxter, weil ich die einfach wegwerfen bzw. löschen kann.
Anmerkung 2: Damit safe lokal läuft muss zumindest unter Linux Mint libmcrypt4 installiert werden.
# apt install libmcrypt4
Und safe verrät auch gleich, dass es Kommandozeilen Argumente braucht. Scheinbar wird eine Art Key oder Passwort benötigt. Warum also nicht die komische Nummer aus dem letzten Flag verwenden.
Ein Flag und ein Hinweis auf das Passwort von RickSanchez. Somit dürften wir 100 von 130 Punkten gefunden haben.
FLAG{And Awwwaaaaayyyy we Go!} - 20 Points
Schritt 10.1 – Es werde root
Da ich nichts mit dem Hinweis im letzten Flag anfangen konnte, habe ich mir einen alternativen Weg gesucht. uname -a zeigt den Kernel an (4.11.8). Damit habe ich einige Exploit Datenbanken durchsucht und cve-2017-16995 gefunden. Den Source habe ich lokal auf meiner Kali VM compiliert und auf die Ziel VM kopiert.
Anschließend das Programm gestartet und schon war ich root. Damit „gehörte“ die VM jetzt mir 😉
Schritt 10.2 – Es werde root – Bonus
Ich denke, der CTF Ersteller hat sich den Schritt anders vorgestellt. Und sicherlich wäre es für US Amerikaner, die gelegentlich Zeichentrick Serien sehen, schnell ersichtlich. Leider trifft bei mir keins von beiden zu.
Rick Sanchez und Morty sind die Namen zweier amerikanischer Comic Figuren ihre Band heißt „The Flesh Curtains“.
Mit dem Hinweis von vorher, müssen alle möglichen Passworte durchprobiert werden. Einfach geht das mit einer Kombination von crunch um Passwortlisten zu erstellen und hydra um die Passworte durch zu probieren. Das , (Komma) wird hierbei durch einen Großbuchstaben und das % (Prozent) durch eine Ziffer ersetzt.
# crunch 10 10 -t ,%Curtains > passworte.txt # crunch 10 10 -t ,%Flesh > passworte.txt # hydra -l RickSanchez -P passworte.txt ssh://192.168.1.163:22222
Damit ist auch das Passwort für RickSanchez bekannt und dem Einloggen steht nichts mehr im Wege. RickSanchez darf sudo ausführen und sudo -l zeigt, das er alle Kommandos auf der Maschine ausführen darf.
Jetzt nur noch ein sudo su und ich bin root.
# ssh -l RickSanchez -p 22222 192.168.1.163 # sudo -l # sudo su
Schritt 11 – Finale
Als nächstes wurde das Home Verzeichnis des root Users besucht und siehe da, ein Flag. Und dieses mal sogar mit 30 Punkten.
FLAG: {Ionic Defibrillator} - 30 points
Somit sind 130 Punkte zusammen und RickdiculouslyEasy ist geknackt.
Schlussbemerkung
Ein schönes CTF zum warm werden und auch für Anfänger. Durch die vielen Flags am Weg bleibt die Motivation erhalten und die Ausdauer wird nicht zu sehr strapaziert.
Über Kommentare, Fragen und Anregungen würde ich mich freuen. Gerne würde ich auch über alternative Lösungsweg von Euch hören.
Vielen Dank für Euer Interesse.