原创:打码日记(微信公众号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多台机器的更多相关文章

  1. shell远程操作另外一台机器上数据

    shell远程操作另外一台机器上的数据,有两种方式: 1 .配置免密登陆,2.使用sshpass 当前存在两台虚拟机,ip地址分别为:192.168.3.32 192.168.3.33 一.免密登陆操 ...

  2. 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息

    ARP欺骗的作用 当你在网吧玩,发现有人玩LOL大吵大闹, 用ARP欺骗把他踢下线吧 当你在咖啡厅看上某一个看书的妹纸,又不好意思开口要微信号, 用arp欺骗,不知不觉获取到她的微信号和聊天记录,吓一 ...

  3. linux利用ssh远程执行多台机器执行同样的命令

    这篇文章主要介绍了ssh远程执行命令方法和Shell脚本实例,本文讲解了ssh执行远程操作方法和远程执行命令shell脚本示例,需要的朋友可以参考下 ssh执行远程操作命令格式代码如下: ssh -t ...

  4. 一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

    1)集群规划:主机名        IP      安装的软件                     运行的进程master    192.168.199.130   jdk.hadoop      ...

  5. Gitlab 赋予某台机器git clone的权限 Deploy key

    开发项目CI(持续化部署)的时候,需要赋予jeckins所在的机器从gitlab远程仓库克隆代码到本地的权限. 之前我们基本都是通过管理gitlab某个项目的成员的方式,管理gitlab的权限. 但是 ...

  6. 七台机器部署Hadoop2.6.5高可用集群

    1.HA架构注意事项 两个Namenode节点在某个时间只能有一个节点正常响应客户端请求,响应请求的节点状态必须是active standby状态要能够快速无缝切换成active状态,两个NN节点必须 ...

  7. 反向Shell增强

    下载socat 在客户端: socat file:`tty`,raw,echo=0 tcp-listen:4444 在服务端: socat exec:'bash -li',pty,stderr,set ...

  8. centos 安装redis(一台机器可以安装多个redis)

    我在运行时redis版本是2.8 操作前设置以管理员身份: 打开终端输入 su - 安装redis需要确保系统已经安装了(gcc gcc-c++)# yum -y install gcc gcc-c+ ...

  9. 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器

    现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...

随机推荐

  1. 随机数类 Random

    import java.util.Random; /* 随机数类 Random 需求: 编写一个函数随机产生四位的验证码. */ public class Demo5 { public static ...

  2. Kubernetes 集群和应用监控方案的设计与实践

    目录 Kubernetes 监控 监控对象 Prometheus 指标 实践 节点监控 部署 Prometheus 部署 Kube State Metrics 部署 Grafana 应用如何接入 Pr ...

  3. centos安装MySQL问题

    使用sudo yum install mysql-server出现没有可用软件包 mysql-server. 先 执行 wget http://repo.mysql.com/mysql-communi ...

  4. Solution -「洛谷 P4449」于神之怒加强版

    \(\mathcal{Description}\)   Link.   给定 \(k\) 和 \(T\) 组 \(n,m\),对于每组,求 \[\sum_{i=1}^n\sum_{j=1}^m\ope ...

  5. C1 能力认证——Web进阶

    C1 能力认证--Web进阶 DOM节点操作-上 名称 描述 getElementById() 获取带有指定id的节点 getElementsByTagName() 获取带有指定标签名的节点集合 qu ...

  6. 公式编辑器CVE-2018-0798样本分析

      当前样本是一个RTF文档,内嵌一个公式编辑器对象,该对象利用Office编辑器漏洞CVE-2018-0798执行shellcode,对EQNEDT32.exe进行代码注入,执行恶意代码.   使用 ...

  7. Gradle进行Build 报GBK错误

    如上图,码主电脑windows,公司用的gradle进行项目build,本地进行build,总是出现这种GBK错误. 本身知道这是文件的编码问题:一般文件都是UTF-8编码,compilejava 默 ...

  8. curl的HTTP参数速查表

    curl简介 curl是一个开源的命令行工具,它基于网络协议,对指定URL进行网络传输,得到数据后不任何具体处理(如:html的渲染等),直接显示在"标准输出"(stdout)上. ...

  9. ctf.show-misc31

    (感谢阿姨)这个misc还是属于比较阴间的,并且学到了一个新的编码形式,直接开搞 下载附件得到压缩包,解压需要密码,可以看到没有输入密码解压也是得到了一个"file"文件,以txt ...

  10. 中国著名hacker---陈三堰

    在学习<网络攻防>这门课程中,我了解到了黑客之间的斗智斗勇,同样也对中国本土黑客产生了兴趣,之后,我将用一段时间扒一扒这其中比较有分量的传奇人物--陈三堰. 真名:陈三堰 网名:陈三少 所 ...