Hacking mit Python, Teil 1 Grundlagen des Ethical Hacking

Autor / Redakteur: Dipl. -Ing. Thomas Drilling / Stephan Augsten |

In diesem Workshop verwenden wir die Programmiersprache Python, um ein Passwort zu entschlüsseln. Genauer gesagt prüfen wir einen auf irgendeine Weise erlangten Passwort-Hash durch einen Vergleich mit dem MD5-Hash eines gegebenen Wörterbucheintrages auf Übereinstimmung.

Wireshark-Mitschnitt eines TCP-Handshakes.
Wireshark-Mitschnitt eines TCP-Handshakes.
(Bild: Drilling / Wireshark)

Gegen das Verwenden der in diesem Beitrag gezeigten Python-Befehle und Bibliotheken ist rechtlich nichts einzuwenden. Allerdings sind im Kontext des „Ethical Hacking“ (z. Dt.: „ethisch korrektes Hacking“) in Bezug auf die hier rein hypothetische Vorgeschichte zu unserem Beispiel-Szenario ein paar Worte der Warnung angebracht.

Wir müssen schon deshalb kurz auf den so genannten Hacker-Paragraphen hinweisen, um auf der rechtlich einwandfreien Seite zu stehen. Das heißt, dieser Artikel dient zu Lehrzwecken, um den Leser für die Unzulänglichkeit schwacher Passwörter zu sensibilisieren und die Mächtigkeit der Sprache Python hinzuweisen.

Die gedachte Vorgeschichte für unserer Beispiel-Szenario würde allerdings noch andere Werkzeuge wie z. B. einen Netzwerk-Sniffer einschließen. Deren Verwendung fällt ebenfalls unter den Hacker-Paragraphen §202c des Strafgesetzbuchs, der bereits das Vorbereiten des Ausspähens und Abfangens von Daten unter Strafe stellt.

Angriffe auf Passwörter

Vergegenwärtigen wir uns kurz, welche Angriffsformen auf Passwörter denkbar sind. Hierbei unterscheiden wir zwischen dem „Erlangen“ von Passwörtern bzw. Passwort-Hashes und dem „Ermitteln“ des Passwort-Klartextes aus einem vorhandenen bzw. abgefangenen Hash.

Für das „Erlangen“ von Passwörtern kommen prinzipiell folgende Methoden in Frage:

Erraten: Dies setzt einen direkten physischen Zugang zum anzugreifenden System voraus. Das klassische Hollywood-/James-Bond-Szenario, in dem der Held spätestes beim dritten Versuch das Passwort errät, weil es der Name oder der Geburtstag von Partner(in), Kind, Hund oder Wellensittich ist.

Stehlen der Passwort-Datei: Das bietet den Vorteil, nahezu endlos lang Zeit für den Angriff zu haben. Liegt die Passwort-Datei nicht in ge-hash-ter Form, sondern im Klartext vor (soll immer noch vorkommen), sind alle im Folgenden beschriebenen Maßnahmen ohnehin obsolet.

Sniffing: Das Passwort bei der Übermittlung über das Netzwerk im Kontext des jeweiligen Authentifizierungs-Handshakes mit Netzwerk-Sniffern wie Wireshark über das WLAN oder LAN abfangen. Das ist besonders erfolgversprechend bei FTP, HTTP und Telnet (ohne SSL/TLS), da diese Dienste mit Klartext-Passwörtern arbeiten.

Reply: Abfangen des kompletten „Login-Prozesses“, um damit einen Reply-Angriff starten zu können. Ist man durch Abfangen im Besitz des Nutzernamens und des Passwort-Hashes ist es durch erneute Anforderung eines Login-Prozesses und wiederholte Übermittlung des Hashs, der ja dem verschlüsselten Passwort entspricht möglich, sich erfolgreichen anzumelden. Moderne Systeme prüfen allerdings meist auch, ob die Quelle des Login-Versuches (IP-Range, Layer-2-Segment, VLAN) überhaupt zur Anmeldung bei diesem Server berechtigt ist.

Kommen wir zur Frage, wie man das Passwort herausfinden kann. Hier sind prinzipiell die Methoden Keylogger, Brute-Force-Angriff, Dictionary-Angriff und Rainbow Tables denkbar. Keylogger gehören zu den perfidesten Methoden und sind praktisch kaum zu entdecken. Allerdings braucht der Angreifer physischen Zugang zum anzugreifenden System, um den Keylogger initial zu platzieren. Brute-Force-Angriffe funktionieren prinzipiell immer, brauchen aber Zeit und immense Rechenpower.

