probar contraseñas en texto cifrado simétricamente

Iniciado por xabware, 3 Octubre 2020, 23:05 PM

0 Miembros y 1 Visitante están viendo este tema.

xabware

Hola, buenas noches, soy nuevo en el foro.
Estoy haciendo una práctica de una asignatura de seguridad informática y tengo que tratar de descifrar un texto que está cifrado con una clave simétrica y en base64 para ser imprimible.
Para ello tengo una lista de contraseñas, se que entre ellas está la correcta, pero no se que algoritmo se ha usado. Se que el texto descifrado, debe tener el formato flag{datos} (en datos una serie de letras y números).
Para ello estoy utilizando el siguiente script de bash:
#!/bin/bash

IFSAUX= $IFS

contrasenas=()
while IFS= read -r line
do
    contrasenas+=("$line")
done < "contrasenas.txt"
#Contrasenas.txt tiene una lista de 1000 contraseñas
IFS= $IFSAUX

IFS=' ' read -r -a algoritmos <<< $(openssl help 2>&1 | grep -A 1000 "Cipher" | tail -n +2 | tr -d '\n')

for contrasena in ${contrasenas
  • }
    do
       for algoritmo in ${algoritmos
  • }
        do
            #este directorio tiene el texto a descifrar
       cat openssl_reto/reto_SSI19 | openssl enc -base64 -d | openssl enc -d -$algoritmo -pass pass:$contrasena | openssl enc -base64  >> salida2.txt
             #if [ $? -eq 0 ]; then
               # echo $contrasena $algoritmo
          #cat openssl_reto/reto_SSI19 | openssl enc -base64 -d | openssl enc -d -$algoritmo -pass pass:$contrasena | openssl enc -base64
          #read -n1    
           # fi
        done
    done

    soy bastante nuevo haciendo scripts de bash así que creo que está bashtante mal (perdón). La cosa es que en el fichero que me genera con los textos descifrados ninguno tiene el formato de flag.
    Tenéis alguna idea de que puedo probar o de qué puede estar pasando?
    sí queréis puedo pasar el texto a descifrar y las contraseñas pero por ahora creo que eso solo haría que mi post fuese demasiado largo.
    Gracias de antemano si has dedicado tu tiempo a leerme y aún más gracias si pretendes contestarme. Espero que yo también pueda ser de utilidad en este foro algún día. Un abrazo

kub0x

#1
Hola,

veo que desencodeas el base64 del texto cifrado, y acto seguido pruebas a descifrar utilizando el algoritmo con una contraseña (esto debido a los dos bucles). Ahora, una vez descifras, ¿por qué encodeas el descifrado en base64? En b64 el descifrado no tendrá los datos ni el flag, supongo.

Si no estoy en lo correcto, y aun quitando el b64 del descifrado no lo logras, el propio OpenSSL te puede imprimir que algoritmos simétricos soporta, de esta forma, añadiéndolos a la lista, encontrarás la respuesta.

Ten en cuenta que el nº de intentos/try será nº_de_algoritmos * nº_de_passwords en el peor de los casos.

Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


xabware

Cita de: kub0x en  3 Octubre 2020, 23:16 PM
Hola,

veo que desencodeas el base64 del texto cifrado, y acto seguido pruebas a descifrar utilizando el algoritmo con una contraseña (esto debido a los dos bucles). Ahora, una vez descifras, ¿por qué encodeas el descifrado en base64? En b64 el descifrado no tendrá los datos ni el flag, supongo.

Si no estoy en lo correcto, y aun quitando el b64 del descifrado no lo logras, el propio OpenSSL te puede imprimir que algoritmos simétricos soporta, de esta forma, añadiéndolos a la lista, encontrarás la respuesta.

Ten en cuenta que el nº de intentos/try será nº_de_algoritmos * nº_de_passwords en el peor de los casos.

Saludos.

