martes, 22 de noviembre de 2011

Indetectando webshells y backdoors


¡Saludos!

En los últimos años la cantidad de "defaces" se ha incrementado bastante, por lo que no es de extrañar que estén apareciendo cada vez más herramientas dedicadas a la detección de webshells y backdoors -como NeoPI-, que junto a los AVs, intentan limpiar los servidores.


La primera línea de detección de los AVs y las herramientas orientadas a WSD (WebShell Detection) está basada en firmas. Un método de detección bastante simple y extendido es el de uso de checksums a modo de firma, que consiste en comparar los hashes de los archivos del servidor con los existentes en una lista negra. En dicha lista se encuentran los checksums de backdoors y webshells de los que ya tienen constancia las compañías de AVs. Esta técnica de detección es fácilmente evadible, puesto que añadiendo un comentario en el source se modificaría radicalmente su checksum y ya no sería detectado.

La detección de firmas suele ir más allá, tratando de encontrar nombres de funciones declaradas dentro de la propia webshell, o incluso trozos de código que sean típico. Este método puede surtir efecto en aquellas shells "clásicas" (como la C99, por ejemplo) a partir de las cuales se han ido distribuyendo distintas versiones con pequeñas modificaciones del código, pero que en esencia las funciones propias siguen manteniendo los mismos nombres, o incluso grandes porciones del código, por lo que la detección es inmediata.


En estos casos lo más fácil para que pase desapercibida es modificar los nombres de todas las funciones, reordenar el código y alterar la sección del HTML que "maquetará" a la shell.

Por supuesto que el uso de listas negras de funciones sospechosas (como system, o base64_decode) es otro método clásico para detectar archivos maliciosos. Para utilizar estas funciones y pasar desapercibido podemos hacer uso de las funciones variables -cuando una variable tenga "()" al final, PHP buscará una función con el mismo nombre- :


$a = 'sys'.'tem';
$a('rm -rf /');


Incluso podemos ir más allá y tomar la función desde variables de tipo GET (u otras variables como user-agent y similares):


<?php
echo $_GET[2]($_GET[1]);
?>



Pero las herramientas de WSD no se quedan aquí, sino que también implementan otros conceptos curiosos para detectar shells ofuscadas. Un claro ejemplo es NeoPI, que busca dentro de los archivos cadenas largas de caracteres, puesto que son típicas de los códigos ofuscados. La idea en inicio es buena, pero yerra porque son varias las funciones que al pasarle un string eliminan los espacios que contenga. Un ejemplo es base64_decode: si le metemos una cadena en base64 donde cada pocos caracteres aparece un espacio, ésta va a ser leída perfectamente.


Además NeoPI también detecta archivos con una entropía muy alta, por lo que si añadimos espacios entre cada carácter de la cadena ofuscada con base64, la entropía descenderá y pasará desapercibido.


PD: el bypassing a NeoPI estan sacadas de este post de Seth donde podreis encontrar un ejemplo de una shell 100% invisible para esta herramienta.
5 0verl0ad Labs: Indetectando webshells y backdoors ¡Saludos! En los últimos años la cantidad de "defaces" se ha incrementado bastante, por lo que no es de extrañar que estén a...
< >