使用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
效果如下:
- 正向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 Shell
socat与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
效果如下:
原理和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,就实现了多机同时操作,效果如下:
下面是实现多机操作的命令:
# 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
这是脚本socatscript.sh的实现
#!/bin/bash
SOCKDIR=$(mktemp -d)
SOCKF=${SOCKDIR}/usock
SESSION_NAME=${1:-socatSession}
WINDOW_NAME=${2:-socatWindown}
# create session and window
tmux has-session -t $SESSION_NAME
if [[ $? -eq 1 ]];then
tmux new -s $SESSION_NAME -n $WINDOW_NAME -d "socat file:\`tty\`,raw,echo=0 exec:'ncat -lk 9998'"
fi
# split windown 0
tmux split-window -h -t 0 "socat file:\`tty\`,raw,echo=0 UNIX-LISTEN:${SOCKF},umask=0077"
tmux select-pane -t 0
tmux select-layout -t $WINDOW_NAME main-horizontal
tmux resize-pane -t 0 -y 2
# Wait for socket
while test ! -e ${SOCKF} ; do sleep 1 ; done
while ! $(ncat -z localhost 9998) ;do sleep 1; done;
# Use socat to ship data between the unix socket and STDIO.
socat -U STDOUT TCP:localhost:9998 &
exec socat STDIO UNIX-CONNECT:${SOCKF}
主要功能是,每当有一个反向Shell连接时,在tmux上新建一个分屏,并将反向Shell显示在这个新建的分屏上,同时,提供一个特殊的分屏(最上面那个),在这个分屏上的输入的命令,会转发到各个反向Shell里。
如果你发现反向Shell里的文字不能满屏显示,需要通过 stty rows 63 columns 204
重新设置一下当前tty的显示宽高。
并且,如果你有ssh机器的权限,同时也想使用这种tmux分屏的方式执行命令,只需要将bash更换成ssh即可,如下:
# 1.开发机上监听
nohup socat tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork exec:'bash socatscript.sh' &
# 2.开发机上,使用ssh连接到多个机器
nohup socat exec:'sshpass -p "xxx" ssh root@192.168.0.10',pty,stderr,setsid,sigint,sane tcp:localhost:9999 &
# 3.进入tmux分屏界面
tmux a -t socatSession
是不是很爽,连ansible也可以不用装了!
总结
socat命令非常的强大,值得好好的研究一翻,同时当你研究成功后,会发现自己对各种概念的理解,又上升了一步。
使用socat反向Shell多台机器的更多相关文章
- shell远程操作另外一台机器上数据
shell远程操作另外一台机器上的数据,有两种方式: 1 .配置免密登陆,2.使用sshpass 当前存在两台虚拟机,ip地址分别为:192.168.3.32 192.168.3.33 一.免密登陆操 ...
- 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息
ARP欺骗的作用 当你在网吧玩,发现有人玩LOL大吵大闹, 用ARP欺骗把他踢下线吧 当你在咖啡厅看上某一个看书的妹纸,又不好意思开口要微信号, 用arp欺骗,不知不觉获取到她的微信号和聊天记录,吓一 ...
- linux利用ssh远程执行多台机器执行同样的命令
这篇文章主要介绍了ssh远程执行命令方法和Shell脚本实例,本文讲解了ssh执行远程操作方法和远程执行命令shell脚本示例,需要的朋友可以参考下 ssh执行远程操作命令格式代码如下: ssh -t ...
- 一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)
1)集群规划:主机名 IP 安装的软件 运行的进程master 192.168.199.130 jdk.hadoop ...
- Gitlab 赋予某台机器git clone的权限 Deploy key
开发项目CI(持续化部署)的时候,需要赋予jeckins所在的机器从gitlab远程仓库克隆代码到本地的权限. 之前我们基本都是通过管理gitlab某个项目的成员的方式,管理gitlab的权限. 但是 ...
- 七台机器部署Hadoop2.6.5高可用集群
1.HA架构注意事项 两个Namenode节点在某个时间只能有一个节点正常响应客户端请求,响应请求的节点状态必须是active standby状态要能够快速无缝切换成active状态,两个NN节点必须 ...
- 反向Shell增强
下载socat 在客户端: socat file:`tty`,raw,echo=0 tcp-listen:4444 在服务端: socat exec:'bash -li',pty,stderr,set ...
- centos 安装redis(一台机器可以安装多个redis)
我在运行时redis版本是2.8 操作前设置以管理员身份: 打开终端输入 su - 安装redis需要确保系统已经安装了(gcc gcc-c++)# yum -y install gcc gcc-c+ ...
- 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器
现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...
随机推荐
- squid 代理服务器应用
squid 代理服务器应用 1.Squid 代理服务器 : Squid 主要提供缓存加速.应用层过滤控制的功能. 代理的工作机制: 代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址. 将获得 ...
- WEB前端开发--2(HTML基础)
HTML基础 HTML不分大小写 1.HTML概述 HTML(HyperText MarkUp Language)"超文本标记语言",他是制作网页的标准语言 1.1 标签--元素 ...
- CSS多种方式实现元素水平垂直居中
html结构: <div class="center">确定宽高水平垂直居中</div> <div class="center2" ...
- IDEA的使用和快捷键
一.字体设置: 菜单:file->setting->Appearan 编辑区字体大小:file->setting->Font 字体加粗:file->setting-> ...
- tomcat实现多虚拟主机
一.安装tomcat 请查看:二进制安装tomat 二.配置虚拟主机 2.1 修改server.xml # vim /usr/local/tomcat/conf/server.xml ...省略 #在 ...
- 04.python语法入门--基本数据类型
# python是一门解释型的.强类型的.动态语言# 一:数字类型# 1.1 整型int:记录人的年龄.等级.号码.个数# age = 18# print(type(age))# 1.2 浮点数 ...
- MYSQL数据表损坏的原因分析和修复方法小结
MYSQL数据表损坏的原因分析和修复方法小结 1.表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1. 服务器突然断电导致数据文件损坏. 2. 强制关机,没有先关闭mysql 服务. ...
- Dubbo基础之四管理控制台 dubbo-admin
Dubbo提供一个重要功能就是服务治理(SOA governance),什么是服务治理呢?企业为了确保项目顺利完成而实施的过程,需要进行各方面的管理.服务治理就是用来管理SOA的采用和实现的过程. 服 ...
- zabbix-agentd;客户端开启多个端口。
学习标杆:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/configuring_basic ...
- Java的Future接口
Java的Future接口 Java 中的 Future 接口和其实现类 FutureTask,代表了异步计算的结果. 1. Future接口简介 Future 是异步计算结果的容器接口,它提供了下面 ...