google translator

martes, 20 de diciembre de 2011

Creando utilidades para los módulos ADAM6050 de Advantech

1.- LUCES,...

Primero quiero presentar brevemente lo que son estos módulos, para qué se usan y porqué he investigado esta capacidad que el fabricante no me ha sabido|querido|ha pasado de proporcionar.

Los módulos ADAM6050 son módulos controladores que tienen entradas para elementos de detección y salidas para activación de relés. ¿Qué quiere decir esto? Básicamente que puedo incorporarle detectores (De presencia, interruptores,…) y quitar o suministrar electricidad a componentes concretos (Telecontrol de luces, persianas automáticas,…)

Esto, sumado a la API que nos da el fabricante, lo convierten en una solución rápida para temas de inmótica, domótica, etc.

Mi intención es vincular una luz (salida 1) al controlador que se encienda en base a un interruptor (entrada 1) y que, a su vez, pueda telecontrolar desde una aplicación.

Al grano. Cuando programamos uno de estos aparatos, podemos hacerlo de dos maneras:

1.- Utilizar la API para conectarnos mediante TCP/IP al ADAM6050 para preguntar los estados y activar las salidas (Tipo: ¿Cuál es el estado del interruptor de la entrada 1?) o encender/apagar una luz (incorporando relés de 12V, claro),…

2.- Meter en la memoria del ADAM6050 (GCL) un esquema de lo que tiene que hacer automáticamente en función del estado de sus entradas/salidas.

Problemas. Si aplicas GCL a una salida, no puedes implementar un telecontrol desde la API a esa salida a la vez.

Ejemplo. Programamos con GCL lo siguiente: Si te activan la entrada1, activa la salida1 (Básicamente, la entrada1 podría ser un interruptor y la salida1 una luz)

Dada esta afirmación, mediante las APIs no podríamos activar la salida1 (Luz) directamente porque depende exclusivamente de la entrada1 (Interruptor)

2.- CAMARA,...

Bueno, mi objetivo es que, además de que la luz se manipule mediante un interruptor, que yo pueda también telecontrolar esa luz mediante órdenes TCP/IP, sin la necesidad de cambiar el estado del dispositivo de entrada.

¿Cómo puedo hacerlo? Dado que tengo que incorporar el GCL obligatoriamente, me voy a centrar en cambiar el estado de la entrada1.

Realmente no puedo cambiar el estado de la entrada1 porque se activa/desactiva mediante la pulsación del interruptor pero si puedo, mediante el software del fabricante, cambiar su “estado por defecto” (Apagado o encendido por defecto) de manera que cambiaría el estado de la entrada y a la vez, afectaría a la salida. Me voy a focalizar en esa opción "Invert signal":


Me repasé toda la API y me di cuenta que el fabricante no había introducido esta posibilidad en la API.

Entonces realicé la consulta al fabricante…

Sólo decir que si no me hubiese afeitado desde entonces, el día de Reyes iría en camello.

Vaya, ¿El fabricante tiene un programa que lo hace a través de TCP/IP y yo no puedo? Frustrante…

3.- ¡ACCION!

Primero vamos a analizar qué es lo que manda el programa al módulo 6050 cuando le damos a “Invert signal”, que es la característica que queremos desarrollar. Con la aplicación abierta, usamos el wireshark para mirar qué es lo que va pasando (filtrando por la IP del ADAM6050). Vemos 3 cosas:


1.- Vemos que el programa usa el protocolo Modbus, que es un protocolo estándar para la comunicación con controladores (Dicho mal y pronto) Realiza queries de estados y recibe responses con los mismos.

3.- Aquí se puede comprobar cómo está leyendo el estado de referencia 0 (entrada 0) y lee un solo estado (bit count) Se podría pedir con un “bit count” de 5 y nos devolvería los estados de la entrada 0 a la 4.

2.- Bueno, éste es el que nos interesa. Es un intercambio de paquetes UDP que se intercambian justo cuando aplico la opción “Invert signal”… El puerto “blackjack” es el 1025. Entiendo que debo seguir por aquí. Advantech 0 - Trosman 1

En el wireshark, señalo los paquetes UDP -> Follow UDP Stream… -> Convierto esta conversación con la opción “Hex dump”, de manera que ya tengo todo en binario:


Bueno, el siguiente paso lógico sería desactivar “Invert signal” y ver cómo cambia esta traza UDP. Incluso también realizarlo con otra entrada y revisar la traza para ver los cambios.

Como suele decir un compañero mío, “a veces la informática es una ciencia infusa” y, bueno, este es el mejor ejemplo, ya que la traza resultante es igual a la anterior. Advantech 1 - Trosman 1.

Bueno, voy a intentar copiar esa comunicación y hacer pruebas. Para ello, primero me voy a crear una herramienta que me genere esa trama de comunicación UDP.

Entiendo que, como es UDP, no voy a necesitar establecer la conexión y se la voy a poder “meter doblá”. Para ello, voy a utilizar C#, la clase UDPClient en concreto. ¿Por qué? Porque es lo que tengo más a mano.

Después de un rato columpiándome con la conversión de bytes, termino el programita (todo en el main, para que sea cortito):


--------

const string IP = "192.168.1.40";

const int PORT = 1025;

// Genero los objetos de conexión

IPAddress ip = IPAddress.Parse(IP);

IPEndPoint endPoint = new IPEndPoint(ip, PORT);

UdpClient cliente = new UdpClient();

// Genero los bytes de los paquetes

byte[] paquete1 = { 36, 48, 49, 67, 56,

48, 56, 48, 48, 48, 48, 48, 48, 48, 48,

48, 48, 48, 48, 48, 48, 48, 48, 48, 48,

48, 48, 48, 48, 48, 48, 48, 48, 48, 48,

48, 48, 48, 48, 48, 13

};

