Cómo proteger entradas de GRUB con contraseña

Siempre es bueno añadir un nivel más de seguridad a tu equipo, pues ahí está tu información, ¿y qué mejor que impedir el arranque de un sistema operativo a extraños? Si tienes el gestor de arranque GRUB (que es lo más común si has instalado un sistema operativo adicional, como Ubuntu o Fedora), puedes proteger cada entrada del menú de GRUB con una contraseña; de este modo, cada vez que elijas un sistema operativo para arrancar, se te preguntará la contraseña que hayas especificado para poder arrancar el sistema. Y como beneficio adicional, si roban tu equipo los intrusos (y tu hermana) no podrán acceder a tus archivos. Se oye bien, ¿no? Y hacer esto es relativamente fácil.

Comencemos abriendo el entorno de GRUB. Abre una terminal y escribe grub. Después, introduce la siguiente orden:

md5crypt

Se te preguntará cuál es la contraseña que deseas. Escríbela y presiona Enter. Obtendrás una contraseña cifrada, que guardarás con mucho cuidado.

Ahora, con permisos de administrador, abre el archivo /boot/grub/menu.lst con tu editor de textos favorito (p.ej.: sudo gedit /boot/grub/menu.lst). Para ponerles contraseña a las entradas del menú de GRUB que prefieras, debes añadir lo siguiente a cada una de las entradas que deseas proteger:

password --md5 encrypted_password

Esto quedaría parecido a lo siguiente:

Antes:
title Ubuntu, kernel 2.6.8.1-2-386 (recovery mode)
root (hd1,2)
kernel /boot/vmlinuz-2.6.8.1-2-386 root=/dev/hdb3 ro single
initrd /boot/initrd.img-2.6.8.1-2-386

Después:
title Ubuntu, kernel 2.6.8.1-2-386 (recovery mode)
root (hd1,2)
kernel /boot/vmlinuz-2.6.8.1-2-386 root=/dev/hdb3 ro single
initrd /boot/initrd.img-2.6.8.1-2-386
password –md5 $1$w7Epf0$vX6rxpozznLAVxZGkcFcs

Guarda el archivo y reinicia. ¡Vualá!

Visto en Ubuntu Buzz

Alias en Hotmail y sincronización de cuentas en Gmail

No es una novedad, y existe desde hace mucho tiempo, pero siempre he querido hacer un post dedicado a esto, y dedicado a los que tenemos cuentas largas e incómodas de dar al público para cosas serias, y además de eso, usar varias y diferentes cuentas, incluso la de la universidad.

Alias en Hotmail

Voy a empezar por hablar de los alias en Hotmail.com. Desde hace bastantes años, llevo usando una cuenta de correo en hotmail que combina el ser bastante larga, con el ser bastante lol.

Todo esto ocasiona algunos problemas en el dia a dia: a la hora de registrarse en sitios teclear una dirección tan larga cansa más, a la hora de rellenar formularios impresos en papel con tu correo incluso ha llegado a no caberme el correo electrónico en el espacio de papel permitido. También he aprendido que cuando das tu dirección de correo en persona o por teléfono, es más tedioso, incluso puede algunos caracteres se puedan confundir (guiones con guiones bajos por ejemplo), y multitud de ejemplos.

Crearnos un alias en Hotmail nos permite asociar una nueva dirección para poder ver los mensajes que se reciben en esta en nuestro correo normal. De la misma manera, podemos escribir mensajes desde nuestro correo normal, poniendo de remitente el alias. ¿Qué ventajas obtenemos con esto? En mi caso, al tener un correo largo, me puedo crear un alias más corto para poder registrarme en sitios, y que los correos de registro me lleguen directamente a otra carpeta, separada de la principal. Vamos a probar a configurarlo:

Le damos a “Crear un alias de Hotmail”, y elegimos nuestro nuevo alias.

Tras esto, seleccionamos si queremos crear una nueva carpeta para que ahí se redigiran los correos llegados, y ya está. Un momento, porqué no me funciona?? Claro, a Hotmail se le olvidó decirnos que nos lo tienen que activar. Tardan unas horas (a mi me tardaron unas 10 o así) en activarlo, y cuando lo hacen, te mandan un correo del estilo.

Sincronizar diferentes cuentas de correo en GMail

También soy de las personas que tienen varios correos y los usan, por lo que la sincronización con GMail me ha venido bastante bien.

Para empezar vamos a crear las etiquetas, cuyo nombre (en mi caso) serán el nombre de cada correo, para así tener un orden sencillito.

Posteriormente, vamos a “Configuración del correo”, y nos vamos a “Cuentas e Importación”, y en la parte de “Comprobar correo mediante POP3”, le damos a “Añadir cuenta de correo electrónico”

Ahí ya ponemos finalmente el correo, la contraseña, y seleccionamos los checkboxes de “Usar SSL” y “Etiquetar los mensajes entrantes”, a lo que seleccionaremos la etiqueta que creamos anteriormente.

Ahora bien, ya lo tenemos configurado, solo un par de aclaraciones.

  • Podemos poner cualquier correo, yo tengo dos de hotmail y uno de mi universidad.
  • Es un proceso que requiere actualización no inmediata, osea que puede que tarde en verse reflejado los correos. Igualmente, se le puede dar a “Comprobar correo electrónico” para ver si tenemos algo nuevo.
  • Cuando eliminamos un correo importado a nuestro GMail, se elimina en la cuenta. Si queremos que se mantenga, seleccionaremos el primer checkbox de la configuración.

¿Cuánta información lleva un tweet? y los identificadores de Twitter

Otro post más acerca de Twitter.. debe ser que estoy tan enganchado que no puedo pensar en otra cosa. Esta vez, quisiera hablar de los identificadores a la vez que averiguamos el contenido de un tweet (que, a pesar de lo que pueda parecer, no es poco precisamente).

Los identificadores numéricos nos permiten poner un orden a nuestra base de datos usándolos como Primary Key, sin embargo el usuario normal no necesita conocerlos para nada, así que no es un dato explícito tal y como lo sería nuestro nick en un foro por ejemplo.

Primero de todo, vamos a obtener el ID de un tweet, que es un procedimiento (si se puede llamar así) bastante sencillo, y para ello, hay que poner el ratón sobre el indicador del tiempo de cúando se envió el tweet.

