Wie kann ich binäre Daten in netcat an eine bereits bestehende Verbindung senden?

2286
user887437

Ich kann folgende Schritte ausführen, um binäre Daten in netcat zu senden:

echo -e '\x80' | nc host port 

Aber ich möchte es nicht so machen, ich möchte eine Verbindung zu einem Server herstellen:

nc 192.168.1.115 12345 

Und dann etwas Text schicken:

aaaaaaaaaabbbbbbbbbbccccccccccc 

Und dann einige binäre Daten senden:

0x80 0xF4 0x12 

Wie kann ich das machen?

2
Ich dachte, Sie könnten `echo -e '\ x80 \ xF4 \ x12' | verwenden xclip -i` in ein anderes Terminal, dann in das `nc`-Terminal einfügen, aber die Terminal-Eingangseinstellungen stehen im Weg, und ich weiß nicht, wie` nc` diese einstellt, noch finde ich Einstellungen, die mit `funktionieren stty ...; Katze | xxd; stty sane`. AFH vor 6 Jahren 1
Es wäre nützlich zu wissen, was Sie senden möchten und wie - Dateien / Tastatureingaben / etc ... Können Sie ein Beispiel geben, was die Fernbedienung erwartet? Attie vor 6 Jahren 0

4 Antworten auf die Frage

5
Kamil Maciorowski

Hinweis: Wenn Sie dieser Lösung folgen, geben Sie die Befehle in einer einzigen Shell-Sitzung ein (oder verwenden Sie ein einzelnes Skript), sofern nicht anders angegeben. Dies liegt daran, dass Variablen und Dateideskriptoren verwendet werden, die außerhalb ihrer ursprünglichen Sitzung nicht direkt verfügbar sind.

Erstellen Sie ein temporäres FIFO. Der richtige Weg zum Erstellen einer temporären Datei ist mit mktemp. Leider können keine FIFOs erstellt werden. Es kann jedoch ein temporäres Verzeichnis erstellt werden:

tmpd=`mktemp -d` tmpf="$tmpd"/fifo mkfifo "$tmpf" printf "%s\n" "$tmpf" # just to know the path to the fifo, it may be useful later 

Alternativ können Sie ein benanntes FIFO von Hand an einem festen Ort oder Ad-hoc-Speicherort erstellen. Es liegt an dir.

Erstellen Sie einen Hintergrundprozess, der die FIFO liest und Daten an einen Server weiterleitet:

nc 192.168.1.115 12345 < "$tmpf" & ncpid=$! # PID may be useful later 

Achten Sie darauf, wenn nces nicht vorzeitig beendet wird. Vorausgesetzt, es gibt kein Problem mit der Verbindung selbst oder mit dem Server, bleibt der obige Hintergrundbefehl so lange verbunden, bis Sie das erste Bündel von Daten über das FIFO-Gerät gesendet haben. Sie möchten jedoch, dass das Dokument geöffnet bleibt und mehrere Schreibvorgänge akzeptiert. Öffnen Sie das FIFO und schließen Sie es (noch) nicht:

exec 3> "$tmpf" 

Jetzt können Sie alles senden, was Sie möchten, und die Hintergrundverbindung bleibt bestehen:

echo abcd >&3 # sends text echo -e '\x80' >&3 # sends "binary" cat /etc/issue >&3 # sends file cat >&3 # type whatever you want, terminate with Ctrl+D 

Jeder dieser Befehle kann statt mit dem Pfad zum FIFO aufgerufen werden &3, wenn Sie nur den Pfad kennen. Wenn Sie den Pfad kennen, können Sie aus derselben oder einer anderen Shell-Sitzung in das FIFO schreiben :

cat > /path/to/the/fifo # type whatever you want, terminate with Ctrl+D 

Oder Sie können einen Deskriptor in einer anderen Sitzung auf ähnliche Weise wie in der ursprünglichen öffnen. Wie auch immer Sie in den FIFO schreiben, der ncwird sie in einer einzigen Verbindung an den Remote-Server weiterleiten.

Aber hüte dich vor den Rennbedingungen. Die Verwendung eines einzelnen Deskriptors innerhalb einer einzelnen Shell-Sitzung ist eine gute Möglichkeit, sie zu vermeiden.

Nachdem Sie die erforderlichen Daten übergeben haben, beenden Sie das ncund schließen Sie den Deskriptor in der ursprünglichen Shell-Sitzung:

kill $ncpid exec 3>&- 

Beachten Sie, dass in einigen Fällen der letzte Befehl ausreicht, um den Hintergrund zu ncbeenden. es hängt davon ab, was Sie getan haben und was Sie noch mit dem FIFO tun. Aus diesem Grund entschied ich mich, das ncexplizit zu töten .

