Rechencluster für Hashcat mit VCL

In vorherigen Artikeln auf TacticalCode wurde bereits die Thematik der Berechnung von Passwörtern/Passphrases aufgegriffen, wie z.B. in Damons Artikel über WPA2-PSKs.

In seinem Artikel bewerkstelligte er dies mit dem Tool Hashcat, welches in der Ausführung oclHashcat nicht nur die CPU sondern auch die verbaute GPU zum Berechnen nutzen kann.

VCL Geschwindigkeiten

Geschwindigkeit beim Berechnen verschiedener Hashes mit 25 AMD GPUs via VCL (in GigaHashes pro Sekunde).

Durch die Verwendung der GPU, welche durch ihren Aufbau für solche Aufgaben bedeutend besser geeignet ist als die CPU, konnte die Geschwindigkeit, also die getesteten Kombinationen pro Sekunde, drastisch gesteigert werden. Bei längeren bzw komplexeren Passphrases braucht man jedoch immer noch eine beachtliche Zeit um brauchbare Ergebnisse zu erzielen. Die Lösung für dieses Problem ist simpel: Mehr Rechenpower in Form von mehr GPUs!

Doch wer nicht gerade ein zweites Exemplar seiner Grafikkarte zur Hand hat, kann Crossfire/SLI (das Betreiben zweier oder mehr Grafikkarten in einem PC) nicht nutzen. Und hier kommt VCL ins Spiel.

Was ist VCL?

Um die Leistung der Grafikkarte für die Berechnung von Passwörtern und Ähnlichem zu nutzen, bedarf es einer Schnittstelle, über welche Hashcat die GPU ansprechen kann: OpenCL (Open Computing Language). Mit OpenCL kann man jedoch nur „lokale“ GPUs ansprechen, welche im Computer verbaut sind. Durch Limitationen vom Mainboard, dem BIOS und den Treibern ist die Anzahl der parallel betriebenen Grafikkarten auf 8 begrenzt. Des weiteren müssen diese Grafikkarten, wie oben schon erwähnt, alle die selbe GPU benutzen.

VLC (Virtual Computing Language) ist ein sogenannter Wrapper für OpenCL, nutzt dies also als Grundlage, erweitert es aber um einige Funktionen. Der Hauptaspekt von VCL liegt auf dem betreiben sogenannter Rechencluster. Ein Rechencluster ist in diesem Fall ein Netzwerk mit mehreren PCs, deren Leistung von Hashcat genutzt werden kann.

Wie funktioniert VCL?

Ein VCL-Rechencluster für Hashcat besteht aus zwei Teilen:

Broker Node

Die sogenannte Broker Node ist der Computer im Netzwerk, welcher die Aufgaben und das Rechnen koordiniert. Diese Node selbst benötigt keine OpenCL-kompatibelen Geräte und Treiber. Allgemein muss diese Node nicht sehr Leistungsfähig sein, sie braucht nur eins: Unmengen an RAM. Da die Ergebnisse des verteilten Rechnens hier zusammenlaufen, braucht man viel Speicher um diese entgegenzunehmen und zusammenzufügen.

Des weiteren beherbergt die Broker Node all die benötigte Software, also das OpenCL Framework und Hashcat, diese müssen für den Betrieb nicht auf den Compute Nodes installiert sein. Einzig die VCL Software muss vorhanden sein.

Compute Node

Von diesen Compute Nodes gibt es in der Regel mehrere im Netzwerk, da diese die eigentliche Arbeit der Berechnung vornehmen. Diese Geräte müssen jeweils mindestens ein OpenCL-kompatibeles Gerät mit den entsprechenden Treibern besitzen.

Ein vereinfachtes Schema eines VCL-Clusters

Ein vereinfachtes Schema eines VCL-Clusters

ACHTUNG: Von VCL werden im Moment NUR AMD Grafikkarten unterstützt!

Neben dem benötigten Treiber muss noch die VCL Software installiert sein, alles andere wird von der Broker Node bereitgestellt.