Ahora sencillamente, mediante cualquier herramienta con la que podamos usar cURL (ya sea desde la consola de Linux o desde el Cygwin con Windows, o con PHP..) o incluso poniendo la URL en nuestro navegador (que nos pedirá de descargar un archivo .json el cual podremos abrir con cualquier editor de texto) hacemos una petición a al siguiente enlace: http://api.twitter.com/1/statuses/show.json?id=XXXXXXXXXXXXXX en donde XXXX.. es la ID del tweet.

Nos devolverá el siguiente resultado:
{“geo”:null
“coordinates”:null
“retweeted”:false
“in_reply_to_status_id_str”:null
“in_reply_to_user_id_str”:null
“retweet_count”:0
“contributors”:null
“user”:
—{“follow_request_sent”:false
—“verified”:false
—“profile_background_image_url_https”:”https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png”
—“profile_link_color”:”0084B4″
—“protected”:false
—“following”:false
—“profile_sidebar_border_color”:”C0DEED”
—“followers_count”:106
—“location”:”Burgos, Espa\u00f1a”
—“name”:”Juan Miguel Lipman”
—“default_profile”:true
—“favourites_count”:10
—“profile_use_background_image”:true
—“utc_offset”:3600
—“url”:”http:\/\/delanover.com”
—“description”:”Otaku. Computer Engineering student. PHP+MySQL Developer. Fedora user. Rammstein lover (as EBM, NDH and Melodic Death Metal music).”
—“listed_count”:6 —“time_zone”:”Madrid”
—“profile_background_color”:”C0DEED”
—“screen_name”:”jmlipman”
—“contributors_enabled”:false
—“notifications”:false
—“profile_background_image_url”:”http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png”
—“id_str”:”103288301″
—“show_all_inline_media”:false
—“geo_enabled”:true
—“lang”:”es”
—“created_at”:”Sat Jan 09 14:55:42 +0000 2010″
—“profile_text_color”:”333333″
—“default_profile_image”:false
—“profile_sidebar_fill_color”:”DDEEF6″
—“profile_image_url”:”http:\/\/a1.twimg.com\/profile_images\/1307866230\/MWSnap062_normal.jpg”
—“statuses_count”:9368
—“profile_background_tile”:false
—“friends_count”:84
—“profile_image_url_https”:”https:\/\/si0.twimg.com\/profile_images\/1307866230\/MWSnap062_normal.jpg”
—“id”:103288301
—“is_translator”:false
}
“in_reply_to_user_id”:null
“in_reply_to_status_id”:null
“id_str”:”118319553267761152″
“truncated”:false
“created_at”:”Mon Sep 26 13:42:34 +0000 2011″
“place”:null
“favorited”:false
“source”:”web”
“id”:118319553267761152
“in_reply_to_screen_name”:null
“text”:”Tweet de prueba para un post sobre Twitter en #Delanover”
}

Igual después de ver todo esto entendemos la cantidad de herramientas que hay para twitter que te dicen cosas como de dónde son tus followers o cuanto tiempo de antigüedad tiene la cuenta de twitter.

Para obtener el los datos de un usuario dado una ID (del propio usuario obviamente) simplemente tendriamos que mandar una petición del tipo: http://api.twitter.com/1/users/show.json?id=XXXXXXX.

Y para recorrer el camino inverso, es decir, obtener el nombre de usuario a partir de una ID, simplemente sería cambiar el ID de antes por ‘screen_name=nick’ de forma que quedaria: http://api.twitter.com/1/users/show.json?screen_name=NICK

En general, disponemos de un listado interesante de peticiones que podemos realizar, que como dije es el que usan muchas aplicaciones, justo aquí.

Breve introducción a la programación con CUDA: Guía de Instalación, Códigos y Compilación

Índice:
1.-Introducción
2.-Instalación
2.1.-Configurando Visual Studio 2008
3.-Compilación
3.1.-Hola Mundo
3.2.-Jugando con la memoria

1.-Introducción

La tecnología CUDA (Compute Unified Device Architecture) es una arquitectura de computación paralela desarrollada por nVidia lanzada en 2007. Esta tecnología permite a los programadores desarrollar aplicaciones o programas que se ejecuten en la GPU de la tarjeta gráfica. Este lenguaje es una variación de C, por lo que los que lo conocen, ya tienen una gran ventaja.

No me quiero extender mucho más en la introducción para pasar a lo importante cuanto antes, ya que si has venido buscando cómo empezar a programar en CUDA es de suponer que sabes lo que es.

2.-Instalación

Para empezar, nos descargaremos el Visual Studio 2008 Express (Versión de C++) ya que lo usaremos para escribir y compilar nuestro código (opcional).

Por otra parte, nos tenemos que descargar los archivos relacionados con CUDA, que son dos (o tres, este último que explicaremos será opcional). Todos ellos, los descargaremos de aquí. Por un lado, necesitamos los drivers para CUDA, en los que, importante, no son los mismos para portátiles que para ordenadores de sobremesa.

Por otro lado, nos descargaremos el CUDA Toolkit, que es el que tiene los archivos para los desarrolladores (compilador y demás). Finalmente, y de manera opcional, podemos descargarnos el “CUDA SDK code samples” que incluye códigos de muestra para veamos si funciona.
Si tenemos algún problema en la instalación, podemos probar a reinstalar los drivers (normales) de nuestra tarjeta.

Por otra parte, si no sabemos si nuestra tarjeta tiene CUDA, podemos consultarlo aquí.

2.1.-Configurando Visual Studio 2008

Tras instalar el SDK, en la ruta por defecto de instalación (C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\SDK Browser) encontraremos un archivo llamado browser.exe, que es el navegador (como su propio nombre indica) sobre el cual podremos ver los archivos de muestra y correrlos para verlos funcionar.

A continuación le daremos a cualquier “Files”, ya que realmente todos nos llevan al mismo directorio (siendo que deberian de llevar cada uno a su propio directorio pero bueno). Si no, directamente nos dirigiremos a C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\src.

Nos metemos en una carpeta cualquiera, en este caso, la de templates y abrimos el fichero template_vc90.sln. Se deberia de abrir con el Visual Studio 2008.

