Où trouver le challenge ?

Le challenge se trouve dans ce repo github.

Résolution

Cette fois le challenge nous vient sous forme d'archive.
L'archive contient 2 fichiers.

Le but ici c'est donc de récupérer la clé privée à partir de la clé publique pour ensuite pouvoir déchiffrer le flag.

Comme on peut le voir, la clé publique est très courte, ce qui nous permettra de facilement la casser.

Commençons par récupérer quelques informations sur cette clé publique.

Notre hypothèse se vérifie, la clé est très courte (399 bits).

On va donc maintenant extraire le modulo N et tenter de la factoriser pour retrouver le P et Q de la clé privée.

# Convert to int
python -c 'print(int("52A99E249EE7CF3C0CBF963A009661772BC9CDF6E1E3FBFC6E44A07A5E0F894457A9F81C3AE132AC5683D35B28BA5C324243", 16))' 

833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019

Pour ça on va utiliser le site factorDB qui recense tous les nombres factorisables connu.

Comme on peut le voir il est assez simple de factoriser N pour retrouver P et Q.
Avec P et Q il est simple de calculer λ(n) et avec λ(n) il est simple de trouver D.

def egcd(a, b):
    if a == 0: return (b, 0, 1)
    g, x, y = egcd(b % a, a)
    return (g, y - (b // a) * x, x)

def mod_inv(a, m):
    g, x, _ = egcd(a, m)
    return (x + m) % m

p=863653476616376575308866344984576466644942572246900013156919
q=965445304326998194798282228842484732438457170595999523426901
e=65537
phi = (p - 1) * (q - 1)
d = mod_inv(e, phi)
print(d)

521250646663056391768764366517618655312275374668692430321064634566533568373969990465313092928455546989832961905578375473

A partir de là il ne reste plus qu'à reconstruire la clé privée (le couple N et D).

from Crypto.PublicKey import RSA #pip install pycrypto

p=863653476616376575308866344984576466644942572246900013156919

q=965445304326998194798282228842484732438457170595999523426901

d=521250646663056391768764366517618655312275374668692430321064634566533568373969990465313092928455546989832961905578375473

n=833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019

e=long(65537)

pvt = RSA.construct((n, e, d, p, q))
print(pvt.exportKey("PEM"))

On enregistre notre nouvelle clé privée et il ne reste plus qu'à déchiffrer le flag.

On enregistrer simplement la clé dans un fichier texte (keyprivate.pem).

On décode notre flag en base64

cat flag.b64 |base64 -d > RawFile 

Ensuite on le déchiffre simplement avec openssl.

openssl rsautl -decrypt -in RawFile -out decrypted.txt -inkey keyprivate.pem 

Et voila !

Social et Media

Comme toujours je suis disponible sur Twitter et cie, si vous avez des questions, des remarques, des suggestions etc. N’hésitez pas !

Twitter: @GhostAgs

Discord: hackraw