Beginnt man in einem fertig installierten Rechencluster nun eine Operation mit Hashcat, wird die auf der Broker Note vorhandene Hash file mit Hashcat zusammen an jede Compute Node geschickt, welche dann beginnen, zu rechnen.

Welche Bereiche der Hash file von welcher Compute Node berechnet werden, wird von der Broker Node gesteuert. Da alle Daten permanent zwischen Broker Node und den Computer Nodes ausgetauscht werden, also eine synchrone Berechnung stattfindet, verursacht dieser Vorgang eine unglaubliche Menge an Traffic. Für die bestmögliche Performance ist mindestens ein Gigabit-Netzwerk erforderlich, als Empfehlung wird auf der Hashcat-Seite ein sog. Infiniband-Netzwerk gelistet (Infiniband ist eine Netzwerktechnik, welche meist bei professionellen Rechenclustern etc. genutzt wird, Bandbreiten von 40 GBIT/s und mehr sind Möglich. Da diese Netzwerktechnik häufig in Firmen genutzt wird, auf dem Markt für Privatnutzer aber kaum zu finden ist, kosten gebrauchte Infiniband-Komponenten ein stolzes Sümmchen.).

Ein VCL-Rechencluster aufbauen

Jetzt kommen wir endlich zum praktischen Teil der ganzen Sache: Ein VCL-Rechencluster für Hashcat aufbauen.

Hier ist einmal die Liste aller Voraussetzungen:

Hardware:

  • mindestens 2 Computer, verbunden via TCP/IP
  • mindestens 8GB Arbeitsspeicher
  • mindestens eine AMD GPU, nVidia wird nicht unterstützt
  • ein privates Hochgeschwindigkeitsnetzwerk (mindestens Gigabit, besser Infiniband, kein Internet/WiFi/VPN!)

Software:

  • Linux 64-Bit Distribution (32-Bit wird nicht unterstützt, Windows wird nicht unterstützt)
  • Catalyst Treiber Version 13.1 (es muss exakt diese Version sein!)
  • VCL Version 1.17 oder höher
  • oclHashcat-plus/-lite Version 0.13 oder höher

Anmerkung zum Netzwerk:

Da es sich beim Berechnen mit dem VCL-Cluster um synchrones Berechnen handelt, werden riesige Daten durchs Netzwerk transportiert. Daher empfiehlt es sich, für den Cluster ein komplett separates Netzwerk ohne fremde Geräte aufzubauen. Außerdem sollten so wenig Router/Switches/Hubs wie Möglich verwendet werden, da jedes Routing die Latenz erhöht. Dies mag an sich nicht sehr viel sein, beeinträchtigt die Performance u.U. aber enorm!

Sind die oben gelisteten Voraussetzungen soweit erfüllt, kann es losgehen. Jede Node im Netzwerk benötigt die VCL-Software, also muss auf jeder Node im Cluster folgendes durchgeführt werden:

VCL installieren

Als erstes muss die VCL-Software heruntergeladen werden:

wget http://www.mosix.org/vcl/VCL-1.17.tbz

Anschließend wird das Archiv extrahiert:

tar xf VCL-1.17.tbz

Als nächstes muss VCL installiert werden. WICHTIG: Nicht den mitgelieferten Install-Script nutzen. Dieser wurde für openSUSE bzw MOSIX geschrieben und funktioniert auf anderen Distributionen wie Ubuntu nicht. Alle Befehle müssen als root ausgeführt werden:

cd vcl-1.17/

mkdir /usr/lib/vcl /etc/vcl

install -m 0755 -o root opencld /sbin/opencld

install -m 0755 -o root opencld_1.2 /sbin/opencld_1.2

install -m 0755 -o root broker /sbin/broker

install -m 0755 -o root libOpenCL.so /usr/lib/vcl/libOpenCL.so

install -m 0644 -o root man/man7/vcl.7 /usr/share/man/man7/vcl.7

ln -s libOpenCL.so /usr/lib/vcl/libOpenCL.so.1

