Amazon EC2: Tor .onion Adressen auf GPU-Instanz generieren

Achtung! Dieser Artikel ist älter als ein Jahr. Der Inhalt ist möglicherweise nicht mehr aktuell!

Aktuell bin ich dabei diesen Blog auch via eines Hidden Services anzubieten.

Die .onion Adresse setzt sich aus den ersten 16 Zeichen des Public Kes + „.onion“ zusammen. Ich wollte eine Adresse, die mit velocityblog anfängt. Jetzt könnte man natürlich hergehen und solange einen neuen Key generieren, bis man den gewünschten Prefix hat. Oder man nutzt aktuelle Technologien und wendet rohe Gewalt an.

Amazon EC2

Amazon bietet unter dem Namen AWS (Amazon Web Services) verschiedene Dienste in der (Achtung: Catchphrase) „Cloud“ an. Darunter zum Beispiel EC2 – oder Elastic Computing Cloud.

Amazon betreibt ein paar Rechenzentren auf der Welt verteilt und stellt mit der Elastic Computing Cloud verschiedene virtuelle Server mit unterschiedlichen Eigenschaften zur Verfügung.

Die unterschiedlichen Typen

Kurz aufgeschlüsselt:

Mehr Informationen gibt es hier.

Preismodell

Das Preismodell ist etwas kompliziert. Das AWS Konto an sich kostet nichts. Für die erste Registrierung bekommt man ein 750 Stunden gratis Kontingent, die man für T-Instanzen verwenden kann.

Jeder andere Service kostet ein bisschen Geld. Der genaue Preis unterscheidet sich je nach Region. Abgerechnet wird Stundenweise.

Nicht jeder Instanz-Typ ist in jeder Region verfügbar.

Eine Auflistung der Preise findet man hier. Aktuell kann man meines Wissens nach nur mit Promo-Codes oder einer hinterlegten Kreditkarte bezahlen.

G2-Instanzen

Da ich viel Rechnen will habe ich mich für die g2.2xlarge-Instanz entschieden. Diese hat eine Kepler GPU mit ein bisschen was über 1530 CUDA-Kernen. Für so eine Instanz bezahlt man in der Region „EU (Irland)“ 0,702$ pro Stunde. Mit Steuern und sonstigen Gebühren kann man ca. mit 1 $ pro Stunde rechnen.

Die nächsthöhere Instanz g2.8xlarge hat vier Grafikkarten und kostet 2,808$ pro Stunde.

Achtung: Wahl des Betriebssystems

Es ist nicht möglich diese Instanzen mit einem Windows Betriebssystem zu verwenden!

Ebenso ist ein Linux mit grafischer Oberfläche nicht dazu geeignet.

Warum genau kann ich nicht sagen. Ich denke, dass die Grafikkarte exklusiv gelockt wird.

Schritt für Schritt

Jetzt geht’s los. Wichtig ist, dass man sich schon in die AWS Konsole eingeloggt hat und eine Kreditkarte hinterlegt ist.

Richtige Region wählen

Ich benutze immer die Region EU (Ireland). In dieser Region ist die Instanz am billigsten und so gut wie nie ausgelastet.

Auf der Startseite im oberen rechten Eck ist dazu die Auswahlbox.

AWS-Console-Overview

Instanz erstellen

Nun klickt man auf EC2 im oberen linken Teil der AWS Konsole. Es wird eine Übersichtsseite mit den aktuell laufenden Instanzen in dieser Region angezeigt.

Klicke auf „Lauch Instance“.

EC2-launch-instance

 

Im nächsten Schritt wird man nach dem gewünschten AMI (Amazon Machine Image) gefragt. Wähle im linken Menü „Community AMIs“ aus und gib in das Suchfeld „gpu“ ein.

EC2-AMI-Selection

 

Eine gutes vorgefertigtes AMI ist die „amzn-ami-gpu-hvm-2014.09.2.x86_64-ebs – ami-21ce4256“.

Dieses Image ist ein headless CentOS System mit vorinstalliertem NVIDIA SDK und passende OpenCL Bibliotheken.

Nach dem Klick auf „Select“ filtert man in der ersten Box nach „GPU instances“. Danach werden zwei Varianten vorgeschlagen.

Die g2.2xlarge hat eine GPU, die g2.8xlarge hat vier. Für mein Vorhaben reicht eine GPU, deshalb nehme ich die g2.2xlarge.

EC2-Select-Instance

 

Nun kann man sich entweder durch die 5 anderen Punkte klicken oder gleich auf „Review and Launch“ klicken. Es schadet aber nicht, wenn man sich die anderen Punkte durchliest.

Sobald man am Ende angelangt ist wird man nach einem Key Pair gefragt. Wähle „Create a new key pair“ aus und nenne ihn nach belieben. Klicke auf „Download Key Pair“. Danach kannst du mit „Launch Instances“ die Instanz fertigstellen und starten.

**Hinweis: Spot Instances

** In Schritt 3 Kann man die Option „Request Spot Instance“ wählen.

Aktiviert man diese Option, kann es sein, das die G-Instanz nicht sofort verfügbar ist, sondern erst nach ein paar Minuten oder Stunden. Zudem ist die Verfügbarkeit nicht Gewährleistet. Kommt in der Zwischenzeit ein anderer Kunde, der den vollen „On-Demand“-Preis bezahlt, verliert man die Instanz vorerst.

Dafür bietet Amazon auch einen Preisnachlass an. Vorallem Nachts in der EU sind Preisnachlässe von 90% auf den Stundenpreis durchaus realistisch.

