Salta al contenuto principale

Decriptare un .dmg criptato

·5 minuti· ·
Robe Che Ho Fatto Crittografia Apple .Dmg Linux
Indice dei contenuti

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), 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: https://en.wikipedia.org/wiki/Apple_Disk_Image

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: https://talebyanis.github.io/posts/how-to-deal-with-encrypted-dmg-files

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, che però ha dato scarsi risultati:

$ file encrypted.dmg 
encrypted.dmg: data

No shit, Sherlock!

Usando il comando xxd possiamo ottenere più indizi riguardo al tipo di file:

$ 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.

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: non riesce a gestire i DMG criptati;
  2. Usare dmg2img: non riesce a gestire i DMG criptati;

Ho cercato per un po’ finchè non ho trovato 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 del progetto.

Dopo di che possiamo decriptare il nostro DMG col seguente comando:

$ ./dmgwiz.elf encrypted.dmg -p "<password>" 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:

$ ./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 del file DMG.

Se proviamo con l’utility file a scoprire il tipo di file scopriamo che…

$ 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 systemInteresting…

Tramite fdisk possiamo scoprire che il file system in questione è APFS, un file system proprietario di Apple ottimizzato per gli SSD e utilizzato come default su MacOS dalla versione Sierra.

$ 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; si può trovare nei repository della propria distribuzione.

Una volta installato possiamo utilizzarlo per montare il nostro file system:

$ mkdir files/
$ apfs-fuse output.dmg files/

Infine possiamo verificare che il tutto sia stato montato correttamente con:

$ 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, 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.

Autore
Nicola Belluti
Un ragazzo innamorato del mondo open source. Su di me…