byte[] paquete2 = { 36, 48, 49, 67, 13 };

byte[] paquete3 = { 36, 48, 49, 70, 13 };

byte[] paquete4 = { 36, 48, 49, 48, 13 };

// Comienzo la conversación

cliente.Connect(endPoint);

cliente.Send(paquete1, paquete1.Length);

cliente.Receive(ref endPoint);

cliente.Send(paquete2, paquete2.Length);

cliente.Receive(ref endPoint);

cliente.Send(paquete3, paquete3.Length);

cliente.Receive(ref endPoint);

cliente.Send(paquete4, paquete4.Length);

cliente.Receive(ref endPoint);

cliente.Close(); // Cerramos la conexión

// Avisamos

Console.WriteLine("Trama enviada!");

Console.ReadKey();

-------

Allá vamos. Comienzo enviando esta conversación al Adam y veo… que algo he hecho, pues he activado el “Invert signal” de la entrada0. Empecé a fijarme en el byte marcado en rojo en el código y me di cuenta que es… un flag! 56 ON – 48 OFF.

Exactamente, teníamos el primer invertsignal! El orden de bytes del primer mensaje funcionaría así:

[0] [1] [2] [3] [Invert0] [Reset0] [Invert1] [Reset1] [Invert2] [Reset2] [Invert3] [Reset3]

Los reset servirían para resetear el modo de las entradas digitales.

Después de crear un GCL y realizar la prueba, fue bastante satisfactoria. Pude encender y apagar las luces con el GCL en marcha.

Con esta información y revisando algo más por si cambia algo en la trama entra diferentes dispositivos, se puede crear la librería de rigor. Esto a gusto de consumidor.

Comentario sobre seguridad: Estos aparatos pueden modificar su comportamiento con paquetes UDP, esto es tremendamente peligroso por lo que aconsejo mantener como mínimo en subredes diferentes (Y si puede ser en otra VLAN o en otro switch a parte del de producción, mucho mejor)

Recordad que si tardas unos meses en desarrollar un SCADA con este tipo de elementos, cualquier investigador de seguridad podría sacar fallos muy gordos en poco tiempo… Por eso conviene, desde mi punto de vista, reforzar el acceso desde la red.

Espero que os haya gustado, si tenéis cualquier comentario o pregunta, dejadme un comentario. (Críticas no por favor, ando bajo de autoestima XDDDD)

sábado, 19 de noviembre de 2011

Charla: Scapy. Generación y manipulación básica de paquetes de red.

Otra charla más que subo al blog. Ésta la he dado en la LAN Party Arroutada 18, en A Coruña. La verdad es que no tenía intención de hacer ninguna, pero me comentaron el viernes si quería dar una charla y como le estoy cogiendoel gustillo a esto de dar charlas, en un par de horitas me preparé estas diapositivas.

Son bastante básicas sobre el funcionamiento de Scapy, comandos principales y manejo de ficheros. Por lo menos dan una idea generalizada de cómo se usa y qué se puede hacer con éste script, que es imprescindible para jugar con las redes y la seguridad.

El índice es el siguiente:
- ¿Qué es Scapy?: Explicación de qué es y para qué sirve Scapy
- Protocolos: Los protocolos que soporta
- Comandos: Manera de sacar los comandos básicos
- Generación de paquetes: En capa2 y capa 3
- Apilado de capas: Cómo fusionar paquetes de diferentes capas para generar un único paquete
- Visualización: Ver los paquetes en memoria
- Envío: Cómo enviarlos, una o varias veces
- Manipulación de ficheros: Cómo cargar y guardar ficheros y cómo hacer sniffing directamente
- Edición de paquetes capturados: Editar los paquetes y las capturas directamente, sin tener que volcar a otros paquetes.




Espero que os guste y os sea de utilidad. Cualquier duda o sugerencia, dejadla en los comentarios

miércoles, 16 de noviembre de 2011

La red de la Cantabria Net al descubierto

Esta es la charla que impartí dentro de la LAN Party Juventud Cantabria Net 2011, donde soy responsable de comunicaciones.Está estructurada en:- Montaje: Pequeña explicación del hardware que los patrocinadores nos prestan para el desarrollo de la party- Esquemas de red: Topología, Diagrama General, Diagrama de Flujo y diseño del Centro de Comunicaciones- Funcionamiento de una red: Breve explicación de una red LAN- Funcionamiento de un switch: Cómo funciona un switch y las tablas ARP- Seguridad y control: Explicación de cómo controlar el flujo de datos y detección temprana de problemas- Portal cautivo: Desarrollo del portal cautivo para validar a los usuarios y su funcionamiento e implementación- Problema CantabriaNet 2010: Exposición del problema que en la edición de 2010 estuvo durante casi 15 horas ralentizando la red

He modificado la presentación original corrigiendo algunos errores. También he eliminado las animaciones, ya que dan problemas a la hora de subirse a internet o pasarla a formato pdf. Por último, he añadido una diapositiva con un glosario de términos, en formato pdf y odt, extraído de la Wikipedia, con su herramienta de generación de libros.
Cuando saque tiempo, explicaré en profundidad algunos de los problemas que nos ha dado el portal cautivo y el modo de resolverlos.

jueves, 27 de octubre de 2011

Charla en la Gumiparty 007

Esta es la presentación de una charla que di a los alumnos de primero y segundo del Ciclo Formativo de Grado Medio de "Sistemas microinformáticos y redes" del I.E.S Valle del Jerte, dentro del montaje de la Gumiparty 007



