Continuando con el análisis que se publicó esta semana sobre el número de servidores vulnerables y cómo la vulnerabilidad en PHP-CGI está siendo explotada de forma masiva, se explicará el funcionamiento del archivo que se inyecta en los servidores vulnerables. Se detallará la forma en que el atacante protege el mencionado archivo para que sólo el mismo atacante pueda utilizarlo y las funcionalidades que le brindan.

Como se mencionó a lo largo de los diferentes post que se fueron publicando sobre esta vulnerabilidad, la finalidad de la explotación masiva de PHP-CGI es la de subir un archivo de extensión PHP para que el atacante pueda disponer de sus funcionalidades y ejecutar operaciones sobre el servidor. Existen algunos aspectos llamativos que se pueden ver en parte del código fuente del archivo, tal como se especifica a continuación:

Función selección nombre backdoor

Cómo puede verse en la captura anterior, la cual muestra la sección de código del archivo PHP que se inyecta, se selecciona el nombre del archivo inyectado de forma aleatoria entre una lista de ellos, tales como "engine.php" y "core.php", entre otros. Estos nombres son utilizados con la finalidad de esconderse en el servidor vulnerado intentando pasar desapercibidos a través del uso de nombres comunes de archivos presentes en servidores web.

En la siguiente captura se puede observar la existencia del mismo archivo bajo diferentes nombres de la lista en un servidor web.

Caso de servidor real de inyección de código
Otro detalle de este archivo, tal como puede verse en la captura siguiente, es que el atacante realiza una  comprobación mediante MD5.

Comprobación del md5En la sección de código puede observarse que el MD5 es aplicado dos veces consecutivas(para incrementar la complejidad) sobre una cadena de texto para certificar que es realmente el atacante propietario de dicho archivo quien está realizando la petición al servidor comprometido. Este cadena de texto, que cumple la función de una contraseña, es pasada por parámetro en la URL de la forma “p=[CONTRASEÑA]”. De esta forma la única manera de poder ejecutar el archivo de forma completa y obtener los resultados deseados es teniendo la cadena de texto adecuada, la cual aplicando MD5 dos veces seguidas, devuelve el hash por el cual comprueba y se cumpla la condición.

El paso siguiente que realiza el código es solucionar la vulnerabilidad en el servidor luego de que el archivo ya se encuentra dentro del mismo. En la siguiente imagen se puede observar la sección de código que lleva adelante esta acción.

Parche de vulnerabilidad PHP-CGI

El código realiza una escritura sobre el archivo “.htaccess” y mediante la inserción de una expresión regular realiza el correcto saneamiento de los parámetros mitigando, de esta manera, la vulnerabilidad en PHP-CGI de forma que nadie más pueda explotarla. Cabe destacar que en estas instancias la inyección del código ya se ha producido.

Existen otros aspectos de este código que valen la pena resaltar, sobre todo lo referido a cuáles son las funcionalidades y capacidades que brinda al atacante por sobre el servidor. En la siguiente imagen puede observarse el código que se ejecuta en caso de poseer la contraseña adecuada.

Imprimir directorios en el servidorEl archivo permite inyectar el código que se pase a través del parámetro correspondiente en cualquier archivo que se encuentre dentro del servidor, siempre y cuando se cuente con los permisos adecuados (permisos de escritura). Esto puede llevarse a cabo especificando los parámetros “f” y “b”, donde el primer parámetro indica cuál es el archivo al que se le desea inyectar el código y el segundo parámetro especifica el código que realmente se desea inyectar. Como resultado de esta funcionalidad, el atacante puede utilizar RFI (remote file inclusion), por ejemplo, a través de la inserción de la sentencia "include_once" utilizado en PHP para importar archivos PHP dentro de otro archivo. Asimismo, es posible importar un archivo que se encuentre en un servidor remoto, dando lugar incluso a la inserción de webshells en PHP complejas y con muchas funcionalidades, tales como “r57” o “c99”, entre otras. También es posible la inyección de iframes dentro de archivos PHP existentes en el servidor, como puede ser un archivo index.php.

A modo de ejemplo, en las siguientes capturas puede verse cómo es posible realizar la inyección de una webshell r57 dentro de un archivo index.php. Posteriormente se accede a ese archivo mediante el navegador y la shell de tipo web ya se encuentra funcionando.

Pasaje de parámetros

Luego de ejecutar este comando con los parámetros adecuados, se logra la inserción de la shell web.

Inyección de Webshell

Todas estas funcionalidades exponen cuál es el nivel de acceso que puede tener un atacante detrás de esta campaña en un servidor determinado que sea vulnerable. Es importante tomar conciencia de que estas vulnerabilidades no pueden ser tomadas a la ligera, por lo que es recomendable estar informados y conscientes sobre las mismas. Esta vulnerabilidad en particular ya es posible solucionarla, por lo que es recomendable realizar tal acción con la finalidad de no dejar expuesto al servidor a este tipo de amenazas. La seguridad debe ser gestionada para estar preparados y poder enfrentar este tipo de situaciones.

Fernando Catoira
Analista de Seguridad