domingo, 15 de marzo de 2015

Desofuscando PHP backdoors: Keep it simple!

¡Saludos!

   Esta tarde me he acordado de este tuit de Sucuri que ví hace tiempo:


   En su momento lo dejé aparcado por falta de tiempo, y hoy he vuelto a acordarme. Básicamente se trata de un backdoor en PHP que habían encontrado en un sitio comprometido, y que si te gusta desofuscar este tipo de cosas y andas buscando curro le mandes el resultado limpio.  Aquí teneis el link http://labs.sucuri.net/?note=2012-05-24 .

   Los que sigais este blog ya sabreis que siento devoción por el malware web en todas sus formas. En este caso se trata de  un simple backdoor, pero resulta atractivo porque está ofuscado. Voy a aprovechar este post para explicar la metodología que por regla general sigo cuando me encuentro este tipo de código ofuscado en algun servidor.

  Obivamente lo primero es montar un laboratorio de pruebas (una máquina virtual) donde poder trabajar sin posibilidad de sufrir percance alguno -pues el código está ofuscado y no sabemos qué diablos hará-. Una vez que tenemos un sitio donde trabajar, nos ponemos manos a la obra con un editor de textos que permita colorear el código en base a la sintaxis: nos va ahorrar mucho tiempo.



   El primer paso: eliminar comentarios del código que puedan inducirnos a error. En PHP los comentarios pueden ser /**/ para bloques de código, o # y // para líneas. En la imagen de arriba se corresponde con las cadenas de color azul.

   A continuación, en el segundo paso, procedemos a ordenar el código para poder leerlo de forma más clara:


   La inmensa mayoría (y cuando digo inmensa mayoria estoy hablando quizás del 90%) de los códigos ofuscados en PHP se basan en introducir un "prólogo" donde se crean variables y se operan con ellas con el objetivo de imposibilitar la lectura, y por último utilizarlas en forma de funciones variables para ejecutar funciones de forma subrepticia (el mítico $a = base64_; $b = decode; $c($string)).

   Teniendo esto en cuenta podemos limitarnos a localizar trozos de código que tengan una estructura tipo $asdfadfs(), y una vez localizadso con "echo" imprimimos en pantalla para ver su contenido. Normalmente las funciones variables las suelen colocar al final del código.Importante es poner un error_reporting(0) al inicio para evitar mostrar errores que puedan ensuciar.

  En nuestro caso, comentamos la última parte y añadimos:



Y al ejecutar el malware con la parte comentada y nuestro añadido, obtenemos qué hacía:

mothra@kaiju:~/Documentos/shit|⇒  php sucuri-vardump.php
if levenshtein(md5(getenv(HTTP_A)),(6042416b73a05928b8bb366sjf4<8rbc) exit;
call_user_func(preg_rer<Huo,.[eU].sie,getenv(HTTP_X_NET_INFO),eC1kcnV0dC1wb3J0YWwtdXNlci1tc2lzZG4=)

Vemos cómo está esperando determinadas cabeceras HTTP para ejecutar los comandos.

Siguiendo estos sencillos pasos vamos a poder desofuscar la mayoría de código PHP con el que nos crucemos.


Byt3z!
5 0verl0ad Labs: Desofuscando PHP backdoors: Keep it simple! ¡Saludos!    Esta tarde me he acordado de este tuit de Sucuri que ví hace tiempo:    En su momento lo dejé aparcado por falta de tiem...
< >