No es una maravilla y no entra en demasiada profundidad en los temas, debido a que la mitad de los asistentes llevaban una semana de curso y todavía no tenían conocimientos suficientes para entrar en la materia de manera más profunda, pero da una idea de lo que es la seguridad en una red y problemas básicos que pueden encontrarse y cómo solucionarlos.

Más adelante, iré haciendo algún artículo sobre el tema, focalizándome en cada uno de los problemas típicos de red y entrando en profundidad para analizarlos tanto en sus causas como en sus soluciones.

lunes, 19 de septiembre de 2011

Claves WPA para WLAN_XXXX y JAZZTEL_XXXX

El siguiente script no es nada especial, solo me he dedicado a escribir en Python los datos que he ido recopilando de la red. No he descubierto nada nuevo, si no que he 'mejorado?' lo que ya habia.

Hace tiempo, estuve buscando informacion sobre la seguridad en las redes wireless y especialmente me centre en investigar las redes WLAN.
Movistar (antigua Telefonica) siempre ha estado en el punto de mira de los investigadores de seguridad. Una compañia sin piedad que llena titulares tan escandalosos como el ERE de 8500 empleados habiendo obtenido unos beneficios records de un 31% sobre el ejercicio anterior durante un periodo de crisis economica brutal.

Pero, como diria Francisco Umbral, yo he venido aqui a hablar de mi libro y mas exactamente de como se puede romper la seguridad en las redes WLAN_XXXX y JAZZTEL_XXXX y su clave WPA.

La gente de SeguridadWireless fueron los primeros en dar la primicia que acababan de descubrir el algoritmo de encriptacion para las claves por defecto de los router Comtrend. Optaron por no liberar el codigo e intentar sacar beneficio a traves de AdSense posteando en su web un formulario. Algo que personalmente me parece muy feo.

La comunidad, ante esta agresión, trabajó para descubrirlo y demostraron el método de encriptacion, basado en cifrar a MD5 una cadena generada mediante el ESSID y el BSSID del router. Esta proeza la consiguio elvecinoo dumpeando la memoria del router y buscando cadenas. Simplemente estaba ahi escrita, esperando a ser encontrada.
El hilo se siguió de cerca desde lampiweb.

Dejando a un lado la historia, voy a la parte tecnica que es la que nos gusta a todos.

Primero hay que quitar los : al BSSID. Solo estorban ;-)
El ESSID normalmente se genera restando 3 a el ultimo bloque del BSSID, pero hay que tener en mente que el usuario ha podido cambiar el ESSID a su router.

Coge papel y boli que empezamos.

La clave se obtiene de la cadena compuesta por:
bcgbghgg + 8 primeros caracteres del BSSID + 4 ultimos caracteres del ESSID + BSSID completo
La cadena resultante, se encripta a MD5 y se acorta a los 20 primeros caracteres.

En el caso de que se haya cambiado el ESSID la clave se sacaria de esta manera:
bcgbghgg + los 10 primeros caracteres del BSSID + resta 3 a los dos ultimos caracteres del BSSID + BSSID
Igual que antes, solo nos quedamos con los 20 primeros caracteres del MD5.

Esto queda mas claro con este ejemplo:
Mi red es WLAN_B2B0 y el BSSID es 64:68:0C:B1:B2:B3
La cadena que me resulta es:
bcgbghgg + 8 primeros caracteres del BSSID + 4 ultimos caracteres del ESSID + BSSID completo
bcgbghgg + 64680CB1 + B2B0 + 64680CB1B2B3 = bcgbghgg64680CB1B2B064680CB1B2B3

Convertido a MD5 es 20fbc01c79ee84a8bdde311e15aebb91 y me quedo con los 20 primeros caracteres.
El pass de la red es 20fbc01c79ee84a8bdde

Bonus:
La clave de los router Zyxel es mas sencilla. Estos router tienen como BSSID 00:1f:a4:XX:YY:ZZ.
Se crea una cadena con los 8 primeros digitos del BSSID + 4 ultimos digitos del ESSID
Al igual que con los Comtrend se convierte a MD5 y se acorta ese MD5 a los 20 primeros caracteres.

De nuevo lo explico con un ejemplo:
Mi red tiene como BSSID 00:1f:a4:b1:b2:b3 y esta identificada mediante el ESSID WLAN_B2B0
Creo la cadena:
8 primeros digitos del BSSID + 4 ultimos digitos del ESSID
001fa4b1 + b2b0 = 001fa4b1b2b0

Lo convierto a MD5 y queda 9689bde42d0f3aec317fc7d1a70a4bee
Me quedo solo con los 20 caracteres y el resultado es la contraseña
El password de la red es 9689BDE42D0F3AEC317F

URL SVN:
https://www.assembla.com/code/PynTester/subversion/nodes/trunk/WJ4x/WJ4x_BBDD.py

Creando un plugin para immunity debugger

Muchas veces, cuando estamos depurando una aplicación con el immunity debugger, siempre pensamos que hay algo que debería tener pero que no tiene. Incluso perdemos el tiempo repitiendo tareas que podríamos evitar tener que hacer mil veces si hubiera un plugin que lo hiciese. Pues bien, en este post voy a hacer una pequeña introducción a como realizar un plugin para el immunity, para que os sirva de introducción, y podáis haceros luego vuestros propios plugins.

El plugin que vamos a realizar es muy sencillo, simplemente buscará unas instrucciones en ensamblador por todo el programa que estemos depurando (incluso sus librerías), y nos mostrará por pantalla donde se encuentra dichas instrucciones. Para realizarlo, lo vamos a hacer con Python, un lenguaje que se lleva muy bien con Immunity y con el que además vamos a programar el plugin muy rápido.

