In diesem Tutorial werden wir über ein sehr leistungsfähiges Netzwerktool Netcat sprechen, das allgemein als nc abgekürzt wird. Dieses Tool wird über die Befehlszeile verwendet und seine Syntax ist sehr einfach. Dadurch können wir Daten über Sockets (TCP oder UDP) schreiben und empfangen. Es hat viele Funktionen und daher können wir es auf viele Arten verwenden. Es ist wichtig zu wissen, wie es funktioniert, da wir damit im Netzwerk debuggen, testen und nachforschen können.
Netcat kann in 2 Modi betrieben werden:
Wir werden die Funktionsweise von Netcat oder nc anhand von praktischen Beispielen lernen, was der beste Weg ist, um zu lernen. Dafür werde ich das Betriebssystem Ubuntu 16.04 verwenden.
Das Erste, was wir sehen werden, ist die Syntax von netcat:
nc [Optionen] [Ziel] [Port]
Netcat hat viele Optionen, sehen wir uns einige an:
- -l : Sag netcat, dass es weiter lauschen soll.
- -p : Um den Ursprungshafen anzugeben.
- -s : Zur Angabe der Quelladresse.
- -k : Um “unendliche” Verbindungen für den Listener zuzulassen (wird mit -l verwendet).
- -u : Netcat öffnet den Port als UDP anstelle von TCP (was standardmäßig der Fall ist).
- -v : Mit dieser Option werden Informationen zur Verbindung angezeigt.
- -i : Zeigt die Verzögerung für das Senden und Empfangen an. (In Sekunden).
- -4 : Dient dazu, dass Netcat nur IPv4 verwendet.
- -6 : Wie das vorherige, jedoch IPv6 erzwingen.
Es gibt weitere Optionen, die wir durch Ausführen des folgenden Befehls sehen können:
nc -h
Unten sehen Sie im Bild:
Beginnen wir mit den Beispielen. Zuerst werden die einfachsten Beispiele behandelt, um sie zu komplizieren. Sie werden jedoch feststellen, dass sie sehr einfach zu verwenden sind.
Hören Sie sich meinen Computer in Port 87 an:
sudo nc -l -p 87
Jetzt werden wir eine Verbindung von einem anderen Terminal herstellen, da ich sie auf demselben Computer ausführe, benutze ich localhost als Adresse:
nc localhost 87
Wenn wir etwas von dem Client schreiben, den wir gerade geöffnet haben, sehen wir es auch in dem Terminal, das abhört, und überprüfen somit, ob die Verbindung korrekt funktioniert. Wenn wir aber in den Listener schreiben, erreicht das erste Terminal auch den Client. Als nächstes hinterlasse ich ein Bild des Zuhörers und eines anderen des Kunden:
Wir sehen, dass sie kommunizieren, wie wir es in diesem Beispiel wollten, wir gehen für einen anderen.
Wir können den Server oder Listener veranlassen, die vom Client gesendeten Daten in einer Datei zu speichern. Daher unterscheidet sich der auszuführende Befehl nicht wesentlich von dem im ersten Beispiel:
sudo nc -l 87> test
Auf der Clientseite ist der Befehl derselbe wie zuvor:
nc localhost 87
In der folgenden Abbildung sehen Sie, was auf dem Client ausgeführt wurde (der Listener hört zu, bevor er eine Verbindung herstellt, da dies sonst keine Auswirkungen hätte):
Und auf der Serverseite können wir sehen, dass anscheinend nichts empfangen wird, aber das Einzige, was sicher ist, ist, dass es nicht auf dem Bildschirm angezeigt und in der Testdatei gespeichert wird:
Fahren wir mit einem anderen Beispiel fort.
Lassen Sie uns prüfen, ob eine Reihe von Ports geöffnet ist, um festzustellen, ob sie geöffnet sind oder nicht. In diesem Beispiel liegt der Bereich zwischen 80 und 90. Zuerst öffnen wir einen Server in Port 80, wie wir es im ersten Beispiel getan haben (wir werden sehen, wie es funktioniert, wenn es geöffnet ist und wenn es nicht funktioniert):
sudo nc -l 87
Und im Client werden wir ausführen:
nc -z -v localhost 80-90
Der Parameter -z wird zum Scannen verwendet, und das zuvor angezeigte -v zeigt Informationen an (wenn dies nicht festgelegt ist, wird nicht angezeigt, welcher Port offen ist und welcher nicht). Anschließend wird das Image des Clients angezeigt:
Schauen wir uns ein Beispiel für UDP an .
Dieses Beispiel ist ebenfalls einfach: Wir werden in Port 2016 auf UDP warten und erzwingen, dass es sich um eine IPv4-Adresse handelt:
sudo nc -l -u -4 2016
Und jetzt stellen wir die Verbindung zum Client her:
nc -u -4 2016
Ich stelle kein Bild zur Verfügung, da das Capture das gleiche wie in Beispiel 1 ist und der Teil des Befehls geändert wird, der klar ist. Fahren wir mit einem Beispiel fort, in dem wir Python-Code verwenden.
Wir werden einen möglichst einfachen Code in Python einfügen, damit Sie eine Verbindung abhören, Daten empfangen und fertig sind.
Import-Socket s = socket.socket () an Bindung (("192.168.56.1", 1987)) s.listen (1) conn, addr = s.accept () data = conn.recv (1024) .decode ("utf-8") drucken (Daten)
Dieser Code wird unter Windows ausgeführt und von Linux aus werde ich über Netcat eine Verbindung herstellen. Die folgende Abbildung zeigt die Clientseite unter Linux:
Und wie es in Windows aussehen würde:
Wenn wir den Code ändern, können wir ihn veranlassen, einen Befehl auszuführen und seinen Inhalt zu senden, aber wir können auch eine Shell zurückgeben, mit der wir viele Dinge tun können. Fahren wir also mit dem nächsten Beispiel fort.
In diesem Beispiel werde ich einen Python-Code auf demselben Linux-Computer ausführen und eine Verbindung zu Netcat herstellen. Überprüfen wir, ob eine Shell (/ bin / bash) zurückgegeben wird. Dann lasse ich den Python-Code, so einfach und kurz wie möglich, nur für das Beispiel.
Import-Socket, Subprozess s = socket.socket (socket.AF_INET) s.setsockopt (socket.IPPROTO_IP, socket.SO_REUSEADDR, 1) s.bind (("", 1987)) s.listen (1) conn, addr = s.accept () p = subprocess.Popen (["/ bin / bash"], stdin = conn, stdout = conn, stder = conn)
Der Python-Code wird ausgeführt und Folgendes wird angezeigt (das Bild zeigt, wie es ist, wenn eine Verbindung von Netcat hergestellt wird):
Wir sehen, dass es beim Ausführen weiter lauscht, aber wenn ein Client eine Verbindung herstellt, wird die Verbindung geschlossen und wir haben eine Shell für uns.
Wir könnten auch einen Code erstellen, der sich mit unserer Maschine verbindet. Wir hören ihn an einem bestimmten Port. Im Allgemeinen gibt es viele Möglichkeiten. Jetzt sind Sie an der Reihe, Netcat zu untersuchen und mit ihm zu “spielen”, was uns in vielen Momenten helfen kann .