Passwörter von TightVNC ermitteln…

Nachdem ich letztens nachgewiesen habe, wie unsicher eines der Lieblingstools von Hannes Schurig ist, hat dieser mich gestern angeschrieben und gefragt, ob ich mir nicht mal das OpenSource-Tool TightVNC angucken könnte.

Wie er mitbekommen hatte, speichert der TightVNC-Server in der Registry unter "HKCU\Software\TightVNC\Server" zwei Werte mit den Namen "Password" und "PasswordViewOnly". Seine Frage war nun, ob es möglich wäre, aus den kryptischen Werten die ursprünglichen Passworte für den "Remote Control"- und den "Remote View Only"-Zugang wiederherzustellen.

Da man von diesem Programm die Quelltexte erhält, habe ich mir diesen natürlich zuerst angeguckt und habe auch relativ schnell eine Antwort auf die Frage gefunden: Ja, man kann die ursprünglichen Passworte anhand der Werte in der Registry ermitteln!

Um das herauszufinden, habe ich am Quellcode entlang gehangelt. Begonnen habe ich in der Datei "ServerConfig.cpp" - in dieser wird die Klasse ServerConfig definiert, die später anscheinend die gesamte Konfiguration vorhält. In dieser Klasse gibt es u.a. auch die beiden Methoden "setControlPassword()" und "setReadOnlyPassword()", die einen Rückschluss auf die verschiedenen Zugänge zulassen.
Um zu sehen, was weiter geschieht, habe ich nachgesehen, wo die Methode setControlPassword() überall aufgerufen wird - das wiederum ist u.a. in der Datei "ControlApplication.cpp" der Fall, in der sich die Methode "run()" befindet. In der Methode werden anscheinend Kommandozeilen-Parameter verarbeitet und wie es aussieht, kann man die Passwörter über die Kommandozeile setzen.
Auffallend ist die Verwendung der Methode "getCryptedPassword()" - sie befindet sich in der gleichen Datei und enthält u.a. einen Aufruf der Form "VncPassCrypt::getEncryptedPass()". Diese Methode (die sich in der Datei "VncPassCrypt.cpp" befindet) enthält nun die eigentlich interessante Passage:

1
2
3
4
5
6
7
void VncPassCrypt::getEncryptedPass(UINT8 encryptedPass[8],
                                    const UINT8 plainPassword[8])
{
  DesCrypt desCrypt;
  desCrypt.encrypt(encryptedPass, plainPassword,
                   sizeof(encryptedPass), m_key);
}

Das Passwort, das oben eingekippt wird, wird unten DES-verschlüsselt wieder ausgegeben - eine Entschlüsselungsmethode wird übrigens gleich mitgeliefert und selbst das Passwort liegt fest einprogrammiert im Quelltext vor:

1
const UINT8 VncPassCrypt::m_key[] = { 23, 82, 107, 6, 35, 78, 88, 7 };

Man sollte sich also dringend überlegen, wie man die Passwörter in der Registry absichert, wenn man vorhat, TightVNC zum Beispiel zur Fernwartung von Mitarbeiter-PCs zu nutzen. Die Leute könnten schneller an das Passwort kommen, als einem lieb sein dürfte.
Entschlüsselte Grüße, Kenny

2 Kommentare » Schreibe einen Kommentar

  1. Ich vermute das soll auch mit Clients funktionieren, die nicht hashen können bzw ist die Hash-Übertragung im VNC-Protokoll nicht vorgesehen? Ich weiß nicht in wieweit da überhaupt irgendwas standardisiert ist. Geeignete Ubuntu-Clients zu finden ist immer schwierig, vor allem wenn man solche Ansprüche stellt, dass man am Client die Fenstergröße vorgeben möchte. Kann ja sein, dass der Client eine niedrigere Auflösung als der Server hat ...

    • Ich habe mir gerade mal ein paar Quelltexte angesehen und es ist in der Tat so, dass das Passwort irgendwann im Plaintext vorliegen muss. Bei TightVNC gibt es z.B. die Methode VncPassCrypt::challengeAndResponseIsValid() über die wahrscheinlich der Login überprüft wird. Darin wird eine Challenge mit dem Benutzerpasswort verschlüsselt und anschließend überprüft, ob dieser Wert mit der Response des Clients übereinstimmt.

      Ich habe außerdem mal geguckt, ob der TightVNC-Client sich an einem Server einer anderen Implementierung anmelden kann - selbst das hat funktioniert. Die einzelnen Pakete scheinen jedoch auch Zusatzmöglichkeiten anzubieten, die je nach Produkt anders ausfallen: Von vollständig verschlüsselten Kanälen bis hin zu längeren Passworten.

      Danke übrigens für den Hinweis: Ich habe den entsprechenden Absatz entfernt.

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.