vendredi 30 novembre 2012

Manipulons un peu cryptsetup sans cryptsetup

cryptsetup est l'outil en ligne de commande permettant de manipuler dm-crypt, le module de chiffrement du noyau linux.
Il permet de chiffrer et déchiffrer à la volée les informations destinées à être enregistrées/lues sur le disque dur.

Je propose une petite manipulation pour faire du cryptsetup sans cryptsetup. Il ne s'agit pas de cracking, puisque la clé doit être connue, il s'agit seulement d'expliquer un peu comment cela fonctionne.
J'utilise la version sans LUKS pour plus de facilité, mais la version avec LUKS fonctionne de la même manière, aux offsets près.

1/ Déchiffrement sans cryptsetup:
On crée un mapping, et on copie des données dedans:

kevin@slack:~$ dd if=/dev/zero of=img bs=1024k count=10
10+0 enregistrements lus
10+0 enregistrements écrits
10485760 octets (10 MB) copiés, 0,0307038 s, 342 MB/s
kevin@slack:~$ sudo losetup /dev/loop0 img 
kevin@slack:~$ sudo cryptsetup create -c aes-cbc-plain -s 128 x /dev/loop0
Entrez la phrase de passe :   ( abcd comme pass )
kevin@slack:~$ sudo dmsetup table --showkeys x
0 20480 crypt aes-cbc-plain 2e7e536fd487deaa943fda5522d917bd 0 7:0 0
kevin@slack:~$ printf 'abcd' | openssl dgst -ripemd160
2e7e536fd487deaa943fda5522d917bdb9011b7a
kevin@slack:~$
On met quelques données dans ce container. Je les écrit en dur, sans mettre de filesystem, puis on démonte le maping:
kevin:~# python -c "print 'A'*512 + 'B'*512 + 'Success' " > /dev/mapper/x
kevin@slack:~$ sudo cryptsetup remove x

Et le déchiffrement sans cryptsetup est aisé:
kevin@slack:~$ dd if=img of=part1 bs=512 count=1
kevin@slack:~$ dd if=img of=part2 bs=512 count=1 skip=1
kevin@slack:~$ dd if=img of=part3 bs=512 count=1 skip=2
kevin@slack:~$ openssl aes-128-cbc -nosalt -nopad -d -in part1 -K 2e7e536fd487deaa943fda5522d917bdb9011b7a -out clear1 -iv 0 -p
key=2E7E536FD487DEAA943FDA5522D917BD
iv =00000000000000000000000000000000
kevin@slack:~$ openssl aes-128-cbc -nosalt -nopad -d -in part2 -K 2e7e536fd487deaa943fda5522d917bdb9011b7a -out clear2 -iv 01 -p
key=2E7E536FD487DEAA943FDA5522D917BD
iv =01000000000000000000000000000000
kevin@slack:~$ openssl aes-128-cbc -nosalt -nopad -d -in part3 -K 2e7e536fd487deaa943fda5522d917bdb9011b7a -out clear3 -iv 02 -p
key=2E7E536FD487DEAA943FDA5522D917BD
iv =02000000000000000000000000000000
kevin@slack:~$ hexdump -C clear3 
00000000  53 75 63 63 65 73 73 0a  ad 5c 0c 69 bc 82 c5 9d  |Success..\.i....|

Attention aux IV qui croissent en relation avec le numéro de secteur.

2/ Création de volumes cryptsetup sans cryptsetup:
Pour créer un device depuis openssl, c'est le même principe:
kevin@slack:~$ python -c 'print ("A"*511)' > e1c
kevin@slack:~$ python -c 'print ("B"*511)' > e2c
kevin@slack:~$ python -c 'print ("C"*511)' > e3c
kevin@slack:~$ openssl aes-128-cbc -nosalt -nopad -e -in e1c -K 2e7e536fd487deaa943fda5522d917bdb9011b7a -out e1 -iv 0 -p
key=2E7E536FD487DEAA943FDA5522D917BD
iv =00000000000000000000000000000000
kevin@slack:~$ openssl aes-128-cbc -nosalt -nopad -e -in e2c -K 2e7e536fd487deaa943fda5522d917bdb9011b7a -out e2 -iv 01 -p
key=2E7E536FD487DEAA943FDA5522D917BD
iv =01000000000000000000000000000000
kevin@slack:~$ openssl aes-128-cbc -nosalt -nopad -e -in e3c -K 2e7e536fd487deaa943fda5522d917bdb9011b7a -out e3 -iv 02 -p
key=2E7E536FD487DEAA943FDA5522D917BD
iv =02000000000000000000000000000000
kevin@slack:~$ cat e1 e2 e3 > e-disk
kevin@slack:~$ sudo losetup /dev/loop1 e-disk 
kevin@slack:~$ sudo cryptsetup create -c aes-cbc-plain -s 128 x /dev/loop1
Entrez la phrase de passe :  ( "abcd" comme pass )
kevin@slack:~$ sudo hexdump -C /dev/mapper/x
00000000  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
*
000001f0  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 0a  |AAAAAAAAAAAAAAA.|
00000200  42 42 42 42 42 42 42 42  42 42 42 42 42 42 42 42  |BBBBBBBBBBBBBBBB|
*
000003f0  42 42 42 42 42 42 42 42  42 42 42 42 42 42 42 0a  |BBBBBBBBBBBBBBB.|
00000400  43 43 43 43 43 43 43 43  43 43 43 43 43 43 43 43  |CCCCCCCCCCCCCCCC|
*
000005f0  43 43 43 43 43 43 43 43  43 43 43 43 43 43 43 0a  |CCCCCCCCCCCCCCC.|
00000600

Enjoy.