Linux Mint: Passwort für Festplattenverschlüsselung vergessen --> Bruteforce?

shortrange

Banned
Registriert
Okt. 2013
Beiträge
626
Moin,

letztens habe ich Linux Mint 17 64bit installiert.

Bei der Installation kam die Frage, ob man das komplette Laufwerk verschlüsseln möchte und ggf. auch die privaten Daten. Beide Fragen habe ich mit "Ja" angekreuzt und ein Passwort vergeben. Das Passwort für die Laufwerksverschlüsselung ist identisch mit dem Passwort für den Benutzeraccount.

Nun war ich ca. 1 Woche nicht an dem PC und habe jetzt leider das Passwort vergessen.

Ich weiß noch wie das Passwort aufgebaut ist, wie lang es ist und einige Zeichenfolgen.

Gibt es die Möglichkeit einen Bruteforce-Angriff auf meine eigene Festplatte durchzuführen?

Danke :)
 
Und da gab es keine Aufforderung, einen Rettungsdatenträger zu erstellen?
 
Bruteforce kannst du praktisch vergessen. Dauert einfach zu lange.
 
Wie lange ist das Passwort? So ab 8-9-10 Zeichen (wenn du Groß- und Kleinbuchstaben sowie Zahlen verwendet hast), hast du eigentlich keine Chance mehr.
 
Probieren geht über studieren ...

btw schon 20 minuten verloren .
 
NiThDi schrieb:
Wie lange ist das Passwort? So ab 8-9-10 Zeichen (wenn du Groß- und Kleinbuchstaben sowie Zahlen verwendet hast), hast du eigentlich keine Chance mehr.

Also das Passwort besteht aus 11 Zeichen.
Die ersten acht davon kenne ich, die restlichen drei habe ich vergessen

Wäre das einen Versuch wert?

Wenn ja, wie gehe ich daran?
Welches Programm, o.ä. braucht man dafür?
 
shortrange schrieb:
Also das Passwort besteht aus 11 Zeichen.
Die ersten acht davon kenne ich, die restlichen drei habe ich vergessen

Wäre das einen Versuch wert?
Definitiv, das sind ja weniger als eine Million Kandidaten. Je mehr du über die drei fehlenden Zeichen weißt, desto weniger musst du durchprobieren. Wenn es z.B. Ziffern sind, hast du nur noch 1000 Kandidaten, bei nur Kleinbuchstaben ein paar mehr usw.

shortrange schrieb:
Wenn ja, wie gehe ich daran?
Welches Programm, o.ä. braucht man dafür?
Ob es dafür ein fertiges Programm gibt, weiß ich nicht. Du kannst aber von einer LiveCD starten und dann (falls du dir das zutraust) mit einem kleinen Shell-Skript die entsprechenden LUKS-Befehle aufrufen und alles durchprobieren.

Edit: Hier habe ich ein C-Programm gefunden, das man leicht so abändern könnte, dass es dein Problem löst.
 
Zuletzt bearbeitet:
jdcr schrieb:
Definitiv, das sind ja weniger als eine Million Kandidaten. Je mehr du über die drei fehlenden Zeichen weißt, desto weniger musst du durchprobieren. Wenn es z.B. Ziffern sind, hast du nur noch 1000 Kandidaten, bei nur Kleinbuchstaben ein paar mehr usw.

Ob es dafür ein fertiges Programm gibt, weiß ich nicht. Du kannst aber von einer LiveCD starten und dann (falls du dir das zutraust) mit einem kleinen Shell-Skript die entsprechenden LUKS-Befehle aufrufen und alles durchprobieren.

Edit: Hier habe ich ein C-Programm gefunden, das man leicht so abändern könnte, dass es dein Problem löst.

Danke für den Tipp!

Leider kenne ich mich nicht so gut mit Linux aus, wie würde man sowas umsetzen?

Könntest du mir bei der Abwandlung des C-Programms etwas behilflich sein, damit ich wieder Zugriff auf meine Festplatte bekomme?

Danke ;)
 
So zum Beispiel:
Code:
// hier das richtige Geraet angeben (z.B. mit gparted ermitteln)
const char*	DEVICE = "/dev/sda3\0";

// abcdefgh durch die bekannten 8 ersten Zeichen der Passphrase ersetzen
const char*	PASSPHRASE = "abcdefgh%c%c%c\0";

// Kandidaten für die letzten drei Zeichen (je weniger desto schneller)
char*		CANDIDATES = "abcABC012!$#\0";

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<libcryptsetup.h>

