[THE BEGINNINGS] ZAP y proxys Web: Analizar el trafico durante la navegación

Bueno debido a mi nuevo oficio, tengo menos tiempo del que me gustaria para dedicarle al blog, pero últimamente lo que más ando haciendo es aprendiendo y dándome cuenta de lo poquito que sé, el post de hoy va a tratar de los proxys webs, este tipo de aplicaciones se usan mucho a la hora de hacer auditorias webs para ver que hay “por debajo”, con ellos podemos monitorizar todos los datos que se envían y que recibimos a la hora de realizar una navegación web, hay varios proxys; esta Webscarab que es uno de los más complejos en cuanto a opciones y usabilidad y de los más potentes; tenemos también Paros, que es un proyecto ya abandonado pero muy intuitivo y fácil de usar; y el que hasta ahora es mi favorito: ZAP (Zed Attack Proxy) que es un fork de Paros que sigue actualizándose, este será el que usaré, para este post. ZAP esta corriendo bajo Fedora14 y con un Firefox con el Addons FoxyProxy para poder gestionar rápidamente los proxys.

Este es el aspecto que presenta este proxy, primero tenemos que configurar la dirección del mismo que será a la que apunte el navegador para conectarse a internet. Para ellos simplemente Tools -> Options -> Local Proxy (yo lo tengo puesto por defecto 127.0.0.1:8080).

Después tendríamos que configurar el navegador (en este caso Firefox y su plugin FoxyProxy), para ello añadimos la dirección del proxy a la lista de nuestro complemento, una vez configurado y guardado podemos empezar a navegar por cualquier web. Recordad que tenemos que seleccionar el perfil del nuevo proxy en el Firefox para poder ver lo que hacemos.

Vamos a comprobar que todo funciona, para ello vamos a realizar una navegación simple por Google por ejemplo y comprobar que nos enseña ZAP:

Como vemos en el ejemplo se ha realizado la búsqueda de la palabra “hola” en Google, esto se ha producido mediante un método GET, y estos son los datos que podemos ver que se han enviado en uno de los 11 envíos/recibos de datos:

En esa petición podemos ver como enviá el navegador los datos solicitados a Google y de que forma este predefine el envió de los mismos, como dijimos más arriba es mediante un método GET, eso significa que si copiamos la petición veríamos la búsqueda y si en el campo q= podemos “adiós” y lo enviamos por nuestro navegador podemos ver como Google busca el dato nuevo, es decir mediante un proxy web podemos modificar TODA la información que nuestro ordenador enviá al servidor web y muchas veces saltarnos las verificaciones que realiza el navegador del formato de nuestros datos mediante por ejemplo un JavaScript que se ejecuta en nuestros navegadores de forma local (cosa insegura por esta razón). Como podemos ver en la siguiente captura podemos ver y modificar todos los parámetros que vemos, como el nombre del navegador, el site de donde venimos, etc.

Como hemos comentado este envió se realiza mediante un método GET, otro método más “seguro o invisible” sería enviarlo mediante un método POST, una forma de localizarlos es cuando realizamos por ejemplo una búsqueda en un campo y en el navegador solo vemos algo del tipo http://www.dominio.com/busqueda.php podríamos deducir que se trata de un POST.

Aquí podemos ver otra característica de ZAP, mediante el botón Break podemos crear un punto de interrupción a partir del cual podemos controlar, modificar y analizar los datos que se envían desde el navegador hasta el servidor destino:

Dentro del rectángulo rojo encontramos tres botones, el primero en verde es el que crea el Break, el siguiente confirmaría el envío actual y daría paso a la siguiente interrupción y el botón Play cancelaría el Break y haría que la comunicación vuelva a ser fluida y sin espera ni interrupciones, entre envío y envío de datos.

Esta es la explicación básica de como funciona un proxy web y como se crearía un Break o Trap, estos programas tienen otras funcionalidades como escaneres de puertos, de vulnerabilidades, spiders que analizan el site listando todos los directorios, etc.