Wir konzentrieren uns im folgenden Szenario auf einen Wörterbuch-Angriff. Ein solcher ist umso vielversprechender, je größer die Wörterbuch-Datei (kann bis in den TB-Bereich gehen) und je simpler das Passwort ist. Im folgenden Beispiel unterstellen wir, dass wir bereits im Besitz des Passwort-Hashes sind. In der Praxis müsste man die Passwort-Datei stehlen oder den Hash wie oben erwähnt z. B. durch Einsatz eines Netzwerk-Sniffers wie Wireshark abfangen.

Wireshark-Mitschnitt eines TCP-Handshakes.
Wireshark-Mitschnitt eines TCP-Handshakes.
(Bild: Drilling / Wireshark)

In der vorangestellten Abbildung haben wir mit Wireshark lediglich den TCP-Handshake zum Aufbau einer klassischen FTP-Verbindung mitgeschnitten. Das Klartext-Passwort „ftpuser“ für den User „ftpuser“ ist schon unten im Rohdaten-Feld sichtbar

Hackerparagraph

Bevor wir mit dem Hacken von Passwörtern mit Hilfe von Python beginnen, müssen wir aus rechtlichen Gründen auf den Hacker-Paragraphen „Vorbereiten des Ausspähens und Abfangens von Daten“ (§202c des deutschen StGB) aus dem Jahr 2007 hinweisen. Er stellt die Beschaffung und Verbreitung von Zugangscodes zu geschützten Daten sowie auch die Herstellung und den Gebrauch von Werkzeugen, die diesem Zweck dienlich sind, als Vorbereitung einer Straftat unter Strafe (maximal zwei Jahre).

Eine juristische Stellungnahme der European Expert Group for IT Security (EICAR) geht davon aus, dass konstruktive Tätigkeiten (im Dienste der IT-Sicherheit) bei ausführlicher Dokumentation nach diesem Paragraphen nicht strafbar sind. Wer Tools wie z. B. Wireshark im Sinne des White- bzw. Ethical-Hackings beispielsweise zur Analyse und Absicherung der eigenen IT-Infrastruktur oder zu Lehr- und Demonstrationszwecken einsetzt, bewegt sich in einer in der Regel geduldeten Grauzone.

Um zu hundert Prozent auf der sicheren Seite sein, darf man z. B. Wireshark ausschließlich zur Analyse eigener Rechner und Netze bzw. im Auftrag eines Eigners einsetzen, und zwar so, dass andere Netzwerkressourcen davon nicht tangiert sind. Wer als IT-Consultant oder Arbeitnehmer offiziell mit Netzwerkanalysen oder Pentests beauftragt wird, sichert sich am besten vorher rechtlich ab (möglichst schriftlich) und dokumentiert akribisch, was er tut.

Anaconda und Jupyter

Für die Demos im zweiten Teil dieses Workshops nutzen wir im Unterschied zu unserem Python-Einführungskurs keinen Online-Interpreter, keine Kommandozeile und auch keine Python-IDE wie z. B. PyCharm. Zum Einsatz kommt dabei iPython in Form der Webapplikation Jupyter Notebook unter dem Dach der Python-Distribution Anaconda.

Bei Anaconda handelt es sich um eine so genannte Freemium-Open-Source-Distribution für die Programmiersprachen Python und R. Anaconda bringt unter anderem die Entwicklungsumgebung Spyder, den Kommandozeileninterpreter IPython und ein webbasiertes Frontend für Jupyter mit. Anaconda wird häufig dann gerne eingesetzt, wenn es um die Verarbeitung von großen Datenmengen, die Vorhersageanalyse oder wissenschaftliches Rechnen und Kryptographie geht.

Anaconda vereinfacht vor allem das Paketmanagement und die Softwareverteilung, wobei Paketversionen von der eigenen Paketverwaltung “conda“ verwaltet werden. Die Installation und Inbetriebnahme ist einfach und weitgehend selbsterklärend. Für weitere Informationen verweisen wie auf die hervorragende Anaconda Community.

Anaconda bzw. Jupyter bietet vor allem den Vorteil, dass man Code in unabhängigen „Zellen“ ausführen kann, denen jeweils eine eigene Notebook-Instanz zugrunde liegt. Trotzdem bleiben Runtime, Namensräume und Variablen beim Erzeugen einer neuen Zelle erhalten. Da es zudem den Zell-Typ-Markup gibt, dienen Jupyter Notebooks vor allem auch dazu, Code und Markups in einem eigenen „Paket“ zu bündeln und dieses im Ganzen weitergeben zu können, was besonders im Umfeld von Machine Learning sehr populär ist.

(ID:45923143)