Genießen Sie diesen Titel jetzt und Millionen mehr, in einer kostenlosen Testversion

Nur $9.99/Monat nach der Testversion. Jederzeit kündbar.

Python Hacking: Lernen Sie die Sprache der Hacker, testen Sie Ihr System mit Python und schließen Sie die Lücken!

Python Hacking: Lernen Sie die Sprache der Hacker, testen Sie Ihr System mit Python und schließen Sie die Lücken!

Vorschau lesen

Python Hacking: Lernen Sie die Sprache der Hacker, testen Sie Ihr System mit Python und schließen Sie die Lücken!

Bewertungen:
5/5 (1 Bewertung)
Länge:
495 Seiten
5 Stunden
Herausgeber:
Freigegeben:
Sep 23, 2015
ISBN:
9783645223225
Format:
Buch

Beschreibung

Schon einmal selbst gehackt? Na, dann wird es aber Zeit - lernen Sie, wie Hacker mit Python Systeme angreifen und Schwachstellen ausnutzen. Durch Einbindung vorhandener Werkzeuge wie Metasploit und Nmap werden Skripte erschreckend einfach. Nutzen Sie dieses Wissen, um Ihre Systeme auf Lücken zu testen, und schließen Sie diese, bevor andere Ihnen zuvorkommen. Das erlangte Python-Wissen können Sie nicht nur für das Hacken einsetzen, sondern zum Beispiel auch zur Fernsteuerung von Programmen mithilfe von Pexpect.

Bereiten Sie sich vor! Wenn Sie bisher wenig Erfahrung in der Programmierung mit Python haben, dann lernen Sie in Kapitel 1 die notwendigen Grundlagen, um die Beispiele in den darauffolgenden Kapiteln zu verstehen: angefangen bei Variablen und der Behandlung von Ausnahmen über Funktionen bis zu wichtigen Modulen für das Hacking wie sys und os. Diese Grundlagen werden anhand eines Beispiels eingeführt. Schritt für Schritt wird ein Schwachstellenscanner entwickelt. Zum Abschluss des Kapitels bauen Sie ein Skript, um UNIX-Passwörter zu knacken. Danach werden Ihre Passwörter sicher anders aussehen.

Am Quellcode lernen: Hacken und Programmieren lernt man nicht alleine mit Theorie, sondern mit viel Praxis - in diesem Fall mit Quellcode. Alle Hacks, ob SSH-Botnetz, Portscanner oder Analyse des DNS-Datenverkehrs, werden mit aussagekräftigem Quellcode beschrieben. Die relevanten Bestandteile des Quellcodes werden verständlich erklärt. Die Quellcodes der einzelnen Hacks stehen als separater Download zur Verfügung.
Herausgeber:
Freigegeben:
Sep 23, 2015
ISBN:
9783645223225
Format:
Buch

Über den Autor


Ähnlich wie Python Hacking

Ähnliche Bücher

Ähnliche Artikel

Buchvorschau

Python Hacking - T. J. O'Connor

Grundlagen

Das Außergewöhnliche der Kampfkunst liegt für mich in ihrer Einfachheit. Der einfache Weg ist auch der richtige. Kampfkunst ist nicht im Geringsten etwas Spezielles. Je näher am wahren Weg der Kampfkunst, umso weniger Verschwendung von Ausdruck gibt es.

Meister Bruce Lee, Begründer des Jeet Kune Do

1.1 Einführung: Ein Penetrationstest mit Python

Vor Kurzem hat ein Freund von mir einen Penetrationstest am Computersicherheitssystem eines Fortune-500-Unternehmens durchgeführt. Diese Firma hatte zwar ein hervorragendes Sicherheitsverfahren aufgestellt und umgesetzt, doch schließlich fand er eine Schwachstelle auf einem Server ohne Patches. Innerhalb weniger Minuten konnte er das System mit Open-Source-Werkzeugen knacken und sich administrativen Zugang verschaffen. Daraufhin untersuchte er die restlichen Server sowie die Clients, wobei er jedoch keine weiteren Schwachstellen entdeckte. An dieser Stelle endete die Erkundungsphase, und der eigentliche Penetrationstest begann.

In einem Texteditor schrieb mein Freund ein Python-Skript, um die auf dem geknackten Server gefundenen Anmeldeinformationen an den restlichen Computern im Netzwerk auszuprobieren. Damit erhielt er innerhalb von wenigen Minuten administrativen Zugang zu Tausenden von Rechnern. Dabei sah er sich jedoch bald einem unlösbaren Problem gegenüber: Er wusste, dass die Systemadministratoren seinen Angriff bemerken und ihm den Zugang sofort sperren würden. Daher sichtete er schnell die geknackten Computer, um herauszufinden, wo er am besten eine dauerhafte Hintertür installieren sollte.