ln -s libOpenCL.so.1 /usr/lib/libOpenCL.so

Im letzten Schritt wird ein von epixoip geschriebener Init-Script heruntergeladen und installiert:

wget http://bindshell.nl/pub/vcl.init

install -m 0755 -o root vcl.init /etc/init.d/vcl

update-rc.d vcl defaults

Die Compute Nodes einrichten

Damit haben wir die VCL-Software installiert. Als nächstes werden die Compute Nodes eingerichtet, wir sagen also den entsprechenden Computern, dass sie als Rechenmaschinen fungieren.

Die folgenden Befehle sollen NUR auf den Compute Nodes ausgeführt werden!

Zuerst sagen wir VCL, dass dieser Computer ein Compute Node ist:

touch /etc/vcl/is_back_end

Da das von VCL standardmäßig genutzte OpenCL 1.1 nicht mit unserem Catalyst-Treiber kompatibel ist, müssen wir ihn explizit anweisen, OpenCL 1.2 zu nutzen:

touch /etc/vcl/amd-1.2

Nun deaktivieren wir die Zugriffskontrolle des X11-Servers, damit VCL auf den Monitor zugreifen darf:

xhost +

Als letzten Schritt wird VCL mit dem vorher heruntergeladenen Script ausgeführt:

/etc/init.d/vcl start

Die Broker Node einrichten

Damit hätten wir die Compute Nodes installiert und eingestellt, nun begeben wir uns zur Broker Node:

Wieder müssen wir VCL die Rolle des Computers mitteilen, in diesem Falle ist er die Broker Node:

touch /etc/vcl/is_host

Als nächsten Schritt entfernen wir evtl. von einem vorherigen Start vorhandene Einstellungen und fügen dann die IPs der Compute Nodes in die Datei /etc/vcl/nodes, damit die Broker Node weiß, welche Computer sie ansprechen soll:

rm -f /etc/vcl/nodes

echo 192.168.XXX.XXX >> /etc/vcl/nodes

echo 192.168.XXX.XXY >> /etc/vcl/nodes

Hier müsst ihr natürlich die Netzwerk-IPs eurer Compute Nodes eintragen! ;)

Auch hier ist der letzte Schritt das Starten von VLC:

/etc/init.d/vcl start

Hashcat installieren

Um Hashcat nutzen zu können, muss es natürlich installiert sein. WICHTIG: Hashcat wird NUR auf der Broker Node installiert!

Als erstes laden wir die Datei herunter mit:

wget http://hashcat.net/files/oclHashcat-plus-0.13.7z

Nun müssen wir die Datei entpacken. Dies tun wir unter Linux mit dem Tool p7zip (jedes andere Programm kann gerne genutzt werden, ich nehme hier allerdings p7zip als Beispiel):

p7zip -d oclHashcat-plus-0.13.7z

Das Programm erstellt nun einen Ordner namens oclHashcat-plus-0.13, in dem sich das Programm befindet.

Hashcat starten

Als erstes wechseln wir mithilfe des cd Befehls in das Hashcat-Verzeichnis. Hier müssen wir Hashcat jetzt sagen, wo es die OpenCL-Library findet, die es benutzen soll. Da wir diese im Verzeichnis /usr/lib/vcl haben, müssen wir folgenden Befehl ausführen:

export LD_LIBRARY_PATH=/usr/lib/vcl

Als letzten Schritt starten wir einfach die vclHashcat binary mit den entsprechenden Argumenten und es geht los.

Hashcat wird nun beginnen, mithilfe aller Compute Nodes die angewiesene Operation durchzuführen und wir haben erfolgreich ein Rechencluster aufgebaut!

Hier ein kleines Beispiel aus dem Hashcat-Wiki, wie das dann aussehen könnte:

root@token:~/oclHashcat-plus-0.10-12.8# ./vclHashcat-plus64.bin -t 32 -a 7 example0.hash ?a?a?a?a example.dict

oclHashcat-plus v0.10 by atom starting...

Hashes: 6494 total, 1 unique salts, 6494 unique digests

Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes

