miércoles, 5 de agosto de 2015

Cybercamp 2015 CTF: Criptografia

Hola lectores!

El dia 17 de julio inicio el CTF 2015 de Cybercamp, el mismo era del estilo jeopardy y constaba de retos de criptografia, forensica, exploiting, web y reversing.
En mi caso termine en el puesto 44, tan solo a 4 de clasificar, una lastima no tener mas tiempo para dedicarlo a los retos.
En las siguientes semanas, les ire trayendo writeups sobre alguno de los retos que pude guardar.
Empezamos con uno de criptografia!

Descripcion: Se ha logrado interceptar dos criptogramas denominados C1 y C2, asi como sus correspondientes textos planos M1 y M2. Se desea generar C3, el cual es el criptograma correspondiente a M3. Se sabe que el cifrado utilizado es DES-ECB.

Datos:
M1 = INGRESAR ARACELI GONZALEZ 1.000
M2 = INGRESAR MANUEL FERNANDEZ 10.000
C1 = C4 41 ED E3 5C 67 4D D5 ED 61 A5 3F 72 1F E3 F4 9F 7E D0 56 6C 93 DE 1B 89 80 8E D0 95 75 C7 66
C2 = C4 41 ED E3 5C 67 4D D5 49 89 15 5D 3E 6B 2A A8 69 DF C0 30 B6 85 DC DE 82 9D EF 5D EB A1 D8 C1
M3 a cifrar: INGRESAR ARACELI GONZALEZ 10.000

Como pueden ver a primera vista ya hay algo extraño, los primeros bytes de los dos criptogramas se repiten lo que nos hace pensar ya en un problema de confidencialidad como minimo.
Debido a que no hay ningun dato que nos permita obtener la Key de cifrado y que el algoritmo DES no es un cifrado reversible, hay que investigar un poco mas sobre ECB.

Con una busqueda rapida en Wikipedia nos encontramos con que este modo de operacion por bloques ECB ( Electronic Code-book), tiene dos problemas: confidencialidad y replay attack.

El primero lo pudimos ver antes, si los bloques son iguales, sus textos planos coinciden.
El segundo es un ataque que se basa en el principio basico de este modo ECB: cada bloque se cifra independientemente del otro o de otra cosa. Con esto si necesitamos construir un criptograma nuevo, si tenemos sus textos planos y criptogramas correspondientes, tan solo hay que unir los bloques correspondientes.

Eso es lo que exactamente necesitamos para obtener el flag, asi que vamos a dividir los criptogramas en bloques de 8 bytes y obtenemos...

M1 = i  n  g  r  e  s  a  r |  a  r  a  c  e  l  i   |    g  o  n  z  a  l  e | z     1  .  0  0  0  
C1 = C4 41 ED E3 5C 67 4D D5| ED 61 A5 3F 72 1F E3 F4| 9F 7E D0 56 6C 93 DE 1B| 89 80 8E D0 95 75 C7 66
C2 = C4 41 ED E3 5C 67 4D D5| 49 89 15 5D 3E 6B 2A A8| 69 DF C0 30 B6 85 DC DE| 82 9D EF 5D EB A1 D8 C1
M2 =  i  n  g  r  e  s  a  r|     m  a  n  u  e  l   |  f  e  r  n  a  n  d  e| z     1   0  .  0  0  0 

Como podemos ver el primer bloque coincide en los dos criptogramas y ahora ya sabemos por que, para obtener el flag simplemente tomamos de C1 los primeros tres bloques ( "ingresar araceli gonzale") y de C2 tomamos el ultimo bloque( "z 10.000").

C3 : C441EDE35C674DD5ED61A53F721FE3F49F7ED0566C93DE1B829DEF5DEBA1D8C1

Con esto obtenemos el criptograma correspondiente el cual es valido y es nuestra flag!
Las recomendacion para evitar estos problemas son:
  1. No utilizar DES, es un algoritmo que se a probado que es vulnerable, utilizar AES el cual es su sucesor.
  2. No utilizar ECB, debido a que tiene fallos de confidencialidad y es vulnerable al replay attack, utilizar otros modos como CBC, CFB, OFB y CTR.
Con esto terminamos con el unico reto que guarde sobre criptografia. La proxima entrada sera sobre reversing.
Saludos!