[THE BEGINNINGS] Scapy: Construyendo un paquete UDP

Hace relativamente poco entre en contacto a raíz de un paper publicado en hackxcrack con una potentísima aplicación llamada scapy. Scapy es una herramienta escrita en python que nos permite desde crear paquetes UDP o TCP, hasta realizar un montón de cosas más con la potencia implícita que nos da python, escaneos de puertos, ataques DDoS, como herramienta didactica, etc. Tengo preparado otro post más de scapy y me gustaria poder dedicarle el tiempo que se merece para poder hacer una serie de ellos y poder explicar y entender ciertas cosas. En este primer post vamos a aprender como se genera un paquete TCP y como se vería en Wireshark y si lo recibimos con ncat.

Como sabemos UDP es un protocolo de red en el nivel de transporte que permite el envío de datos sin haber establecido previamente una conexión. Por lo que en este primer post de introducción veremos la facilidad de crear y enviar un paquete.

Las herramientas que yo he usado fueron, un linux con scapy y un mac con ncat y wireshark.

Entramos en materia, lo primero es tener claro cuales son las ip’s origen y destino y el puerto por el que queremos conectarnos.

Ejecutamos Scapy y si hacemos ls(IP()) vemos lo siguiente:

Son todos los campos de un paquete en la capa IP, vienen definidos de la siguiente forma: nombreDato : tipoDato = ValorActual. Para nuestro ejemplo solo nos valdría dst (ip destino) y src (ip origen). Por lo que tecleamos: (en mi caso)

c_IP=IP(dst="47.69.69.22" , src="47.69.69.55")

Hemos creado un objeto llamado c_IP que contiene los valores por defecto de la capa IP excepto los moficicados (src y dst). Podemos listar la parte modificada de la capa con el comando c_IP.

Ahora vamos con la capa UDP, si la listamos ls(UDP()) vemos lo siguiente:

Al igual que en el resultado anterior, en este caso podemos ver los campos de un paquete en su capa UDP. Para nuestro caso solo nos valdría dport (puerto destino) y sport (puerto origen). Por lo que tecleamos: (en mi caso)

c_UDP=UDP(dport=5005 , sport=1024)

Hemos creado un objeto llamado c_UDP que contiene los valores por defecto de la capa UDP excepto los modificados (dport y sport). Podemos listar la parte modificada de la capa con el comando c_UDP.

Lo siguiente seria añadir un payload, es decir la información contenida en el paquete, en nuestro caso será un mensaje pero podría ser streaming de video, VoIP o cualquier otro formato que viaje en UDP. Tecleamos:

payload="Hola mundo -> UDP

Una vez rellenado el payload procedemos a ensamblar el paquete creado de la siguiente forma:

pqt=c_IP/c_UDP/payload 		#El paquete recibe el nombre "pqt"

Si lanzamos pqt podemos ver como quedaría nuestro paquete ensamblado:

Ahora solo tendríamos que enviarlo, esto se hace con el comando send(nombrePaquete) en nuestro caso: send(pqt)

Pero antes de enviarlo vamos a abrir nuestro wireshark para ver como se vería. Para poder localizarlo mejor podemos poner el filtro:

ip.src_host==47.69.69.55 || udp.port ==5005

Este filtro haría que solo se mostrara los paquetes que salen de la ip 47.69.69.55 (donde ejecutamos scapy) y que vayan destinados al puerto 5005 y mediante UDP.

Aquí tenéis la captura del wireshark y la información del paquete, este paquete es  es rechazado por el host destino porque tiene el puerto cerrado y no espera nada.

Sin embargo si ejecutamos el ncat de esta forma:

ncat -v -u -l -p 1024

-v : modo verbose activo
-u : modo UDP
-l : indicamos que lo ponemos en escucha
-p 1024 : especificamos puerto

