Oracles Cryptographiques Trouver une joke de padding
Présentation Laurent Desaulniers CISSP, CISA, CISM, OSCP Pastafarian Cryptogeek Conseiller senior en sécurité Gabriel Tremblay B.Ing Logiciel, no lousy certs Pentester, Dev, Désagréable Président Subatomic Security Président NorthSec (nsec.io)
NorthSec (http://nsec.io) Le Hackus est Mort! Compétition en sécurité appliquée "Capture the flag" SmartCard Hardware Crypto Web Fun... Fun... JEOPARDY! (Public Shaming) 5-6-7 Avril 2013 (Montréal/Lieu à venir)
Attention : Pas brilliants Nous ne disposons pas, même a deux, d'assez de capital intellectuel pour avoir découvert ces attaques
Oracle quoi? + SSL??
Cryptographique! Un oracle cryptographique est une faille d'implémentation qui permet de déchiffrer un "ciphertext" sans posséder la clé. Il peut affecter autant l'algorithme que son méchanisme de padding ou autre appendice nouilleux nécessaire à son fonctionnement.
AES-ECB - Fonctionnement AES-ECB fonctionne sur une base de bloc de 16 bytes. Pour la présentation, nous assumons que AES-ECB fonctionne avec des boîtes magiques. mais Un bloc plaintext donne TOUJOURS le même plaintext.
AES-ECB - Fonctionnement Image non chiffrée et chiffrée Source: Wikipedia
AES-ECB - Problématique Les blocs sont indépendants. Il est donc possible de déchiffrer l'ensemble du ciphertext grace au pouvoir du Feng Shui Crypto*
AES-ECB - Détection DANS LA NATURE Longueur /16 Plaintext répété = Ciphertext répété Peut s'appliquer a DES sur 8 bytes.
AES-ECB - Oracle On doit controller une partie du plaintext Etre capable de causer la génération d'un deuxieme bloc Il devrait y avoir une partie du plaintext que nous ne controlons et que nous ne connaissons pas "Secret" utilisateur role secret Nous controlons "utilisateur" Nous n'avons aucune idée du reste.
AES-ECB - Oracle Être capable d'envoyer plusieurs requêtes Captcha Jetons Anti-CSRF Server hébergé sur autre chose qu'une ligne télégraphique
AES-ECB - Attaque 1. On cherche a trouver la longueur initiale du Plaintext Complet (ce que l'on contrôle + le reste, si il y en a) 2. On Ajoute 1 caractere a la fin de notre plaintext, ceci aura un impact sur le ciphertext: a. Meme longeur de ciphertext b. Longueur différente.
AES-ECB - Attaque Si il n'y a pas de changement de longueur, nous ajoutons un caractère jusqu'a ce que le ciphertext change de taille Longueur Ciphertext = Longueur Plaintext + Padding Si on a un ajout de bloc, on sait que nous avons dépassé le padding???????
AES-ECB - Attaque Donc Longueur_Ciphertext = Longueur Plaintext connu et inconnu + Padding Comme les blocs de padding ont 16 bytes, lorsque nous causons la génération d'un nouveau bloc. Alors: Longueur_plaintext = 16 - (Longueur plaintext controllé + longeur plaintext non_controllé) - 1 16 = Padding 1 = Le caractere de trop qui a fait générer un bloc.
AES-ECB - Attaque Pourquoi est-ce un oracle? Il est possible de déplacer le plaintext secret au sein du ciphertext Crypto Fengshui!
Crypto Fengshui Username Role LAURENT Admistra (Bloc 1) teurppppppppppppppp (Bloc2) Si, le username est AAAAAAAAAAAAAAA AAAAAAAAAAAAAAA AdministrateurPP
AES-ECB - Imaginer une biere dont vous connaisez le gout (ciphertext) - Vous connaissez tout les ingrédients (plaintext) sauf 1(premier byte du secret) - Comment pouvez vous déterminer lingrédient manquant si il n'existe que 26 ingredients possibles - Faire 26 fois la recette et valider le gout!
AES-ECB Etape 1: CryptoFengshui Etape 2: Faire un dictionnaire Essayer toutes les possibilités de AAAAAAAAAAAAAAAAAA\x00 AAAAAAAAAAAAAAAAAA\xFF Etape 3: Envoyer AAAAAAAAAAAAAAAAA "Et c'est tout!"
AES-CBC/PKCS5 - Fonctionnement "Cipher Block Chaining" Les blocs sont maintenant dépendant L'algorithme de padding est défini The evil PKCS5
AES-CBC Source: Wikipedia
AES-ECB - Fonctionnement Dessin wikipedia
AES-CBC - Concepts importants (IV) Un bloc de plaintext doit toujours etre chiffré avec le ciphertext précédent. Que faire pour le premier bloc? Le premier bloc est toujours composé de 16 bytes aléatoires, c'est Le Vecteur d'initialisation (IV) Ainsi, le meme plaintext chiffré deux fois, avec deux IV différent, donnera deux ciphertext différents. Meme si ils ont la même clef.
AES-CBC - Concepts importants (IMV) En version très simple (TRÈS), le déchiffrement AES ressemble a: 1. Prendre un bloc de ciphertext 2. Le passer dans des boites magiques (AES) auxquelles nous fournissons aussi la clé. 3. On obtiens un (IMV) 4. On XOR ce IMV avec le ciphertext du bloc précédent 5. On obtiens le plaintext
The Evil PKCS5 Il y a TOUJOURS un bloc de padding à la fin. Car le plaintext doit etre contigu a 16 bytes Alors on ajoute un "padding" pour combler les trous Ce padding est défini (norme): 1 byte restant, padding: \x01 2 bytes restant, padding: \x02\x02 3 bytes restant, padding: \x03\x03\x03... Le plaintext est contigu!?, Padding: \x16\x16\x16\x16\x16... 16*\x16 :)
AES-CBC/PKCS5 - Problématique Ceci expose un fait très intéressant Le padding peut être erroné! Il existe une façon de valider si le padding est valide
AES-CBC - Détection DANS LA NATURE Longueur /16 Plaintext répété!= Ciphertext répété Minimum 32 bytes (IV + bloc 1) Si on ne chiffre strictement rien : IV + chiffré (16*\x16). Si on chiffre juste un "A" : IV + chifré(a + 15*\x15) Modifier 1 byte du IV changera tout le reste du ciphertext A tester vraiment!!!
AES-CBC/PKCS5 - Oracle Si le système permet à l'attaquant de déterminer qu'une erreur de padding s'est produite nous sommes en situation d'oracle. Cette situation peut se manifester sous plusieurs formes: - Temps de réponse variable - Message d'erreur différent - Code de retour http différent
CBC+PKCS5 - Propriété importante Admetons un IV au hazard et 1 bloc de ciphertext La probabilité d'obtenir 15 caratère aléatoire et un padding a \0x01 est nettement supérieure à celle d'obtenir 16*\0x16 Ceci est bizare, mais important pour la suite :)
AES-CBC - Attaque 1. Déterminer comment le système exprime une erreur de padding 2. Déterminer comment le système exprime un déchiffrement réussi. (Demo) url-redirect SSO.
AES-CBC - Attaque 1. Concentrons nous sur 1 seul bloc 2. Nous allons couper le ciphertext pour ne garder que les 32 premiers bytes a. IV + Block1 3. On met le IV completement a 16*0x00 4. On incrémente le dernier byte du IV jusqu'à ce que le site nous retourne un déchiffrement réeussi.
AES-CBC - Attaque 1. Nous sommes en situation où ciphertext = IV + chiffré(block1 + \x01) Car le site n'a pas régurgité d'erreur. Il est cependant important de noter que notre url "plaintext" est completement loufoque. La valeur du caractere du IV est utilisée comme IMV [INSERER DESSIN DE 3 BLOCS)
En image Controle Controle Source: Immunity
AES-CBC - Attaque Il est possible de déchiffrer le dernier byte car: \0x01 XOR IMV = Plaintext[15]
AES-CBC - Attaque Comment s'attaquer au byte [14]? Si vous vous rapellez, nous cherchons une chaine terminée par \x02\x02 Maintenant que nous connaisons la valeur du IMV[15] nous pouvons calculer la valeur pour obtenir \x02 a Block1[15] IMV XOR \x02 XOR \x01 = IV[15]
AES-CBC - Attaque Nous recommencons l'attaque sur IV[14] Demo + Dessins + ramasser le sang C'est tout!
D'autres oracles Il existe plusieurs autres attaques de ce genre Bleinbacher Attack (RSA) Lenght-Extension (SHA1) D'autres s'ajouteront avec le temps! Hackfest 2013?.. hahah.