int main(int argc, const char* argv[])
{
	struct crypt_device*	cd = NULL;
	int			status, len;
	const char*		c1;
	const char*		c2;
	const char*		c3;
	char			passphrase[256];

	if((status = crypt_init(&cd, DEVICE)) || (status = crypt_load(cd, NULL, NULL)))
	{
		printf("Could not open/load device \"%s\": %s\n", DEVICE, strerror(-status));
		crypt_free(cd);
		return 1;
	}
	for(c1 = CANDIDATES; *c1 != '\0'; c1++)
	{
		for(c2 = CANDIDATES; *c2 != '\0'; c2++)
		{
			for(c3 = CANDIDATES; *c3 != '\0'; c3++)
			{
				len = sprintf(passphrase, PASSPHRASE, *c1, *c2, *c3);
				printf("Testing %s\n", passphrase);
				if(crypt_activate_by_passphrase(cd, NULL, CRYPT_ANY_SLOT, passphrase, len, 0) >= 0)
				{
					printf("Passphrase found: %s\n", passphrase);
					crypt_free(cd);
					return 0;
				}
			}
		}
	}
	printf("Nothing found.\n");
	crypt_free(cd);
	return 0;
}

  1. Gerätename und bekannten Teil der Passphrase einfügen
  2. als findpswd.c speichern
  3. gcc -o findpswd findpswd.c -lcryptsetup
  4. sudo ./findpswd
 
Zuletzt bearbeitet: (Code angepasst)
Vielen vielen Dank schon mal für deine Arbeit!!

Leider komme ich erst nächste Woche dazu diese Befehlsfolge ausprobieren zu können.

Darf ich vorher noch was fragen?

1.
Beim Passwort waren glaub ich auch Sonderzeichen dabei, wäre es schwierig das noch zu integrieren?

2.
jdcr schrieb:
[*]Gerätename und bekannten Teil der Passphrase einfügen
Der Gerätename wäre z.B. sdb1 oder so ähnlich?

3.
jdcr schrieb:
[*]als findpswd.c speichern
[*]gcc -o findpswd findpswd.c -lcryptsetup
[*]sudo ./findpswd
Kann ich es im Ubuntu Live-System auf dem Desktop speichern und dann diese Schritte ausführen?
Was bedeutet beim letzten Punkt der Punkt vor dem Slash bei "./findpswd"?


4.
Was passiert wenn das Passwort gefunden wurde?
Bekomme ich die Meldung, dass das Passwort gefunden wurde und habe Zugriff auf die Festplatte oder wrid das Passwort z.B. in eine Textdatei gespeichert, sodass ich es auch auslesen kann?

5.
Wo lernt man sowas?
 
Zuletzt bearbeitet:
shortrange schrieb:
Kann ich es im Ubuntu Live-System auf dem Desktop speichern und dann diese Schritte ausführen?
Ja, obiger Befehl kompiliert den gegebenen C - Programmcode (den du ja als findpswd.c speichern sollst) mit dem Compiler gcc und unter Einbeziehung der Bibliothek "cryptsetup" zu einer tatsächlich ausführbaren Binärdatei namens findpswd. In der Windows-Welt würde das Ding findpswd.exe heißen, aber die Unix-Welt braucht keine Endungen für sowas.

Was unter Umständen sein kann...
1.) gcc und cryptsetup sind evtl. nicht installiert -> du kriegst ne Fehlermeldung vom Compiler bzw. der Compiler geht gar nicht an -> über die Paketverwaltung den Kram nachrüsten
2.) Die erzeugte Datei ist nicht ausführbar. In der Windows-Welt ist alles ausführbar, was .exe oder .bat heißt. In der Unix-Welt gibt es dafür das Execute-Flag x... chmod ugo+x findpswd -> macht das Programm für den Eigentümer, dessen Gruppe und alle Anderen (Others) ausführbar. Ist in deinem Falle ok.

Was bedeutet beim letzten Punkt der Punkt vor dem Slash bei "./findpswd"?
Das ist eher als ganzheitliches Konstrukt mit dem Slash zu sehen... Normalerweise würdest du einen Befehl über seinen kompletten Pfad ansprechen um ihn auszuführen, also z.B. /home/deinUsername/documents/codeexperimente/findpswd... Da wir aber faul sind und uns eh im korrekten Ordner befinden, kommt da eben nur "./", was soviel heißt wie "hier, in diesem Ordner"

Was passiert wenn das Passwort gefunden wurde?
printf("Passphrase found: %s\n", buf);
Du kriegst ne Meldung in der Konsole, was denn nun dein PW war.

Wo lernt man sowas?
Grundsätzlich? Informatik-Studium, evtl. auch als Fachinformatiker für Anwendungsentwicklung
Natürlich kann man sowas auch im Selbststudium lernen, wenn man denn genug Interesse an den Tag legt.

