c1b3rwall / module_3

Files from module_3
13 stars 14 forks source link

Ejercicio 2 #5

Open jfzazo opened 3 years ago

jfzazo commented 3 years ago

Otro ejercicio que se me queda a medias pero en el que tengo la impresión de haber avanzado algo.

Se provee un .zip con ficheros encriptados y una clave pública. El objetivo consistirá en recuperar la información.

1) ¿Qué clase de clave es?

$openssl pkey -pubin -in public.pem -text -noout
RSA Public-Key: (128 bit)
Modulus:
    00:d6:3a:aa:15:09:17:7f:4d:85:57:64:1d:bf:d1:14:27
Exponent: 65537 (0x10001)

Una clave bastante pequeña. Con el módulo obtenido (pasando a decimal) y tirando de mente prodigiosa, observamos que se descompone en dos números primos, p,q tales que:

p=16278629018683492619
q=17492836384758049493

Bueno, lo de mente prodigiosa, como os podéis imaginar no es el caso, pero una búsqueda en WolframAlpha y se obtiene rápidamente el resultado. 2) Con este avance se va a intentar recuperar la clave privada a partir de los parámetros que definen esta clave RSA:

e = 65537
p = 16278629018683492619
q = 17492836384758049493
((p-1)(q-1)) = 284759393992004821906415293399860650056
n = pq = 284759393992004821940186758803302192167
d = e^{-1} mod ((p-1)(q-1)) = 65537^-1 mod (16278629018683492618*17492836384758049492) = 166657480750680332469329767820392375201

3) Para ello, generamos un fichero def.asn1 con la información previa:

asn1=SEQUENCE:private_key
[private_key]
version=INTEGER:0

n=INTEGER:0xd63aaa1509177f4d8557641dbfd11427
e=INTEGER:0x10001
d=INTEGER:0x7d61103207842d084b798fb99a8ba3a1
p=INTEGER:0xe1e94ed838fec90b
q=INTEGER:0xf2c30a02cb882ad5
exp1=INTEGER:0xdb30866a6e6a6edf
exp2=INTEGER:0x90bbe9df0abbcf55
coeff=INTEGER:0xb5b3ddb370e64a03

4) Y generamos la clave en formato per:

openssl asn1parse -genconf def.asn1 -out privkey.der -noout
openssl rsa -inform DER -outform PEM -in privkey.der -out privkey.pem

5) Y recuperamos la información desde el resto de ficheros:

for i in $(ls -1 File_2/*.encrypted); do echo "$i"; openssl rsautl -decrypt -in "$i" -inkey privkey.pem >> total_rot.xml;done

6) Sobre el fichero total_rot.xml se ha aplicado un cifrado Cesar. Nuevamente con cyberchef u otra herramienta al gusto, se recupera el contenido de un fichero de Word:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><o:DocumentProperties></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/></w:fonts><w:docPr></w:docPr><w:body><wx:sect><w:p><w:pPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Helvetica Light" w:h-ansi="Helvetica Light" w:cs="Helvetica Light"/><wx:font wx:val="Helvetica Light"/><w:sz w:val="24"/><w:sz-cs w:val="24"/></w:rPr><w:t>**diKBVUfEaItQ5lE3Nitr6KOwuZTc/eR8**</w:t></w:r></w:p><w:sectPr></w:sectPr></wx:sect></w:body></w:wordDocument>**-----BEGIN PUBLIC KEY-----
MDQwDQYJKoZIhvcNAQEBBQADIwAwIAIZAL9LPyTM85vtJebljX3p+ORWj2gGwk/o
wQIDAQAB
-----END PUBLIC KEY-----**

7) Hay una clave pública nueva y otra cadena sospechosa... tiene pinta de ser base64, conteniendo un nuevo secreto cifrado de 24B para una clave pública de 192 bits... parece obvio que hay que continuar con esa pista aunque por hoy suficiente.

frohe commented 3 years ago

En realidad es el Ejercicio 2. Si puedes cambia el nombre.

Ya lo he resuelto, pero el mérito es tuyo. Impresionante. Apunto lo siguiente y aclaro algunas cosas para los más verdes:

1º hay que factorizar en primos el módulo obtenido.

En wolframalpha no te deja con este número de 192 bits --> hay que convertirlo a decimal. Hay páginas como https://www.mobilefish.com/services/big_number/big_number.php.

Sacamos el módulo de la clave pública: MDQwDQYJKoZIhvcNAQEBBQADIwAwIAIZAL9LPyTM85vtJebljX3p+ORWj2gGwk/o wQIDAQAB,

y es bf4b3f24ccf39bed25e6e58d7de9f8e4568f6806c24fe8c1, en decimal

Pero en esta página te lo factoriza en tiempo récord https://www.numberempire.com/numberfactorizer.php.

(suerte que nuestro número tiene 58 dígitos y el límite es 60, pero adiós a RSA 192 bits)

p=67446555695998731383019035573 q=69544152732691176387798972509

2º calculamos d y los exponentes, etc..

(en esta página podemos hacerlo http://kourbatov.com/math/calculators/100digitbigintcalculator.htm)

d = e^{-1} mod ((p-1)(q-1)) = 407880080549055052582335745374603828252859506336060164625

exp1 = d.mod(p.subtract(BigInteger.ONE)); 7787480155509443526180707725 exp2 = d.mod(q.subtract(BigInteger.ONE)); 29059411059168833870636050813 coeff = q.modInverse(p); 28887724925648423762038613151

3º generamos el def.asn1

asn1=SEQUENCE:private_key [private_key] version=INTEGER:0

n=INTEGER:0xBF4B3F24CCF39BED25E6E58D7DE9F8E4568F6806C24FE8C1 e=INTEGER:0x10001 d=INTEGER:0x10A2777C38C25A65D5ECED3B2920F447A0985329B2004A11 p=INTEGER:0xD9EE7BB69D02888B0A3E5BB5 q=INTEGER:0xE0B59329D2872DD2B8D5385D exp1=INTEGER:0x1929A71123B9DA282BAB9D8D exp2=INTEGER:0x5DE561A61333AB41273CE97D coeff=INTEGER:0x5D575DB220A956B9880FE49F

a partir de aquí lo mismo para generar la clave privada y descifrar la cadena diKBVUfEaItQ5lE3Nitr6KOwuZTc/eR8. Pero hay que ponerla en hex:

76 22 81 55 47 c4 68 8b 50 e6 51 37 36 2b 6b e8 a3 b0 b9 94 dc fd e4 7c

Lo guardamos en un archivo, word.crypted por ejemplo.

Y desciframos

openssl rsautl -decrypt -in word.crypted -inkey privkey2.pem >> word.txt

ch4m17ux commented 3 years ago

Muchas gracias por la ayuda. Pero aun no me queda claro como se debe realizar el ejercicio. Podeis poner un step-by-step en linea de comandos?

jfzazo commented 3 years ago

Muchas gracias por la ayuda. Pero aun no me queda claro como se debe realizar el ejercicio. Podeis poner un step-by-step en linea de comandos?

PD: Por cierto, que no lo vi antes. Para pasar el secreto a hexa no hay necesidad de andar convirtiendo a mano:

$echo "diKBVUfEaItQ5lE3Nitr6KOwuZTc/eR8" | base64 -d > word.crypted
asalazard commented 3 years ago

Guia paso a paso de la clave 128 bits WriteUpModulo3_Ejercicio2_Detallado.pdf 128