Como podemos observar, es un proyecto formado por 3 ficheros, de los cuales podemos ver que hay algunos con extensión cu. Efectivamente, “cu” va a ser la extensión del código fuente en CUDA. Por otra parte, podemos observar que no nos aparece el código coloreado, sin embargo si que aparece coloreado en el fichero .cpp

Para ello, nos dirigiremos a Herramientas -> Opciones -> Editor de texto -> Extensiones de archivo, y escribiremos “cu” (sin el punto) y le daremos a “Añadir”. Posteriormente, si reiniciamos el Visual Studio ya nos pondrá bien la sintaxis.

Por otra parte, también querremos que las palabras reservadas nos las coloree para que quede más bonito y sencillo a la vista. Para ello, nos dirigiremos a C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\doc\syntax_highlighting\visual_studio_8 y abrimos el archivo usertype.dat con algún editor de texto. Como podremos ver, contiene palabras reservadas, que son las que se volverán de color azul al escribirlas en el VS2K8. Copiamos este archivo, y lo llevamos a la siguiente ruta: C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE. Como dije anteriormente, reiniciamos el Visual Studio y podremos ver la nueva sintaxis remarcada.

3.-Compilación

A pesar de haber configurado el Visual C++, al ser nuestra primera compilación, la haremos directamente desde la consola de Windows. Usaremos dos códigos sencillitos, sacados de aquí.

3.1.-Hola Mundo

Como viene muy bien explicado, poco más he de añadir. En este primer ejemplo, simplemente añadiremos la cabecera cuda.h para que comprobemos que, en caso de no tenerlo, nos daria un error.

Lo guardamos como hola.cu en el escritorio por ejemplo, y nos vamos a la consola, usando el NVCC.

//Agregamos libreria standard
#include 
//Agregamos libreria cuda
#include 
//Funcion principal
main()
{
    //Imprimimos texto y salto de linea
    printf("Hola mundo\n");
}

3.2.-Jugando con la memoria

Con este código, tocaremos un poco la memoria interna de nuestra GPU, también viene bastante bien explicado:

//Libreria estandar
#include 
//Libreria cuda
#include 

//Definimos el tamanio de nuestro array
#define SIZE 128

