En este post vamos a ver cómo disfrazar un correo electrónico para obtener la IP de un usuario con el simple hecho de que lo abra y vea su contenido, o mejor dicho, una imagen.
Lo que haremos, en pasos sencillos, será enviar una imagen de un perro (no es broma) la cual será servida a través de PHP con readfile. La IP se registrará con el código que vimos aquí.
Este método funciona correctamente en correos de dominio personal (es decir, .com, .me, .io, etcétera) y en hotmail; pero no en gmail, ya veremos por qué.
Recuerda que esto se hace con fines didácticos y que no me hago responsable de lo que se pueda hacer con esto.
Una explicación de cómo funciona
Recordemos que es posible enviar HTML en los correos. Así que basta con enviar una imagen y ya está.
La imagen se va a descargar cuando el usuario abra el correo, por lo que su IP quedará registrada.
Para registrar la IP y servir la imagen al mismo tiempo, el atributo src
de nuestra imagen será un archivo PHP que mostrará la imagen pero antes registrará la IP.
Nota: todo el código que se usa está en GitHub.
Paso 1: preparar archivo que registra IP y sirve imagen
El archivo queda como se ve a continuación.
<?php
# Para obtener la fecha correcta hay que poner la zona horaria
date_default_timezone_set("America/Mexico_City");
$fechaYHora = date("Y-m-d H:i:s");
# Si no hay REMOTE_ADDR entonces ponemos "Desconocida"
$ip = empty($_SERVER["REMOTE_ADDR"]) ? "Desconocida" : $_SERVER["REMOTE_ADDR"];
# Formatear mensaje
$mensaje = sprintf("La IP %s accedió en %s%s", $ip, $fechaYHora, PHP_EOL);
# Y adjuntarlo o escribirlo en accesos.log
file_put_contents("accesos.log", $mensaje, FILE_APPEND);
# Ya registramos la ip, ahora seguimos con el flujo normal ;)
# Indicar que vamos a servir una imagen jpeg
header('Content-Type: image/jpeg');
header("Content-Transfer-Encoding: Binary");
# Leer la imagen del perro
readfile("perro.jpg");
?>
Así, aunque la extensión sea php, será servida una imagen, y eso es totalmente válido.
Por cierto, la imagen en cuestión es esta.
Ese archivo debe estar en internet, puedes usar un hosting gratuito y subirlo por FTP.
Cuando esté subido (no olvides subir también la foto) copia su ruta absoluta; por ejemplo:
http://sitio.com/perro.php
En mi caso es este enlace:
https://www.parzibyte.me/apps/obtener_ip/perro.php
Paso 2: preparar HTML
Ahora hay que crear un archivo HTML con el contenido del correo. No olvides colocar la imagen:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Perro</title>
</head>
<body>
<p>Hola Luis! quiero mostrarte una foto de un perro. Mira:</p>
<img src="https://www.parzibyte.me/apps/obtener_ip/perro.php" alt="Perro">
<p>¿Es bonito, cierto?<br> Espero tus comentarios :)</p>
</body>
</html>
Se ve así:
Paso 3: enviar correo
Ahora hay que copiar ese HTML y enviarlo por gmail o por otro lugar, pero asegúrate de enviar el HTML.
Nota: recuerda que con PHP también se puede enviar un correo con HTML.
Tip: si lo vas a enviar por Gmail selecciona todo el contenido, copia y pega:
Lo enviamos y listo. Ahora esperamos que la víctima lo abra.
Paso 4: víctima
Me ha llegado el correo a Thunderbird, y Thunderbird sabe que estas cosas existen así que me pregunta si deseo ver el contenido remoto:
Al aceptarlo, se loguea la IP:
¿Por qué en Gmail no funciona?
Como lo dije, en mis pruebas no funcionaba con gmail, no sé si fue cosa mía o que realmente no funciona.
Bueno, decir que no funciona no es correcto. Quise decir que no se registró mi IP, sino una IP de lo que parece ser un proxy.
Así que puedo decir que parece que gmail sirve el contenido a través de un proxy para prevenir justamente cosas como estas.
En cambio, probé enviarme el correo al de mi sitio (contacto@parzibyte.me) y al de hotmail; en ambos casos funcionó.
Conclusión
Con esto queda demostrado que debemos ser cuidadosos al mostrar el contenido remoto de un correo de un desconocido.
Cabe mencionar que si el usuario no permite el contenido remoto, no se logueará nada. Depende de las aplicaciones que use y de sus hábitos.