Sí, he tenido en cuenta esos factores. De hecho si te fijas en mi código extraigo los algoritmos simétricos que soporta OpenSSL de su propia página de help, concretamente son estos:
aes-128-cbc       
aes-128-ecb       
aes-192-cbc       
aes-192-ecb       
aes-256-cbc       
aes-256-ecb       
aria-128-cbc     
aria-128-cfb     
aria-128-cfb1     
aria-128-cfb8     
aria-128-ctr     
aria-128-ecb     
aria-128-ofb     
aria-192-cbc     
aria-192-cfb     
aria-192-cfb1     
aria-192-cfb8     
aria-192-ctr     
aria-192-ecb     
aria-192-ofb     
aria-256-cbc     
aria-256-cfb     
aria-256-cfb1     
aria-256-cfb8     
aria-256-ctr     
aria-256-ecb     
aria-256-ofb     
base64           
bf               
bf-cbc           
bf-cfb           
bf-ecb           
bf-ofb           
camellia-128-cbc 
camellia-128-ecb 
camellia-192-cbc 
camellia-192-ecb 
camellia-256-cbc 
camellia-256-ecb 
cast             
cast-cbc         
cast5-cbc         
cast5-cfb         
cast5-ecb         
cast5-ofb         
des               
des-cbc           
des-cfb           
des-ecb           
des-ede           
des-ede-cbc       
des-ede-cfb       
des-ede-ofb       
des-ede3         
des-ede3-cbc     
des-ede3-cfb     
des-ede3-ofb     
des-ofb           
des3             
desx             
rc2               
rc2-40-cbc       
rc2-64-cbc       
rc2-cbc           
rc2-cfb           
rc2-ecb           
rc2-ofb           
rc4               
rc4-40           
seed             
seed-cbc         
seed-cfb         
seed-ecb         
seed-ofb         
sm4-cbc           
sm4-cfb           
sm4-ctr           
sm4-ecb           
sm4-ofb

En cuanto a lo del base64, lo pongo para que una vez desencodeado se vuelva a convertir en texto imprimible, antes he probado a quitar el segundo base64 por lo que tu dices, y solo obtenía un montón de símbolos sin sentido, aunque supongo que podría probar a guardar todo eso en un fichero y ver si aunque solo sea una de las salidas tiene sentido

kub0x

Un ejemplo siguiendo tus pautas:

Tengo un fichero example con el texto hola.
Cifro el fichero con AES-256, password 1234 y encodeo en b64. Guardo el resultado en example.enc

Ahora, aplicando tu pipeline de comandos, el resultado es hola, en base64 es decir -> aG9sYQo=

cat example.enc | openssl enc -d -base64 | openssl enc -d -aes256 -pass pass:1234 | openssl enc -base64

Si quito el último b64 como te decía antes, el resultado es hola, tal y como yo quiero que sea.

cat example.enc | openssl enc -d -base64 | openssl enc -d -aes256 -pass pass:1234

Tu profe (probablemente) quiere que busques la secuencia flag-datos en el texto plano sin encodear, no en el texto plano encodeado en b64.

Lo lógico es guardar en un fichero los distintos plaintexts, obviamente, númerados y con su password con separadores o como quieras, para así, una vez obtenido el válido, saber que algoritmo-password es.

Eso o guardar el nº de intentos y descomponerlo en nº algoritmo y nº de password.

Si sabes lo que buscas, es decir, el flag o algo del plaintext, con una búsqueda valdría, en bash es sencillo.

Espero servir de ayuda. Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


animanegra

#4
Cita de: xabware en  3 Octubre 2020, 23:05 PM
Hola, buenas noches, soy nuevo en el foro.
Estoy haciendo una práctica de una asignatura de seguridad informática y tengo que tratar de descifrar un texto que está cifrado con una clave simétrica y en base64 para ser imprimible.
Para ello tengo una lista de contraseñas, se que entre ellas está la correcta, pero no se que algoritmo se ha usado. Se que el texto descifrado, debe tener el formato flag{datos} (en datos una serie de letras y números).
Para ello estoy utilizando el siguiente script de bash:
#!/bin/bash

IFSAUX= $IFS

contrasenas=()
while IFS= read -r line
do
   contrasenas+=("$line")
done < "contrasenas.txt"
#Contrasenas.txt tiene una lista de 1000 contraseñas
IFS= $IFSAUX

