负载均衡下的WebShell连接

关于负载均衡

负载均衡(Load Balance) 是一种廉价的扩容的方案,它的概念不是本文的重点,不知道的可以去查资料学习。实现负载均衡的方式有很多种,比如 DNS 方式、HTTP 重定向方式、IP 负载均衡方式、反向代理方式等等。

比如 DNS 方式就是这种:

在这里插入图片描述

再比如用 ipvsadm 来做的 IP 负载均衡:

ipvsadm -a -t 30.0.30.10:80 -r 172.16.1.2:8080 -m
ipvsadm -a -t 30.0.30.10:80 -r 172.16.1.3:8080 -m
ipvsadm -a -t 30.0.30.10:80 -r 172.16.1.4:8080 -m

再比如反向代理的负载均衡:

在这里插入图片描述

其中像 HTTP 重定向方式、DNS方式等能够直接访问到单一机器的情况,不在我们本文讨论范围内。连接的时候,URL处按 IP 格式来填,然后把域名加在 Host 头处,就完事了。我们重点讨论不能直接访问到跑着具体业务的某个节点的情况,比如说「反向代理方式」。

反向代理方式其中比较流行的方式是用 nginx 来做负载均衡。我们先简单的介绍一下 nginx 支持的几种策略:

  • 轮询(默认)

    按请求顺序逐一分配

  • weight

    根据权重分配

  • ip_hash

    根据客户端IP分配

  • least_conn

    根据连接数分配

  • fair

    (第三方)根据响应时间分配

  • url_hash

    (第三方)根据URL分配

案例

为了方便解释,我们只用两个节点,启动之后,看到有 3 个容器(你想像成有 3 台服务器就成)。

现在整个架构长这个样子:

在这里插入图片描述

在这里插入图片描述

Node1 和 Node2 均是 tomcat 8 ,在内网中开放了 8080 端口,我们在外部是没法直接访问到的。

搭建环境

执行 docker compose up -d 命令

在这里插入图片描述

在这里插入图片描述

docker ps -a 查看所有的进程

在这里插入图片描述

查看nginx 的配置:

在这里插入图片描述

在这里插入图片描述

去浏览器访问18080端口

在这里插入图片描述

上传了ant.jsp文件

在这里插入图片描述

进一台服务器

在这里插入图片描述

可以看到有ant.jsp

它是一个jsp的一句话木马,密码是ant

在这里插入图片描述

查看这两台服务器是否都有ant.jsp这个文件

在这里插入图片描述

用中国蚁剑进行连接

按常规操作在蚁剑里添加 Shell

填入正确的基础配置

然后测试连接

显示连接成功 (因为两台节点都在相同的位置存在 ant.jsp,所以连接的时候也没出现什么异常。)

再选择添加

在这里插入图片描述

在这里插入图片描述

难点

难点一:我们需要在每一台节点的相同位置都上传相同内容的 WebShell

一旦有一台机器上没有,那么在请求轮到这台机器上的时候,就会出现 404 错误,影响使用。是的,这就是你出现一会儿正常,一会儿错误的原因。

在这里插入图片描述

在这里插入图片描述

难点二:我们在执行命令时,无法知道下次的请求交给哪台机器去执行。

我们执行 ip addr 查看当前执行机器的 ip 时,可以看到一直在飘,因为我们用的是轮询的方式,还算能确定,一旦涉及了权重等其它指标,就让你好好体验一波什么叫飘乎不定。

在这里插入图片描述

难点三:当我们需要上传一些工具时,麻烦来了:

由于 antSword 上传文件时,采用的分片上传方式,把一个文件分成了多次HTTP请求发送给了目标,所以尴尬的事情来了,两台节点上,各一半,而且这一半到底是怎么组合的,取决于 LBS 算法

难点四:由于目标机器不能出外网,想进一步深入,只能使用 reGeorg/HTTPAbs 等 HTTP Tunnel,可在这个场景下,这些 tunnel 脚本全部都失灵了。

解决难点

在这里插入图片描述

所有的数据包都能发给「LBSNode 1」这台机器。

首先是 第 1 步,我们请求 /antproxy.jsp,这个请求发给 nginx

nginx 接到数据包之后,会有两种情况:

我们先看黑色线,第 2 步把请求传递给了目标机器,请求了 Node1 机器上的 /antproxy.jsp,接着 第 3 步,/antproxy.jsp 把请求重组之后,传给了 Node1 机器上的 /ant.jsp,成功执行。

再来看红色线,第 2 步把请求传给了 Node2 机器, 接着第 3 步,Node2 机器上面的 /antproxy.jsp 把请求重组之后,传给了 Node1 的 /ant.jsp,成功执行。

具体操作

1.创建 antproxy.jsp 脚本

在这里插入图片描述

修改转发地址,转向目标 Node的 内网IP的 目标脚本 访问地址。

注意:不仅仅是 WebShell 哟,还可以改成 reGeorg 等脚本的访问地址。

在这里插入图片描述

注意:

a) 不要使用上传功能,上传功能会分片上传,导致分散在不同 Node 上。

b) 要保证每一台 Node 上都有相同路径的 antproxy.jsp, 多保存几次,保证每一台都上传了脚本

2. 修改 Shell 配置, 将 URL 部分填写为 antproxy.jsp 的地址,其它配置不变

在这里插入图片描述

3. 测试执行命令, 查看 IP

在这里插入图片描述

可以看到 IP 已经固定, 意味着请求已经固定到了 LBSNode1 这台机器上了。此时使用分片上传、HTTP 代理,都已经跟单机的情况没什么区别了。
.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值