web-dev-qa-db-ja.com

nc listenの代わりに/ dev / tcp listen

次のようなnetcatリスナーの場合:

nc -l <port> < ~/.bashrc

新しいマシンで.bashrcを取得できます(ncまたはLDAPがない場合)。

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

私の質問は、最初の行でncの代わりに/ dev/tcpを使用してnc -l <port>の機能を模倣する方法はありますか?

私が作業しているマシンは、非常に強化されたラボ/サンドボックス環境のRHELです(ssh、nc、LDAP、yumなし、新しいソフトウェアをインストールできない、インターネットに接続されていない)

39
h3rrmiller

Perlがインストールされている場合(RHELマシン上にあるため):

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

ローカルファイアウォールが1234への着信接続を許可しない限り、機能します。

Socatがインストールされている場合:

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

Zshがインストールされている場合:

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
24

残念ながら、bashだけで行うことは不可能です。 _/dev/tcp/<ip>/<port>_仮想ファイルは、bashがconnect(2)関数を使用して指定された_<ip>:<port>_に接続しようとする方法で実装されます。リスニングソケットを作成するには、bind(2)関数を呼び出す必要があります。

これを確認するには、bashソースをダウンロードして確認します。 _lib/sh/netopen.c_関数(または_netopen6、IPv6もサポート)の__netopen4_ファイルに実装されています。この関数は、同じファイルのラッパー関数netopenによって使用され、この仮想リダイレクトを実装するために、ファイル_redir.c_(_redir_special_open_関数)で直接使用されます。

あなたのマシン上でリスニングソケットを作成できる他のアプリケーションを見つける必要があります。

43

Adamskiが指摘したように、聞くことはbashにはないため、聞く方法はありません。

ただし、クライアントでリッスンする必要がないため、ファイルを転送するためにクライアントでnetcatは必要ありません。次に例を示します。

## 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
0
A.Danischewski