Beim Studium des Auftragsdokuments für den Penetrationstest stellte mein Freund fest, dass sein Kunde der Absicherung des Domänencontrollers sehr hohen Wert beimaß. Da er wusste, dass sich der Administrator an diesem Domänencontroller mit einem völlig unabhängigen Administratorkonto anmeldete, schrieb mein Freund ein kleines Skript, um Tausende von Computern auf angemeldete Benutzer abzuklopfen. Schon kurze Zeit später wurde er darüber informiert, dass sich der Domänencomputer an einem der Rechner angemeldet hatte. Damit war die Sichtung praktisch vollständig, denn jetzt wusste mein Freund, wo er seinen Angriff fortsetzen sollte.

Die Fähigkeit, schnell zu reagieren und auch unter Druck kreativ zu denken, hat meinen Freund zu einem erfolgreichen Penetrationstester gemacht. Er hat aus kurzen Skripts seine eigenen Werkzeuge hergestellt, um erfolgreich in das Fortune-500-Unternehmen einzudringen. Mit einem kurzen Python-Skript hat er den Zugriff auf mehr als tausend Arbeitsstationen gewonnen, und mit einem weiteren kleinen Skript konnte er diese tausend Arbeitsstationen sichten, bevor ein aufmerksamer Administrator in der Lage war, seinen Zugang zu sperren. Um ein richtiger Penetrationstester zu werden, müssen Sie zur Lösung Ihrer Probleme Ihre eigenen Waffen schmieden können.

Als ersten Schritt, um Ihre eigenen Werkzeuge herzustellen, müssen Sie Ihre Entwicklungsumgebung installieren. Damit wollen wir unsere Betrachtung beginnen.

1.2 Die Entwicklungsumgebung einrichten

