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
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.
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
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.
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.
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
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
Bueno, conocimiento y diversion no tienen por que que estar reñidos ¿no?
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.
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
Cita de: xabware en 4 Octubre 2020, 23:45 PM
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.
Bueno, habéis preguntado en un foro de hacking y lo habéis hecho de forma que os han contestado. Eso significa que estáis por el buen sendero, estudiais las cosas, las mirais y proponéis preguntas inteligentes. De otra forma, simplemente os hubiesen cerrado el hilo diciendo que aqui no se resuelven tareas (y creeme que lo hacen).
Espero que aparte de entrar en esta comunidad para preguntar, os empapéis bien de ella, aprendáis lo posible y aporteis en ella.
Y espero que mañana aportéis alguna noticia de seguridad al principio de clase, o un par. sección del foro llamada noticias, muy buenas todas.
Este hilo es demasiado bueno como para borrar cualquier ápice de él.
un saludo.
PD: Dadme mis malditos flags!!!
Para nada esperaba que fuera uno de tus pupilos :D
Ya sabéis, aquí resolvemos dudas si vemos que el usuario se esforzó en resolver su problema.
Saludos.