[转帖] 使用socat反向Shell多台机器
https://www.cnblogs.com/codelogs/p/16012319.html
场景#
很多时候,我们需要批量操作多台机器,业界一般使用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命令非常的强大,值得好好的研究一翻,同时当你研究成功后,会发现自己对各种概念的理解,又上升了一步。
作者:打码日记
出处:https://www.cnblogs.com/codelogs/p/16012319.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
[转帖] 使用socat反向Shell多台机器的更多相关文章
- 使用socat反向Shell多台机器
原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 场景 很多时候,我们需要批量操作多台机器,业界一般使用Ansible来实现,但使用Ansible来操作多台机器的前提是需 ...
- 反向Shell增强
下载socat 在客户端: socat file:`tty`,raw,echo=0 tcp-listen:4444 在服务端: socat exec:'bash -li',pty,stderr,set ...
- JavaScript反向shell
Node.js反向Shell 摘自:http://www.itfang.net/?p=109 如下的Javascript就是一个Node.js的反向连接shell. 这个payload将会生成一个/b ...
- 使用netcat的正向 / 反向shell
reverse shell bind shell reverse shell描述图: 在此示例中,目标使用端口4444反向连接攻击主机.-e选项将Bash 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节点必须 ...
随机推荐
- 解锁华为云AI如何助力无人车飞驰“新姿势”,大赛冠军有话说
摘要:在2020年第二届华为云人工智能大赛•无人车挑战杯赛道中,"华中科技大学无人车一队"借助华为云一站式AI开发与管理平台ModelArts及HiLens端云协同AI开发应用平台 ...
- 性能之巅:定位和优化程序CPU、内存、IO瓶颈
摘要:性能优化指在不影响系统运行正确性的前提下,使之运行得更快,完成特定功能所需的时间更短,或拥有更强大的服务能力. #一.思维导图 #二.什么是性能优化? 性能优化指在不影响系统运行正确性的前提下, ...
- 想要做好软件测试,可以先了解AST、SCA和渗透测试
摘要:如何做好安全测试,我们重点从应用程序安全测试AST.软件组成分析SCA和渗透测试三个方面来看一下. 本文分享自华为云社区<DevSecOps研发安全实践--测试篇>,作者:华为云Pa ...
- 【活动预告】数据集成引擎BitSail遇上CDC
BitSail是字节跳动开源数据集成引擎,于2022年10月26日宣布开源,可支持多种异构数据源间的数据同步,并提供离线.实时.全量.增量场景下全域数据集成解决方案.BitSail支撑了字节内部众多的 ...
- Docker Jenkins 安装配置
Docker Jenkins 安装配置 Windows 2016 安装 Jenkins Jenkins + SVN Jenkins + SVN/Git + Maven + Docker + 阿里云镜像 ...
- faker造数据
faker是一个开源的python库,安装完成后只需要调用Facker库,就可以帮助我们创建需要的数据. pip install Faker demo from faker import Faker ...
- 使用 BLIP-2 零样本“图生文”
本文将介绍来自 Salesforce 研究院的 BLIP-2 模型,它支持一整套最先进的视觉语言模型,且已集成入 Transformers. 我们将向你展示如何将其用于图像字幕生成.有提示图像字幕生成 ...
- 【SpringBoot】 启动后会调用执行的方法的 (五种方式)
在 SpringBoot 工程 启动后, 会调用执行方法的五种方式: 亲自测试, 按照执行顺序如下: 第一种: @Component public class SpringContext1 { @Po ...
- 一、mysql5.7 rpm 安装(单机)
一.下载需要的rpm包mysql-community-client-5.7.26-1.el6.x86_64.rpmmysql-community-common-5.7.26-1.el6.x86_64. ...
- kafka集群四、权限增加ACL
系列导航 一.kafka搭建-单机版 二.kafka搭建-集群搭建 三.kafka集群增加密码验证 四.kafka集群权限增加ACL 五.kafka集群__consumer_offsets副本数修改 ...