Shell 升级:使用 bash 编写 typescript 命令

Shell 升级:使用 bash 编写 typescript 命令

谁能解释一下这是什么意思:

SHELL=/bin/bash script -q /dev/null

它用于升级 CTF 中的 shellHTB

 SHELL=/bin/bash script -q /dev/null
 Ctrl-Z
 stty raw -echo
 fg
 reset
 xterm

它与这篇文章中的类似:将简单的 Shell 升级为完全交互式 TTY,但我不明白它的作用。

man script说:

NAME
       script - make typescript of terminal session
SYNOPSIS
       script [options] [file]

   script makes a typescript of everything displayed on your terminal.  It is useful for students
   who need a hardcopy record of an interactive session as proof of an assignment, as  the  type‐
   script file can be printed out later with lpr(1).

   -q, --quiet
          Be quiet (do not write start and done messages to standard output).

答案1

所以,这里的上下文似乎是你有一个到某个地方运行的 shell 的普通 TCP 连接,可能使用类似于netcat你的终端的东西。我所说的“普通”是指 shell(其 stdin/stdout)直接连接到网络套接字,而不是通过 SSH 等为 shell 提供伪终端 (pty) 的方式。

伪终端很重要,因为这是所有智能发生的层,例如处理 ^C 和 ^Z 等。

SHELL=/bin/bash script -q /dev/null

script在环境变量SHELL设置为/bin/bash以及参数-q和 的情况下运行/dev/null。要点script是记录 shell 会话获取的所有内容作为输入并作为输出打印,为此,它使用 pty。它还在运行时传递所有内容。创建 pty 是这里的重点,而不是发送到的实际记录/dev/null-q只是script在启动时不打印消息。

Ctrl-Z

假设我们通过以下方式连接到远程netcat当地的终端可能处于处理 ^Z 的模式。所以这会挂起本地netcat进程。

stty raw -echo

然后我们将本地终端置于原始模式,这样它就不会干扰远程pty。

fg

并再次启动netcat。现在,我们有一个在远程端打开了 pty 的 shell,并且本地终端不会干扰它。

reset

重置远程终端,我不确定这是否有必要。在您链接到的文章中,他们似乎需要它,但没有它对我来说效果很好。

重置当地的结束远程后的终端script可能会更困难,因为这样你的本地终端就处于原始模式,在远程上运行连接的 netcat,并且很难杀死该 netcat。但是然后你可以杀死本地 xterm/屏幕窗口/无论你的 shell 运行在什么地方。或者可以exec script在远程运行。

相关内容