Auf der Download-Seite von Python (http://www.python.org/download/) finden Sie Python-Installer für Windows, Mac OS X und Linux. Der Download des Installers versorgt Sie mit dem Python-Interpreter, der Standardbibliothek und mehreren integrierten Modulen. Wenn auf Ihrem System Mac OS X oder Linux läuft, ist der Python-Installer dort wahrscheinlich schon installiert. Die Standardbibliothek und die Module bieten eine breite Palette von Merkmalen wie Datentypen, Ausnahmebehandlung, numerische und mathematische Funktionen, Dateihandhabung, Verschlüsselung, Zusammenspiel mit dem Betriebssystem, Handhabung von Daten aus dem Internet, Interaktion mit IP-Protokollen und andere nützliche Dinge. Sie können jedoch ganz einfach zusätzliche Drittanbieterpakete installieren. Eine umfassende Liste dieser Pakete finden Sie auf http://pypi.python.org/pypi/.

1.2.1 Drittanbieterbibliotheken installieren

In Kapitel 2 setzen wir das Paket python-nmap ein, um nmap-Ergebnisse zu analysieren. Das folgende Beispiel zeigt, wie Sie dieses Paket (oder jedes beliebige andere Paket) herunterladen und installieren. Nachdem Sie das Paket als lokale Datei gespeichert haben, entpacken Sie den Inhalt und wechseln in das unkomprimierte Verzeichnis. Dort geben Sie den Befehl python setup.py install, der das Paket installiert. Diese Vorgehensweise ist für die meisten Drittanbieterpakete erforderlich.

Um die Installation von Python-Paketen noch zu vereinfachen, gibt es in den Python-Setup-Tools das Modul easy_install. Wenn Sie dieses Modul, gefolgt vom Namen des gewünschten Pakets, ausführen, wird das Paket in den Python-Repositorys gesucht, heruntergeladen und automatisch installiert:

Um Ihre Entwicklungsumgebung möglichst rasch einzurichten, sollten Sie die neueste Version der Penetrationstest-Distribution Kali Linux von ­https://www.kali.org herunterladen. Sie enthält einen Schatz an Werkzeugen für Penetrationstests für forensische, Web- und Netzwerkanalyse und Angriffe über drahtlose Verbindungen. Mehrere der in diesem Buch genannten Beispiele stützen sich auf Werkzeuge oder Bibliotheken, die in Kali Linux enthalten sind. Wenn ein Beispiel neben der Standardbibliothek und den eingebauten Modulen noch ein Drittanbieterpaket erfordert, werden Sie im Text darauf hingewiesen, von wo Sie es herunterladen können.

Beim Einrichten einer Entwicklungsumgebung kann es nützlich sein, alle Drittanbietermodule herunterzuladen, bevor Sie beginnen. In Kali können Sie die meisten der für die Beispiele zusätzlich erforderlichen Bibliotheken mit dem folgenden Befehl installieren:

Für Kapitel 5 sind einige besondere Bluetooth-Bibliotheken erforderlich, die Sie nicht über easy_install beziehen können. Verwenden Sie stattdessen den Paketmanager aptitude, um diese Bibliotheken herunterzuladen und zu installieren:

Außerdem brauchen Sie für einige Beispiele in Kapitel 5 und 7 eine Windows-Installation von Python. Den neuesten Python-Installer für dieses Betriebssystem erhalten Sie auf http://python.org/getit/.

In den letzten Jahren wurde der Quellcode von Python in zwei unterschiedliche stabile Branches verzweigt, nämlich Python 2.x und 3.x. Der Urheber von Python, Guido van Rossum, wollte den Code aufräumen und die Sprache einheitlicher gestalten. Dafür aber opferte er bewusst die Rückwärtskompatibilität mit Python 2.x. Beispielsweise hat er die Anweisung print aus Python 2.x durch die Funktion print() ersetzt, die Argumente erfordert. Die in den folgenden Kapiteln vorgestellten Beispiele sind für Python 2.x gedacht. Die aktuelle Kali-Version 1.1 enthält Python 2.7.3.

1.2.2  Interpretiertes und interaktives Python im Vergleich

Wie andere Skriptsprachen ist auch Python eine Interpretersprache. Zur Laufzeit verarbeitet der Interpreter den Code und führt ihn aus. Um das zu veranschaulichen, geben wir den Befehl print \"Hello World\" in eine Datei mit der Endung .py ein. Um dieses neue Skript auszuführen, rufen wir den Python-Interpreter mit dem Namen des Skripts auf:

Zudem bietet Python aber auch Möglichkeiten zur Interaktion. Programmierer können den Python-Interpreter aufrufen und direkt mit ihm arbeiten. Um den Interpreter zu starten, starten Sie Python ohne Argumente. Daraufhin zeigt der Interpreter die Eingabeaufforderung >>> an, was bedeutet, dass er bereit ist, Befehle entgegenzunehmen. An dieser Eingabeaufforderung können Sie nun Befehle wie print Hello World eingeben. Wenn Sie dann die Eingabetaste drücken, führt der Interpreter die Anweisung sofort aus:

Um die Semantik der Sprache deutlich zu machen, wird in diesem Kapitel an einigen Stellen die interaktive Arbeit mit dem Interpreter vorgeführt. Das können Sie daran erkennen, dass in den betreffenden Beispielen die Eingabeaufforderung >>> zu sehen ist.

Bei der Erklärung der Python-Beispiele in den folgenden Kapiteln erstellen wir jeweils Skripte aus Codeblöcken, die als Methoden oder Funktionen bezeichnet werden. Zur Fertigstellung der einzelnen Skripte zeige ich Ihnen jeweils, wie Sie diese Methoden zusammenstellen und von der Methode main() aus aufrufen. Der Versuch, ein Skript auszuführen, das nur die Funktionsdefinitionen enthält, aber keinen Aufruf, bringt nichts. Meistens können Sie das fertige Skript daran erkennen, dass darin eine Funktion namens main() definiert ist. Bevor wir aber damit beginnen, unser erstes Programm zu schreiben, möchte ich Ihnen einige der Hauptbestandteile der Python-Standardbibliothek vorstellen.

1.3  Die Sprache Python

Auf den folgenden Seiten sehen wir uns an, was es mit Variablen, Datentypen, Strings, komplexen Datenstrukturen, Netzwerkverbindungen, bedingten Anweisungen, Iteration, Dateihandhabung, Ausnahmebehandlung und Zusammenspiel mit dem Betriebssystem auf sich hat. Zur Veranschaulichung schreiben wir einen einfachen Schwachstellen-Scanner, der Verbindung mit einem TCP-Socket aufnimmt, die Banner eines Dienstes liest und mit denen von Versionen des Dienstes vergleicht, die Schwachstellen aufweisen. Wenn Sie ein erfahrener Programmierer sind, werden Ihnen einige Teile der ersten Codebeispiele wahrscheinlich hässlich vorkommen. Ich hoffe sogar, dass Sie das so empfinden. Bei der Weiterentwicklung des Skripts in diesem Abschnitt wird es jedoch eine elegantere Gestaltung annehmen, die auch Sie akzeptieren können. Fangen wir mit der Grundlage jeglicher Programmiersprache an, nämlich den Variablen.

1.3.1  Variablen

In Python zeigt eine Variable auf Daten, die an einem bestimmten Speicherort im Arbeitsspeicher abgelegt sind. Dieser Speicherort kann Werte unterschiedlicher Art enthalten, z. B. Ganzzahlen (Integer), reelle Zahlen, boolesche Werte, String oder komplexere Typen wie Listen oder Dictionarys. Im folgenden Code definierten wir die Variable port, die einen Integerwert festhalten soll, und die Variable banner für einen String. Um diese beiden Variablen in einem String zusammenzufassen, müssen wir die Portnummer mithilfe der Funktion str() ausdrücklich in einen String umwandeln.

Python reserviert Speicher für Variablen, wenn sie deklariert werden. Den Typ der Variable müssen Sie dabei nicht ausdrücklich deklarieren. Die Entscheidung über den Typ und über die Menge des zu reservierenden Speicherplatzes trifft der Interpreter. Im folgenden Beispiel deklarieren wir einen String, einen Integer, eine Liste und einen booleschen Wert, wobei der Interpreter all diesen Variablen automatisch den richtigen Typ zuweist:

1.3.2  Strings

Das Python-Modul string stellt einen umfassenden Satz von Methoden für Strings zur Verfügung. Die gesamte Liste dieser Methoden können Sie auf http://docs.python.org/library/string.html einsehen.

Sehen wir uns davon die Methoden upper(), lower(), replace() und find() etwas genauer an. upper()wandelt einen String in Großbuchstaben um, lower() in Kleinbuchstaben. Mit replace(alt, neu) ersetzen Sie alle Vorkommen des alten Teilstrings durch den neuen. Die Methode find() gibt den Versatz (Offset) an, an dem der angegebene Teilstring zum ersten Mal auftritt.

1.3.3  Listen

Die Datenstruktur der Listen bietet eine hervorragende Möglichkeit, um in Python Arrays von Objekten zu speichern. Listen lassen sich aus jeglichen Datentypen aufbauen. Außerdem gibt es eingebaute Methoden, um Listen­einträge anzuhängen, einzufügen, zu entfernen, vom Anfang zu entfernen und zu zählen und um die ganze Liste zu indizieren, zu sortieren und umzukehren. In dem folgendem Beispiel erstellen wir eine Liste, indem wir mit der Methode append() immer neue Einträge anfügen. Dann geben wir die Einträge aus und sortieren sie, bevor wir sie erneut ausgeben. Es ist auch möglich, den Index eines bestimmten Eintrags zu finden (in diesem Beispiel die Ganzzahl 80) oder einen bestimmten Eintrag zu entfernen (hier die 443).

1.3.4  Dictionarys

Ein Dictionary (Wörterbuch) ist eine Hashtabelle, in der Sie eine beliebige Anzahl von Python-Objekten speichern können. Die einzelnen Einträge sind Paare aus einem Schlüssel und einem Wert. Zur Veranschaulichung eines Python-Dictionarys fahren wir mit unserem Beispiel eines Schwachstellen-Scanners fort. Für eine solche Anwendung kann ein Dictionary nützlich sein, das die Namen der gängigen Dienste hinter den einzelnen Ports festhält. Wenn wir in einem solchen Dictionary einen Schlüssel wie ftp nachschlagen, erhalten wir den Wert 21 für den zugehörigen Port zurück.

Beim Aufbau eines Dictionarys werden die Schlüssel jeweils durch einen Doppelpunkt von ihrem zugehörigen Wert getrennt und die einzelnen Einträge durch Kommata. Die Methode .keys() gibt eine Liste aller Schlüssel im Dictionary zurück, die Methode .items() die Liste der gesamten Einträge. Danach überprüfen wir in diesem Beispiel, ob das Dictionary einen bestimmten Schlüssel enthält (nämlich ftp). Der Abruf dieses Schlüssels gibt den Wert 21 zurück.

1.3.5  Netzwerkverbindungen

Das Modul socket stellt eine Bibliothek bereit, um mit Python Netzwerkverbindungen herzustellen. Als Beispiel wollen wir ein kurzes Skript schreiben, das Verbindung mit einer gegebenen IP-Adresse und einem gegebenen Port aufnimmt, das Banner abruft und ausgibt. Nach der Implementierung des Socketmoduls instanziieren wir dazu die neue Variable s der Klasse socket. Danach stellen wir mit der Methode connect() eine Netzwerkverbindung zu der IP-Adresse und dem Port her. Nach erfolgreicher Verbindung können wir in dem Socket lesen und schreiben. Die Methode recv(1024) liest die nächsten 1024 Bytes auf dem Socket. Das Ergebnis dieser Methode wird in einer Variable gespeichert und dann auf dem Server ausgegeben:

1.3.6  Bedingte Anweisungen

Wie die meisten Programmiersprachen bietet auch Python eine Möglichkeit für bedingte Anweisungen. Die Anweisung if wertet einen logischen Ausdruck aus und trifft aufgrund des Ergebnisses eine Entscheidung. In unserem Bannerabrufskript möchten wir gern wissen, ob der vorliegende FTP-Server eine Schwachstelle aufweist. Dazu vergleichen wir das Ergebnis mit Versionen von FTP-Servern, die bekanntermaßen Schwachstellen aufweisen:

1.3.7  Ausnahmebehandlung

Auch bei einem syntaktisch korrekt geschriebenem Programm können zur Laufzeit oder bei der Ausführung Probleme auftreten. Der klassische Laufzeitfehler ist die Division durch Null. Da eine solche Operation mathematisch unzulässig ist, zeigt der Python-Interpreter eine Fehlermeldung an und bricht die Ausführung des Programms ab:

Wie aber gehen Sie vor, wenn Sie den Fehler im Kontext des laufenden Programms oder Skripts handhaben wollen? Dafür bietet Python Möglichkeiten zur Ausnahmebehandlung. Mit try/except-Anweisungen können wir das vorherige Beispiel verbessern und ihm eine Ausnahmebehandlung hinzufügen. Wenn das Programm jetzt versucht, eine Division durch null auszuführen, fängt die Ausnahmebehandlung den Fehler ab und gibt eine Meldung auf dem Bildschirm aus:

Leider sagt uns diese Meldung nicht, welche Art von Ausnahme den Fehler hervorgerufen hat. Es wäre besser, eine Fehlermeldung anzuzeigen, in der der Grund dafür genannt wird. Dazu speichern wir die Ausnahme in der Variable e, um sie später ausgeben zu können. Dazu müssen wir e ausdrücklich in einen String umwandeln.

Sehen wir uns nun an, wie wir damit unser Bannerabrufskript verbessern können. Dazu verpacken wir den Netzwerkcode in eine Ausnahmebehandlung. Wenn wir dann Verbindung mit einem Computer aufnehmen, bei dem an Port 21 kein FTP-Server ausgeführt wird, wird schließlich die Fehler­meldung angezeigt, dass bei der Verbindungsaufnahme eine Zeitüberschreitung aufgetreten ist. Das Programm aber kann weiterlaufen.

Beachten Sie einen warnenden Hinweis zur Ausnahmebehandlung in diesem Buch: Um eine möglichst große Bandbreite an verschiedenen Prinzipien zu illustrieren, enthalten die vorgestellten Skripts nur ein Minimum an Ausnahmebehandlung. Sie können die Skripts, die Sie auf der Begleitwebsite finden, gern um eine umfassendere Ausnahmebehandlung erweitern.

1.3.8  Funktionen

Funktionen in Python sind geordnete Blöcke wiederverwendbaren Codes. Gewöhnlich schreibt ein Programmierer einen solchen Codeblock, um eine einzige, zusammenhängende Aktion auszuführen. Python enthält zwar viele eingebaute Funktionen, doch es ist auch möglich, eigene Funktionen zu schreiben. Eine solche Funktion beginnt mit dem Schlüsselwort def(). In die Klammern können Sie beliebige Variablen aufnehmen, die dann als Referenz übergeben werden. Das bedeutet, dass sich jegliche Änderungen an diesen Variablen außerhalb der Funktion auf den Wert auswirken, den sie in der Funktion haben. In unserem Beispiel mit dem FTP-Schwachstellen-Scanner schreiben wir eine Funktion für den Vorgang, die Verbindung mit dem FTP-Server aufzunehmen und das Banner abzurufen:

Sie haben das Ende dieser Vorschau erreicht. Registrieren Sie sich, um mehr zu lesen!
Seite 1 von 1

Rezensionen

Was die anderen über Python Hacking denken

5.0
1 Bewertungen / 0 Rezensionen
Wie hat es Ihnen gefallen?
Bewertung: 0 von 5 Sternen

Leser-Rezensionen