Todas los plugins de immunity se encuentran en el directorio "PyCommands" del directorio de instalación de Immunity (No confundir con el directorio "PyPlugins"). Con lo cual vamos a crear un fichero en esa carpeta llamado "buscador.py". Para hacer una prueba y ver como funciona esto de los plugins, vamos a hacer primero el típico "hola mundo". Para ello abrimos el fichero "buscador.py" y escribimos lo siguiente:

def main(args):
	return "Hola mundo!"

Una vez guardado, abrimos el immunity cargando cualquier programa (yo he cargado en notepad) y en la parte inferior de la ventana tecleamos lo siguiente:

!hola 

Después de eso veremos con se muestra justo debajo de donde hemos escrito el mensaje "hola mundo!", como podemos ver en la imagen.



Con esto ya nos podemos hacer un poco a la idea de como van los plugins de immunity. Así que ahora vamos a explicar como hacer más cosas.

La librería que nos trae immunity para hacer plugins se llama "immlib", y es en lo que nos vamos a basar para hacer cualquier plugin ya que con esta libreria podemos hacer casi de todo con immunity. El propio immunity trae en el menú una parte dedicada a "immlib" y si extendemos el menú veremos que tenemos ayuda sobre immlib y su API. Aunque la mejor ayuda esta en el directorio "documentation/ref" del la carpeta principal de immunity. Si hacemos doble click sobre index.html veremos la documentación completa de immlib y esta sí que es muy buena, si perdemos un poco de tiempo echándole un vistazo podemos hacer cosas bastante chulas (hooks, breakpoints, etc..)

Para hacer el plugin vamos a utilizar alguna de las funciones que nos ofrece immlib. Para ello lo primero que deberemos de hacer es importar "immlib" e instanciar la clase "debugger" que es la que vamos a usar en nuestro plugin. Los métodos que vamos a usar para el plugin van a ser solo tres:
  • log - Con el cual vamos a escribir en la ventana de log.
  • searchCommands - El cual buscará las instrucciones en ensamblador que le pasemos.
  • getMemoryPageByAddress - Como el nombre indica devuelve una página de memoria, desde una dirección que devuelve "searchCommands"
Buenos ahora que ya sabemos los tres comandos que vamos a necesitar voy a mostrar el código completo del plugin y lo vamos comentando:

from immlib import *

def main(args):

  imm = Debugger()
  if not args:
     imm.log("!prueba [asm]")
     imm.log("Ejemplo: !prueba pop r32|pop r32|ret")
     return "[*] No se ha usado correctamente. Vea la ventana de logs"

  codigo = " ".join(args).replace("|","\n")
  res = imm.searchCommands(codigo.upper())

  for aux in res:
    memoria = imm.getMemoryPageByAddress( aux[0] )
    permisos = memoria.getAccess(human = True)
    if "execute" in permisos.lower():
      imm.log("[*] Coincidencia: %s (0x%08x) en %s" % (codigo.replace("\n","|"),aux[0], aux[2]))
 

  return "[*] Ejecutado sin errores. Consulte la ventana de logs para ver los resultados"

Como se puede ver el código no es complicado, en las primeras lineas lo único que hago es instanciar la clase Debugger, y si el usuario introduce mal los argumentos mostrarle como debe hacerlo.

En la segunda parte, sustituyo las tuberías (que hago que el usuario introduzca para separar comandos) por un salto de linea (necesario para que "searchCommands" funcione correctamente) y hago que "searchCommands" busque las instrucciones.

En la ultima parte, con cada resultado devuelto, uso getMemoryPageByAddress para saber que permisos tiene dicha región de memoria, y en el caso de que esa región sea ejecutable la muestro por pantalla. Muchos os preguntareis, ¿Por qué ejecutable? Pues bien, este plugin lo hice con la intención de buscar pop/pop/ret para los exploits, por lo cual necesitaba que la región donde se encuentren estas instrucciones fuera ejecutable. Así que si no os interesa esta parte simplemente la podéis comentar y solo mostrar los resultados de la busqueda con "searchCommands", o si os vale con que la memoria sea de lectura pues podéis poner "read", esto ya os lo dejo a vuestra imaginación.

Si queréis probar el plugin, ya sabéis como hacerlo, copiáis el codigo en un fichero (para los vagos os lo podéis bajar de aquí) y luego lo ponéis en la carpeta "PyCommands". Abrir el immunity debugger con alguna aplicación y en la parte baja de la ventana, el nombre que le hayáis puesto al fichero más la cadena a buscar. Por ejemplo, si al fichero lo habéis llamado buscador y queréis buscar la famosa cadena pop/pop/ret, podéis poner lo siguiente:

!buscador pop eax|pop ebx|ret 



y buscará todas las instrucciones que se correspondan con esa cadena y las mostrará en la ventana de logs. Sencillo, no?

miércoles, 15 de junio de 2011

Post Dominguero: Si es que van provocando...

Vamos con otro post de tarde dominguera...

Hoy vamos a hacer algo rapidito y para toda la familia. Seguro que todos hemos oído aquello de que hay que cambiar las claves por defecto y tal. Bueno, pues hoy vamos a ver por qué...

Ante la dura imagen de otro lunes que se acerca, a uno le entran unas ganas locas de darse al noble arte de la cata de licores variados, o de, directamente, putear a alguien. Lanzamos nuestro dado de 20 caras para buscar un objetivo aleatorio y, ¡zas!, aparece el término "webcam"...

Y es que no sólo de bases de datos vive el cracker (si no que se lo digan a los de Inteco), sino que cualquier dispositivo conectado a una red es susceptible de estar expuesto a miradas indiscretas...

