19 marzo 2013

MACWatch 1.0 (Python NAC)

Nadie puede negar que las redes Wifi han supuesto un avance en cuanto a conectividad, han permitido crear un ecosistema de aparatos interconectados de una forma muy fácil y cómoda.

No obstante, desde el punto de vista de la seguridad, las redes Wifi rompen los paradigmas de las redes conectadas por cable: ahora para acceder a tu red ya no hace falta estar físicamente frente a la toma de red.

Esto supone un reto a la hora de monitorizar la red y auditar quien y cuando se conecta a dicha red Wifi.

Mucha gente usa ARPWatch como herramienta para monitorizar su red Wifi, a mi, personalmente, no termina de convencerme, creo que tiene aspectos mejorables y por ello he creado mi propia versión con bastantes mejoras frente al original.

De entrada, MACWatch hace lo siguiente:

- Monitoriza nuevas direcciones MAC en la red 

- Además de validar por MAC conocida / MAC desconocida, añade una comprobación basada en su perfil tcp/ip (puertos abiertos)

- Permite bloquear esa nueva dirección MAC (actúa como NAC)

- Envía un correo electrónico con las nuevas MACs detectadas

Respecto a monitorizar MACs, nada nuevo bajo el sol, se buscan MACs conocidas y MACs desconocidas. Donde empieza lo bueno es en la parte del perfil TCP/IP. 

Lo que hace MACWatch es lanzar un escaneo vía Nmap contra la máquina y comprobar si tiene los puertos TCP abiertos que nosotros conocemos previamente

Esta comprobación añade seguridad frente a la comprobación de la MAC ya que es fácil conectarse a una red Wifi y 'clonar' la MAC de un cliente legítimo. Ahora, si alguien clona esa MAC pero el resultado de Nmap difiere, será bloqueada.

La parte del NAC funciona mediante envenenamiento ARP, esto ya lo hacen muchos sistemas NAC, lo que pasa es que algunos, desde mi punto de vista, lo hacen mal.

Envenenan la caché ARP del atacante, y eso me parece un poco ingenuo ya que un atacante podría fijar una entrada ARP estática y eludir el ataque.

MACWatch funciona de forma diferente: se definen una serie de hosts a proteger, típicamente el router, servidores que anden por la red, etc.

Cuando MACWatch detecte una MAC desconocida, procederá a aislarla de la red envenenando la caché ARP de los hosts protegidos, de esa forma el atacante no puede hacer -en teoría- nada para eludir el ataque.


Para configurarlo hay que editar dos ficheros:

macok.txt

En este fichero configuramos las direcciones MAC de nuestros equipos en la red y sus puertos abiertos.

La dirección MAC es fácilmente obtenible vía comando arp, los puertos abiertos se pueden sacar empleando nmap -sT -Pn contra el host que vayamos a defender.

Una vez hecho eso, el fichero queda tal que así

0f:71:20:f9:7c:4f<->22,23,110
a4:ba:49:c7:b6:ca<->600,900
6f:a8:f5:b4:70:55<->21

Como se puede ver, a la izquierda va la dirección MAC, luego un separador <-> y la lista de puertos abiertos separados por comas.

isolated.txt

En este fichero ponemos el listado de direcciones IPs de la red que queremos aislar del potencial atacante

192.168.33.1
192.168.33.55

Luego, hay que editar MACWatch.py y definir:

- el correo electrónico origen de los mensajes, el correo destinatario y el servidor

- Si queremos que haga bloqueo de las nuevas MAC o no, recomiendo de inicio no hacerlo hasta tener todo funcionando. Para ello localizamos la variable 

isolate = 0

Y la cambiamos a 1 si queremos bloqueo.

Finalmente ejecutamos tal que así (cambiando la red por la que toque):

python MACWatch.py 192.168.33.0/24

MACWatch genera un fichero de log llamado maclog.txt con información de los eventos.

Para descargar:


Requiere tener instalado python-nmap (disponible a través de pip)

De momento no deja de ser una versión inicial, pero sabiendo que por aquí nos visitan muchos 'Pythoneros', lanzo el guante: si os motiva la idea y queréis que vaya un poco más allá, escribidme un correo a yjesus@security-projects.com y podemos crear un proyecto en code.google para evolucionarlo !

Y no solo gente que tire código, también sería genial tener un logo o mejor documentación

11 comments :

chmeee dijo...

Este tipo de herramientas simples son las que ayudan de verdad y no las supermegasuites...

Aún así, se me ocurre que simplemente monitorizando en modo pasivo eres capaz de ver las MACs válidas de otros usuarios y suplantarlas cuando no estén :).



Aunque para hacer eso tendrías que sospechar que monitorizan las MAC, cosa nada común, por otra parte.

ppm dijo...

tuanis!! voy a testearlo, se ve interesante.

Yago Jesus dijo...

De ahí el tema del perfil TCP/IP, no basta con suplantar, también tienes que tener los mismos puertos TCP abiertos que la víctima a quien vayas a suplantar

masticover dijo...

como siempre... ¡espectacular Yago!

oscarinside dijo...

Genial el histórico relacionado las mac con los puertos, ya que si antes de conectar no puede conocerlos es más complicado poder calcar el comportamiento tcp como intruso y dar respuesta en los mismos puertos que la mac conocida y permitida.

Se me ocurre seguir aprovechando las ventajas de nmap y añadirle la identificación del SO, aunque haya que basarse en porcentajes de similitud, y otras tantas más.

Genial Yago, me gusta mucho el trabajo y es muy últil.

Alex J. Clares dijo...

Ya era hora !!!!!!!.. si lo paquetizaras para agregarlo al PfSense sería la caña ;-)

Yago Jesus dijo...

Muchas gracias por los ánimos, lo que comentas fue mi primera aproximación, el fingerprinting del sistema, sorprendentemente el ratio de acierto de Nmap era bastante bajo (y hablamos de sistemas Linux / windows) así que tiré por la opción de los puertos

Adrián Ruiz dijo...

Muy buen aporte!

Se me ocurre que la herramienta implementara autoaprendizaje y en cuanto detectase alguna inconsistencia, aislase toda la red que hemos especificado del atancante.

Yago Jesus dijo...

Gracias por el feedback. Es un muy buen aporte, un modo learning y luego un modo enforcing, me gusta

Ivan Flores dijo...

Ya te haba mandado un mensaje por twitter pero aqui lo explico un poco mas, la parte de detección de puertos que puede tener podria ser burlada por algún escaneo del atacante hacia alguno de los host en la red o quiza las computadoras de una organizacion tengan el mismo SO y los mismos servicios por lo cual te sugeri implementar del lado del cliente y de la herramienta el Port knocking para abrir un puerto en especial que podamos estar seguros que solo nuestros equipos lo tienen pero a la misma vez estara seguro ya que permanecera cerrado hasta que no se cumpla la secuencia para poder abrirse.
Bueno quiza solo es una idea de muchas para poder mejorar la herramienta.
Saludos

wiredrat dijo...

Esta genial Yago, un buen avance de funcionalidad. Tal vez le faltaría poder asignar diferentes perfiles de puertos a una misma MAC por si se usan 2 sistemas operativos en un ordenador.