Quando si tratta di decifrare dei database msgstore di conversazioni whatsapp cifrati in crypt12, ci sono attualmente due modi di procedere.

1) Usare WhatCrypt
2) Decrittare manualmente i file msgstore.crypt12

Whatsapp-crypt12

1) WhatCrypt

WhatCrypt può decifrare database whatsapp fino alla cifratura crypt12.

E’ disponibile sia come app per android, scaricabile dal thread su xda.
Sia via web.
Attualmente non sappiamo quali algoritmi e procedure vengano utilizzate nel decrypting delle informazioni, nè se le conversazioni vengano raccolte e utilizzate per fini commerciali o di lucro. Se volete esser sicuri che niente venga trapelato in rete un domani, allora procedete manualmente come descritto di seguito:

2) Procedura manuale

Nel passato Whatsapp ha cambiato crittografia per il database delle conversazioni in modo incrementale, con piccoli cambiamenti fra una versione e l’altra. Abbiam discusso più volte su come decifrare file con l’estensione crypt5, crypt7, crypt8.
Con la nuova versione crypt12 le cose cambiano ulteriormente.

Le conversazioni di backup di whatsapp in .crypt12 ricalcano la strada intrapresa già dal .crypt9. Usano una crittografia che riprende in parte Spongy Castle (una libreria crittografica open source per Android).
Tutte le scoperte mostrate di seguito si basano su un lavoro di reverse engineering fatto su WhatCrypt e Omni-Crypt. Durante questo reversing e debugging vorrei dire che IGLogger si è rivelato essere un ottimo tool.

Estrarre la chiave

Per decifrare i file crypt12, è necessario avere il file key. Questo file contiene di fatti la chiave crittografica. Whatsapp salva questa chiave in un posto sicuro: /data/data/com.whatsapp/files/key.

Se il vostro smartphone è rootato, estrarre la chiave è un compito abbastanza semplice. Non riprenderemo nuovamente tutti i passi necessari per farlo, in quanto già descritti ampiamente nei precedenti articoli, nella modalità automatica (anche senza root), e nella modalità manuale.
In casi estremi l’idea è quella di installare una vecchia versione di whatsapp dove il metodo dell’ADB Backup ancora funziona e recuperare in quel modo la chiave.

Estrarre i file di backup crypt12

Usiamo ADB e lanciamo il comando:

$ adb pull /sdcard/WhatsApp/Databases/msgstore.db.crypt12

Chiavi di decifratura

Questa sezione è solo per vostra pura informazione, sentitevi liberi di saltarla.

Il metodo crittografico utilizzando è AES con una chiave (K) di lunghezza 256 bit ed un vettore d’inizializzazione (IV) di 128 bit. La chiave AES 256 bit va dall’offset
0x7E fino a 0x9D nel file. L’offset inizia da 0x00. E’ possibile estrarre la chiave AES usando hexdump e assegnare il valore alla variabile $k.

$ k=$(hexdump -ve '2/1 "%02x"' key | cut -b 253-316)

La variabile $k conterrà un valore esadecimale a 64 cifre in ASCII di lunghezza esatta 256bit.
Il vettore d’inizializzazione IV va dall’offset 0x33 fino a 0x42 nel file crypt12. Il valore di IV varia da file a file.

$ iv=$(hexdump -n 67 -ve '2/1 "%02x"' msgstore.db.crypt12 | cut -b 103-134)

Il metodo d’estrazione di K e IV è simile a quanto visto nella guida per il crypt8.

Rimuovere intestazione e footer nel file crypt12

Ancora, questa sezione è solo per vostra informazione, potete saltarla.
Prima di iniziare la fase di decrypt, dobbiamo rimuovere l’header da 67 byte e il footer da 20 byte dal file crypt12.

$ dd if=msgstore.db.crypt12 of=msgstore.db.crypt12.enc ibs=67 skip=1
$ truncate -s -20 msgstore.db.crypt12.enc

Il comando dd sopra rimuove i primi 67 byte dal file e lo salva in un nuovo file con estensione crypt12.enc. Il comando truncate rimuove invece gli ultimi 20 byte dal file.

Decrittare il file crypt12

Siccome la libreria crittografia usata da whatsapp per AES sembra essere leggermente modificata, non siamo più in grado di utilizzare openssl per il nostro file crypt12.

Per decifrare dunque questi file, si trova in rete un piccolo programma in Java che in linea alla nuova crittografia di whatsapp svolge il compito richiesto.
Potete trovare l’applicativo in Java e la crypto library in questa repo.

Il programma in Java da in output esattamente 3 file:

msgstore.db.crypt12.enc – file cifrato senza header e footer.
msgstore.db.zlib – file decrittato, nel formato zlib.
msgstore.db – file decrittato (di fatti è un database sqlite3).

Sotto la procedura per la compilazione e l’esecuzione del programma in Java (si assume abbiate un pò di dimestichezza con git e la console):

$ git clone https://gitlab.com/digitalinternals/whatsapp-crypt12.git
 
$ cd whatsapp-crypt12/
 
$ javac -classpath "lib/whatsapp_spongycastle.jar:." crypt12.java
 
$ cp ../whatsapp.data/key .
 
$ cp ../whatsapp.data/msgstore.db.crypt12 .
 
$ java -cp "lib/whatsapp_spongycastle.jar:." crypt12
 
K:XXXXXXXXXX
IV:YYYY
creating encrypted file with header/footer stripped: msgstore.db.crypt12.enc
creating zlib output file: msgstore.db.zlib
creating sqlite3 output file: msgstore.db
 
$ ls -l
total 136724
-rw-r--r-- 1 ibrahim staff     4339 Oct  9 16:05 crypt12.class
-rw-r--r-- 1 ibrahim staff     5459 Oct  9 16:05 crypt12.java
-rw-r--r-- 1 ibrahim staff      158 Oct  9 16:05 key
drwxr-xr-x 2 ibrahim staff     4096 Oct  9 16:05 lib
-rw-r--r-- 1 ibrahim staff     1089 Oct  9 16:05 LICENSE
-rw-r--r-- 1 ibrahim staff 62692352 Oct  9 16:06 msgstore.db
-rw-r--r-- 1 ibrahim staff 25757610 Oct  9 16:05 msgstore.db.crypt12
-rw-r--r-- 1 ibrahim staff 25757523 Oct  9 16:05 msgstore.db.crypt12.enc
-rw-r--r-- 1 ibrahim staff 25757507 Oct  9 16:06 msgstore.db.zlib
-rw-r--r-- 1 ibrahim staff     1376 Oct  9 16:05 README.md
 
$ file *
crypt12.class:           compiled Java class data, version 52.0 (Java 1.8)
crypt12.java:            C source, ASCII text
key:                     Java serialization data, version 5
lib:                     directory
msgstore.db:             SQLite 3.x database, user version 1
msgstore.db.crypt12:     raw G3 data, byte-padded
msgstore.db.crypt12.enc: data
msgstore.db.zlib:        zlib compressed data

Conclusioni

Per usare il tool in Java, dovete avere OpenJDK. Oracle richiede che le JCE Provider libraries siano firmate. OpenJDK invece non ha queste necessità.
Se provate ad eseguire il tool su Oracle JDK, probabilmente otterrete quest’eccezione:

Exception in thread "main" java.lang.SecurityException: JCE cannot authenticate the provider SC

Ci sono alcuni trucchi per bypassare l’errore, ma non hanno funzionato con me.
Solo la libreria Omni-Crypt sembra funzionare per ora.

Hai bisogno d’aiuto?

Scrivi una mail e chiedi una consulenza anche tramite la pagina facebook se preferisci o lascia un commento.