Sí amiguitos, hoy día casi todo está conectado a la red (he visto hasta cafeteras que twittean los cafés que sirven), por lo que no está demás tener un poco de cuidado. Una sencilla búsqueda en Google nos puede proporcionar numerosos modelos de webcams que incorporan un simple servidor web para mostrar al mundo su particular visión del ídem. Cogeremos un modelo al azar, por ejemplo, el modelo "Wit-Eye" de Softwell Technology. ¿Por qué no? Buscando una imagen de la cámara, encontramos que este modelo en concreto no se trata de una webcam como tal, sino de una controladora con varias entradas de señal que se usa para administrar varias cámaras a la vez.

Ahora buscaremos lo que los que saben de esto llaman "vector de ataque", que básicamente viene a ser por dónde le vamos a meter mano al tema. ¿Buscaremos un exploit conocido para el servidor web? ¿Buscaremos datos para un ataque de ingeniería social? ¿Intentaremos romper la clave de acceso por fuerza bruta, diccionario,etc? ¿O por el contrario utilizaremos una complicada pero brillante inyección SQL?

Bueno, no sé si he dicho que es domingo, estoy vago y en Ferrari la han vuelto a liar... Pues no, nada de complicaciones. Lo primero es probar lo más fácil, que en este caso es usar las credenciales por defecto de este dispositivo (ah... pensamiento lateral, lo llaman). Otra búsqueda en Google y, vaya..., debería haberlo supuesto, admin:admin... ¡glorioso!

¿Qué nos queda? Pues un conejillo de indias con el que comprobar el nivel de seguridad medio de un usuario de este tipo de cámaras. ¿Cómo lo encontramos? Bueno, pues creo que este tema lo iba a tratar uno de los compañeros del blog, pero ya que estamos, este post os puede servir de introducción de lo que se llama "Google Hacking" (mola el término, eh?). Todos los buscadores permiten afinar sus búsquedas mediante el uso de ciertas palabras clave. ¿Nunca habéis visto en el cine cómo desde el navegador sacan hasta las multas de tráfico de alguien? Pues no es tan complicado, creedme... En este ejemplo voy a usar la siguiente búsqueda en Google:

allintitle:"dvr login"

¿Qué creéis que me devolverá? Exacto, todas las páginas que tengan en su título la cadena exacta "DVR Login", que viene a ser el panel de acceso. Ahora simplemente iremos cogiendo los resultados y meteremos las credenciales por defecto... A mí me ha costado exactamente cuatro intentos (no es coña) encontrar un resultado en el que no las haya cambiado, lo que significa, según este riguroso estudio, que al 25% de los usuarios de estas webcams les importa bastante poco su privacidad.


Una vez dentro, ¡¡¡ que empiece la fiesta !!! A ver qué tenemos...


Este es el panel de control del dispositivo. Desde él podemos controlar hasta 16 cámaras al mismo tiempo (ideal para negocios, empresas, bancos, jeje)... Una de las primeras cosas que se me ocurren es cambiar el pass del dispositivo, pero como eso está muy mal visto hoy en día, podría crearme una nueva cuenta de administrador, por ejemplo.

Como podéis ver, tengo acceso a todo el sistema, puedo ver todo lo que las cámaras muestran, podría activarlas y desactivarlas a mi antojo, etc... Vamos, una maravilla...

Hay un apartado muy interesante que es "Alarm Log". En él se guarda un registro de ciertos eventos que han sucedido, como cambios de configuración, determinados fallos, etc... Como podemos observar, parece ser que la configuración ha sido modificada el pasado 01/06/2011, tras varios fallos de disco.


Cómo no, el apartado "Login Logs" nos mostrará todos los accesos al sistema e incluso podremos exportar estos datos. Esto es interesante si quisiéramos continuar realizando otro tipo de ataques. Por ejemplo, aparecen numerosos accesos como admin desde las mismas IPs, lo cual significa que esas son las IPs desde las que se administra este sistema (¿y quizás otros?). La opción de "Exportar" es especialmente útil en este caso, jeje... Además, desde aquí podremos borrar nuestras huellas eliminando aquellas entradas en las que aparecemos. No nos gustaría recibir la visita del cartero con un sobre certificado...

Por último, y por mera curiosidad, vamos a ver a dónde nos estamos conectando. Una visita a GeoIP, metemos la IP del sitio y ...

Bueno, por lo visto se trata de una empresa de comunicaciones de EE.UU, con sede en Virginia... Con todos estos datos casi podríamos meternos hasta la cocina, pero creo que ya es suficiente por hoy, ¿no?. La moraleja de todo esto es que SIEMPRE debemos cambiar las contraseñas que vienen por defecto.

Como dije en el título de la entrada, es que hay algunos que van provocando...

lunes, 6 de junio de 2011

Post Dominguero: Haciéndonos un crawler básico

Desde NoSecNoFun inauguramos una nueva sección llamada "Post Dominguero", donde recogeremos esas cosillas que puedes hacer una tarde de domingo sin partidos de liga, después de ver ganar a Nadal (otra vez) Rolland Garros...

Uno de los primeros pasos que se dan a la hora de meterle mano a una web es revisar el código de la página en busca de datos que nos permitan hacernos una idea de la composición del sitio, de la tecnología que utiliza, etc. Buscar direcciones de correo en el código, revisar los comentarios, buscar campos ocultos, la estructura de carpetas, etc, puede ser algo bastante aburrido y, sobre todo, tedioso si el sitio es un poco grande. Para ello existen los crawlers, que son programitas que se encargan de hacer este trabajo por nosotros y ahorrarnos un montón de tiempo. También son muy utilizados por los motores de búsqueda para indexar las webs y mostrarlas en los resultados de las búsquedas, pero lo que buscan estos últimos es muy diferente de lo que vamos a buscar nosotros.

