Descifrado del troyano PGPcoder
Desvelamos los detalles del algoritmo utilizado por PGPcoder, un troyano que cifra los archivos de los sistemas que logra infectar y solicita dinero a los usuarios afectados si quieren volver a restaurarlos.
Como ya comentamos en una entrega anterior en Hispasec, aunque el nombre del troyano podía llevar a confusión, el algoritmo de cifrado de PGPcoder no era robusto, y permitía descifrar los archivos de forma automática sin sucumbir al chantaje de su autor.
La semana pasada propusimos un reto consistente en encontrar una solución genérica que permitiera descifrar los archivos modificados por PGPcoder partiendo del criptoanálisis de una muestra, para lo cual facilitamos un archivo de texto cifrado por el troyano y otro donde se podía encontrar la versión original en texto claro.
La solución debería poder descifrar cualquier archivo modificado por el troyano, de hecho cada propuesta de nuestros lectores fue probada con una muestra real, en concreto con una hoja de cálculo que había sido afectada por PGPcoder.
Apenas unas horas después de publicar la noticia recepcionamos las primeras soluciones, entre los que destacamos a los cinco primeros según orden de llegada:
1. Antonio Izquierdo Manzanares
Grupo de Seguridad T.I y C. Dep. Informática
Univ. Carlos III de Madrid
2. Francisco Cuevas Pérez
Gestión de RR.HH.
3. David Guerrero López
Dep. de Sistemas Informáticos y Computación
Universidad Politécnica de Valencia
4. Jaume Martínez Martínez
R&D Engineer
5. Angel Goitia Fuertes
Consultor Senior en Altran SDB
En todas estas primeras soluciones de primera hora se pudo observar claramente que los algoritmos utilizados, basados en bloques de valores fijos, habían sido construidos a partir del análisis de la muestra del archivo cifrado facilitado, tal y como se proponía en el reto, y no fruto de aplicar ingeniería inversa al código del troyano.
El hecho de que, además de la efectividad, se premiara la rapidez en la que se hiciera llegar la solución, también fue en contra de que los primeros participantes no dedicaran muchos esfuerzos en encontrar una relación matemática entre los diferentes valores utilizados.
En el propio código de la primera solución, comentado con detalle por Antonio Izquierdo, podemos encontrar una primera descripción del algoritmo de cifrado: “PGPcoder cifra los ficheros haciendo una operación de suma a cada byte. Cada vez que cifra un byte cambia la clave siguiendo una secuencia predeterminada para realizar dicho incremento. Esa secuencia de incrementos consta de 16 elementos, tras los cuales vuelve a repetirse. Cada 4 secuencias (64 bytes) se repiten las claves de cifrado.”
PGPdecoder-Antonio_Izquierdo.zip (clave: hispasec)
http://www.hispasec.com/directorio/laboratorio/pruebas/PGPdecoder-Antonio_Izquierdo.zip
Una mirada al código del gusano simplifica mucho la tarea, ya que se puede observar que el cifrado de PGPcoder se limita a realizar una operación de suma a cada byte del archivo original, comenzando el bucle con la clave 0x3A y modificando su valor para cada uno de los bytes restantes, multiplicando en cada ocasión la clave anterior por 0x25 y sumándole 0x5C.
Desde PandaLabs, responsables de que Panda fuera uno de los pocos motores antivirus que incluyera entre sus firmas la recuperación de archivos cifrados por PGPcoder, también nos hicieron llegar el siguiente ejemplo:
“Suponiendo que tenemos en ‘buffer’ el contenido del fichero a desencriptar y en ‘buffer_size’ el tamaño del mismo, el algoritmo en cuestión sería el siguiente:
key = 0x3A;
for (int i = 0; i < buffer_size; i++)
{
buffer[i] = buffer[i] – key;
key = key * 0x25 + 0x5C;
}
Como puede observarse se trata de un algoritmo clásico. A cada byte de información se le substrae o se le suma -para desencriptar o encriptar respectivamente- un valor determinado que comienza con una constante inicial y es recalculado en cada iteración usando su valor anterior.”
Recibimos alguna solución utilizando este algoritmo ‘optimizado’, como es el caso de Daniel Pérez Álvarez, estudiante de Ingeniería Informática, que reconoció haber partido del acceso al código de PGPcoder en lugar de proceder al criptoanálisis de las muestras proporcionadas.
pgpdecoder Daniel Pérez:
http://www.hispasec.com/directorio/laboratorio/pruebas/pgpdecoder.zip
Afortunadamente en esta ocasión ha sido posible proponer este reto gracias a que el autor del troyano no ha utilizado criptografía seria y una estrategia más robusta, ya que de lo contrario podría ser materialmente imposible lograr una solución genérica y automática que fuera efectiva.
Por último agradecer a los participantes su interés, que recibirán en breve una camiseta de Hispasec como premio simbólico por su dedicación, y emplazaros a todos hasta el próximo reto.