Für mich wär das nix, ich wurde mit C nie so richtig warm.
 
shortrange schrieb:
1.
Beim Passwort waren glaub ich auch Sonderzeichen dabei, wäre es schwierig das noch zu integrieren?
Nein, siehe oben. Denk aber daran, dass die benötigte Zeit kubisch mit der Anzahl der in Frage kommenden Zeichen wächst. Auf meiner Maschine dauert es ca. 2s einen Kandidaten auszuprobieren. Wenn du z.B. wüsstest, dass es nur Ziffern sind, liefe das Programm maximal 2s*10³=2000s=34min. Kommen noch Sonderzeichen hinzu, sagen wir 10 Stück, dann sind es schon 2s*20³=4,5h. Je weiter du es eingrenzen kannst, umso besser.

shortrange schrieb:
2.
Der Gerätename wäre z.B. sdb1 oder so ähnlich?
/dev/sdb1 könnte es gewesen sein. Aber pass auf, diese sdxy-Namen sind nicht fest einem Datenträger zugeordnet und können sich theoretisch bei jedem Start ändern. Insbesondere müssen die Zuordnungen im Live-System nicht so sein wie auf deinem installierten. Deshalb solltest du das vorher überprüfen, z.B. mit gparted. Noch besser ist es, nach gparted auch noch sudo blkid auszuführen und dort die UUID nachzuschlagen. Die kannst du dann mit /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ins Programm eintragen. Die UUID ist ein für alle mal fest, egal von welchem System aus.

Den Rest hat Daaron schon perfekt beantwortet. Beachte insbesondere seine Anmerkungen 1.) und 2.).

shortrange schrieb:
5.
Wo lernt man sowas?
Daaron schrieb:
Grundsätzlich? Informatik-Studium, evtl. auch als Fachinformatiker für Anwendungsentwicklung
Natürlich kann man sowas auch im Selbststudium lernen, wenn man denn genug Interesse an den Tag legt.
Lasst mich dazu noch anmerken, dass dieses schnell hingeschluderte bzw. aus Internetquellen zusammengeflickte C-Programm von niemandem als Vorbild genommen werden sollte. Objektiv gesehen wäre es wahrscheinlich einfacher gewesen, ein Shell-Skript zu schreiben, das cryptsetup luksOpen aufruft. Der einzige Grund für C ist, dass a) ich nicht viel Ahnung von Shell-Skripten habe und b) ich zufällig mit C klarkomme und c) der C-Code das erste war, das Google ausgespuckt hat und d) niemand mehr als 5 Minuten für ein Programm in einem anonymen Forum opfern will, das nur ein einziges Mal laufen soll. Also...whatever works.
 
Gerade versuche ich den Code auszuführen, doch ich habe noch eininge Schwierigkeiten:

Ich habe den Code in den Texteditor gedit kopiert und im Desktop unter "findpswd.c" abgespeichert.

1.
Die Datei "findpswd.c" liegt mit den geänderten Werten auf dem Desktop. Wenn ich im Terminal den Befehl "gcc -o findpswd findpswd.c -lcryptsetup" eingebe kommt folgende Fehlermeldung :

Code:
it@it:~/Desktop$ gcc -o findpswd findpswd.c -lcryptsetup
findpswd.c:13:30: fatal error: libcryptsetup.h: No such file or directory
compilation terminated.

Wie kann ich libcryptsetup.h installieren?


2.

jdcr schrieb:
Code:
// Kandidaten für die letzten drei Zeichen (je weniger desto schneller)
char*		CANDIDATES = "abcABC012!$#\0";

Heißt das, dass "abcABC012!$#\0" alle Möglichkeiten sind, die ausprobiert werden?
D.h. wenn eine der drei letzten Stellen die Zahl "3" war, wird sie nicht ausprobiert?


Viele Grüße und Danke für Eure sehr kompetente Hilfe!!
 
Zuletzt bearbeitet: (Rechtschreibung)
shortrange schrieb:
Wie kann ich libcryptsetup.h installieren?
Probier mal sudo apt-get install libcryptsetup4 oder sudo apt-get install libcryptsetup-dev.

shortrange schrieb:
Heißt das, dass "abcABC012!$#\0" alle Möglichkeiten sind, die ausprobiert werden?
D.h. wenn eine der drei letzten Stellen die Zahl "3" war, wird sie nicht ausprobiert?
Genau. Du musst alle in Frage kommenden Zeichen eintragen.
 
jdcr schrieb:
Probier mal sudo apt-get install libcryptsetup4 oder sudo apt-get install libcryptsetup-dev.

sieht so aus:

Code:
it@it:~/Desktop$ sudo apt-get install libcryptsetup4
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut       
Statusinformationen werden eingelesen... Fertig
libcryptsetup4 ist schon die neueste Version.
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 77 nicht aktualisiert.
it@it:~/Desktop$ sudo apt-get install libcryptsetup-dev
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut       
Statusinformationen werden eingelesen... Fertig
Einige Pakete konnten nicht installiert werden. Das kann bedeuten, dass
Sie eine unmögliche Situation angefordert haben oder, wenn Sie die
Unstable-Distribution verwenden, dass einige erforderliche Pakete noch
nicht erstellt wurden oder Incoming noch nicht verlassen haben.
Die folgenden Informationen helfen Ihnen vielleicht, die Situation zu lösen:

Die folgenden Pakete haben unerfüllte Abhängigkeiten:
 libcryptsetup-dev : Hängt ab von: libcryptsetup4 (= 2:1.4.1-2ubuntu4) aber 2:1.6.1-1kali1 soll installiert werden
E: Probleme können nicht korrigiert werden, Sie haben zurückgehaltene defekte Pakete.
it@it:~/Desktop$ gcc -o findpswd findpswd.c -lcryptsetup
findpswd.c:13:30: fatal error: libcryptsetup.h: No such file or directory
compilation terminated.
it@it:~/Desktop$







jdcr schrieb:
Genau. Du musst alle in Frage kommenden Zeichen eintragen.

Code:
    // Kandidaten für die letzten drei Zeichen (je weniger desto schneller)
    char*	CANDIDATES = "1234567890!"§$%&";

Ich habe jetzt das eingegeben, also alle Zahlen von 0-9 und die Sonderzeichen !"§$%&, doch das Gänsefüßchen beendet die Eingabe, sodass man das Gänsefüßchen selbst nicht als Zeichen ausprobieren kann.
Gibt es dafür eine Lösung?
 
Zuletzt bearbeitet:
jdcr schrieb:
Danke!


Weißt du was hier helfen könnte?


Code:
it@it:~/Desktop$ sudo apt-get install libcryptsetup4
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut       
Statusinformationen werden eingelesen... Fertig
libcryptsetup4 ist schon die neueste Version.
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 77 nicht aktualisiert.
it@it:~/Desktop$ sudo apt-get install libcryptsetup-dev
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut       
Statusinformationen werden eingelesen... Fertig
Einige Pakete konnten nicht installiert werden. Das kann bedeuten, dass
Sie eine unmögliche Situation angefordert haben oder, wenn Sie die
Unstable-Distribution verwenden, dass einige erforderliche Pakete noch
nicht erstellt wurden oder Incoming noch nicht verlassen haben.
Die folgenden Informationen helfen Ihnen vielleicht, die Situation zu lösen:

Die folgenden Pakete haben unerfüllte Abhängigkeiten:
 libcryptsetup-dev : Hängt ab von: libcryptsetup4 (= 2:1.4.1-2ubuntu4) aber 2:1.6.1-1kali1 soll installiert werden
E: Probleme können nicht korrigiert werden, Sie haben zurückgehaltene defekte Pakete.
it@it:~/Desktop$ gcc -o findpswd findpswd.c -lcryptsetup
findpswd.c:13:30: fatal error: libcryptsetup.h: No such file or directory
compilation terminated.
it@it:~/Desktop$
 
Damit kenne ich mich leider auch kaum aus...


Ich hab es nochmal unter Linux Mint probiert und jetzt kommt diese Fehlermeldung:
Code:
mint@mint ~/Desktop $ gcc -o findpswd findpswd.c -lcryptsetup
findpswd.c:10:22: fatal error: stdio.h: No such file or directory
     #include<stdio.h>
                      ^
compilation terminated.

Kannst du damit etwas anfangen?
 
Zuletzt bearbeitet:
Bei beiden Meldungen geht es darum, dass Bibliotheken, die vom Programm eingebunden werden, fehlen. Im ersten Fall die Bibliothek, die die Verschlüsselung regelt, im zweiten Fall die für die Ein- und Ausgabe. Wobei mir schleierhaft ist, wie auf einem System gcc vorhanden sein und gleichzeitig stdio (die Standardbibliothek schlechthin, es gibt wahrscheinlich kein C-Programm, das die nicht verwendet) fehlen kann.

Ich habe gerade kein Live-System zur Hand, aber ich glaube ich habe unter Mint nur das Paket build-essential installiert und vielleicht noch libcryptsetup-dev.

Bei dem libcryptsetup-Fehler scheint etwas mit den Versionen nicht zu stimmten. Was passiert denn, wenn du nur ...-dev und nicht ...4 installierst?
 
Zuletzt bearbeitet:
Zurück
Oben