El camino fácil es coger un crawler conocido como BlackWidow, Sam Spade o Teleport y dejarle que haga el trabajo sucio pero, como lo que nos mola es aprender cómo funcionan las cosas, vamos a hacernos uno sencillito, con un simple script para la consola. En este caso he elegido hacerlo para Linux, pero si se quiere hacer para Windows simplemente cambiaremos grep por findstr (o similares).

Lo primero que necesitamos es hacernos una copia local del sitio en nuestra máquina (por aquello de la velocidad y tal...). Podemos currarnos un programita que recorra todas las páginas de un sitio y las copie en el disco duro pero, es domingo, tengo resaca y conozco un programa que ya lo hace: WGET. Además hay versión tanto para Windows como para Linux, así que, p'alante!

Supogo que sabemos cómo funciona wget (y si no, nos leemos la ayuda, que es muy fácil, jeje), así que el comando que necesitaríamos para descargarnos una web sería el siguiente:

wget -r -m -nv http://www.unawebcualquiera.com

Este comando nos va a generar una carpeta con el nombre de la web y nos va a dejar dentro todos los ficheros de la misma respetando la estructura de carpetas (esto es importante, ya que así podremos hacernos una idea de cómo se estructura el sitio, qué tipo de aplicaciones alberga y qué tecnologías utiliza).

Una vez que ha acabado de copiar (puede tardar bastante si el sitio es un poco grande), necesitamos filtrar cada uno de los ficheros y buscar lo que queremos. ¿Qué usaremos para filtrar? a mí me mola grep para linux y findstr para windows, pero es una cuestión de gustos. Ahora viene lo importante: ¿Qué queremos buscar? Bueno, en este ejemplo sencillo, buscaremos lo más básico, que viene a ser:
  1. Comentarios: Os sorprendería ver lo que nos podemos encontrar comentado en cualquier código, desde credenciales de acceso, hasta referencias a ficheros de configuración, logs, etc, que nos pueden ayudar muchísimo a la hora de buscarle las cosquillas al asunto. Los comentarios en html empiezan con la misma cadena, <!-- , así que ya sabemos cómo sacarlos...
  2. Enlaces: Por supuesto, cualquier link que venga en el código. Podemos encontrar referencias a scripts, ficheros, carpetas, etc. Yo buscaré cadenas HREF (podemos buscar también por ACTION, pero estoy vago...).
  3. Direcciones de correo: Fundamental. Tanto para hacer ingeniería social como para su posible uso como usuario, ¿Cuántas webs conoces en las que el usuario es una dirección de correo? Pues eso, a buscar @...
  4. Campos ocultos: ¿Por qué se oculta un campo en una web? Porque seguro que es importante. Así que, al saco todo aquello que ponga type=hidden
  5. Meta Tags: Estas etiquetas que se añaden al código pueden contener direcciones, teléfonos, nombres, etc. Son una buena fuente de información para ataques de ingeniería social, así que, si pone meta...
  6. Scripts: Por supuesto, si hay algún script, lo quiero ver.
Podríamos seguir añadiendo cosas para buscar, pero para el ejemplo, creo que es más que suficiente.

¿Cómo sería el comando para aplicar una de estas búsquedas? Por ejemplo, para sacar los enlaces sería muy sencillo:
cat ./www.unawebcualquiera.com/index.html | grep -i -F 'href'
Nos sacaría por pantalla todas las líneas que contuvieran la cadena indicada. Lo que tendríamos que hacer es ir cambiando el patrón de búsqueda según el tipo, y sacarlo todo a un fichero de texto. Para ello, me he hecho un script en bash al que le paso dos parámetros: la carpeta con la web descargada y el fichero con los resultados.
#!/bin/bash

#para cada fichero de la carpeta de entrada, lo parseamos...
for i in $(find $1/)
do
echo "Parseando " $i
if [ -f $i ];
then
echo "[" $i "]" >> $2
#Buscamos comentarios "<!--"
echo "Comments" >> $2
echo "" >> $2
cat $i | grep -i -F '<!--' >> $2
echo "-----------------------------------------------------------------" >> $2
#Buscamos correos "@"
echo "Emails" >> $2
echo "" >> $2
cat $i | grep -i -F '@' >> $2
echo "-----------------------------------------------------------------" >> $2
#Buscamos campos ocultos "hidden"
echo "Hidden Fields" >> $2
echo "" >> $2
cat $i | grep -i -F 'type=hidden' >> $2
echo "-----------------------------------------------------------------" >> $2
#Buscamos Links "href"
echo "Links" >> $2
echo "" >> crawl
cat $i | grep -i -F 'href=' >> $2
echo "-----------------------------------------------------------------" >> $2
#Buscamos Meta "Meta"
echo "Meta Tags" >> $2
echo "" >> $2
cat $i | grep -i -F 'meta' >> $2
echo "-----------------------------------------------------------------" >> $2
echo "" >> $2
echo "-----------------------------------------------------------------" >> $2
#Buscamos scripts "script"
echo "SCRIPTS" >> $2
echo "" >> $2
cat $i | grep -i -F 'script'>>; $2
echo "-----------------------------------------------------------------" >> $2
echo "" >> $2
echo "********************************************************" >> $2
echo "********************************************************" >> $2
echo "" >> $2
fi
done
echo "FIN!"
En este ejemplo, el fichero de resultado podría salir algo tosco si la web en cuestión no sigue una indentación correcta, pero como ejemplo nos sirve más que de sobra. Una forma de mejorar esto sería mediante el uso de expresiones regulares. Como no me quiero meter con ello en este post, simplemente os dejo un ejemplo de cómo se filtrarían las direcciones de correo mediante el uso de expresiones regulares:
grep -o -e "[A-Za-z0-9\._-]*@[A-Za-z0-9\._-]*\.[a-zA-Z]\{2,4\}" $i >> $2
En este comando le estamos diciendo que sólo nos saque la cadena que coincida con el patrón que le indicamos (parámetro -o) y le indicamos el susodicho patrón (-e): una cadena de caracteres entre los que se pueden encontrar letras de la A a la Z (mayúsculas y minúsculas), números del 0 al 9 y los caracteres ".", "_","-", seguidos del carácter "@", y después otra cadena con el mismo patrón, seguida de un "." y otra cadena que sólo contenga las letras de la A a la Z mayúsculas o minúsculas, de un mínimo de dos caracteres y un máximo de cuatro... Un poco farragoso de leer, ¿no?, pero sin duda más amigable a la hora de presentar los resultados...