Estaríamos diciendo con este comando que dejamos el puerto 1024 UDP a la escucha de cualquier conexión entrante y al indicar modo verbo que nos especifique todo, al enviar el paquete con scapy veríamos lo siguiente:

Y aquí os pongo la captura completa de lo hecho con scapy, como veréis, muy sencillo:

Y hasta aquí el post de hoy, espero poder volver a subir la frecuencia de publicación próximamente.

[THE BEGINNINGS] Tips: Jailbreak iPad 4.2.1 Untethered Greenpois0n

Hola a todos, la razón de este post, es más bien porque después de experimentar durante este fin de semana mil y un problemas para poder hacer jailbreak en mi iPad con el mensaje repetido hasta la saciedad de Failed :(, decidi buscar y encontre en un hilo de MacRumors donde explicaba como solucionar este problema, con esto no digo que en los sitios como iPhoneros o iPadizate no este bien explicado, sino que a mi no me funciono, asi que paso a explicaos rapidamente como lo hice:

Lo primero es tener instalado el último firmware en vuestro iPad 4.2.1, despues haced una copia de restauración de vuestros datos por si acaso haciendo una copia de seguridad con iTunes (yo no lo hice desde una restauración limpia, lo reconozco :D) y ahora ya podemos entrar en materia:

  1. Desde la web de greenpois0n descargaos el ejecutable (en este caso mac).
  2. Conectar el iPad al Mac
  3. Abrir un Terminal<
  4. Y ejecutad desde ahi el ejecutable tipo: open greenpois0n.app/Contents/MacOS/greenpois0n
  5. Se os abrira otra ventana de terminal, no la cerreis
  6. Seguid las instrucciones para poner vuestro iPad en modo DFU
  7. Si pusisteis bien el iPad en DFU (cosa que yo no hice a la primera) ya deberiais tener el iPad desbloqueado
  8. En caso de no tener el loader de Cydia instalado podeis descargaos Redsn0w 0.9.7b6 y instalar Cydia desde ahí

Con estos simples pasos lo tendríais hecho, como veis más que un post en un tips o miniguia para vuestro problemilla.

[THE BEGINNINGS] GNS3: Instalación y configuración básica

GSN3 Logo

Cuando hablamos de seguridad de la información, una pieza muy importante para saber de lo que hablamos muchas veces es poder verlo, es decir comprobarlo; hay muchas pruebas que no podemos realizar, cuando hablamos por ejemplo de un súper servidor o de un software de firewall muy determinado es complicado poder investigar sobre ello o probar una determinada vulnerabilidad existente. Sin embargo hoy os voy a hablar sobre un software que virtualiza el sistema operativo de los switch y router de Cisco, se trata de GNS3, un software multiplataforma, que es muy útil, ya que se adapta perfectamente con Wireshark, Qemu e incluso si tenemos varias tarjetas de red podemos emular una red desde ellas y ver como se comportaría el modelo determinado de router. En este post intentare explicaos como instalarlo.

Instalación en Windows

Descargar GNS3, el paquete incluye Dynamips (un software necesario para correr GNS3), Putty (cliente para conexiones SSH y telnet por excelencia), WinPCAP (conjunto de librerías para trabajar con protocolos de red presente en los analizadores de red) y Quemu/Pemu (librerías para poder conectar GNS3 con Qemu, software libre emulador de sistemas operativos tipo VMware).

  • Como la mayoría de las instalaciones en windows hacemos un “next, next…”
  • Nos aparecerá una ventana con dos acciones necesarias a realizar: Acciones

  • El paso 1 nos dice que tenemos que configurar y comprobar el path. Y comprobar si el software esta trabajando en una ruta que nos valga.

  • Una vez realizados estos pasos solo nos quedara seleccionar los IOS desde la carpeta seleccionada en el paso anterior, para ello nos vamos a Editar -> Imagenes IOS y hypervisors. En la pestaña de Imágenes en Image Files seleccionamos el/los IOS que usaremos y podemos configurar algunos datos más como el modelo donde lo aplicaremos el IOS, la RAM del mismo y otras opciones.

Opciones

  • El último paso es testera el modulo Dynamips, para ello en Editar -> Preferencias -> Dynamips le damos al botón Test y debería salir un mensaje en verde, si es así ya podremos empezar a usar GNS3 en windows.

Instalación en MacOS

  • Lo primero es descargar el archivo de aqui

  • Una vez descargado, como una aplicación normal de MacOS copiamos el .app a la carpeta que queramos, ahora tenemos que descargarnos desde aqui > el Dynagen (Dynamips), para hacer funcionar el GNS3.

  • Una vez descargado al igual que en windows Editar -> Preferencias -> Dynamips y ahí en ruta del ejecutable tendremos que escribir (a mi no me dejo seleccionarlo directamente) la ruta donde tenemos descargado dynamips, por ejemplo: /Users/danito/Desktop/Dynagen/dynamips una vez hecho esto y para asegurarse si pulsamos abajo el botón de test ya tendríamos listo el GNS3 en MacOS, ya solo nos quedaría seleccionar los IOS.

  • Para seleccionar los IOS es la misma operación que en windows, desde Editar -> Imagenes IOS y hypervisors. En la pestaña de Imágenes en Image Files seleccionamos el/los IOS que usaremos y podemos configurar algunos datos más como el modelo donde lo aplicaremos el IOS, la RAM del mismo y otras opciones.

GNS3 en Windows XP abriendo un consola

Consideraciones generales y consejos:

Como ya os comentaba en la introducción, una de las cosas que más me gusta de este software es que puedes conectar maquinas virtuales Qemu, esto nos da mucha versatilidad y le da mucha potencia a la aplicación siendo la capacidad de GNS3 la que nosotros queramos (emulación y prueba de DDos, MiTM, secularizar Apache, BBDD, etc). También podemos ‘meter’ en medio un Wireshark que nos puede ayudar a entender que esta pasando, desde problemas de red antes de hacer una subida de una configuración a reproducción, hasta estudiar los protocolos de enrolamiento viendo los paquetes que se envían entre equipos, etc.

También es valido este software para facilitar el estudio de certificaciones como CCNA, CCNP, CCNA-Sec, etc, teniendo en cuenta que GNS3 es mucho mas potente que el ya conocido PacketTracer de CISCO.

Es conveniente explicar que GNS3 es un software de emulación y necesita un sistema operativo IOS que emular, el cual se supone que es ilegal distribuirlo, pero ya sabéis como conseguirlo. Cuando consigáis o os compréis una IOS para practicar recordar que siempre es interesante que la IOS acepte crypto (opciones de seguridad) para ello una forma de guiarse es con el nombre que tiene, si lleva el sufijo k9, también comentaros que este software no emula equipos de capa 2 como switches, la única forma de trabajar con switchs es con un firmware de un equipo router multicapa, es decir que tiene opciones de configuración de switchs), yo uso el modelo Cisco 3725 y una posible IOS seria: c3725-adventerprisek9-mz.124-7.bin.