//Funcion principal
main()
{
    //Definimos
    float *array_pc;    //Aqui guardaremos el array en nuestra RAM
    float *array_pc2;    //Aqui guardaremos la lectura del array cuando vuelva de la grafica
    float *array_grafica;    //Usaremos este puntero para el array en la grafica.
    size_t totaltamanio = sizeof(float)*SIZE;    //Calculamos el tamanio que tendra nuestro array
    int i;            //Variable auxiliar para utilizar en bucle.

    //Reservamos espacio para los arrays de nuestra RAM
    array_pc = (float *)malloc(totaltamanio);
    array_pc2 = (float *)malloc(totaltamanio);
    //Reservamos espacio para el array de nuestra grafica
    cudaMalloc((void **)&array_grafica,totaltamanio);

    //Bucle de 0 a SIZE (Sin incluir SIZE)
    for(i=0;i

Y tras ejecutarlo:

Análisis de tráfico en las aplicaciones de Twitter más “seguras” para Android

Parte 1
Parte 2

En relación al post acerca de la seguridad de nuestros tweets pudiendo ser atacados por un MitM, he decidido analizar el tráfico de datos generado por cada una de las cuatro aplicaciones que usaban SSL para transmitir los tweets y alguna otra información. La verdad es que me he llevado una sorpresa un tanto desagradable, puesto que no hay ninguna que sea segura en su totalidad.

Las aplicaciones analizadas son: Twitter (Oficial), TweetDeck, Seesmic y HootSuit. Tienen en común estas aplicaciones, que se pueden acceder a ellas y ver los tweets cargados anteriormente, junto con lo que esto conlleva (avatares, biografias…). Esto quiere decir que esta información está guardada dentro del teléfono y cada vez que nos conectamos a Internet se va actualizando y reemplazando. Esto es un tanto obvio la verdad. Lo que también deberia ser obvio, es que para el transporte de estos datos, de Internet al telefono, se hiciese todo mediante el protocolo seguro y no es así.

Por un lado, las cuatro aplicaciones cargan los avatares que posteriormente son guardados en el teléfono sin usar SSL, así que con un MitM podriamos sacar todos los avatares.

La otra falta de seguridad que comparten las cuatro aplicaciones son que, si subimos una imagen desde la aplicación para twittearla junto con nuestro estado, esta imagen también se puede recuperar al realizar un ataque MitM y cualquiera que esté escuchando, podria obtenerla, al contrario que en la versión web de Twitter, que si subimos una imagen, no se puede obtener (en la versión segura claro está).

Twitter (Oficial)

Como anteriormente dije, se pueden obtener los avatares que se cargan en la aplicación:

Cabe destacar que la recuperación de tweets, privados, menciones, búsquedas, listas, y todo en general, se hace a través de SSL, por lo que no podrán leer lo que escribimos o recibimos.

Sin embargo, como anteriormente también dije, si que podemos recuperar una imagen que subamos a Twitter directamente desde la aplicación, como podemos ver a continuación:

Finalmente, añadir que otro dato que también podemos recuperar con total precisión, es la geolocalización, es decir, la localización que se recupera al usar el propio GPS del teléfono móvil para posteriormente incluirla en los tweets. Como podemos ver, recuperamos las coordenadas que luego las ponemos en GMaps y tan tranquilamente vemos el sitio, aunque ciertamente poco sentido tiene si esto se realiza en un MitM puesto que al realizarlo en un entorno controlado, ya sabemos donde está.

TweetDeck

Al sincronizar todo por primera vez, como con todas las aplicaciones, se transfieren los avatares, incluso podemos ver que llega un paquete cuyo host es: tracking.tweetdeck.com y realiza una petición GET a la siguiente URL: /track/add_account?cl=android&tw=103288301&tz=120&v=2 de la obtenemos el número identificador de la cuenta de twitter (se hablará sobre esto en otra entrada).

Al actualizar la timeline, tweets de perfiles, privados y demás, se realiza todo mediante SSL, aunque cada 15 minutos (configurable) al actualizarse automáticamente, podemos interceptar un paquete sin tampoco demasiada importancia aunque con ciertos datos, cuyo contenido también es una petición GET de URL /track/ping?android-model=MT15i&android-sdk=2.3.3&cl=android&interval=900&tw=103288301&tz=120&v=2&ver=1.0.7.3. Aparecen el identificador, el modelo, versión de Android y el intervalo de tiempo.

Por otro lado, al subir una imagen, podemos recuperarla al igual que con la aplicación anterior, pero no solo eso, sino que también disponemos del link de la subida que se ha generado, como podemos ver:

Otra característica curiosa que tiene TweetDeck es la posibilidad de traducir tweets o biografias, pero esto tampoco pasa por SSL y es totalmente transparente, por lo que podemos ver el mensaje traducido y el original:

Por último, al agregar y desagregar de favoritos, recibimos los identificadores de los tweets que nos sirven para saber qué tweet hemos añadido o no, también en texto plano.

Como podemos ver, tenemos el identificador del tweet 104311621911982080. De esto también se hablará próximamente.

Seesmic

Al sincronizar por primera vez nuestra cuenta de twitter, además de recoger los avatares de los usuarios, podemos obtener nuestra descripción y último tweet. Al subir una imagen, además de poder recuperarla como en las demás aplicaciones, podemos ver el enlace generado junto con nuestro nombre de usuario e identificador.

Por otra parte, en un paquete de datos, vemos que alguna información es guardada en la siguiente ruta de nuestro teléfono: /sdcard/ANdroid/data/com.seesmic/stats.txt

HootSuit

Esta, es la más insegura de las cuatro sin lugar a dudas: cierto es que los tweets y privados que enviamos se hace a través de la capa segura, pero al actualizar de forma automática (cosa que hace cada 300 segundos) o de forma manual, son totalmente visibles los tweets de nuestro timeline, de nuestro usuario, y nuestros privados. Además, al sincronizar por primera vez también aparecen algunas cookies interesantes junto con nuestra descripción.

Y por supuesto, al subir alguna imagen, también la podemos obtener junto con el enlace en donde se ha subido:

Conclusión

Tristemente, no hay ninguna aplicación segura en su totalidad, pero si de alguna manera tuvieramos que ordenarlas por orden de más seguro a inseguro, seria el siguiente:

Twitter (Oficial) > Seesmic > TweetDeck > HootSuit

Resumen:
–>Todos:
-Recuperación de avatares.
-Recuperación de imágenes subidas al enviar tweet.

–>Twitter (Oficial):
-Recuperación de coordenadas al usar el GPS para ubicarnos.

–>TweetDeck
-Enlace de la imagen subida
-Sistema Operativo, versión y modelo del teléfono.
-ID del tweet que faveamos o desfaveamos.
-Nuestro ID identificador de twitter.
-Obtención de los tweets que traducimos (ambos, el original y el traducido).

–>Seesmic
-Enlace de la imagen subida.
-Nuestro ID identificador de twitter.
-Nuestro nombre de usuario de twitter.
-Sistema Operativo, versión y modelo del teléfono.

–>HootSuit
-Obtención de cookies interesantes.
-Enlace de la imagen subida.
-Obtención de los tweets de nuestro timeline, perfil y privados (junto con información de los usuarios).

Un saludo, lipman

Seguridad en las aplicaciones de Twitter para Android

Parte 1
Parte 2

Desde mi reciente adquisición de un teléfono móvil con Android (más concretamente el Xperia NEO) no he parado de usarlo y descubrir cosas sobre él, ya que era la primera vez que tenia un Android en mi poder (un poco tarde, lo sé). Como soy un adicto al Twitter y no estoy sujeto a una tarifa de datos 3G, siempre que veo una red abierta velozmente activo el Wifi para ver las novedades de mi red social favorita como no (y aquí algunos nos daremos por aludidos, verdad?).

Además de eso, como me gusta probarlo todo (las aplicaciones) para luego poder elegir, busqué por Internet aplicaciones para Twitter y demás, y me topé con un post que listaba un top 10 de tales aplicaciones.

Por ello, me dispuse a instalarme las ocho que me faltaban (ya que siempre he usado la oficial, y la última de la lista la descarté), y tras realizar un MitM entre el dispositivo y el router, pude comprobar que solo cuatro de ellas transmiten los tweets por SSL:

Aplicación ¿SSL?
Plume NO
Tweetdeck SSL
Twicca NO
Twitter Oficial SSL
TweetCaster NO
Twitdroyd NO
Seesmic SSL
HootSuit SSL
TweetTopics NO

Así que si sois de los que nada más detectais una red Wifi abierta os conectais y no os importa correr el riesgo de lo que pueda pasar, al menos usad un cliente de Twitter que use SSL para enviar los tweets.

Un saludo, lipman

Usando la API de Virustotal

Índice:
1.-Analizando un archivo
2.-Realizando comentarios
3.-Analizando una URL

Introducción

Quien no conoce Virustotal, el servicio online en el que podemos subir un archivo y nos lo escanea con hasta 42 antivirus para tener varios resultados.

Hace ya tiempo, los que se dedicaban al desarrollo de Malware usaban el KIMS (que recuerdos me trae), que era un software que se descargaba varios antivirus (creo que hasta 20) y los analizaba localmente en tu propio ordenador. Ahora con el avance de los tiempos, tenemos servicios online como este del que voy a hablar hoy, o de NoVirusThanks, el cual tuvo su auge en cuanto los desarrolladores supieron que la plataforma Virustotal distribuia lo que subian (o eso se dijo), por lo que si subian virus que estaban desarrollando, no les traia cuenta que estos ficheros fueran dados a las marcas de Antivirus para que los analizasen y detectasen posteriormente.

Una de las razones que me ha llevado a interesarme por esta API, es su increible simpleza y flexibilidad, como podremos ver a continuación en un script. Antes de nada, decir que este script, y todo lo que pondré a continuación está sacado de aquí. La razón por la cual quiera hacer un post de esto, es para dar a conocer más esta API y que todos vean lo simple que es.

Antes de dar paso al uso de la API, quisiera agradecer a Julio Canto y Emiliano Martínez (del staff de VirusTotal) por su total ayuda (incluso en un domingo =P) a través de twitter y por correo electrónico. Sin ellos no podría haber terminado este post, ya que tuve dudas importantes con el uso de la API analizando webs.

A continuación, vamos a hacer lo más simple, y es analizar un fichero y obtener el reporte de los antivirus. Para ello lo primero que tenemos que hacer, es registrarnos en Virustotal.com, y obtener la API Key, que se halla en My Account -> Inbox -> Public API.

1.-Analizando un archivo

Ahora os dejo con el código, comentado y explicado, de cómo analizar un fichero virus.exe y obtener el resultado:

0: fecha (-2 horas española)
--->1: Array
------>Nombre del antivirus: Resultado
------| Si no detecta nada, el resultado está vacio
------| Hay 42 antivirus
*/

echo "
"; if($retrieve){ foreach($retrieve['report'][1] as $clave => $valor) echo $clave . ": " . $valor . "
"; //Esto nos devuelve todos los antivirus, seguido del resultado que nos dan echo "
"; } function virustotal_scanfile($filepath, $key){ //Editada y comentada por lipman // Author: Peter Bailey // Website: Bailey-Projects.com $post = array('key' => $key, 'file' => '@'.$filepath); //preparamos lo que vamos a pasar por POST $ch = curl_init(); //Iniciamos CURL curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); curl_setopt($ch, CURLOPT_URL, 'http://www.virustotal.com/api/scan_file.json'); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); //Cerramos CURL } function virustotal_getreport($resource, $key){ $url = 'https://www.virustotal.com/api/get_file_report.json'; $fields = array('resource'=>$resource, 'key'=>$key); foreach($fields as $key=>$value) $fields_string .= $key.'='.$value.'&'; $fields_string = rtrim($fields_string,'&'); //Preparamos la variable que enviaremos por el método POST $ch = curl_init(); //Iniciamos CURL curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST,count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); //Cerramos CURL $result = json_decode($result, true); //Decodeamos usando la función de json el resultado if(isset($result['report'][0])) return $result; //Si todo sale bien, lo devolvemos a la función else return false; } ?>

Resultado (seguro que podeis adiviniar que virus testeé):

2.-Realizando comentarios

En los reportes que se generan online tras el analizado de un fichero, se pueden realizar comentarios, incluso puntuar si estos son buenos o malos. Para realizar comentarios también disponemos de una función que he explicado en los comentarios del script:

$key,'comment'=>$comment);
	 if(preg_match('/^https?:\/\/.*/',$fileorurl)){
	    $fields['url']=$fileorurl;
	 } else {
	    $fields['file']=$fileorurl;
	 }
	 //Esto detecta si lo que pasamos es la URL o el hash del archivo, pero como
	 //dije anteriormente, a mi pasando la URL no me funciona, asi que podriamos
	 //deshacer este if-else
	
    $fields_string='';
	foreach($fields as $key=>$value)
	   $fields_string .= $key.'='.$value.'&';
	
	$fields_string=rtrim($fields_string,'&');
	//Creamos lo que vamos a pasar por POST-JSON
	
        $ch = curl_init();
	//Iniciamos CURL
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_POST,count($fields));
	curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	$result = curl_exec($ch);

	curl_close($ch);
	//Cerramos CURL
	$result = json_decode($result, true);
	//Decodeamos el resultado para saber si ha sido exitoso o no el proceso

	 if($result['result']=="1"){
	 	return true;
	 } else {
	 	return false;
	 }
}