Como ya he dicho antes, si lo queremos hacer para Windows, simplemente cambiaríamos el cat por el type (comando para ver el contenido de un fichero en Windows), y el grep por findstr o similares.

Espero que os resulte útil.
CIAO!

P.D.: Sí, sí, ya sé que con grep, si ponemos el parámetro -r, nos recorre recursivamente un directorio y aplica el filtro a todos los ficheros, pero me molaba más así...

jueves, 19 de mayo de 2011

¡¡Yo tengo el poder!!

Introducción

El otro día me llegó mi última compra en Ebay, dos Cisco 3550 de 48 puertos de segunda mano, para mi laboratorio Cisco de casa. Como cada vez que recibo equipos, en lugar de resetearlos y empezar a jugar con ellos, mi curiosidad me llevó a "jugar" con ellos.

Mi tesoroooooo


Conecto el primero y veo como va cargando el IOS y llega al prompt. Nombre "Switch", que es nombre que traen de fábrica. Este promete poco y así es. Cuando voy a intentar entrar en modo privilegiado (comando enable) me deja entrar sin problemas. Un show running-config me confirma que viene vacío, así que con este poco podemos hacer.

Pasamos al siguiente. Ya para empezar, en el examen visual para ver si están en perfecto estado y demás, veo una pegatina que no viene de serie: "Property of HeMan's Castle Limited" Me apunto el dato.

Conectado a la consola, voy viendo como arranca. Llega al prompt y aparece un nombre de equipo Greyskull. Eso significa que hay configuración de por medio. Este switch promete. Intento entrar en modo privilegiado y me pide password. Pruebo con los que trae Cisco de serie y nada. Bueno, habrá que recuperar contraseña.

Comienza la diversión

Protocolo de recuperación de contraseña de Cisco sólo hasta el paso 12. Todavía no quiero tocar la configuración que trae. Hago un show running-config y el petróleo empieza a manar.

enable secret 5 $1$7oI7$s5Pi5XXX/f/6HxxXXK6Bn/

enable password PorElPoderDeGreyskull

Primeras líneas y quizás ya tengo el password de modo privilegiado. Alguien ha metido el password usando el comando enable password y luego ha metido el secreto encriptado, usando enable secret . La diferencia es el almacenamiento en texto plano o en un MD5 modificado. En caso de meter 2 passwords diferentes, prevalece el más seguro, así que vamos a verificar. Vuelvo a copiar su configuración por defecto y reinicio. Entrando en modo privilegiado, el password plano no sirve. Por aquí no sacamos más, porque no se puede desencriptar un password 5 de Cisco (y si alguien sabe como, que lo ponga en los comentarios, por favor)

Volvemos a recuperar contraseña y cambiamos el password por cisco, el que ponen por defecto, para evitar que al reiniciar tengamos que repetir el proceso.

Seguimos explorando la configuración. Vemos en los puertos 42, 46 y 48 que son de acceso a una VLAN, la 280.

interface FastEthernet0/42

switchport access vlan 280

switchport mode access

También podemos observar que está en modo acceso. Eso significa que había algún equipo conectado a esos puertos. El resto están en modo dinámico, así que no podemos saber cual se usaba como troncal. Pero esa información nos confirma que hay VLANs en el switch. Pasaremos luego a ello.

Seguimos mirando la configuración y llega uno de los puntos que más información pude proporcionar: la comunidad SNMP.

snmp-server community MyCastle RO

snmp-server location Greyskull Castle

snmp-server contact ManAtArms

El nombre de la comunidad no dice mucho, pero el campo location nos dice, en teoría, dónde ha estado ubicado. El campo contacto, da un nombre. Más datos, como decía Johnny 5.

Llegamos a la parte de líneas vty o acceso remoto.

line con 0

line vty 0 4

password YoTengoElPoder

login

line vty 5 15

password YoTengoElPoder

login

Lo que nos da los passwords de conexión. Ademas, la línea de login nos confirma que no está restringido a ssh, por lo que un telnet sería capaz de conectarse.

Por ahora de esta configuración no vamos a sacar nada. Pasamos a las VLANs.

Ejecutamos un show vlan y obtenemos esta salida (recortada para mostrar lo interesante)


VLAN

Name

Status

Ports

80

ServerVlan

active


110

DDBBVlan

active


210

BckVlan

active


280

DMZVlan

active

Fa0/42, Fa0/46, Fa0/48

666

SatanIsMyFriend

active







Vemos que la VLAN a la que están mapeados los puertos 42, 46 y 48 es de una DMZ. Este switch se usaba para conectar equipos de DMZ. También sabemos que la VLAN 80 es donde están los servidores y la 110 donde están las bases de datos. En la configuración no hemos encontrado referencias a VTP así que suponemos que, o bien antes ha estado en otra parte del CPD donde necesitaba esas VLANs, el administrador ha metido demasiada información donde no debía o antes sí estaba en un dominio VTP. También deducimos que el administrador de redes es un cachondo, viendo la VLAN 666 (es lo único que no he cambiado en todo el post, ese número de VLAN). Yo, personalmente, he usado ese número para la VLAN de aislamiento de puertos no utilizados, pero me ha hecho gracia encontrármelo en otra configuración.

