+++
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 = ["Robe che ho fatto"]
+++

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: <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*](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 "<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:

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