Entfernen Sie das temporäre Verzeichnis und dessen Inhalt (dh die FIFO):

rm -r "$tmpd" 

Schlussnote:

Es ist nicht unbedingt notwendig, ncin den Hintergrund zu treten. Sie können es in einem Terminal ausführen, von einem anderen in den FIFO schreiben (seinen Pfad kennen). Auf diese Weise können Sie den Status einfach überwachen. Passen Sie diese Lösung an Ihre Bedürfnisse an.

Ich habe so sehr danach gesucht, danke! bitcell vor 5 Jahren 0
1
A.B

Mit einem kleinen Trick können Sie Hilfe von einer Named Pipe erhalten:

remote$ nc -v -n -l -p 8888 > /tmp/data Listening on [0.0.0.0] (family 0, port 8888) Connection from 10.0.3.1 47108 received!  local:1$ mkfifo /tmp/fifo local:1$ nc -v -n <>/tmp/fifo 10.0.3.66 8888 Connection to 10.0.3.66 8888 port [tcp/*] succeeded! 

Es ist wichtig, die FIFO-Lese- und Schreibzugriffsfunktion zu öffnen (oder einen anderen neutralen Prozess zu haben, wie zum Beispiel sleep 9999 >/tmp/fifodas Öffnen zum Schreiben). Daher die <>.

local:2$ echo aaaaaaaaaabbbbbbbbbbccccccccccc > /tmp/fifo local:2$ cat /bin/ls > /tmp/fifo # sends the binary contents of the file /bin/ls, which would probably garble the input or output local:2$ cat > /tmp/fifo Some more interactive text  (local:1$ ) ^C  remote$ od -c /tmp/data|head -4 0000000 a a a a a a a a a a b b b b b b 0000020 b b b b c c c c c c c c c c c \n 0000040 177 E L F 002 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000060 003 \0 > \0 001 \0 \0 \0 0 T \0 \0 \0 \0 \0 \0 
Ihre Antwort verwendet den gleichen Ansatz wie meine, wie ich sah, als ich schrieb (ja, das Schreiben und Testen einer guten Antwort dauert so lange). In meiner Antwort werden einige Probleme erwähnt, die Sie vernachlässigen (z. B. der ordnungsgemäße Umgang mit temporären Dateien, Rennbedingungen). Trotzdem +1 für dich. Kamil Maciorowski vor 6 Jahren 0
In der Tat habe ich mich nicht um Sicherheit und beste Benutzerfreundlichkeit gekümmert. Sie haben eine einsatzbereite Antwort gemacht. A.B vor 6 Jahren 0
0
AFH

Folgendes scheint zu funktionieren:

while read -r; do echo -en "$REPLY" | nc ...; done 

Auf diese Weise können Sie \xNNEscape-Sequenzen zu Ihren normalen Daten hinzufügen, wie in:

aaaaaaaaaabbbbbbbbbbccccccccccc\x80\xF4\x12 

Vergessen Sie nicht, beliebige Literalzeichen \in Ihrer Texteingabe zu verdoppeln . Beachten Sie, dass die Verwendung von read -rund $REPLYanstelle einer Variablen das Stripping von führenden und nachgestellten Leerzeichen verhindert.

Dies fügt keine neue Zeile am Ende des Puffers hinzu, daher müssen Sie entweder die nOption im echoBefehl auslassen oder die Stelle eingeben, \x0aan der Sie eine neue Zeile haben möchten.

Ich kann derzeit nicht einrichten nc, habe aber getestet mit:

while read -r; do echo -en "$REPLY" | cat | xxd; done 

Zum Testen können Sie verwenden, od -ct x1wenn Sie nicht haben xxd; oder verwenden od -cSie, wenn Sie binäre Zeichen in Oktal gerne sehen. Sie können cat |aus dem Rohr weglassen : Ich habe es als möglicherweise bessere Simulation der Verwendung von aufgenommen nc.

0
Attie

Wenn Sie die beiden Daten vorab kennen, versuchen Sie Folgendes:

$ ( echo "aaabbbccc"; echo -en "\x80\xf4\x12" ) | hexdump -Cv 00000000 61 61 61 62 62 62 63 63 63 0a 80 f4 12 |aaabbbccc....| 0000000d 

Wenn Sie mehr Kontrolle haben möchten (Tastatur usw.), versuchen Sie Folgendes:

$ ( cat; cat | xxd -r -p ) | hexdump -Cv aaabbbccc 80f412 00000000 61 61 61 62 62 62 63 63 63 0a 80 f4 12 |aaabbbccc....| 0000000d 

Hinweis: Sie müssen Ctrl+ drücken D, um jedes zu beenden cat... also habe ich hier eingegeben (einschließlich Returns - EOT muss am Anfang der Zeile stehen):

aaabbbccc ^D 80f412 ^D