Recapitulamos datos. Tenemos una pegatina que da un posible nombre de empresa. Una ubicación y un técnico. Además tengo un albarán de envío. “Google is your friend”

Dando el toque final

Lo primero, buscar la dirección del remite (que viene con teléfono incluido) y es una empresa de equipos de red de segunda mano de un lejano país. Poco sacamos de aquí.

Buscamos el nombre del técnico y, curioso, el segundo resultado es un perfil de Linkedin de un tal ManAtArms. Miremos el perfil. Anda, si pone que hace 4 años trabajó en una empresa llamada Skeletor Castle Ltd. como la pegatina que lleva el switch. Buscamos la empresa en Google y resulta que está en Greyskull Castle, localidad de al lado de la empresa que me lo ha enviado.

Y hasta aquí llego. Pero un atacante, puede empezar a buscar vulnerabilidades en la web y hacerse con un acceso. A partir de ahí, sabe las VLANs que hay en la empresa y tiene más fácil intentar hacer un VLAN hopping para un DoS o cualquier otro tipo de ataque en capa 2.

Conclusión

En este caso, es un switch que no da demasiada información para un ataque en condiciones, pero aun así nos revela información importante de la empresa. En el caso de los routers suele ser más descarado (tengo un router que me vino lleno de usuarios, passwords e IPs públicas para VPNs de una importante empresa del norte de Europa y otro que me trajo hasta los teléfonos móviles de los técnicos).

Cuando una empresa retira equipos, suele ser habitual venderlos de segunda mano o regalarlos. En el caso de ordenadores, siempre está la conciencia de formatear el disco duro o poner uno nuevo. ¿Por qué en el caso de los equipos de red no? Por desconocimiento, básicamente. Total, si esos bichos no tienen disco duro. Pues no, sí que tienen. Y pueden revelar información mucho más crítica que un ordenador en un momento dado que puede ser utilizada de manera “poco ética”.

Por eso, BORRAR SIEMPRE LAS CONFIGURACIONES. Y por supuesto, todos los backups o archivos alternativos que pueda haber en la memoria flash, que también suele tener configuraciones olvidadas. Aparte del fichero vlan.dat que es el que guarda la información de las VLANs.

Disclaimer: Evidentemente, he cambiado nombres, lugares, passwords y números de VLAN para no relacionar personas ni empresas. Únicamente he dejado intacto el número de VLAN 666 como ya he comentado. Si coincide con algún otro equipo que alguien tenga, es fruto de la casualidad.


martes, 17 de mayo de 2011

BackTrack 5 Revolution


El pasado 10 de Mayo se lanzó la nueva versión de la conocida BackTrack. Para los que no la conozcan, se trata de una distribución Linux especialmente enfocada a todo lo relativo a la seguridad. Vamos, que si te gusta este rollo, lo primero que tienes que hacer es bajártela porque tiene de todo…

Esta nueva versión es la BackTrack 5 “Revolution”. En esta ocasión, la distro ha sido totalmente renovada. Desde cero. La base es una Ubuntu Lucid con Kernel 2.6.38 y una de las novedades más importantes es la posibilidad de elegir la interfaz gráfica en KDE o GNOME (cosa que, personalmente, agradezco enormemente). También, además de las arquitecturas 32 y 64 bits,
hay disponible una versión para ARM, lo que significa que se puede correr sobre dispositivos Android (sí, has leído bien).

Dentro de los cambios más importantes podemos destacar que se han incluido muchas mejoras
para la auditoría de redes wifi, que era hasta ahora uno de sus puntos “débiles”. Se ha habilitado
un modo de arranque especial para análisis forense llamado “Forensic Mode” (sólo para versiones 32 y 64 bits) y un modo “Stealth” que no genera tráfico de red.
Entre las nuevas herramientas que trae esta versión, vemos que se han mejorado notablemente los apartados de VoIP, así como el de Análisis Forense. Por supuesto, se ha incluido la nueva versión de Metasploit. Éste es un resumen de las aplicaciones que trae:

· Obtención de Información:
o Airodump-ng
o Kismet
· Detección de Vulnerabilidades:
o Cisco Auditing Tool
o Mantra
o Nikto
o SQLMap
o W3af
· Herramientas de Exploiting:
o Cisco Global Exploiter
o FastTrack
o Sapyto
o Beef
o Social Engineering Toolkit
o Aircrack, Airmon, Airodump, etc…
· Escalada de Privilegios:
o Cowpatty
o John The Ripper
o Medusa
o Videojak
· Mantenimiento de Acceso:
o ProxyChains
o WebShell
· Ingeniería Inversa:
o GDB
o OllyDBG
· Herramientas RFID
· Stress Testing:
o Siege
o MKD3
· Forense:
o Bulk Extractor
o Foremost
o Scalpel
o MD5Deep
o Ddrescue
o PTK
o Samdump
o PeepPDF
o Volatile
· Herramientas de Reporte

En definitiva, todas las herramientas que necesitas y algunas más. Como siempre, se puede correr desde un Live CD, con lo que no necesitas instalar nada en tu equipo. También lo puedes instalar en un pendrive y llevarlo siempre contigo.

En artículos posteriores tendrás ocasión de ver esta joya y sus utilidades en acción, así que, os dejamos el enlace para descargarla


Saludos!


BackTrack 5 - Penetration Testing Distribution from Offensive Security on Vimeo.