我正在编写 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
开通
/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