Workload: 256 loops, 80 accel

Watchdog: Temperature abort trigger disabled

Watchdog: Temperature retain trigger disabled

Device #1: Cayman, 1024MB, 800Mhz, 24MCU

Device #2: Cypress, 512MB, 800Mhz, 20MCU

Device #3: Cayman, 1024MB, 800Mhz, 24MCU

Device #4: Cypress, 512MB, 800Mhz, 20MCU

Device #5: Cayman, 1024MB, 800Mhz, 24MCU

Device #6: Cypress, 512MB, 800Mhz, 20MCU

Device #7: Cayman, 1024MB, 800Mhz, 24MCU

Device #8: Cypress, 512MB, 800Mhz, 20MCU

Device #9: Cayman, 1024MB, 800Mhz, 24MCU

Device #10: Cypress, 512MB, 800Mhz, 20MCU

Device #11: Cayman, 1024MB, 800Mhz, 24MCU

Device #1: Kernel ./kernels/4098/m0000_a1.Cayman_938.2_CAL 1.4.1741.kernel (490316 bytes)

Device #2: Kernel ./kernels/4098/m0000_a1.Cypress_938.2_CAL 1.4.1741.kernel not found in cache! Building may take a while...

Device #2: Kernel ./kernels/4098/m0000_a1.Cypress_938.2_CAL 1.4.1741.kernel (456788 bytes)

Device #3: Kernel ./kernels/4098/m0000_a1.Cayman_938.2_CAL 1.4.1741.kernel (490316 bytes)

Device #4: Kernel ./kernels/4098/m0000_a1.Cypress_938.2_CAL 1.4.1741.kernel (456788 bytes)

Device #5: Kernel ./kernels/4098/m0000_a1.Cayman_938.2_CAL 1.4.1741.kernel (490316 bytes)

Device #6: Kernel ./kernels/4098/m0000_a1.Cypress_938.2_CAL 1.4.1741.kernel (456788 bytes)

Device #7: Kernel ./kernels/4098/m0000_a1.Cayman_938.2_CAL 1.4.1741.kernel (490316 bytes)

Device #8: Kernel ./kernels/4098/m0000_a1.Cypress_938.2_CAL 1.4.1741.kernel (456788 bytes)

Device #9: Kernel ./kernels/4098/m0000_a1.Cayman_938.2_CAL 1.4.1741.kernel (490316 bytes)

Device #10: Kernel ./kernels/4098/m0000_a1.Cypress_938.2_CAL 1.4.1741.kernel (456788 bytes)

Device #11: Kernel ./kernels/4098/m0000_a1.Cayman_938.2_CAL 1.4.1741.kernel (490316 bytes)

Cache-hit dictionary stats example.dict: 1210228 bytes, 129988 words, 129988 keyspace

e973fc5ba3f41964b28cbf1d3d3e7f5c:dyn10001000

7ac74b85753f5cee6c9446b103cc59e8:scas0000

aa1ce869d58da099b8c15859540ad220:linn01111986

0142b84c7d5ab92691cf9e21fbca9a08:f8140123

5be4a34c048a4d4af2462679b7886151:55bo02020202

d2a92d0b635bdc8fd3df226b7084dc8c:368901man

Wie eigentlich für alles, gilt auch hier: Dies soll keine Anstiftung zum Cracken aller möglichen Keys sein, damit ihr euch unbefugten Zugriff verschaffen könnt. Ich will lediglich die Möglichkeiten aufzeigen, die einem mit Programmen wie VCL gegeben werden ;)

Dieser Eintrag wurde veröffentlicht in Security
Bookmarken: Permanent-Link Schreibe einen Kommentar oder hinterlasse einen Trackback: Trackback-URL.
Achtung: Wordpress interpretiert bestimmte Zeichenfolgen als Markup und verändert diese. Nutzt für Programmcode lieber Gist oder PasteBin-Services und verlinkt die Code-Schnipsel.

Post a Comment

Sie müssen angemeldet sein, um kommentieren zu können.