Espero poder hacer una entrega futura, cuando disponga de más tiempo, explicando como meter un GNS3 en una red puenteado con una interfaz de red y usarlo de servidor DHCP spoofeado para redirigir el tráfico de nuevo al original y poder ver lo que pasa con los equipos que ‘pesquemos’. Como ya sabéis el limite lo pone el conocimiento y la imaginación que tengamos, imaginaos añadiendo un proxy en PHP al que habilitemos SSL-strip ;).

[THE BEGINNINGS] Seguridad: comprometiendo un switch (Parte 2 de 2)

En el articulo anterior pudimos ver cómo comprometer la seguridad de un switch y como me pareció un tema interesante decidí crear esta segunda parte en la que os explicare como securizar un switch de manera que podamos protegerlo contra una serie de ataques, trabajaremos con una sintaxis de IOS que es el sistema operativo de Cisco, que es lo que a fin de cuentas es más normal encontrarse dentro de una red más o menos importante, pero lo importante es entender el concepto y la diferentes medidas.

La mayoría de los switch poseen unos puertos que funcionan con un ancho de banda superior al resto de puertos y suelen ser tipo Ethernet Giga, en estos puertos lo correcto es conectar host que necesiten más ancho de banda que un equipo final normal, estos puertos suelen estar destinados a servidores, por lo que no solo seria necesaria asignar una MAC a ese puerto. Estos puertos también pueden estar destinados a ser puertos troncales, un puerto troncal cumple la finalidad de unir dos switchs, por lo que en estos puertos habría que actuar con cuidado y calculando bien antes de definir un numero máximo de direcciones MAC.