Analizando una URL

Virustotal también nos permite analizar una URL. A priori, al analizar una URL, los motores de análisis tales como Google Safebrowsing y el de Firefox, nos indican la maliciosidad de la web (devuelto en un array, al igual que los resultados de cuando analizábamos un archivo). Pero además de esto, si la URL que indicábamos corresponde a un archivo, también nos devuelve un identificador que posteriormente podemos usar para ver si ese archivo es detectado o no.

Aquí el código, explicado:

$key = 'API_KEY';
//Api que se obtiene en el perfil
$file = "http://i476.photobucket.com/albums/rr125/lipmandj/asd.jpg";
//URL a analizar

$identificador = virustotal_scanurl($file,$key);

$retrieve = virustotal_geturlreport($key,$identificador);


if($retrieve){
	print_r($retrieve); // Array que contiene el reporte
}

function virustotal_scanurl($url, $key){

	// Esta función envia la URL

	
    // Author: Kenny Lyons aka ih8censorship
	// Website: http://pasture.sourceforge.net
    // Editado por lipman
	
    //URL a la que enviaremos los datos
    $url = 'http://www.virustotal.com/api/scan_url.json';
    //Preparamos los campos de lo que vamos a enviar
	$fields = array('url'=>$url, 'key'=>$key);
    $fields_string='';
	foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
	$fields_string=rtrim($fields_string,'&');

    //Procedemos a enviarlo mediante cURL
    $ch = curl_init();

	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($process, CURLOPT_HTTPHEADER, array("Content-Type: text/xml","SOAPAction: \"/soap/action/query\"", "Content-length: ".strlen($fields_string))); 
	curl_setopt($ch,CURLOPT_POST,count($fields));
	curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	
	$result = curl_exec($ch);

	curl_close($ch);
	//Tras enviarlo, cerramos la conexión y decodeamos el resultado devuelto
	$result = json_decode($result, true);
	
	
	if($result['result']=="1"){ //Si todo va bien, devolvemos la ID del scan
		return $result['scan_id'];
	} else {
		return false;
	}
	
}

function virustotal_geturlreport($key,$resource,$scan=false){

	// Nos devuelve el reporte
	
    // Author: Kenny Lyons aka ih8censorship
	// Website: http://pasture.sourceforge.net
    //Editado por lipman	

    //URL a donde enviaremos los datos
    $url = 'http://www.virustotal.com/api/get_url_report.json';
    //Preparamos los campos
	$fields = array('resource'=>$resource, 'key'=>$key,'scan'=>$scan);
    $fields_string='';
	foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
	$fields_string=rtrim($fields_string,'&');
    //Finalmente, usamos cURL para enviarlo y recoger el resultado
    $ch = curl_init();

	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_POST,count($fields));
	curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	
	$result = curl_exec($ch);

	curl_close($ch);
	
	$result = json_decode($result, true);
	
	 if($scan && $result['result']=="0"){
	 	return $result['scan_id'];
	 } else {
	 	return $result;
	 }
	
}

Saludos, lipman

