13 ene 2011

Flu beta 0.2 y el envío de datos de la botnet cifrados con AES (II de II)

Flu beta 0.2 y el envío de datos de la botnet cifrados con AES (Parte I de II)

Flu beta 0.2 y el envío de datos de la botnet cifrados con AES (Parte II de II)

Buenas a todos, en el post de hoy vamos a concluir la cadena de posts que comenzamos ayer sobre cifrado de datos con el algoritmo Rijndael (AES)

Hoy descifraremos la cadena de texto que ciframos ayer mediante una aplicación desarrollada en PHP, que emulará la manera en la que Flu desencripta los datos enviados en la botnet.

El código utilizado para el proceso de desencripción es el siguiente:

Como veis, hemos creado una función llamada decrypt a la que le pasaremos por cabera tres datos, el primero será la clave que utilizamos en el proceso de encriptación, el segundo será nuestro vector de inicialización y en tercer lugar la cadena encriptada.

La función se compone de solo dos líneas de código, la primera que creo que no hará falta explicar, en la que convertiremos el vector de inicialización a codificación UTF-8. Y la segunda que es un poco más compleja.

Nota: Como curiosidad, aunque no tiene nada que ver con el post, la función mb_convert_encoding de PHP si le pasamos como parámetros algo parecido a esto mb_convert_encoding($iv,’UTF-8',’ISO-8859-1') comprobará si la cadena iv está en formato ISO-8859-1 para codificarla a UTF-8.

Si ahora le pasamos como parámetros mb_convert_encoding($iv,’UTF-8',’ISO-8859-1,ISO-8859-1,ISO-8859-1,ISO-8859-1,ISO-8859-1') comprobará 5 veces si la cadena iv está en formato ISO-8859-1. Veis por donde voy ¿no? Si tenemos en cuenta que el mecanismo para determinar el charset es muy costoso, y le pasamos un fichero con muchos parámetros separados por comas, estaríamos ante un DDoS de nuestro servidor web en toda regla. Volvamos a nuestro algoritmo =)

En primer lugar le indicaremos que se hará el descifrado con una clave de 128bits, recordar los tamaños que comentábamos en el post anterior, 128, 192 y 256 bits. En segundo lugar le pasaremos la clave tal cual. En tercer lugar le pasaremos la cadena encriptada, recordad que la habiamos convertido a base 64 en el último paso de nuestro algoritmo de cifrado por lo que habrá que restaurarla a su origen. A continuación le indicaremos el modo de cifrado por bloques, en nuestro caso CBC y finalmente le pasaremos el vector de inicialización.

Para probar si funciona nos creamos una aplicación PHP utilizando la función anterior:

Si la ejecutamos, para ello nosotros hemos montado un WAMP en Windows 7, veremos el mensaje desencriptado:

Espero que os haya gustado el post.

¡Hasta la próxima!

3 comentarios:

  1. [...] Sesión « Tipos de ataques Denial-of-Service Flu beta 0.2 y el envío de datos de la botnet cifrados con AES (II de II) [...]

    ResponderEliminar
  2. Tengo una duda, si en el programa, en este caso el cliente de flu que es quien envía la comunicación cifrada con AES es programada con este código:Rijndael rijndael = Rijndael.Create();byte[] clave = rijndael.Key;byte[] iv = rijndael.IV;Es decir, generando la clave de forma aleatoria, como lo descifro en este código con PHP...

    ResponderEliminar
  3. Flu lo tiene programado de esta manera:byte[] clave = Encoding.ASCII.GetBytes("qwertyuioplkjhgf"); byte[] iv = Encoding.ASCII.GetBytes("qwertyuioplkjhgf");Por lo que sí sabes cual es la clave en todo momento, ya que la pondrías tu a mano.Si quieres crear la clave automáticamente, deberías enviar la clave junto con el texto al programa PHP para que sepa descifrarlo. En este caso, es recomendable cifrarla también con una clave conocida que sepa el programa PHP.saludos

    ResponderEliminar