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:
- Usare 7zip: non riesce a gestire i DMG criptati;
- 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 system… Interesting…
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.