[IEWatch] Analizando tráfico de red con este complemento para Internet Explorer

Índice:
1.-Breve Introducción
2.-Acerca del Interfaz de Usuario
3.-Datos de los paquetes filtrados
4.-Tráfico HTTPS
5.-Análisis HTML
6.-Conclusión final

A través de los comentarios de un tocayo mio, en el post de Realizar búsquedas encriptadas con Google me enteré de la herramienta (más bien complemento) IEWatch.

1.-Breve Introducción

IEWatch es un addon para Internet Explorer que nos permite analizar el tráfico de red que pasa por este navegador mientras lo usamos para navegar. Esto supone una ventaja frente a otros analizadores de red, y es que directamente podemos ver el tráfico único que pasa por el navegador sin la necesidad de aplicar ningún filtro. Además de esto, dispone de un analizador de elementos HTML bastante útil y una utilidad que nos permite realizar peticiones POST que veremos más adelante. Finalmente destacar que podemos ver también los contenidos cifrados por HTTPS.

Las pegas que le veo a este complemento para empezar son el precio, ya que no es gratuito (aunque lo podemos tener por el módico precio de 170$ USD) y la incomodidad que supone a la hora de trabajar, ya que si queremos trabajar cómodamente, el complemento ocupará un gran tanto por ciento de la pantalla, dejando poquito espacio para la navegación en si.

Se puede descargar una versión de evaluación de aquí.

2.-Acerca del Interfaz de Usuario

La verdad que se podría resumir en que deja bastante que desear la verdad. Por un lado, en el “análisis HTTP” (del tráfico de red) se divide en tres zonas (en realidad dos): la zona superior donde aparecen los paquetes de red capturados junto con una breve descripción. Finalmente, en la parte inferior, a pesar de estar dividida en dos partes, se tratan de características y datos que contienen los paquetes de datos capturados.

En la parte superior, en el log de los paquetes capturados, no podemos ver ningún tipo de leyenda ni nada parecido para saber qué datos son los mostrados, sino que tenemos que aventurarnos a adivinarlos.

Por otro lado, como dije anteriormente, si quieres trabajar completamente cómodo con el complemento, tienes que expandirlo hasta el punto en que la navegación se vuelve incómoda. Tampoco podemos expandir los campos para ver totalmente los contenidos largos que no caben en la pantalla.

3.-Datos de los paquetes filtrados

Podemos ver cómodamente:

  • Datos de la cabecera
  • Cookies
  • Datos pasados por POST
  • Parámetros y valores pasados por la URL
  • Response Headers
  • Response Cookies
  • Content

Podemos aplicar filtros, como podemos ver en la posterior imagen, sin embargo me parecen un poco escuetos. Sin ir más lejos, en los filtros por tipo de contenido solo se permiten esos tres (text, html y css), echando de menos el javascript. También dispone de un buscador, aunque este no acepta expresiones regulares. Por último, destacar que se pueden exportar e importar resultados en formato XML.

4.-Tráfico HTTPS

La verdad es que siempre me han parecido interesantes los snifers de tráfico SSL y su funcionamiento. Desde que se mostró que aun puede ser inseguro estar tras una página que use HTTPS con sslstrip, han surgido por la red sniffers de este tipo. Sin embargo, sslstrip funcionaba muy fácilmente: es un script en Python que sustituia una versión segura de una página web por una insegura, haciendo que los datos viajen en texto plano en lugar de cifrados, haciendo creer al usuario que está seguro para posteriormente esnifar su conexión con cualquier sniffer.

Sin embargo, no sé como funciona realmente esta funcionalidad de IEWatch , incluso les he enviado un correo para que me expliquen un poco qué han hecho. Al principio me aventuré pensado que podría simplemente crearnos la falsa sensación de que estamos navegando en una página HTTPS siendo que nuestros datos iban en texto plano (en plan sslstrip pero más bonito), pero esto no es así, ya que puse un sniffer a la vez que el IEWatch y pude comprobar que la información viajaba todo el rato cifrada.

También pensé que simplemente podria saber qué estamos introduciendo en el navegador (ya que al ser un complemento, seguro que tiene cierta facilidad para ello) y a partir de eso, crear la falsa sensación de magia para decir que “descifra” los datos que viajan por el protocolo seguro. Pero tampoco es esto cierto, ya que esto funcionaría en el caso de los datos que nosotros enviamos, pero los datos que recibimos (como los valores de los datos de sesión) también se nos muestran descifrados.

Por último, recuerdo haber leido (aunque puedo estar equivocado) que a partir de tener el certificado y las claves (esto ya entraría más bien en el funcionamiento del propio SSL) es relativamente fácil y no sería muy complicado “crackear” el cifrado de los datos, así que definitivamente me aventuro a decir que funciona de esta manera o de otra que no se me ha ocurrido, pero repito que les envié un mensaje y espero que me respondan para poder explicar cómo lo consiguen.

5.-Análisis HTML

No es casualidad que una herramienta de análisis de tráfico de red lleve incorporado una subherramienta (por llamarlo de alguna manera) que analice los elementos HTML de las páginas, sobre todo si se trata de un complemento incorporado en el navegador.

De forma sencilla se pueden visualizar datos como: el código HTML, imágenes, enlaces, formularios, scripts, y todavía más, como podemos ver en la siguiente imagen.

Como podemos ver en la parte izquierda, disponemos de una estructura a modo de árbol, en la que al clickear encima de un elemento (como un script) podremos ver a la derecha su contenido.

Otro par de características interesantes son los botones de HTML Spotlight y HTML Designer. La primera de ellas nos permite mostrar el código HTML de un elemento tras clickearlo, y la segunda, nos permite editar una página web en modo local, como si se tratase de un documento, es decir, clickeando en donde queramos añadir o editar texto, y demás.

6.-Conclusión final

Esta es la clase de herramientas (en este caso, complementos) que usamos una vez cada mil. El complemento no está nada mal, sin embargo, por el precio que cuesta (incluso por el simple hecho de costar dinero, habiendo analizadores de red y de HTML mejores y gratuitos en el mercado) no merece la pena ni tenerlo, ya que el dia menos esperado nos salta el aviso de que se nos ha acabado la versión de prueba.

