Bash

Shell 升級:使用 bash 編寫 typescript 命令

  • July 19, 2020

誰能解釋一下這是什麼意思:

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

它用於在HTB中升級 CTF 中的外殼:

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

它與本文中的類似:將簡單外殼升級到完全互動式 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).

所以,這裡的上下文似乎是你有一個普通的 TCP 連接到某個地方執行的 shell,可能netcat在你的最後使用類似的東西。“普通”是指外殼(它的標準輸入/標準輸出)直接連接到網路套接字,而不是通過像 SSH 那樣為外殼提供偽終端(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在遠端執行。

引用自:https://unix.stackexchange.com/questions/599065