miércoles, 25 de junio de 2014

Defeating WebShells Detection Tools I: PHP Web Shell Detector bypass

¡Saludos!

      Estos últimos días he estado hablando con @CodingFree acerca de las webshells. En este mismo blog he estado publicado una serie de artículos sobre backdoors indetectables en PHP, pero todos ellos están orientados símplemente a mantener una puerta abierta. Normalmente se suelen utilizar webshells más complejas que facilitan el trabajo una vez dentro de un servidor comprometido. Son las clásicas (y digo clásicas porque deben de llevar funcionando más de 10 años casi intactas) r57, c99, etc. que todavía perduran con sus modificaciones.  En esta nueva serie de artículos iremos consiguiendo bypassear distintas herramientas, y al final colgaré una herramienta (que será incluida en Gojira) que vuelva indetectables estas webshells grandes.


C100 (C99 modificada)


    Todas estas webshells que han sido tan quemadas durante años es que los AV las detectan al vuelo, así como las distintas herramientas que han surgido con este fin. El problema radica en el mismo punto de siempre, y es el funcionamiento por firmas. En el caso de los AV es sumamente fácil evadirlos, tan sólo se necesita esconder el source utilizando distintas funciones de cadena como rot13, base64, etc. y combinarlas entre sí para que no encuentre ninguna firma reconocible. Por ejemplo, una C100 (c99 modificada), se puede pasar a base64, rot13, y otra vez más base64, y despues revertir el proceso con un eval(), y salvo 1 antivirus, el resto no la detectan como código malicioso:


Bkav es el unico que la detecta


  Sin embargo, al utilizar una función como "eval()", las herramientas destinadas a la detección de webshells van a soltar una alerta, puesto que se trata de una función peligrosa. En este caso vamos a intentar bypassear la herramienta en PHP Web Shell Detector que puede ser adquirida desde su web oficial (http://shelldetector.com/ ).


   Para hacer la prueba coloqué en el mismo directorio una c100 normal y corriente y el archivo que subí  a Virus Total (la misma c100 pero codificada). La c100 utilizando su base de datos de firmas la detecta sin problema, sin embargo estando codificada no. Lo bueno es que al menos es capaz de detectar que hay funciones que pueden ser indicativas de que hay algún malware (base64_decode y eval() ).


   Pues el paso lógico será evitar que se detecten esos string. Para poder ocultar la función base64_decode() no tengo ningún problema puesto que podemos construirla usando las funciones variables.  O sea, que separamos el string en dos variables ($a = "base"; $b = "64_decode";) y las concatenamos ($c = $a.$b):

$a = "base";
$b = "64_decode";
$c = $a.$b;
$string =$c($string);

Usando este simple truco podemos ver que ya no detecta esa función:



Ahora bien, hecatombe. A eval() no podemos aplicarle ese mismo truco porque se trata de un constructor del lenguaje, asi que es en este punto donde tenemos que indagar en el código fuente de la herramienta para localizar algun fallo en su diseño que nos permita realizar algún bypass. Echando un ojo rápido vemos cómo las funciones sospechosas las saca a través de expresiones regulares:

...
//system: regex for detect Suspicious behavior
  private $_regex = '%(preg_replace.*\/e|`.*?\$.*?`|\bcreate_function\b|\bpassthru\b|\bshell_exec\b|\bexec\b|\bbase64_decode\b|\bedoced_46esab\b|\beval\b|\bsystem\b|\bproc_open\b|\bpopen\b|\bcurl_exec\b|\bcurl_multi_exec\b|\bparse_ini_file\b|\bshow_source\b)%';  
 ... 
if (preg_match_all($this->_regex, $content, $matches)) {

  Una lista y después va macheando con strings hasta localizar alguna que esté ahí contenido. Como podemos ver "eval" está en la lista de invitados. Pero... esa expresión regular no lleva ningún modificador para hacerlo case insensitive (el modificador "i").

  Burlar el sistema de detección de funciones sospechosas es tan sencillo como meterlas en mayúsculas, ya que la expresión regular es sensible a mayúsculas y minúsculas, por lo que nunca la detectará. Ponemos "EVAL":


Y vemos cómo esta herramienta se la come con patatas:




Byt3z!
5 0verl0ad Labs: Defeating WebShells Detection Tools I: PHP Web Shell Detector bypass ¡Saludos!       Estos últimos días he estado hablando con @CodingFree  acerca de las webshells. En este mismo blog he estado publicado una...

2 comentarios:

Jose Moruno Cadima dijo...

Esperando la siguiente entrada :D de evasiones, me interesa saber mas de las evasiones que fuiste investigando.

Regards,
Snifer

The X-C3LL dijo...

Lo que necesito es encontrar más herramientas de este estilo, porque tanto NeoPI como Linux Malware Detector ya he conseguido evadirlos.

< >