+++ title = "Decriptare un .dmg criptato" summary = "Come sbloccare un .dmg criptato su Linux (conoscendo la password)" date = "2024-08-13" tags = ["Crittografia", "Apple", ".dmg", "Linux"] categories = ["Tutorial"] +++ Mi è capitato di recente di ricevere una chiavetta USB contenente un file `.dmg` criptato contenente dei file a cui ero interessato. Il proprietario della chiavetta mi ha dato la password, in modo che potessi accedere ai file. Il problema rimane uno: **io non ho un Mac**. Quindi, dato che sono un fiero utente **GNU/Linux** e non ho voglia di creare una VM MacOS (anche se su **Proxmox** sembra essere [abbastanza facile](https://nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/)), ho deciso di provare ad aprire il file crittato con un po' di utility e una buona dose di olio di gomito. ## Che cos'è un DMG? Per i più interessati: Per i pigri come me invece: un file DMG non è altro che un formato file propietario di Apple, utilizzato per distribuire ed installare App su MacOS, ma può contenere anche altre cose, come ad esempio un *file system*. La cosa interessante per me è che un file DMG può essere crittato con **AES-128** o **AES-256**. Durante la mia ricerca per la stesura di questo articolo (ovviamente solo dopo aver speso un'oretta buona per aprire il file) mi sono imbattuto in un articolo di un'altra persona interessata ai DMG criptati che ha concluso dicendo: > #### Conclusion > > I wrote this post because it is too complicated (not hard, **complicated**) > to deal with an encrypted dmg image on another OS than MacOS. Lascio il link all'ottimo articolo qua: Concordo pienamente: sembra che Apple ce l'abbia messa tutta per rendere impossibile l'apertura di questo file senza avere un Mac. ## Decriptare un DMG criptato La prima cosa che ho fatto per analizzare il file con cui stavo lavorando è stata utilizzare l'utility [*file*](https://www.man7.org/linux/man-pages/man1/file.1.html), che però ha dato scarsi risultati: ```shell $ file encrypted.dmg encrypted.dmg: data ``` *No shit, Sherlock!* Usando il comando `xxd` possiamo ottenere più indizi riguardo al tipo di file: ```shell $ xxd encrypted.dmg | head -n 5 00000000: 656e 6372 6364 7361 0000 0002 0000 0010 encrcdsa........ 00000010: 0000 0005 8000 0001 0000 0080 0000 005b ...............[ 00000020: 0000 00a0 ecdb 2a00 e3a5 43a7 b839 0ebb ......*...C..9.. 00000030: 18ec 7107 0000 0200 0000 0000 6d70 0800 ..q.........mp.. 00000040: 0000 0000 0001 de00 0000 0001 0000 0001 ................ ``` Cercando su DuckDuckGo "*encrcdsa*" si trovano un po' di risultati, tra cui il post che ho citato nel [capitolo precedente](#che-cosè-un-dmg). Anche senza usare un motore di ricerca, possiamo capire che il file è criptato e bisogna trovare un modo per decriptarlo. Cercando su Internet con query come "*linux dmg decrypt*" si possono trovare molte risposte, ma nessuna funzionante, tra le quali spiccano: 1. Usare [7zip](https://7-zip.org): non riesce a gestire i DMG criptati; 2. Usare [dmg2img](https://github.com/Lekensteyn/dmg2img): non riesce a gestire i DMG criptati; Ho cercato per un po' finchè non ho trovato [dmgwiz](https://github.com/citruz/dmgwiz), uno strumento scritto in Rust (***Rust FTW!***) nato come clone di `dmg2img` ma che permette, fra le varie cose, di leggere i DMG criptati! --- Per utilizzare `dmgwiz` bisogna prima scaricare il binario dalle [Release della pagina GitHub](https://github.com/citruz/dmgwiz/releases/latest) del progetto. Dopo di che possiamo decriptare il nostro DMG col seguente comando: ```shell $ ./dmgwiz.elf encrypted.dmg -p "" decrypt -o output.dmg 1836058624 bytes written ``` **Hurrà!** Siamo riusciti a decpritare il DMG ## Estrarre i file La dimensione del file decriptato corrisponde più o meno alla dimensione del file criptato, se però proviamo ad ottenere più informazioni sul DMG sempre con `dmgwiz` otteniamo un errore: ```shell $ ./dmgwiz.elf output.dmg info error: could not read input file - could not parse koly header ``` Il che significa che i primi 4 byte del nostro file non corrispondono al [numero magico](https://en.wikipedia.org/wiki/File_format#Magic_number) del file DMG. Se proviamo con l'utility `file` a scoprire il tipo di file scopriamo che... ```shell $ file output.dmg output.dmg: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 1, 3586051 sectors, extended partition table (last) ``` È un *file system*... *Interesting...* Tramite `fdisk` possiamo scoprire che il *file system* in questione è [APFS](https://en.wikipedia.org/wiki/Apple_File_System), un *file system* proprietario di Apple ottimizzato per gli SSD e utilizzato come default su MacOS dalla versione Sierra. ```shell $ fdisk -l output.dmg Disk output.dmg: 1.71 GiB, 1836058624 bytes, 3586052 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 8ABB68ED-8C96-425B-B615-36926AC40D4C Device Start End Sectors Size Type output.dmg1 40 3586015 3585976 1.7G Apple APFS ``` Per montare questo *fle system* ed estrarre i file possiamo usare un drive FUSE per APFS: [apfs-fuse](https://github.com/sgan81/apfs-fuse); si può trovare nei repository della propria distribuzione. Una volta installato possiamo utilizzarlo per montare il nostro *file system*: ```shell $ mkdir files/ $ apfs-fuse output.dmg files/ ``` Infine possiamo verificare che il tutto sia stato montato correttamente con: ```shell $ mount | tail -n 1 output.dmg on /home/user/files type fuse (ro,nosuid,nodev,relatime,user_id=1000,group_id=1000) $ ls files/ private-dir root ``` ## *Post-scriptum* Dopo aver scritto tutto l'articolo ho provato per curiosità a montare l'archivio criptato direttamente con `apfs-fuse` e ha funzionato. Quindi se sapete che il contenuto del DMG è un *file system* APFS potete direttamente utilizzare `apfs-fuse` senza passare per `dmgwiz`. ## Conclusione Ho deciso di scrivere questo post perchè, come ha già scritto [talebyanis](https://talebyanis.github.io/), aprire un DMG criptato su qualcosa che non sia MacOS è complicato (non difficile, **complicato**). Spero di essere stato di aiuto per le pochissime persone che stanno passando il mio stesso problema.