WordPress, la zona de juego de los Ciberdelincuentes (Parte I)

Gabriel Martí
7 min readSep 10, 2020

--

Analizando malware de un WordPress

A menudo llegan retos por los caminos más insospechados, como esta historia, que empezó con un post en Twitter de Érica Aguado. Hablaba sobre un código sospechoso encontrado dentro de un WordPress que había reparado.

Post en Twitter de Érica Aguado
Post en Twitter de Érica Aguado

Tras leer el resto de respuestas del post y viendo el código, había un elemento claro casi al final del código de la imagen que podía servir para ir tirando del hilo. La línea que contenía la comprobación de un parámetro en la querystringisset($_GET[‘daksldlkdsadas’])“.

Una rápida búsqueda en Google mostraba bastantes (miles) sitios web (WordPress probablemente) que parecían estar infectados con dicho código malicioso. Esto evidenciaba a que estaban expuestos a “no se sabe qué” acciones por parte de terceras personas que seguramente desconocían los propietarios y/o administradores de dichos sitios web.

Búsqueda en Google de la cadena encontrada en el código fuente
Búsqueda en Google de la cadena encontrada en el código fuente

Si cargamos el sitemap del primer sitio que aparece en la imagen anterior podemos ver como aparece este texto generado para que quede indexado por los buscadores y con el valor ‘t’ asignado al parámetro.

Sitemap de sitio infectado
Sitemap de sitio infectado

Sospechoso ¿verdad?

Tras unos intercambios de mensajes, Erica me proporciono los ficheros fuente encontrados en dicho WordPress pues yo le dije que si descargaban algún binario me gustaría verlo (tenerlo) para hacerle “ingeniería inversa”.

Así que me envió un archivo con todos los archivos del sitio web y ya en la raíz aparecían algunos archivos que no eran habituales de WordPress.

Archivos y carpetas de sitio WorPress infectado
Archivos y carpetas de sitio WorPress infectado

Si a esto le añadimos, que tras abrir alguno de estos archivos, aparece todo el código ofuscado, es más que evidente la presencia de malware y actividad de algún ciberdelincuente.

Muestra de código ofuscado de uno de los archivos del sitio web
Muestra de código ofuscado de uno de los archivos del sitio web

Del resto de carpetas, existía una con nombre “jbh” que también era sospechosa pues todo el código que había en sus archivos también estaba ofuscado.

Listado de archivos en la carpeta “jbh”
Listado de archivos en la carpeta “jbh”

Daba la sensación de que los archivos utilizaban diferentes métodos de ofuscación combinados, por un lado, y por otro había partes claras y sin ofuscar.

Muestra de diferentes archivos “php” con el código ofuscado
Muestra de diferentes archivos “php” con el código ofuscado

Desofuscando con herramientas online

Hay diversas herramientas para desofuscar código en php, de la misma manera que existen diferentes herramientas para ofuscar que emplean variadas técnicas y métodos para hacerlo y por lo tanto no son todas útiles o igual de efectivas.

Una de estas herramientas que está claramente enfocada a desofuscar código de malware es la página https://malwaredecoder.com/ y otra es https://www.unphp.net/

Si cogemos uno de los archivos ofuscados, como el que se muestra en la siguiente imagen, y lo procesamos.

Muestra de código original ofuscado antes de proceder a desofuscar
Muestra de código original ofuscado antes de proceder a desofuscar

Se puede observar, tras desofuscar el código, que se pueden apreciar algunas palabras clave. Pero no lo revela todo. Ha hecho una parte del trabajo, pero no toda. Y si nos fijamos al pie de la imagen se puede ver la parte de código que nos llevó hasta aquí: isset($_GET[‘daksldlkdsadas’])“.

Muestra de código después de desofuscar
Muestra de código después de desofuscar

Codificación Hexadecimal

Si nos fijamos en el código ofuscado podemos ver un patrón claro en algunas cadenas, en las que se muestran una colección de caracteres precedidos siempre por “\x”. Esto no es otra cosa que la codificación en Hexadecimal de los caracteres ASCII.

Por ejemplo, esta cadena “\x47\x4c\x4f\x42\x41\x4c\x53” decodificada corresponde a la palabra “GLOBAL”, la cadena “\x57\x6f\x72\x64\x50\x72\x65\x73\x73” corresponde a la palabra “WordPress”, y la cadena “\x4f\x4f\x30\x4f\x5f\x30\x5f\x4f\x30\x5f” se corresponde a la secuencia “OO0O_0_O0_” que después se utiliza como nombre de variable.

De hecho, si buscamos esta última cadena en Google también aparecen unos cuantos resultados.

Resultado búsqueda cadena “OO0O_0_O0_”
Resultado búsqueda cadena “OO0O_0_O0_”

Un problema en Windows

Este primer análisis lo hice en una máquina Windows (alterno entre Windows y Linux indistintamente). Y tras mirar los diferentes archivos llegué a uno que se había descomprimido correctamente del archivo “.tar.gz” que me habían proporcionado, pero no lo podía abrir. Se trataba del archivo “con.php”.

Error al abrir fichero “con.php”
Error al abrir fichero “con.php