IFS=' ' read -r -a algoritmos <<< $(openssl help 2>&1 | grep -A 1000 "Cipher" | tail -n +2 | tr -d '\n')

for contrasena in ${contrasenas
  • }
    do
       for algoritmo in ${algoritmos
  • }
       do
           #este directorio tiene el texto a descifrar
       cat openssl_reto/reto_SSI19 | openssl enc -base64 -d | openssl enc -d -$algoritmo -pass pass:$contrasena | openssl enc -base64  >> salida2.txt
            #if [ $? -eq 0 ]; then
              # echo $contrasena $algoritmo
          #cat openssl_reto/reto_SSI19 | openssl enc -base64 -d | openssl enc -d -$algoritmo -pass pass:$contrasena | openssl enc -base64
          #read -n1    
          # fi
       done
    done

    soy bastante nuevo haciendo scripts de bash así que creo que está bashtante mal (perdón). La cosa es que en el fichero que me genera con los textos descifrados ninguno tiene el formato de flag.
    Tenéis alguna idea de que puedo probar o de qué puede estar pasando?
    sí queréis puedo pasar el texto a descifrar y las contraseñas pero por ahora creo que eso solo haría que mi post fuese demasiado largo.
    Gracias de antemano si has dedicado tu tiempo a leerme y aún más gracias si pretendes contestarme. Espero que yo también pueda ser de utilidad en este foro algún día. Un abrazo
Tu profe tiene pinta de ser alguien altamente sexy e inteligente.
Está bien que como comenté os hagáis cuenta en las comunidades relacionadas con la seguridad.

Mayormente con lo que te ha dicho Kub0x lo deberías de sacara. Ya que:

1 estabas codificando en base64 la salida ¿Que esperabas exactamente conseguir con eso?

2 Como bien dice, teniendo todo o parte del contenido descifrado, os doy el formato del flag:
"flag{numero}" sólo tienes que obtener la salida que te vayan dando los cifrados y verificar cual tiene ese formato concreto. Puede que muchos cifrados den salida correcta a pesar de no descifrar correctamente asi que el exitcode del programa séa 0 no vale.

De todas formas lo de "soy bastante nuevo en bash" es un poco como "llorar por llorar" para que te ayuden. Podéis solucionarlo, y de hecho asi os lo comenté, con el lenguaje de programación que prefiráis. Haber elegido otro lenguaje. :)

saludos.

42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.

ikxss

Mucho ojo con preguntar cuestiones de las asignaturas de animanegra. Es un juanker y nos tiene videovigilados.

PD: Fui exalumno suyo y es cierto lo de que es sexy e inteligente   :xD

DarK_FirefoX

Cita de: animanegra en  4 Octubre 2020, 17:09 PM
Tu profe tiene pinta de ser alguien altamente sexy e inteligente.
Está bien que como comenté os hagáis cuenta en las comunidades relacionadas con la seguridad.

Mayormente con lo que te ha dicho Kub0x lo deberías de sacara. Ya que:

1 estabas codificando en base64 la salida ¿Que esperabas exactamente conseguir con eso?

2 Como bien dice, teniendo todo o parte del contenido descifrado, os doy el formato del flag:
"flag{numero}" sólo tienes que obtener la salida que te vayan dando los cifrados y verificar cual tiene ese formato concreto. Puede que muchos cifrados den salida correcta a pesar de no descifrar correctamente asi que el exitcode del programa séa 0 no vale.

De todas formas lo de "soy bastante nuevo en bash" es un poco como "llorar por llorar" para que te ayuden. Podéis solucionarlo, y de hecho asi os lo comenté, con el lenguaje de programación que prefiráis. Haber elegido otro lenguaje. :)

saludos.

Se que esto es offtopic, pero si que me ha hecho el día....  :laugh: :laugh: :xD :xD

Salu2s

animanegra

Bueno, conocimiento y diversion no tienen por que que estar reñidos ¿no?

42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.

xabware

Cita de: animanegra en  4 Octubre 2020, 17:09 PM
Tu profe tiene pinta de ser alguien altamente sexy e inteligente.
Está bien que como comenté os hagáis cuenta en las comunidades relacionadas con la seguridad.

