Filer: Download challenge files
Writeup: Disk Encryption
Indledende Observationer
Jeg fik udleveret:
server.pypasswd.txt
Serveren:
Krypterede
passwd.txti memory med AES-XTSBrugte nøgle =
SHA512(flag)(64 bytes = to AES-256 nøgler)Gav adgang til en ECB encryption oracle i debug-mode
Tillod restore af én vilkårlig ciphertext-blok
Printede flaget hvis en ikke-root bruger fik
uid=0oggid=0
Der var kun én integritetskontrol:
Usernames måtte ikke ændres.
Recon / Kortlægning
I server.py så jeg:
Hver 16-byte blok blev krypteret med XTS:
1 2T = E_k2(tweak) C = E_k1(P xor T) xor Ttweak = block_index.to_bytes(16, 'little')
Debug-funktionen gjorde:
| |
Det betød, at jeg havde:
Oracle for
E_k1(·)Oracle for
E_k2(·)
Restore-funktionen:
| |
overskrev én ciphertext-blok i memory.
Noter:
AES-XTS brugt per 16-byte blok
Tweak = blokindeks (little-endian)
Debug gav ECB-oracle for både k1 og k2
Restore tillod overwrite af én ciphertext-blok
Flag printes hvis non-root bruger får uid=0,gid=0
Analyse
AES-XTS for én blok kan skrives som:
| |
Hvis man har følgende:
E_k1(·)oracleE_k2(·)oracle
kan man forge en gyldig ciphertext for vilkårligt plaintext.
Der var ingen MAC.
Der var ingen integritetsbeskyttelse.
Kun username-check.
Det betød at jeg kunne ændre UID/GID uden at ændre username.
Angrebet
1. Valg af target
I passwd.txt fandt jeg:
| |
Jeg ændrede den til:
| |
Det ændrede kun to bytes (1 -> 0) og holdt længden identisk.
Begge cifre lå i samme 16-byte blok.
Blok-index = 2.
2. Hent tweak-værdi
Tweak for blok 2:
| |
Jeg sendte:
| |
Serveren svarede:
| |
Anden linje var:
| |
3. Forge ønsket plaintext-blok
Ønsket plaintext-blok:
| |
Jeg beregnede:
| |
Jeg sendte:
| |
Serveren svarede:
| |
Første linje var:
| |
4. Konstruér forged ciphertext
| |
5. Restore blok 2
Jeg sendte:
| |
Serveren dekrypterede filen igen.
Nu havde daemon:
| |
Username var uændret.
Checken bestod.
Flaget blev printet.
Flaget
| |
Hvorfor det virkede
XTS beskytter kun mod mønstergenkendelse.
Det giver ingen autentificering.
Hvis man får adgang til:
E_k1 oracle
E_k2 oracle
kan man rekonstruere gyldige ciphertext-blokke.
Det reducerer XTS til en tweakbar ECB-konstruktion uden MAC.
Konklusion
Serveren brugte AES-XTS korrekt til disk-kryptering,
men kombinationen af:
ECB debug oracle
Restore-funktion
Manglende MAC
gjorde det muligt at forge ciphertext-blokke.
Jeg udnyttede dette til at ændre UID/GID på en systembruger
og opnåede dermed flaget:
| |