Como dije anteriormente, es muy sustituible (salvo por el tema de ver HTTPS sin cifrar) en cuanto a analizar la red (función principal) ya que con Wireshark simplemente poniendo un filtro diciéndole que nos muestre el contenido HTTP o similares, tendriamos lo mismo. Y con respecto a la función de analizador HTML, me quedo sin duda con firebug.

Un saludo, lipman

[Script] Enviar e-mails con archivos adjuntos en PHP

Hace mucho tiempo me volví loco para encontrar un script, función o cualquier tipo de ayuda para enviar un email con archivos adjuntos en PHP, ya que todo lo que encontraba no me funcionaba. Supongo que al igual que a mi, hay más gente en las mismas, por lo que me dispongo a copiar una función que encontré aquí. Está hecha de forma totalmente sencilla, en la que para ejecutarla, simplemente tengamos que escribir:

//Ejemplo de usar la función para enviar un fichero llamado fichero.exe que se encuentra en la misma ruta que el script
mail_attachment("fichero.exe","","destinatario@hotmail.com","remitente@delanover.com","Administrador","no-reply@delanover.com","Asunto","Mensaje de prueba");

En caso de que se ejecute correctamente veremos el mensaje de mail send … OK. En caso contrario, veremos el otro mensaje: mail send … ERROR!.

Recordemos que para usar este script, nuestro servidor web ha de ser capaz de enviar correos electrónicos. De no ser así, obviamente no funcionará, pero para los que esteis seguros que funciona, este script debería de funcionar.

Aquí la función:

function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
    $file = $path.$filename;
    $file_size = filesize($file);
    $handle = fopen($file, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $content = chunk_split(base64_encode($content));
    $uid = md5(uniqid(time()));
    $name = basename($file);
    $header = "From: ".$from_name." <".$from_mail.">\r\n";
    $header .= "Reply-To: ".$replyto."\r\n";
    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
    $header .= "This is a multi-part message in MIME format.\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
    $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $header .= $message."\r\n\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here
    $header .= "Content-Transfer-Encoding: base64\r\n";
    $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
    $header .= $content."\r\n\r\n";
    $header .= "--".$uid."--";
    if (mail($mailto, $subject, "", $header)) {
        echo "mail send ... OK"; // or use booleans here
    } else {
        echo "mail send ... ERROR!";
    }
}

Un saludo, lipman

Trazando la ruta geográfica de nuestra víctima

Índice:
1.-Introducción
2.-Preparando el documento
3.-Analizando el documento usando PHP
4.-Caso real: recopilando, analizando y arreglando

Actualmente no funciona, debido a que al parecer, Google tiene deshabilitada la respuesta JSON de cuando enviamos una petición para geolocalizar

1.-Introducción

Últimamente no paro de hablar de la geolocalización a través de las MAC gracias a Google, y no es para menos. El hecho de que sabiendo una MAC de un router obtengamos la localización geográfica muy exacta (igual falla en unos metros) puede ser benificioso y a la vez peligroso.

Programas como Prey, hacen de esta característica que parezca buena y beneficiosa por si nos roban un dispositivo capacitado para acceder a la red, como un móvil, tablet o notebook.

Sin embargo, todo tiene su lado negativo, y realmente esto de cierta manera atenta contra la privacidad de las personas, en mayor o en menor medida: imaginemos que disponemos de un programa para movil que va captando las MACs y a raiz de eso, se geolocaliza y obtiene la dirección. Tendriamos el móvil totalmente controlado. ¿Y si instalásemos este programa en un dispositivo de una persona ajena? Podriamos saber en todo momento por dónde ha pasado.

De hecho, existe algo muy parecido, y se llama Creepy. Este programa, a partir de una cuenta de twitter, puede situar en el mapa los puntos en los que hay tweets de un usuario en donde se haya geolocalizado a la hora de escribirlos.
Sin embargo, esto no es intrusivo, ya que el usuario es quien decide si poner o no su localización.

Volviendo al tema de antes, se me ocurrió diseñar un script que, a partir de un array con direcciones MACs, te geolocalice y trace una ruta en GMaps. De esta manera, si tuvieramos “algo” capaz de obtener las MACs que nos rodean durante un viaje, podriamos saber la ruta que ha seguido (siempre aproximadamente).

Como no sé programar para Android, al menos todavia, no sé muy bien si esto sería fácil o difícil de programar para un móvil/tablet, pero me he valido de la suite de aircrack (concretamente de airodump y aircrack) para poner a prueba el script que pondré a continuación para probar esto mismo.

Lo que hago es lo siguiente:
1.-Con el airodump capturo paquetes durante todo el viaje o trayecto.
2.-Una vez capturados, uso aircrack y redirecciono la salida para tener todas las MACs en un txt.
3.-Posteriormente lo filtro bien para tener un txt del tipo:
aa:aa:aa:aa:aa:aa
bb:bb:bb:bb:bb:bb
cc:cc:cc:cc:cc:cc
...

4.-Finalmente, leo mediante un script en PHP el txt generado y usando las APIs de GMaps y la de la geolocalización, establezco los puntos y trazo la ruta.

2.-Preparando el documento

Antes de todo, hacemos una captura con el airodump y nos vamos a dar un paseo:
$ airodump-ng mon0 -w captura --output-format pcap

Una vez tengamos todos los datos, nos generará un fichero llamado captura-01.cap. Vamos a abrirlo con el aircrack redireccionando su salida en un txt.
$ aircrack-ng captura-01.cap > documento.txt

Una vez hagamos esto, tenemos todos los datos guardados en el fichero documento.txt. Ahora, simplemente tenemos que filtrar el documento para obtener uno que quede como dije anteriormente:
$ cat documento.txt | grep -e '[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]' -o > macs.txt

Vamos a usar un poco el sentido común: si estamos en una ciudad y damos un paseo de cinco minutos, podemos acabar con varios centenares de direcciones MAC. Esto a la hora de pasarlo como argumento y usarlo para localizar puede que tarde mucho, e incluso es bastante inutil. ¿Para qué queremos 10 direcciones MACs que nos deberian de situar en el mismo sitio? Con una nos deberia bastar, ¿no?

Lo único que se me ocurre para filtrar un poco más, y obtener menos direcciones MAC, son dos cosas: obtener solo las MACs de routers que usan WPA (que son mucho menos que los de WEP, tristemente) o usar las direcciones MAC de redes en las que hemos capturado algún paquete (ya que si vamos andando, de muchas no capturaremos nada).