Pasemos al código, una vez dentro del switch pasamos a modo configuración:

sw(config)# interface interfaz slot/port # seleccionamos la interfaz y el puerto
sw(config)# switchport mode access # automaticamente cuando conectemos un host funciona
sw(config)# switch port-security # activamos la seguridad

Llegados a este punto pasaremos a analizar los comandos y las opciones más comunes que podemos configurar ahora.

sw(config)# switch port-security aging

El comando aging define cuanto tiempo se aplica la acción definida cuando se produce una violación de las reglas, pasado ese tiempo acaba la restricción. Hablaremos de eso más adelante. Por defecto el comando da un tiempo de 45 segundos que podemos modificar añadiendo los minutos y segundos de la acción después del comando aging, por ejemplo si ponemos:

sw(config)# switch port-security aging 0 0
# La acción se ejecuta siempre y de forma infinita

# or

sw(config)# switch port-security aging 5 30
# La acción duraria 5 minutos y 30 segundos

sw(config)# switch port-security maximum n
# El comando maximun nos dice el número de direcciones máximas que aprenderá el puerto (n)

sw(config)# switch port-security mac-addres MMMM.AAAA.CCC

El comando mac-addres nos dice las direcciones MAC de los host que tendrán permitido el acceso a ese puerto, este comando tiene sentido si existe un número máximo de direcciones definido previamente, esta sería la opción ideal para un puerto Giga que solo necesitamos conectar un servidor. También nos puede ser útil si vamos a conectar una serie de equipos finitos o dentro de un rango normal que sepamos que si se supera es porque algo raro esta pasando (como un ataque de ARP-Flood), para estos casos nos puede interesar el comando:

sw(config)# switch port-security mac-addres sticky

Con este comando las direcciones se irán almacenando en la tabla CAM (MAC) del switch de forma automatica y cuando llegue al limite ya tendria definidas las direcciones MAC posibles que se conectarían desde ese puerto.

sw(config)# switch port-security violation {shutdown/protect/restrict}

Este comando sirve para especificar que acción se llevara acabo en caso de que alguna de nuestras reglas definidas anteriormente sea saltada, nos encontramos con tres opciones:

  • shutdown: Es la opción por defecto y lo que hace es tirar el puerto que ha sufrido la violación.
  • protect: Evita la entrada a la red a la MAC no permitida.
  • restrict: Evita la entrada a la red a la MAC no permitida y además manda una alerta al servidor de eventos por lo que nos da más control sobre lo que pasa en la red.

Cabría añadir que si queremos configurar un switch entero seria más sencillo y rápido usando rangos de configuración de interfaces:

sw(config)# interface interfaz slot/port - ultimoPuerto

# Por ejemplo: sw(config)# interface <em>Fa0 0/0 - 15

Si aplicamos estas reglas correctamente podremos tener un switch configurado correctamente y nos ahorraríamos la mayor parte de los problemas y ataques mediante ARP.

Page 3 of 5