RuCTF 2012 Quals –
The password generator

RuCTF 2012 - The password generator - task description

Bei dieser Challenge (The password generator) geht es darum, an das Passwort eines Administrators zu gelangen. Alles, was wir kennen, sind die Kommandos, die verwendet wurden, um das Passwort zu generieren und der Hinweis auf ein “wohl bekanntes” Betriebssystem.

Beginnen wir also zunächst einmal, die angegebenen Kommandos nacheinander zu analysieren und deren Funktionsweise in einen Gesamtzusammenhang zu bringen.

cd ~

Relativ simpel – der Administrator wechselt zu Beginn der Operationen in sein Heimatverzeichnis.

vi ./.cshr

Als nächstes wir die Datei “.cshr” im Heimatverzeichnis editiert. Die gezielte Suche nach dieser Datei lässt einen Zusammenhang mit der “csh” (c-Shell) erkennen, die zumeist auf BSD-Systemen zum Einsatz kommt. Bei der Datei, die meist als “.cshrc” referenziert wird, scheint es sich um eine der Dateien zu handeln, die beim Login des Benutzers abgearbeitet werden und in der -ähnlich der “.bashrc”- Umgebungsvariablen und ähnliches gesetzt werden. Was genau hier editiert wurde, lässt sich nur erahnen.

reboot

Auch nicht sonderlich spektakulär – der Administrator startet das System neu. Warum er das tut, ist hier auch nicht ganz klar. Es könnte mit dem Editieren der “.cshr”-Datei zu tun haben. Vielleicht möchte der Administrator also einfach nur die Änderungen der “.cshr”-Datei zur Anwendung bringen, indem er sich -nach dem Neustart- neu einloggt. ;-)

cvs -q checkout -rpkgsrc-2011Q4 -P pkgsrc

Die Suche nach diesem Kommando führt uns als ersten Treffer auf die NetBSD-Homepage, was unsere Vermutung eines BSD-System bestätigt und auch den Hinweis eines “wohlbekannten Betriebssystems” unterstreichen würde.

Im Detail wir hier das Concurrent Version System (CVS), ein System zur Versionverwaltung von Dateien, verwendet. Nach der man-Page des Kommandos “cvs” bedeuten die Optionen folgendes:
-q                           –> Cause  the  command to be somewhat quiet
checkout               –> Create or update a working directory
-r pkgsrc-2011Q4 –> Annotate file as of specified revision/tag
-P                          –> Prune empty directories
pkgsrc                   –> module

Zusammenfassend wird also das aktuelle CVS-Arbeitsverzeichnis auf die Revision “pkgsrc-2011Q4” gewechselt. Ohne mich sonderlich mit NetBSD auszukennen, vermute ich, dass hier ein Wechsel der Paketquellen auf einen anderen Versionierungsstand stattfindet. Vergleichbar wäre dies wohl mit dem Ändern eines Debian-Repositorys in der Datei “sources.list”.

(Anmerkung: Eine Suche nach NetBSD und der “.cshr”-Datei liefert verschiedene Informationen (#1, #2), die im Kern davon sprechen, dass vor dem ersten Verwenden von NetBSD und dessen Paketquellen, einige Änderungen an der “.cshr”-Datei vorgenommen werden sollten. Möglicherweise hat der Administrator genau diese Änderungen beim Editieren dieser Datei durchgeführt.)

pkg_add pwgen

“pkg_add” ist ein zu BSD-Distributionen gehörendes Werkzeug um Pakete nach zu installieren. Hier wird also scheinbar das Paket “pwgen” aus den vorher konfigurierten Paketquellen bezogen.

pwgen -sH /usr/pkg/bin/pwgen 20 1

Anschließend wird das soeben installierte Werkzeug “pwgen” verwendet.  Bei “pwgen” handelt es sich, wie der Name schon andeutet, um ein Tool um Passwörter automatisiert zu generieren. Ein Blick in die man-Page verrät uns auch, was die verwendeten Optionen bedeuten:
-s                                  –> Generate  completely random, hard-to-memorize passwords.
-H /usr/pkg/bin/pwgen –> Will  use  the  sha1’s  hash of given file to create password.
20 1                              –> [ pw_length ] [ num_pw ]

Der Administrator verwendet “pwgen” also um schwer zu merkende Passwörter auf Basis eines Hash-Wertes zu berechnen. Dabei lässt er zwanzig Zeichen lange Passwörter berechnen und wählt aus dieser Liste das erste aus.

passwd

Zuletzt wird das Werkzeug “passwd” verwendet um das Systempasswort zu ändern. An dieser Stelle ändert das Administrator das Kennwort vermutlich auf das soeben durch “pwgen” errechnete Passwort.

Die Frage ist nun, wie kommen wir an dieses errechnete Passwort?

rup0rt@lambda:~$ pwgen -H /etc/passwd 20 1
gohgeing9eis7eiDeito 
rup0rt@lambda:~$ pwgen -H /etc/passwd 20 1
gohgeing9eis7eiDeito 
rup0rt@lambda:~$ pwgen -H /etc/passwd 20 1
gohgeing9eis7eiDeito

Ein kurzer Selbsttest zeigt, dass bei mehrmaliger Übergabe der selben Datei, das Werkzeug “pwgen” gar nicht mehr so zufällig arbeitet, wie vielleicht anzunehmen war. Dies ist natürlich auch verständlich und durch die Option “-H” genau so vorgesehen, da als Grundlage zur Passwortberechnung kein zufälliger Wert mehr, sondern der feste SHA1-Hash der übergebenen Datei verwendet wird.

Da der Administrator zur Bechnung seines Passwortes die Datei “/usr/pkg/bin/pwgen” verwendet hat, müssen wir nun also nur noch genau dieselbe Version der Datei, oder zumindest deren SHA1-Hash, besorgen. Die Suche nach “NetBSD pwgen” liefert als ersten Treffer direkt den FTP-Server der BSD-Paketsammlung.

RuCTF 2012 - The password generator - pwgen version

Das Betrachten der Links verrät uns, welchem Build die angegebenen “pwgen”-Versionen entstammen. Bei der Architektur “i386” und dem ersten Link von “NetBSD 5.0.2” erkennen wir “2011Q4”, das der vom Administrator vorher konfigurierten Paketquelle entspricht.

Nach dem Runterladen und Entpacken des Archives, kann nun das “pwgen”-Binary mit der “-H”-Option an “pwgen” übergeben werden und so dessen SHA1-Hash zur Passwortgenerierung verwendet werden.

rup0rt@lambda:~/the_password_generator$ pwgen -sH pwgen/bin/pwgen 20 1
pZ5MY2NxdmWd1mASje1s

Bis auf den Pfad des Binarys ist der Aufruf damit mit dem des Administrators identisch.

Die Lösung dieser Challenge lautet also “pZ5MY2NxdmWd1mASje1s“.

Nachdem die Antwort eingetragen wurde, werden wir zudem noch in unserer Vermutung bestätigt, dass es sich wirklich um NetBSD gehandelt hat. :-)

RuCTF 2012 - The password generator - solved

Leave a Reply

Your email address will not be published. Required fields are marked *