Posted by Silvan am 17 - August - 2010 17 Kommentare

Weil sich mein Intel Core 2 Quad Processor Q9550 in meinem “Server-PC” langweillt und dieser eigentlich 24 * 7 läuft habe ich ein Miniprogramme (wenn man das schon Programm nennen darf) in der Bash geschrieben, welches eine Brute Force Passwortliste erstellen soll.

Der Beitrag besteht aus einem Praxis- und einem Theorieteil. Ich schreibe den Praxisteil absichtlich vor dem Theorieteil, weil man nach der Theorie die Praxis wegen entmutigung nicht mehr lesen würde ;-).

Praxis
Das Miniprogramm besteht aus verschiedenen Dateien:

signs
Enthält alle Zeichen die man im Passwort haben möchte.

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
0
1
2
3
4
5
6
7
8
9

main.bash
Mit dieser Datei kann das Generieren der Passwortliste gestartet werden.

#!/bin/bash
# Checks, if the folder passwords is writable.
test -w passwords || mkdir passwords

# Reads all signs from the file signs into the array signs
u=0
while read line
do
        signs[$u]=$line
        u=$u+1
done < signs

# For every sign it starts a subprocess and save the pid in the file pids.
z=${#signs[*]}
for (( i=0; $i < $z; i=i+1 )) do         ./sub.bash ${signs[$i]} &         echo $! >> pids
done

sub.bash
Dieses Script wird von main.bash aufgerufen und generiert Passwörter.

#!/bin/bash
# Location of the lists.
pwfolder=passwords

u=0
while read line
do
        signs[$u]=$line
        u=$u+1
done < signs

z=${#signs[*]}
for (( i=0; $i < $z; i=i+1 )) do         echo $1${signs[$i]} >> $pwfolder/$1"2".password
done

while read line
do
        for (( i=0; $i < $z; i=i+1 ))         do                 echo $line${signs[$i]} >> $pwfolder/$1"3".password
        done
done < $pwfolder/$1"2".password

while read line
do
        for (( i=0; $i < $z; i=i+1 ))         do                 echo $line${signs[$i]} >> $pwfolder/$1"4".password
        done
done < $pwfolder/$1"3".password

while read line
do
        for (( i=0; $i < $z; i=i+1 ))         do                 echo $line${signs[$i]} >> $pwfolder/$1"5".password
        done
done < $pwfolder/$1"4".password

while read line
do
        for (( i=0; $i < $z; i=i+1 ))         do                 echo $line${signs[$i]} >> $pwfolder/$1"6".password
        done
done < $pwfolder/$1"5".password

while read line
do
        for (( i=0; $i < $z; i=i+1 ))         do                 echo $line${signs[$i]} >> $pwfolder/$1"7".password
        done
done < $pwfolder/$1"6".password

while read line
do
        for (( i=0; $i < $z; i=i+1 ))         do                 echo $line${signs[$i]} >> $pwfolder/$1"8".password
        done
done < $pwfolder/$1"7".password

stop.bash
Damit kann das ganze Miniprogramm beendet werden.

#!/bin/bash
while read line
do
        kill $line
done < pids
rm pids

Die Scripts können 1:1 kopiert und ausprobiert werden. Gestern habe ich das Script gestartet. Nach ca. 22 Stunden, weiteren 31GB belegtem Speicherplatz und einem Marathon für die CPU habe ich heute das Miniprogramm bei 9baoori abgebrochen. Das sind ca. 4’418’538’970 Kombinationen was ca. 55’789 Kombinationen / s sind. Dies waren jedoch nur die Kleinbuchstaben a-z und die Ziffern 0-9. Grossbuchstaben und Sonderzeichen müssten in der Passwortliste auch enthalten sein.

Selbstverständlich hat das Script und die Methode (es könnte zum Beispiel auch eine SQL Datenbank anstatt Files zur Speicherung der Möglichkeiten verwendet werden) noch Verbesserungspotenzial, der Theorie zur Folge ist eine Passwortliste mit allen Klein- und Grossbuchstaben, den Ziffern 0-9 und Sonderzeichen jedoch schier unmöglich, weshalb ich jetzt auch nicht mehr weiterhirne ;-).

Trotzdem hat es Spass gemacht zu versuchen eine Passwortliste zu erstellen und solch eine Aufgabe ist super geeignet in einer neuen Programmiersprache die Schleifen zu üben.

Theorie
Nehmen wir an, dass die Passwortliste aus dem Alphabet (gross und klein), allen Ziffern und den Sonderzeichen + ” * % & / ( ) = ? ! ü ö ä – _ besteht. Das sind 78 Zeichen. Die nachfolgenden Tabellen geben Aufschluss über Anzahl Möglichkeiten, benötigter Speicherplatz und benötigte Zeit.

Möglichkeiten
78 = 78^1, 78*78 = 78^2 und so weiter, die Tabelle sollte also stimmen.

Möglichkeiten Stellen
78 1
78^2 = 6’084 2
78^3 = 474’552 3
78^4 = 37’015’056 4
78^5 = 2’887’174’368 5
78^6 = 225’199’600’704 6
78^7 = 17’565’568’854’912 7
78^8 = 1’370’114’370’683’140 8
78^9 = 106’868’920’913’285’000 9
78^10 = 8’335’775’831’236’200’000 10

Benötigter Speicherplatz
Wir nehmen an, dass 1 Zeichen 1 Byte gross ist. Der Speicherplatz berechnet sich so: Anzahl Stellen * Anzahl Möglichkeiten * 1Byte.

Speicherplatz Stellen
78 Byte 1
78^2 = 12,168 Kilobyte 2
78^3 = 1,423656 Megabyte 3
78^4 = 148,060224 Megabyte 4
78^5 = 14,435871840 Gigabyte 5
78^6 = 1,351197604224 Terabyte 6
78^7 = 122,958981984384 Terabyte 7
78^8 = 10,960914965465100 Petabyte 8
78^9 = 961,820288219561000 Petabyte 9
78^10 = 83,357758312362000000 Exabyte 10

Benötigte Zeit
Wir nehmen an, dass wir 55’789 Kombinationen / s erstellen können. Die Zeit berechnet sich so: Anzahl Möglichkeiten / 55’789 Kombinationen / s.

Zeit Stellen
<1s 1
<1s 2
9s 3
11m 4
14,37h 5
46,7d 6
9,98j 7
778,76j 8
60’743j 9
4’737’954j 10

Diese Werte basieren natürlich nur auf der Performance meines Computers. Um eine Brute Force Passwortliste zu erstellen würde man einen Supercomputer oder einen Computercluster und extrem viel Storage benötigen.

Zudem frage ich mich, soll man überhaupt so viel Rechenpower und Storage für eine Brute Force Passwortliste verschwenden? Denn jemand, der seine Daten / sein Login gut schützen will, wird bestimmt ein Passwort mit 20 Zeichen und mehr verwenden. Zudem müssen all diese Passwörter auch noch durchprobiert werden, was nochmals Zeit benötigt. Solch eine Brute Force Passwortliste lohnt sich also nur für Passwörter bis 6 Zeichen, falls man mal zum Beispiel ein Passwort für ein RAR Archiv vergessen hat. Bei 6 Zeichen wird aber schon 1,35 TB Speicherplatz benötigt!

Ich hoffe ich konnte euch einen Einblick in die Dimensionen, welche solch eine Brute Force Passwortliste annehmen kann, geben.

17 Kommentare.

  1. Hippi4wil sagt:

    mich würde interessieren welche endung die dateien haben sollen/ txt oder so ??

  2. Silvan sagt:

    Die Endung der Textdateien ist in diesem Fall unter Linux egal. Könntest die Dateien auch .blubb nennen ;-). Hauptsache, ein Programm welches die Brutteforce Attacke durchführen soll kann die Liste öffnen und benutzen.

  3. Jonny Bravo sagt:

    Danke funktioniert super :)

  4. Silvan sagt:

    Danke, kein Problem. Sagst wenn du deine Liste in ein paar Jahren hast ^^.

  5. dävä sagt:

    darf ich fragen, wie mann dein “programm” ausführen kann?
    (Unter Win 7) oder mus ich dazu Linux runterladen?

  6. Silvan sagt:

    Du kannst es unter Linux ausführen. Hast du aber ein paar Batchkenntnisse, kannst du das gleiche auch mit Batch machen ;-). Aber eben, so eine Passwortliste zu generieren ist eigentlich unsinnig, da es zu lange dauert und zu viel Speicherplatz benötigt um ein normales Passwort zu knacken.

  7. dävä sagt:

    das es unsinnig ist is mir auch klar ;) (und zudemm bräuchte man ja auch noch ein programm wo das ganze ausführt)
    also batch kentnisse hab ich leider keine… kannst du mir veraten wo resp. wie man das (er-)lernt?

    lg

  8. Silvan sagt:

    Guck mal hier. Da stehen schon ein paar Dinge. Am einfachsten ist es, wenn du den Ablauf des Programms zuerst auf ein Papier schreibst (einen sogenannten Programmablaufplan ^^) und diesen dann ausprogrammierst mit einer Sprache, eben z.B. Batch. Für das Beispiel im Beitrag benötigst du FOR Schleifen. Gruss Silvan.

  9. Schmunzler sagt:

    Hey das funktioniert nicht :( weder bei windows, noch bei mac noch bei linux. WIE GEHT DAS :(

  10. Silvan sagt:

    Das Script funktioniert nicht unter Windows, nur unter Unix Betriebssystemen. Was funktioniet denn genau nicht? Gruss

  11. Schmunzler sagt:

    also ich habs jetzt mit:
    WINDOWS
    MAC
    Linux debian
    und Linux openSuse
    versucht dei könne das nicht richtig öffnen und wenn dann erstellt er nen ordner mit den passwörtern aber mehr auch nich und das konsolenfenster schließt sich innerhalb 1 sekunde wieder.

  12. Silvan sagt:

    Also mit Windows kann das nicht funktionieren, da es ein Bash Script ist. Mit Mac könnte es funktionieren, habe ich aber nicht getestet. Mit Linux funktioniert das Script ;-), hab ich selbst ausprobiert. “und wenn dann erstellt er nen ordner mit den passwörtern aber mehr auch nich”. Joa, das ist der Sinn dieses Blogbeitrags. Am Ende kommt nur eine Liste mit möglichen Passwörtern raus. Dass das Script gleich dein Passwort (von was auch immer), herausfindet, ist ein wenig zu viel verlangt ;-). Schau mal hier: http://www.linux-services.org/shell/. Da werden die Grundlagen gut erklärt. Danach bringst du das Script bestimmt zum Laufen. Gruss Silvan

  13. Schmunzler sagt:

    nein das meinte ich nicht… egal funktioniert! Ist das normal das der 1000 Datein erstellt? ich dachte der macht 1 Datei, kannste auch ein Skript schriben das die Listen zusammenfügt ;)

  14. Iceman81 sagt:

    Moin,
    wäre es nicht sinnvoll wenn die PWs in einer großen Liste rauskommen oder man irgendwie die Daten noch komprimiert, weil es werden ja auch jedesmal nen paar Byte verschwendet für ne neue Datei abzuspeichern, es wird ja nicht nur der inhalt gesaved!

  15. Silvan sagt:

    Doch, das wäre viel sinnvoller. Das Script ist aber sehr rudimentär ;-). Am Schluss könnte man die Listen mit cat vereinen. Ich habe mehrere Listen gemacht, damit ich mehrere Scripts starten kann und somit mehrere CPUs auslasten kann. Mit nur einer Liste und nur einem Script arbeitet nur ein Core.

  16. a_user sagt:

    die zugehörige Liste mit Benutzernamen erzeugt man am einfachsten auf einem Linux-Host mit public ssh port:

    cat /var/log/auth.log* | grep invalid | awk ‘{print $9}’ | uniq | sort >> users.txt

    :-)

  17. Silvan sagt:

    Hehe ja, auch eine Möglichkeit. Und viel realistischer :D.