¿Por qué pasa esto? Esto es porque Windows tiene una serie de nombres reservados para nombrar a unos dispositivos (con, prn, aux, nul, com1, com2, lpt1, lpt2,… etc). Estos dispositivos, a nivel interno se tratan como archivos y ahí es donde entra el conflicto.

Así que a partir de aquí seguí analizando utilizando Kali Linux. 😏

Jugando con el código

La sustitución de la codificación hexadecimal no era problema, pero igualmente no quedaban claras algunas partes del código. Y me interesaba ver el contenido de todas estas variables que empezaban por “$O_0_0…” que se formaban a partir de la primera variable “$O_0_O0O_O0”.

Muestra de código ofuscado a descubrir por métodos manuales
Muestra de código ofuscado a descubrir por métodos manuales

Así que separé las líneas para identificar claramente las diferentes variables, y al final añadí un “echo” para que mostrara el contenido de cada una de las variables y una finalización del script. De esta manera podía ver que se generaba y tener un control por partes del flujo del programa.

Y finalmente obtuve la lista de funciones que utiliza este código. El siguiente paso era sustituir las variables correspondientes por su nombre y ya tendríamos un código más legible.

Código ofuscado con línea añadida para mostrar contenido que genera y resultado asignado a cada variable
Código ofuscado con línea añadida para mostrar contenido que genera y resultado asignado a cada variable

Aquí tendríamos el código de la primera parte donde se descubren los nombres de las diferentes funciones.

Haciendo una sustitución manual de estos identificadores en el código se puede empezar a intuir que es lo que hace, archivos y carpetas que modifica, etc...

Parte del código desofuscado, combinando herramientas automáticas y técnicas manuales
Parte del código desofuscado, combinando herramientas automáticas y técnicas manuales

Ofuscación recursiva

Otro de los archivos de la raíz del sitio, de nombre “idq.php” tenía una ofuscación recursiva. Hasta 5 veces estaban los datos codificados y comprimidos uno dentro de otro, usando combinaciones de gzinflate(), base64_decode(), rawurldecode() y urldecode() de manera que me obligó a ir revisando paso a paso hasta llegar al código final.

Muestra del fichero idq.php es su formato original
Muestra del fichero idq.php es su formato original

En el siguiente cuadro se puede ver el archivo idq_de-obfuscated.php el cual ya deja ver mejor parte de los procesos que ejecuta, a pesar de que aún es necesario poder identificar algunas variables para que se pueda entender mejor el funcionamiento. A primera vista parece ser que gestiona suscripciones a listas de correo, pero no voy a entrar en más detalles ni voy a seguir haciendo cambios en este archivo. Prefiero para pasar a ver el contenido de otra carpeta a ver que sacamos.

Desofuscación del archivo idq.php

Carpeta “jbh”

Entramos de lleno en la carpeta “jbh” de la que inicialmente tenía mis dudas si tenía relación con los archivos anteriores, pues bien podrían tratarse de archivos (y actuaciones) de diferentes “atacantes” y que ambos habían aprovechado vulnerabilidades del sistema para subir sus archivos y tomar el control. Pero los métodos de ofuscación y algunas variables aleatorias generadas eran similares al anterior, por lo tanto, si nos atenemos a las “tácticas, técnicas y procedimientos” (TTPs), podríamos afirmar que todo procede del mismo actor.

Si miramos el archivo apple.php podemos ver que es el que origino el inicio del hilo de twitter de Érica Aguado, y también que coincide con el contenido ofuscado en el archivo aindex.php que estaba fuera de la carpeta “jbh”.

Archivo apple.php vs aindex.php
Archivo apple.php vs aindex.php

Sin haber entrado en detalle en todo lo que hacía cada archivo, me hace pensar que los archivos de la raíz son los que probablemente se encargaban de crear la carpeta “jbh” y escribir el contenido de esta. Pero, insisto, todo son hipótesis que pueden cambiar a medida que se investigue con más profundidad.

Tras un primer análisis de todos los archivos hice la instalación en mi servidor Apache local y me dispuse a probar algunos archivos.

Empiezo con sad.php, que es completamente diferente a los demás archivos. No está ofuscado. En realidad, es un sencillo webshell que permite navegar entre las carpetas, subir archivos, cambiar permisos, renombrar y editar. No forma parte de los otros, aunque si es un complemento añadido para poder subir y gestionar con más facilidad los archivos en el sitio web. De hecho, ni tan siquiera tiene autenticación, así que, una vez subido al servidor, si ese directorio estuviera indexado por cualquier buscador, incrementaría las posibilidades de acceso por parte de otros atacantes diferentes al original.

Sencillo webshell para manejar los archivos, subirlos, cambiar permisos y editarlos
Sencillo webshell para manejar los archivos, subirlos, cambiar permisos y editarlos

Si miramos el archivo con.php , el cual, sí que está ofuscado, ya nos aparece una primera pantalla de autenticación; nos pide usuario y contraseña.

Control de acceso a la consola
Control de acceso a la consola

También tenemos una firma, “UBH Team”.

Termino aquí esta primera parte, y dejo abierto el tema para ampliar información en una segunda entrega.

--

--

Gabriel Martí

Ex-Docente CFGM, CFGS Ciberseguridad. Actualmente Consultor en Ciberseguridad. Intereses en robótica, ciberseguridad, reversing. Twitter @gmarti @310hkc41b