
Générer des clés RSA backdoorées en utilisant SETUP
Ce dépôt contient le code pour reproduire l'attaque de piège secrètement intégré avec protection universelle (SETUP) sur la génération de clés RSA proposée par Young & Yung, 1996. Compte tenu du potentiel de cette attaque, ne faites jamais confiance aux systèmes de génération de clés en boîte noire.
Références : - Présentation de l'algorithme - Article original complet
Commencez par générer vos clés d'attaquant, puis générez les clés piégées.
# construction
go build generator.go
go build decryptor.go
# (option) générez vos clés RSA (légitimes)
openssl genrsa -out attacker_priv.pem 2048
openssl rsa -in attacker_priv.pem -pubout -out attacker_pub.pem
# génération des clés piégées
./generator -pk attacker_pub.pem
# sortie
------
[*] Génération d'un SETUP de 4096 bits...
> Cela peut prendre un moment...
------
------
[*] Paramètres trouvés :
> Longueur en bits de p : 256
> Longueur en bits de q : 3840
> Longueur en bits de n : 4096 // longueur de la clé finale
> Tentatives nécessaires : 542692
------
------
[*] Clés piégées enregistrées dans :
> Clé privée : out/victim_priv.pem
> Clé publique : out/victim_pub.pem
------
------
[*] Test avec :
> echo -n "hello world" | openssl pkeyutl -encrypt -inkey out/victim_pub.pem -pubin -out out/cipher.bin // chiffrer avec la clé publique SETUP
> ./decryptor -pk out/victim_pub.pem -sk <attacker_priv.pem> -c out/cipher.bin // déchiffrer avec la clé secrète
------
Si la victime fait confiance aux clés reçues (qui ont l'air parfaitement normales et fonctionnent comme prévu), elle les utilisera pour chiffrer certaines données, par exemple :
# chiffrer
echo -n "SuperSecretSh1tttttt" | openssl pkeyutl -encrypt -inkey out/victim_pub.pem -pubin -out out/cipher.bin
# vérifier
echo out/cipher.bin | base64
La subtilité est que l'attaquant peut déchiffrer le message en utilisant la clé publique de la victime et sa propre clé privée. Par exemple :
# déchiffrer
./decryptor -pk out/victim_pub.pem -sk attacker_priv.pem -c out/cipher.bin
# sortie
------
[*] Chargement des clés et du texte chiffré...
> Clé publique de la victime chargée
> Clé privée de l'attaquant chargée
> Texte chiffré chargé
------
------
[*] Dérivation de la clé privée à partir du SETUP...
> Taille de la clé publique : 2048
> Factorisation valide trouvée en utilisant s1
> p récupéré (longueur en bits : 256)
> q récupéré (longueur en bits : 3840)
> d récupéré (longueur en bits : 4092)
------
--- MESSAGE DÉCHIFFRÉ ---
��ϓ�f�~~P�k(���t%Tp��i/3qHvr��s �x��f����){���\c�f�
�.���n�=y���
�R}��r_2���q�H>u�K��%EB�,�yNZ���5�1��:�>��%O�Y/�,��J$a���`��
�ì�|��k&r��1�5H˚�+����U�/4p� ���֒9���#Gmծ����=�gfq��Pg,w�g)�E^���ͻ����-2�t�2-v
�y�.�Ȟ�<0S�i8�w�+�\���D/��/���e���sf?18��l�����Э�Y�
�uk��D҃C�P�leS�<���Cy�oI�I�˴�O�B'
g;L9{b�o.���y.���+J���
2А�$���WƇ�B���υk�D�SuperSecretSh1tttttt
-------------------------
Si vous voulez tous les détails de cette attaque, consultez les deux liens dans le préambule. Voici un aperçu de haut niveau de cette attaque :
Actuellement, le programme utilise ProbablyPrime() pour vérifier si un n donné est premier. ProbablyPrime effectue n tests de Miller-Rabin pour vérifier si x est premier. S'il retourne true, x est premier avec une probabilité de 1 - 1/4^n. S'il retourne false, x n'est pas premier. Par conséquent, il existe une probabilité non nulle que la génération de la porte dérobée échoue (Q ne peut pas être résolu). Relancez simplement l'outil si c'est le cas.
Prendre en charge les formats suivants : ssh-rsa, ssh-dsa, ssh-ecdsa. SETUP est théoriquement possible pour ceux-ci, ssh-ed25519 est résistant à SETUP. La clé privée SSH pourrait alors être dérivée des clés publiques récupérées avec ssh-keyscan. Je prévois également de fournir une petite utilitaire pour hooker ssh-keygen sur une machine compromise afin de piéger automatiquement les clés suivantes... À suivre.