使用socat反向Shell多台机器

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处 。
场景很多时候,我们需要批量操作多台机器,业界一般使用Ansible来实现,但使用Ansible来操作多台机器的前提是需要有ssh权限的,可悲的是,对于开发人员来说,一般是没有正式环境机器的ssh权限的,只能通过一个指定的入口登录机器,也可以理解,毕竟正式环境如此重要 。
不过,如果你的生产环境可以访问你的开发机,那么可以通过反向Shell来访问机器,然后将反向Shell与tmux结合,又可实现同时操作多台机器的效果,这就是本文要介绍的 。
正反向Shell如果你了解过nc命令,一定听说过nc可以建立正向或反向Shell,这里就不解释正向或反向Shell的概念了,解释不清,直接上nc实现正向Shell与反向Shell的例子 。
由于nc命令本身存在模糊性,有些文章介绍的nc命令是ncat,有些文章介绍的nc命令又是netcat,这两个还是有些差别的,故这里的例子,直接使用ncat避免混淆 。
开发机ip为192.168.0.10 服务器ip为192.168.0.1
#正向Shell,1.服务器上使用ncat监听ncat -l 9999 -e /bin/bash#正向Shell,2.开发机上连接ncat 192.168.0.1 9999#反向Shell,1.开发机上使用ncat监听ncat -l 9999#反向Shell,2.服务器上连接ncat 192.168.0.10 9999 -e /bin/bash效果如下:
使用socat反向Shell多台机器

文章插图
 
  • 正向Shell:ncat在服务器上以9999端口监听,当开发机用ncat连接,连接成功后,服务器上的ncat会打开一个bash进程为这个连接服务 。
  • 反向Shell:ncat在开发机上以9999端口监听,当服务器用ncat连接,连接成功后,服务器上的ncat会打开一个bash进程为这个连接服务 。
其实正反向Shell的区别只是建立TCP连接的方向不同而已,如下为ncat提供的Shell大概交互过程:
ncat(client) <-> ncat(server) <-> bash
当在开发机的ncat里面输入命令并Enter后,命令会通过ncat(client)走网络,发送给ncat(server),ncat(server)收到命令后,会将命令发送给bash进程执行,bash进程执行后,命令执行的结果,又会返回给ncat(server),而ncat(server)又通过网络连接返回给开发机上的ncat(client)显示出来 。
但是,当你真正来使用这个反向Shell时,会发现有诸多不便,比如使用tail -f来查看日志文件,完事后你想Ctrl + C退出tail,却发现连ncat进程也退出了,这是最无法忍受的一点了,另外,像Tab补全/Up Arrow history/vim/Ctrl + d/Ctrl + z之类的,也都无法使用,非常难受 。我们一般称获取到的这种Shell叫Weak Shell,而如果要获取Strong Shell,就需要socat上场了 。
通过socat获取Strong Shellsocat与nc命令类似,但它比nc要强大得多,比如通过socat可以获取一个完整的Shell,如下:
#正向Shell,1.服务器上使用socat监听socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork#正向Shell,2.开发机上连接socat file:`tty`,raw,echo=0 tcp:192.168.0.1:9999#反向Shell,1.开发机上使用socat监听socat file:`tty`,raw,echo=0 tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork#反向Shell,2.服务器上连接socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.0.10:9999效果如下:
使用socat反向Shell多台机器

文章插图
 
原理和ncat类似,不过socat可以提供tty和pty,因为像Ctrl + C之类的,本身就是终端tty提供给bash的信号,而不是字符,所以在ncat里,由于没有tty,Ctrl + C信号是无法传递给服务端的bash程序的 。
socat提供的Shell交互过程大概是这样的:
tty <-> socat(client) <-> socat(server) <-> pty <-> bash
那什么是tty?这里我也理解得不是很透彻,可以简单认为键盘和屏幕就是tty,键盘敲的内容会作为tty的输入,tty输出的内容,会显示到屏幕上 。
tmux实现多机同时操作tmux是一个终端复用器,最常用的是实现分屏,既然通过socat已经可以获取到反向Shell了,那么把各个机器的反向Shell显示到tmux的各个分屏上,就可以看到多个反向Shell的命令执行结果,同时,将某个特殊分屏的tty操作,同时转发给多个反向Shell,就实现了多机同时操作,效果如下:
使用socat反向Shell多台机器

文章插图
 
下面是实现多机操作的命令:
# 1.开发机上监听nohup socat tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork exec:'bash socatscript.sh' &# 2.在多个服务器上连接nohup socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.0.10:9999 &# 3.进入tmux分屏界面tmux a -t socatSession


推荐阅读