Mayormente con lo que te ha dicho Kub0x lo deberías de sacara. Ya que:

1 estabas codificando en base64 la salida ¿Que esperabas exactamente conseguir con eso?

2 Como bien dice, teniendo todo o parte del contenido descifrado, os doy el formato del flag:
"flag{numero}" sólo tienes que obtener la salida que te vayan dando los cifrados y verificar cual tiene ese formato concreto. Puede que muchos cifrados den salida correcta a pesar de no descifrar correctamente asi que el exitcode del programa séa 0 no vale.

De todas formas lo de "soy bastante nuevo en bash" es un poco como "llorar por llorar" para que te ayuden. Podéis solucionarlo, y de hecho asi os lo comenté, con el lenguaje de programación que prefiráis. Haber elegido otro lenguaje. :)

saludos.

Es posible que mi profe sea altamente sexy e inteligente. No te voy a engañar, siendo el primer foro que aparece en internet esperaba que aparecieras por aquí, tomémoslo como una tutoría pero más divertido.

Codificaba en base64 la respuesta porque si no los resultados eran algo confusos, pero también probé a no hacerlo por supuesto y aún así no lo conseguía, así que tras mucho probar acabé preguntando por aquí para ver si alguien tenía alguna idea ingeniosa para probar más cosas, nuestro fallo era que no estábamos probando con todos los algoritmos ;) ya lo hemos conseguido.

Efectivamente ya nos dimos cuenta de lo de que el exitcode fuera cero, si te fijas más atentamente en el código que puse, esa parte está comentada, en ese momento estábamos guardando las salidas en un fichero para más tarde buscar el formato del flag en ese fichero.

Al último punto si que no tengo nada que decir, efectivamente podríamos haberlo hecho en cualquier otro lenguaje y nos pusimos a hacerlo en bash porque somos unos cabezotas, pero mira, esto que hemos aprendido (era nuestro primer programa en bash más allá de un par de change directories).

Muchas gracias animanegra, tus discípulos te honrarán siendo menos quejicas en adelante.

xabware

Cita de: kub0x en  4 Octubre 2020, 02:09 AM
Un ejemplo siguiendo tus pautas:

Tengo un fichero example con el texto hola.
Cifro el fichero con AES-256, password 1234 y encodeo en b64. Guardo el resultado en example.enc

Ahora, aplicando tu pipeline de comandos, el resultado es hola, en base64 es decir -> aG9sYQo=

cat example.enc | openssl enc -d -base64 | openssl enc -d -aes256 -pass pass:1234 | openssl enc -base64

Si quito el último b64 como te decía antes, el resultado es hola, tal y como yo quiero que sea.

cat example.enc | openssl enc -d -base64 | openssl enc -d -aes256 -pass pass:1234

Tu profe (probablemente) quiere que busques la secuencia flag-datos en el texto plano sin encodear, no en el texto plano encodeado en b64.

Lo lógico es guardar en un fichero los distintos plaintexts, obviamente, númerados y con su password con separadores o como quieras, para así, una vez obtenido el válido, saber que algoritmo-password es.

Eso o guardar el nº de intentos y descomponerlo en nº algoritmo y nº de password.

Si sabes lo que buscas, es decir, el flag o algo del plaintext, con una búsqueda valdría, en bash es sencillo.

Espero servir de ayuda. Saludos.

Muchas gracias por la ayuda kub0x, ya hemos solucionado el problema, todo lo que dices es cierto, ya te dije que era un poco chapuzas, estaba sacando el texto a un fichero (efectivamente estaba haciendo un poco el tonto al volver a encodearlo), y una vez ahí buscaba "flag" con un grep, si lo encontraba entonces ya me preocuparía de que me imprimiera que algoritmo y contraseña era, cosa que no sucedió. Al final resulta que hay que utilizar un algoritmo de OpenSSl que no se muestra con el comando de help convencional porque no se considera seguro (creo), en vez utilizamos este otro comando openssl list -cipher-algorithms, y así obtenemos una lista en la que si que estaba el algoritmo que necesitábamos.
PD: si animanegra lo pide puedo borrar esto para que mis compañeros no vean como se hace. Un saludo y muchas gracias por la ayuda