Anteriores entradas relacionadas:
[Análisis] Prey, software antirrobo de Código Abierto
Usando la Geolocalización MAC en nuestro favor. Parte I
Actualmente no funciona, debido a que al parecer, Google tiene deshabilitada la respuesta JSON de cuando enviamos una petición para geolocalizar
Índice:
1.-Geolocalización con un script en PHP mediante file_get_contents
2.-Geolocalización con un script en PHP mediante cURL
3.-Geolocalización a través de la shell (también usando cURL)
4.-Geolocation API Specification (W3C)
Siguiendo el hilo argumentativo del análisis que hice a Prey, hice una primera parte que quedó un poco escueta, sobre la que hablé de Geolocalización MAC. Pudimos usar un software para tratar de geolocalizar MACs, e incluso desde la página del MapXSS de Samy. Pero nos quedó pendiente una cosa: geolocalizar MACs por nuestros medios.
En esta entrada voy a tratar 4 formas distintas de geolocalizar una MAC, tres de ellas (las primeras) usando la API de Google. Dos de estas formas serán a través de scripts en PHP: uno de ellos usando cURL, y otro mediante file_get_contains. La otra forma, un tanto curiosa, será a través de la shell (en la que también necesitaremos tener cURL instalado). Con respecto a la forma que no usa la API de Google, usaremos la especificación de la W3C para geolocalizar, que está disponible en algunos navegadores.
1.-Geolocalización con un script en PHP mediante file_get_contents
Los dos primeros métodos funcionan internamente igual: hacemos una enviamos una petición JSON mediante POST, esperando recibir una respuesta que deberiamos de recibir, y posteriormente cuando la tengamos, la decodificamos y obtenemos un array con todos los valores y datos que deseamos, nuestra preciada dirección.
Antes de poner el código, una pequeña aclaración: si probamos este código en un servidor web remoto de algún hosting, es muy probable (casi 100%) de que no funcione. Esto tendriamos que probarlo en nuestro propio servidor PHP. Esto es debido a que los hostings deshabilitan (o deberian) la función file_get_contents por una vulnerabilidad que se encontró en la misma.
Aquí dejo el código explicado:
array(
'method' => "POST",
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $datos
)
);
//Utilizamos file_get_contents para hacer la petición a la API de Google
$respuesta = file_get_contents(
'http://www.google.com/loc/json',
false,
stream_context_create($datos_completos)
);
//Decodificamos lo que nos devuelve
$respuesta = json_decode($respuesta, true);
//Obtenemos los resultados
echo "Direccion Geografica aproximada:
";
foreach($respuesta['location']['address'] as $clave => $valor)
echo $clave . ": " . $valor . "
";
echo "Coordenadas aproximadas:
";
echo "Latitud: " . $respuesta['location']['latitude'] . "
Longitud: " . $respuesta['location']['longitude'];
?>
A continuación escribiré una estructura de tipo árbol de los datos que nos devuelve Google tras este envio, ya que nos devuelve una matriz multidimensional, y viene bien saber el contenido de esta:
$respuesta (Array)
>access_token
>location: Array
|-->latitude
|-->longitude
|-->accuracy
|-->address: Array
|---|-->country
|---|-->country_code
|---|-->region
|---|-->country
|---|-->city
|---|-->street
|---|-->postal_code
2.-Geolocalización con un script en PHP mediante cURL
Aquí si ponemos el mismo código que enviamos en el script anterior, no nos funciona, así que tendremos que modificar la petición como veremos a continuación de una manera todavía más sencilla. Además de eso, tendriamos que cambiar la parte de file_get_contents por el cURL. Este código si que deberia de funcionarnos en un servidor remoto, y digo deberia porque yo no lo he conseguido, solo he conseguido que me aparezca el robot de Google tan mono advirtiéndome de un error “temporal” que no tengo ni idea de porqué puede ser… Pero vamos, que en nuestro servidor casero si que funciona.
Aquí el código:
//Datos que enviaremos
$datos_completos = '{version:"1.1.0",request_address:true,wifi_towers:[{mac_address:"xx-xx-xx-xx-xx-xx"}]}';
//Iniciamos cURL
$ch = curl_init();
//Configuramos cURL
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $datos_completos);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_URL,'www.google.com/loc/json');
$respuesta = curl_exec($ch);
curl_close($ch);
//Obtenemos la respuesta y posteriormente la decodificamos
$respuesta = json_decode($respuesta, true);
//Para terminar, printeamos los resultados
echo "Direccion Geografica aproximada:
";
foreach($respuesta['location']['address'] as $clave => $valor)
echo $clave . ": " . $valor . "
";
echo "Coordenadas aproximadas:
";
echo "Latitud: " . $respuesta['location']['latitude'] . "
Longitud: " . $respuesta['location']['longitude'];
Esto nos devolverá exáctamente el mismo resultado que el anterior script.
3.-Geolocalización a través de la shell (también usando cURL)
Ya por último, acabaremos esta entrada geolocalizando de la forma más sencilla, a través de la shell, en la que solo tenemos que escribirlo y lo recibimos inmediatamente, como veremos en la siguiente imagen.
Usaremos el comando de cURL, por lo que propiamente es hacer lo mismo que en el segundo apartado, pero con la shell:
curl -d '{version:1.1.0,request_address:true,wifi_towers:[{mac_address:xx-xx-xx-xx-xx-xx}]}' www.google.com/loc/json
4.-Geolocation API Specification (W3C)
Para los que usamos twitter, esta especificación no nos deberia de parecer nueva, ya que desde hace tiempo tenemos la opción de añadir desde donde twitteamos usando este método.
A continuación, el código que nos permite esto:
Tras ejecutarlo en Firefox por ejemplo, nos saldrá un aviso de si queremos compartir nuestra localización, que igual a alguno le suena haber visto anteriormente:
Y nos saldrá esto:
A veces no me funciona, igual es que tiene algún límite de peticiones por tiempo (como algunas APIs). Lo curioso (y bueno) del asunto, es que si analizamos con Wireshark los datos, podemos ver que pasan por SSL.
Para terminar con este apartado, decir que en el siguiente enlace disponemos más detalladamente datos relativos al uso de esta Geolocation API.
Saludos, lipman
Primero de todo, felicitarte por el blog. No lo había visto hasta ahora y todos los posts que he leído son muy interesantes y están muy bien redactados.
Estoy interesado en este tema, y desde que cayó la página de samy me estoy buscando la vida para intentar hacer algo. Estaba en la línia de usar curl cuando he encontrado tu artículo.
Una observación:
Cuando localizas a través de la shell el resultado obtenido no es satisfactorio almenos en mi caso e intuyo que en el tuyo tampoco por que sale un radio de 1.8km de error. Por lo que parece que la localización es vía ip y no con las mac’s.
Sin embargo la API de google (para autolocalizarte) funciona bien por lo que el servicio sigue activo.
¿Alguien más está en la misma situación?
Es un poco raro lo que dices: si te fijas, realmente hacerlo por el método 3º (shell) y el 2º (cURL) es realmente lo mismo, ya que se envian los datos a la misma dirección (www.google.com/loc/json) y se obtiene respuesta.
Si te interesa este tema, estate atento al blog, que un dia de estos (creo que la semana que viene o la siguiente) publicaré un post titulado “Trazando la ruta geográfica de nuestra víctima”, no digo más =)
Un saludo!
No me he explicado bien.
Me gustaría que el proceso de pedir una MAC al servidor de google y su respuesta fuese lo más sencillo posible. Si utilizamos un entorno linux, curl es un pequeño programa que muchas veces ya viene preinstalado. Así pues, es fácil hacer un script para geolocalizar una lista de MAC’s sin que tener que instalar un servidor local de php.
El problema que tengo, es que cuando envío la petición usando la opción HTTP POST, parece que Google no verifica la MAC enviada en su base de datos. Cuando Google no encuentra/verifica la MAC que has puesto, por defecto usa la geolocalización vía ip.
Así pues, en vez de tener un rango de error de 100metros, te asigna muchas veces el ayuntamiento de tu localidad (o el centro de la ciudad) y el error es mucho más grande y no es lo que estamos buscando.
Viendo la fotografía que pusiste, se puede observar que en “accuracy” te marca 1800.00 metros, típica distancia de cuando se usa la geolocalización ip.
Un saludo.
Ah si claro, pero para que lo encuentren en la base de datos, tiene que estar registrado por los cochecitos de google, y claro, esta es la única forma de geolocalización. Si no está en la base de datos y no usamos un sistema de geolocalización global (GPS) lo más cercano sería una localización IP.
De todos modos, aunque en accuracy me pusiera 1800 metros, en mi caso personal me acertó con una precisión de menos de 100 metros, y las de IP directamente me marcan que soy o de Barcelona o de Madrid, y va a ser que no.
Algo raro pasa pues. La red que he puesto se que está (o al menos estaba) en la base de datos de Google ya que con la página de Samy si que la detectaba. Además, he probado con varias que sabía que estaban geoposicionadas por Google y todos los resultados han sido negativos.
Pues sí que es muy raro, has probado de las diferentes maneras? Si quieres ponme alguna de esas MACs en un comentario, lo pruebo y edito tu mensaje para ocultarla.
Nada… Prefería hacerlo con la shell por la simplicidad. He instalado el XAMPP y probado los scripts que has puesto (de php no sé nada). Los resultados son negativos, me devuelve la posición calculada por ip y no por MAC. Intenta localizar la siguiente: xx-xx-xx-xx-xx-xx , debería encontrarla a unos 5km del centro de Cartagena.
Un saludo!
Por Cartagena? lo he probado y me dice que está en Granada, pero vamos, que sí que me responde (lo estoy haciendo por el método de la shell).
Encantado, yo también soy murciano, lorquino =P
Un saludo!
Esto no puede ser, el servidor tampoco ha leído la MAC y está geolocalizando mendiente ip.
Siento ser repetitivo. Podrías comprobar la siguiente MAC para salir de dudas: 00-15-6d-51-05-f2 .
PD: Estas MAC’s están detectadas desde las Islas Baleares, no soy murciano :). También he comprobado como el servidor de Google sólo te deja hacer X peticiones, luego no devuelve nada.
He probado con MACs que incluso yo probé, y no sé porqué no funciona, es como si le diera igual la MAC la pongo, que siempre me devuelve lo mismo: la dirección más próxima a la mia, incluso poniendo MACs que no son de mi misma ciudad, es muy extraño la verdad.
Ahí está lo que me pensaba, pongas la MAC que pongas el servidor de Google la ignora y usa su sistema de geolocalización basado en ip (que, por cierto, es bastante bueno). Hace una semana que la página de Samy dejó de funcionar, ya sabemos el porqué.
Pues si, igual es que están haciendo algo, lo miraré uno de estos dias probando de nuevo, muchas gracias!
Lo he estado mirando y tengo siempre el mismo resultado: me localiza en el mismo sitio sea la MAC que sea, sin embargo si uso un localizador de IP me localiza en Barcelona (es menos preciso) así que realmente no sé lo que hará, es muy extraño =/
Lo único que se me ocurre es que estén haciendo algo con la base de datos y den un resultado menos preciso.
El servicio de geolocalización de Firefox (http://www.mozilla.com/es-ES/firefox/geolocation/ ) sigue funcionando perfectamente… Y respecto a la geolocalización ip, ya me percaté hace tiempo que lo tienen muy perfeccionado, por ejemplo, pueden distinguir entre dos pueblos separados 30km, algo que las demás páginas de geolocalización ip no consiguen.
Sip, tienes razón, eso funciona O.o es bastante raro, igual es que lo han limitado de alguna manera, pero es muy muy extraño.
JSON parsing error.
Hola. He encontrado tu pagina buscando geolocalizacion y la verdad que esta muy bien todo lo que he visto.
Hace unos dias que he perdido mi movil y como tengo la caja, he localizado la direccion mac de la tarjeta de red inalambrica que lleva el nokia n8. Me gustaria preguntarte si existe algun programa o script que pudiera incorporar a mi netboot o a un movil nuevo (que sera android) que me avisara cuando con un sonido cuando estuviera en el radio de alcance de cobertura ,siempre que lo tuviera encendido, claro.
Si puedes contestarme, te lo agradecería
nota: hasta ahora se me ha ocurrido lanzar el airodump-ng para que vaya cambiando canales y filtrar a la misma vez con el wireshark con la mac del telefono.Pero claro , siempre pendiente de la pantalla.