/dev/tcp 监听而不是 nc 监听

/dev/tcp 监听而不是 nc 监听

使用 netcat 监听器,例如:

nc -l <port> < ~/.bashrc

我可以通过以下方式在新机器(没有ncLDAP)上获取我的 .bashrc:

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

我的问题是:有没有办法nc -l <port>用 /dev/tcp 而不是模仿我第一行中的功能nc

我正在使用的机器是极其强化的实验室/沙箱环境 RHEL(没有 ssh、没有 nc、没有 LDAP、没有 yum,我无法安装新软件,并且它们没有连接到互联网)

答案1

不幸的是,仅用 bash 是不可能做到的。/dev/tcp/<ip>/<port>虚拟文件的实现方式是 bash 尝试连接到指定的<ip>:<port>usingconnect(2)函数。为了创建监听套接字,必须调用bind(2)函数。

您可以通过下载bash源代码并查看来检查这一点。它在lib/sh/netopen.c文件中的_netopen4函数(或_netopen6,也支持IPv6)中实现。该函数被netopen同一文件中的包装函数使用,而包装函数又直接在文件redir.credir_special_open函数)中使用来实现虚拟重定向。

您必须找到一些可以在您的计算机上创建侦听套接字的其他应用程序。

答案2

如果安装了 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

答案3

没有办法倾听,因为倾听并不像 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

答案4

你可以像你说的那样,用 bash 询问 /dev/tcp:

</dev/tcp/host/port

如果它立即运行,则它正在监听,无论哪种方式都会超时

相关内容