/ dev / tcp lausche statt nc lausche


39

Mit einem Netcat-Listener wie:

nc -l <port> < ~/.bashrc

Ich kann meine .bashrc-Datei auf einem neuen Computer (ohne ncoder mit LDAP) abrufen mit:

cat < /dev/tcp/<ip>/<port> > ~/.bashrc

Meine Frage ist: Gibt es eine Möglichkeit, die Fähigkeiten von nc -l <port>in meiner ersten Zeile mit / dev / tcp nachzuahmen, anstatt nc?

Die Maschinen, auf denen ich arbeite, sind extrem gehärtete RHEL-Umgebungen (kein SSH, kein NC, kein LDAP, kein YUM, ich kann keine neue Software installieren und sie sind nicht mit dem Internet verbunden)


Gibt es eine einfache Möglichkeit, dies zu erreichen, ohne ein Python-Skript zu schreiben, um den Socket offen zu halten?
h3rrmiller

Antworten:


23

Wenn Perl installiert ist (wie auf einem RHEL-Computer):

perl -MIO::Socket::INET -ne 'BEGIN{$l=IO::Socket::INET->new(
  LocalPort=>1234,Proto=>"tcp",Listen=>5,ReuseAddr=>1);
  $l=$l->accept}print $l $_' < ~/.bashrc

würde funktionieren, wenn eine lokale Firewall keine eingehenden Verbindungen zu 1234 zulässt.

Wenn socat installiert ist:

socat -u - tcp-listen:1234,reuseaddr < ~/.bashrc

Wenn zsh installiert ist:

zmodload zsh/net/tcp
ztcp -ld3 1234 && # start listening socket on fd 3
  ztcp -ad4 3 && # accept connection on fd 4
  ztcp -c 3 && # close the listening socket that is no longer needed
  cat < ~/.bashrc >&4 && # send the data
  ztcp -c 4 # close the communication socket to tell the other end we're finished

Sollte der letzte ztcp -c 4Befehl nicht 3 lauten? Ansonsten tolle Infos, toller Tipp.
Dezza

@dezza, siehe bearbeiten. Der Socket auf fd 3 wurde tatsächlich nicht geschlossen (obwohl es gewesen wäre, als das Skript beendet wurde). Wir müssen den Sockel auf fd 4 schließen, damit das andere Ende einen EOF erhält.
Stéphane Chazelas

42

Leider ist es unmöglich, nur mit Bash zu tun. /dev/tcp/<ip>/<port>Virtuelle Dateien werden so implementiert, dass bash versucht, eine Verbindung mit der angegebenen <ip>:<port>using- connect(2)Funktion herzustellen. Um eine Hörbuchse zu erstellen, müsste sie die bind(2)Funktion aufrufen .

Sie können dies überprüfen, indem Sie bashQuellen herunterladen und ansehen. Es ist in lib/sh/netopen.cfile in _netopen4function (oder _netopen6, das auch IPv6 unterstützt) implementiert . Diese Funktion wird von der Wrapper-Funktion netopenaus derselben Datei verwendet, die wiederum direkt in der Datei redir.c( redir_special_openFunktion) verwendet wird, um diese virtuelle Umleitung zu implementieren.

Sie müssen eine andere Anwendung finden, die einen Listening-Socket auf Ihrem Computer erstellen kann.


+1 Die Bash ermöglicht das Erstellen des Client-Sockets, aber der Server-Socket, den Sie verwenden können, nc oder kann mit Perl oder c implementiert werden. Der Server-Prozess nimmt in einer Schleife Verbindungen und Spawning-Prozesse an oder erstellt Threads, oder er kann nur eine Verbindung nach der anderen akzeptieren
Nahuel Fouilleul

2
@NahuelFouilleul: Das ist nicht ganz richtig. Sie können viele Clients mit nur einem Thread / Prozess mithilfe der sogenannten "asynchronen" oder "ereignisgesteuerten" Netzwerkprogrammierung verarbeiten (versuchen Sie, die Funktion select () zu googeln, und erfahren Sie, wie sie in der Netzwerkprogrammierung verwendet werden kann). In vielen Fällen ist es viel besser (schneller), viele Kunden anzunehmen.
Krzysztof Adamski

Vielen Dank, dass ich nicht an diese Lösung
gedacht habe

4
Dafür ist xinetd da. Es lauscht und erzeugt einen beliebigen Prozess / ein beliebiges Skript für eingehende Verbindungen. Damit kann alles zu einem TCP / IP-Server werden.
Evi1M4chine

0

Es gibt keine Möglichkeit zuzuhören, da das Zuhören nicht in der Bash ist, wie Adamski betonte.

Sie müssen den Client jedoch nicht abhören, damit Sie zum Übertragen von Dateien kein Netcat auf dem Client benötigen. Beispiel:

## To send a file to the locked down computer: 
 ## Local server where you do have netcat 
cat ~/.bashrc | nc -l -q 1 -p 8998

 ## Remote locked down computer without netcat
cat < /dev/tcp/local.server.ip.addr/8998 > latest.bashrc 

## To grab a file from the locked down computer: 
 ## First - on the local server run 
nc -l -p 8998 -q 1 > remote.bashrc < /dev/null 

 ## Then on the locked down computer run: 
cat ~/.bashrc > /dev/tcp/local.server.ip.addr/8998 0<&1 2>&1

-3

Sie können das tun, wie Sie sagten, indem Sie / dev / tcp mit bash fragen:

</dev/tcp/host/port

Wenn es sofort ausgeführt wird, hört es zu, in beiden Fällen tritt eine Zeitüberschreitung auf


4
Nein, Sie haben dies definitiv nicht getestet, und wenn Sie dies getan haben, müssen Sie die Ergebnisse nicht verstehen. Ihr Vorschlag würde den Socket öffnen (nicht abhören) und zu dem Befehl umleiten, den Sie ausgeführt haben. Es wurde bereits eine richtige Antwort gefunden (vor fast 6 Jahren ...), daher bin ich mir nicht sicher, warum Sie diese Frage nicht beantwortet haben.
h3rrmiller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.