运行 shellcode 时出现“bin/sh: 无法访问 tty;作业控制已关闭”错误

运行 shellcode 时出现“bin/sh: 无法访问 tty;作业控制已关闭”错误

我正在编写 shellcode 来利用服务器上的缓冲区溢出漏洞。为此,我编写了端口绑定 shellcode,将其发送到服务器,然后我(从 Linux 终端)运行命令 telnet serverAdress 4444,其中 4444 是我打开的端口。希望我能收到一个 shell 返回,可以用来执行命令。但是,我总是得到命令

bin/sh:无法访问 tty;作业控制已关闭

我无法更改任何服务器代码,但我相信 shellcode 是正确的,因为我是从这个网站获取的(http://www.tsirogiannis.com/exploits-vulnerabilities-videos-papers-shellcode/linuxx86-port-binding-shellcode-xor-encoded-152-bytes/)。从我的研究来看,这可能与我的终端运行的模式有关(称为交互模式……或类似的东西)。

所有涉及的计算机都是 Linux 机器,而我所使用的机器运行的是最新版本的 Ubuntu。

知道这个作业控制错误意味着什么以及我该如何修复它吗?

答案1

只需移除/dev/console

cd /dev
rm -f console
ln -s ttyS0 console

编辑/更改/etc/inittab内容

::askfirst:/bin/sh

到:

ttyS0::askfirst:/bin/sh

答案2

这意味着 Ctrl+Z 和 Ctrl+C 等高级命令不可用,因为 sh 不是写入 tty,而是写入套接字。因此,sh 将不支持后台进程 ( command &) 和相关的 bg/fg/disown/jobs 命令。但请注意,进程自行分叉并关闭其输入仍将有效。

您可能已经注意到,如果后台作业尝试从终端读取数据,shell 会停止它(例如,SIGSTOP)并通知您它已暂停该进程。如果 shell 不这样做,您就会出现竞争条件,您写入的内容可能会最终出现在后台进程或 shell 中。这会让您的 shell 会话变得有趣而令人恼火。

要么使用更复杂的 shellcode 来创建虚拟终端(但一旦发生这种情况,它就不再是 shellcode 了),要么只是意识到你的丑陋黑客有局限性。

答案3

如果您可以更改 shell 的命令,请尝试:sh +m而不是sh。这对我来说非常有效。

答案4

也可以看看systemd-nspawn 和 sh:无法访问 tty;作业控制已关闭 #1431

同样的议题#8577#8704

开通/dev/tty退货ENXIO
调用setsid -c -w /bin/sh变通方法解决这 3 个问题

nspawn调用setsid()
ioctl(STDIN_FILENO, TIOCSCTTY, 1)setsid -c

但是,对于 posix,打开/dev/tty不应该失败。正确的解决方案可能是 @poettering 在#8577:分配/dev/console为,pty而不是从外部安装它。

当我less /dev/tty在损坏的终端(作业控制关闭)中执行此操作时,
我得到less: can't open '/dev/tty': No such device or address

当我less /dev/tty在工作终端(作业控制已打开)中执行此操作时,
less 可以打开并读取文件

less /dev/console投入Permission denied两个终端,
损坏和工作

请注意,这setsid仅适用于 unix,另请参阅 python 的操作系统设置

也可以看看QEMU:/bin/sh:无法访问 tty;作业控制已关闭

cttyhack除了可接受的答案之外,还可以使用 busybox 的解决方法。

setsid cttyhack sh
exec /bin/sh

相关内容