Amazon macht das um immer eine optimale Auslastung Ihrer Systeme zu haben. Mit Hardware die sich langweilt kann man kein Geld verdienen.

Man kann sich durchaus überlegen, ob man dieses Angebot nutzen will. Die Schlüsselsuche hat keinen „Fortschritt“. Folglich wäre es egal, wenn mittendrin die Instanz wegbricht.

Keys generieren

Einloggen auf der Maschine

Nach ca. 3 bis 5 Minuten wird die Instanz in der AWS Konsole als „running“ bezeichnet.

Einloggen auf der Instanz mit Hilfe des Schlüssels, den man sich von Amazon heruntergeladen hat:

:~$ ssh -i ~/Downloads/asdf.pem ec2-user@ip

Ersetze asdf.pem und ip durch die Werte des heruntergeladenen Schlüssels bzw. der Instanz-IP.

Sofort nach dem einloggen macht man sich zum Administrator:

:~$ sudo -i

Herunterladen der Software

Für die Berechnung braucht man das Programm Scallion. Es ist auf GitHub verfügbar. Der Entwickler stellt vorkompilierte Binaries bereit.

:~$ wget https://github.com/lachesis/scallion/raw/binaries/scallion-v2.0.zip

Kompilieren des Mono Frameworks

Das Programm ist leider in C# geschrieben und damit es auf Linux läuft benötigt man das Mono-Framework. Dieses habe ich mir selbst kompilieren müssen, da in den CentOS Repos die Abhängigkeiten einfach nicht auflösen wollten.

Die jeweils aktuelle Version kann man sich hier herunterladen. Ich demonstriere es anhand der aktuellen Version 4.0.2.5:

:~$ wget http://download.mono-project.com/sources/mono/mono-4.0.2.5.tar.bz2
:~$ tar xfj mono-4.0.2.5.tar.bz2
:~$ cd mono-4.0.2.5
:~$ ./configure
:~$ make
:~$ make install

Nachdem dieser Schritt erledigt ist, kann man endlich loslegen.

Keys generieren

Wechsle ins Verzeichnis von Scallion (Das Verzeichis, in dem sich die scallion.exe befindet).

Eine Liste der verfügbaren und Ansprechbaren Grafikkarten kann man mit

:~$ mono scallion.exe -l

auflisten. Mit dem Parameter -d kann man die gewünschte GPU auswählen. Hat man nur eine GPU besitzt diese die ID 0.

Ich wollte mir eine Adresse mit dem Prefix „velocityblog“ generieren lassen. Scallion nimmt die zu generierende Adresse als RegEx an. Mein Programmaufruf sieht also wie folgt aus:

:~$ mono scallion.exe -d 0 ^velocityblog

Danach rattert Scallion auch schon los und prüft erstmal, ob die CPU und die GPU den selben Hash eines Wertes liefern. Im Normalfall sollte das so sein.

Der Rest der Ausgabe ist selbsterklärend. Es wird mit Hilfe der CPU ein Key erstellt und mit Hilfe der GPU der Exponent erhöht und versucht eine Kollision zu erzeugen.

Irgendwann ist das Programm (hoffentlich) fertig und spuckt einen Private Key und die daraus resultierende .onion Adresse aus.

in der README des Projekts findet man mehr nützliche Kommandozeilenparameter. Zum Beispiel kann man mit dem Argument -c sagen, dass er nach einem Match nicht aufhören soll zu suchen.

Auf der Projektseite findet man mehr Argumente und Beispiele für RegExe.

Zusatzinfo: Hashrate

Die Hashrate ist interessant und gibt einen Ausblick auf die ungefähre Dauer bis zur Kollision.

Eine kleine Tabelle zur Veranschaulichung:

Grafikkarte CUDA-Prozessoren Basistakt (MHz) Hashrate (MH/s)
GTX 970 1664 1050 2350 (laut Projekt)
GTX 760 1152 980 450
GTX 870m 1344 941 660
GTX TITAN Z 5760 705 ????

Die Grafikkarte in einer G2 Instanz hat ca. 372 MH/s.

So eine TITAN ist natürlich der Killer. Wenn ich schätzen müsste würde ich sagen, dass man damit ca. 4500 MH/s schafft.

Die NSA könnte sich bestimmt viele Racks nur mir solchen Karten bauen und so zum Beispiel versuchen einen privaten Key zum Beispiel für die Silkroad Adresse silkroad6ownowfk.onion zu generieren.

Für jede Stelle, die man berechnen will, dauert der ganze Vorgang vieeeeeeeeel länger. Selbst wenn man alle GPUs der Welt rechnen lässt, wird es nicht einfacher oder schneller gehen.

Troubleshooting

„The passed regex string is not valid“

Ja, ich bin auch auf das Problem gestoßen. Ich wollte eigentlich veloc1tyblog anstelle von velocityblog haben.

Dadurch, dass Base32 verwendet wird sind nur Werte von A-Z und 2-7 erlaubt.

Siehe hierzu ein Issue auf GitHub.

„OpenSSL.so not found“

Das Paket ist nicht installiert. Das benötigte Paket kann man via YUM runterladen:

yum install libssl-dev

Du hast einen Kommentar, einen Wunsch oder eine Verbeserung? Schreib mir doch eine E-Mail! Die Infos dazu stehen hier.

🖇️ = Link zu anderer Webseite
🔐 = Webseite nutzt HTTPS (verschlüsselter Transportweg)
Zurück