Para ayudarnos a la hora de crear un filtro para estos dos casos, miraremos la estructura de una captura pasada por aircrack:

Posteriormente, es fácil deducir que podriamos filtrarlos de la siguiente manera. En el primer caso (solo las WPA):
$ cat documento.txt | grep 'WPA (' | grep -e '[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]' -o > macs.tx

En el segundo caso (WEPs con datos)
$ cat documento.txt | grep 'WEP (' | grep -e '[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]' -o > macs.tx

3.-Analizando el documento usando PHP

No tengo mucho que decir aquí, ya que el código viene completamente comentado, así que haré un resumen de su funcionamiento.

Tengo una matriz con las MACs. Lo que hago es, a partir de esa matriz, obtener una matriz de localizaciones (en orden siempre) usando la Google Geolocation API. Posteriormente simplemente es usar la API de Google Maps de la que uso 3 funciones: establecer un mapa, establecer los puntos, y trazar una ruta entre los puntos.

Aquí va el código:




 

';



function trazar_ruta($matriz){
/*A partir de una matriz, trazaremos la ruta entre las direcciones MAC
  ya que tenemos las coordenadas. El contenido será del tipo
  matriz[0]=a,b;
  matriz[1]=c,d; Siendo a,b,c,d coordenadas */
  
echo '
  var flightPlanCoordinates = [
  ';
  //Ponemos todos los valores de los puntos a unir
  foreach($matriz as $clave => $valor)
     echo "new google.maps.LatLng(" . $valor . "),
";
  
//Configuramos las caracteristicas: color, opacidad y tamaño
	echo '
  ];
 
  var flightPath = new google.maps.Polyline({
    path: flightPlanCoordinates,
    strokeColor: "#FF0000",
    strokeOpacity: 1.0,
    strokeWeight: 2
  });

 
  flightPath.setMap(map);

	';
	
}

function poner_punto($coordenadas,$titulo){
/* Esta función nos permite poner un punto en el mapa
   tenemos que darle las coordenadas, y el título que tendrá ese punto

*/
	
//Establecemos las coordenadas
echo "var coordenadas = new google.maps.LatLng(" . $coordenadas[0] . "," . $coordenadas[1] . ");
";

//Lo ponemos en el mapa
echo '  var marker = new google.maps.Marker({ //opciones
      position: coordenadas,
      map: map,
      //Nombre del mapa
      title:"' . substr(str_replace("-",":",$titulo), 0, -1) . '"
      //Titulo (visible cuando colocamos el ratón sobre el punto)
  });
';
	
}



function obtener_coordenadas($mac, &$resultado){
/* Esta función nos permite guardar en "resultado" (pasado por referencia)
   las coordenadas de la mac pasada en el primer parámetro
*/ 
	
//Datos que enviaremos
$datos_completos = '{version:"1.1.0",request_address:true,wifi_towers:[{mac_address:"' . $mac . '"}]}';
 
//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, pasamos los resultados a los valores que posteriormente usaremos
$resultado[0]=$respuesta['location']['latitude'];
$resultado[1]=$respuesta['location']['longitude'];

}


?>



  

4.-Caso real: recopilando, analizando y arreglando

Esta mañana decidí poner a prueba lo que he escrito anteriormente: puse el portatil a escanear y me fui desde donde vivo actualmente hasta la universidad para posteriormente analizarlo y ver si consigo trazar la ruta correctamente.

Para empezar, antes de salir de casa, puse la tty3 (para poder cerrar el portatil sin que se suspenda o apague) de mi Fedora escaneando con airodump y recogiendo paquetes de datos. Al llegar a la uni, filtreé los datos recogidos como anteriormente puse, generando 3 resultados distintos:
-606 MACs en total
-33 MACs con datos WEP (de las 606)
-35 MACs con WPA (de las 606)

Al script de geolocalizar y trazar rutas se le pueden pasar todos los datos que queramos, como si le pasamos over 9000 MACs, lo que pasa que hay que recordar que tenemos un timeout por defecto puesto en 60, por lo que dependiendo de nuestra velocidad de conexión podremos tratar más o menos MACs. Por ejemplo, en la uni puedo tratar hasta 225 MACs, pero en casa, alrededor de 100.

Podemos cambiar el timeout yéndonos al fichero php.ini y cambiando los valores (que están en segundos) de max_execution_time y max_input_time. Recordad que si tenemos corriendo nuestro servidor, para que se hagan efectivos los cambios habría que reiniciarlo.

Los puntos verdes muestran el inicio y el fin desde donde recogí datos. La primera imagen refleja el resultado de usar las 33 MACs con datos WEP:

Esta segunda imagen, es la de las 35 MACs que usan WPA:

Como podemos ver, en algunos puntos se nos va un poco de la ruta, pero creo que eso es debido a que hay repetidores aquí por la ciudad para tener WiFi gratis (además de los propios de la uni) y eso desestabiliza un poco.

Vamos a tratar ahora de solucionar el problema del límite de MACs que anteriormente dijimos ya que, esta captura la he realizado en 15 minutos.. Si fueran horas, tendriamos decenas de miles de direcciones. Para ello, lo que hacemos es pasar la matriz por una función cuyo algoritmo determine qué direcciones MAC deberiamos de eliminar para no pasar el límite.

Por ejemplo, si tenemos 5 MACs y queremos buscar dos, pues obviamente cogeriamos la primera y la última. Si tuvieramos 20 MACs con un límite de 4, podriamos coger 1 cada 5, y así sucesivamente.

El siguiente código no es el más eficaz ni el más perfecto, ya que le dediqué 5 minutos en hacerlo, pero funciona, y nos permite parsear una matriz y establecer otra a partir de un límite:

function reducir(&$matriz, &$resultado, $limite=100){
	$total=count($matriz);
	if($total>$limite) {
	  $division = $total/$limite;
	  $division = explode(".",$division);
	  $division = $division[0];
	
	  for($a=0;$a<$limite;$a++)
	    $resultado[$a]=$matriz[$a*$division];
	  unset($matriz);
	 //$matriz = $nueva;
	}
	//En caso contrario no hace falta modificar
	echo "

"; }

Un saludo, lipman