28 de enero de 2012

Simulando una red corporativa: Instalando la red VoIP

Continuando con la serie Simulando una red corporativa, en esta entrada voy a describir el proceso para instalar una red de telefonía utilizando Cisco Call Manager Express como centralita IP PBX para manejar las llamadas y contar con la posibilidad de interconectar la red de datos (IP) con la red telefónica tradicional (PSTN).

En nuestro caso, el más sencillo, crearemos un Dial Peer (1)(2) para enrutar las llamadas entre las sedes remotas. Además deberemos configurar un Pool DHCP, opción 150, que será utilizado para dar direccionamiento a los teléfonos IP así como a las aplicaciones de telefonía.


Los datos completos del direccionamiento del laboratorio los podeis encontrar en el siguiente documento.

Desplegando la red VoIP

En primer lugar deberemos configurar la VLAN de telefonía tanto en los routers como en los swtiches de cada sede, en nuestro caso VLAN 40, al igual que añadir la red a la configuración RIP para que nos la enrute.


Comprobamos que tenemos conexión:


Tendremos que configurar el direccionamiento para la VLAN así como el modo de acceso en los distintos puertos de los switches. Utilizaremos el comando switchport voice vlan 40 para permitir el tráfico de voz por los puertos access. Los puertos trunks deberemos resetearlos tras añadir la VLAN con el comando switchport trunk allowed vlan add 40.






Comprobamos la conexión entre las sedes remotas.


Cisco Call Manager Express

En Packet Tracer, el servicio CME está disponible en los dispositivos de la serie 2800 incluidos por defecto en la instalación. Deberemos por tanto migrar nuestra configuración a un equipo superior para poder continuar con la instalación del servicio.




Configuramos un pool de direcciones DHCP para cada sede con la opción 150, una puerta de enlace por defecto y las direcciones IP excluidas. Además configuraremos el número máximo de teléfonos (ephones) y extensiones (dn), la dirección donde se registrarán los terminales a través del protocolo SCCP (3) y la auto-asignación pero no funciona muy bien que digamos...


También debemos crear las distintas extensiones indicando la numeración que utilizarán


Una vez tenemos configurado todo, podemos empezar a conectar terminales y ver como se registrar y toman un extensión. El siguiente enlace muestra información sobre el registro de teléfonos SCCP y SIP en centralitas Cisco Call Manager.


Y si realizamos una llamada entre las extensiones de una misma sede, ésta se realizará correctamente


Conectando sedes

La gracia de todo esto no es que podamos solamente realizar llamadas locales, también podemos realizar llamadas entre distintas sedes estableciendo Dial Peers entre ellas. Deberemos especificar la numeración destino y la sesión a través de la que se enrutarán las llamadas para un dial peer dado.

Sede Central
Sede Externa
Si realizamos llamadas entre las sedes, igualmente se establecen correctamente.


Me gustaría seguir jugando con Packet Tracer y algunas otras opciones y características interesantes que incluyen las últimas versiones del programa, un resumen con los comandos realizados así como publicar los archivos pkt, etc.

Enlaces de referencia

1. http://www.cisco.com/en/US/tech/tk652/tk90/technologies_tech_note09186a008010ae1c.shtml
2. http://www.cisco.com/en/US/docs/ios/12_3/vvf_c/dial_peer/dp_plan.html
3. http://www.cisco.com/en/US/products/sw/voicesw/ps556/products_tech_note09186a00801a62b9.shtml

Un saludo, Brixton Cat.

24 de enero de 2012

Python Script: BssidFromPcap.py

BssidFromPcap.py

En esta entrada se presenta el código fuente del script BssidFromPcap.py desarrollado para obtener un listado de BSSIDs únicos contenidos en un archivo de captura PCAP que será pasado como argumento al script.

Sintaxis: ./BssidFromPcap.py archivo.pcap

Es necesario especificarle un archivo de captura PCAP como primer argumento del script donde leerá los paquetes secuencialmente para obtener la dirección MAC origen de los paquetes Beacon Frames que existan. El script no comprueba la existencia del fichero y tampoco existen un control de errores, try y execption, etc...

Código fuente:
#!/usr/bin/env python
#
# Name: BssidFromPcap.py
# Decription: List unique BSSIDs from pcap capture file.
# Date: 23 Jan 2012
# Author: Brixton Cat
# Version: 0.2
#

### Import modules

import sys
from scapy.all import *

### Declare variables and constants

# Open output file
outfile = open('./Out.txt', 'w')
# Obtain pcap capture file from first arguments
capfile = sys.argv[1]
# Open pcap capture file with scapy
capture = rdpcap(capfile)
# Filter for blank MAC address: 00:00:00:00:00:00
blank = '00:' * 5 + '00'
# Blank array for unique bssids
unique = []

### Script

# Read pcap capture file
for pcks in capture:

  # If pcks is Dot11 (802.11) package
  if pcks.haslayer(Dot11Beacon):
    # Obtain MAC address from package
    bssid = pcks.addr2
  
    # If bssid is blank go to next iteration
    if bssid == blank:
      continue
   
    # Check if exist bssid in unique array and append it
    else:
      if unique.count(bssid) == 0:
        unique.append(bssid)
        # Write bssid in outfile
        outfile.write(bssid + "\n")
 
  # Else go to next iteration
  else:
    continue

# Close output file
outfile.close()

#EOF
##FVE
En esta entrada puedes ver más información sobre el mismo así como unas imágenes con algunas pruebas realizadas.

Un saludo, Brixton Cat ; )

Python Script: Obteniendo BSSIDs de un archivo pcap

Buenas a tod@s! Se que tengo varias series por terminar, como configurar el servidor MySQL y el CMS Drupal para nuestro cluster web de alta disponibilidad o la instalación de la red VoIP utilizando Cisco Call Manager Express de nuestra simulación de una red corporativa. Pero en el primer caso haciendo pruebas me carge la configuración de DRBD y en el segundo caso tengo que tomar las capturas para escribirlo. Todo a su tiempo, todo a su tiempo...

De todas maneras, no solo de administración podemos vivir y la programación es una tarea fundamental para cualquier geek/freak/nerd/hacker/hack0r, o como mejor querais llamaros... Aprovechando que hace poco he terminado el curso Introduction to PenTest Scripting impartido por Roberto Martinez, gran maestro y persona, que ha montado un programa de cursos de lo más interesante utilizando webinars para crear clases virtuales a través de Internet y una posible futura aula virtal donde se añadirá la modalidad E-learning.

http://commons.wikimedia.org/
Volviendo con la entrada... El script nos va a generar un archivo lista con BSSIDs únicos presentes en un archivo de captura PCAP que le pasaremos como argumento. Voy a hacer uso del modulo Scapy para Python que se incluye en la instalación de BackTrack 5, pero si es necesario añadirlo a vuestras librerias lo podeis encontrar en la Web del desarrollo.

En esta entrada voy a resumir los pasos fundamentales del script y las pruebas realizadas, podeis encontrar el código completo en la siguiente entrada (BssidFromPcap.py) y una descripción del proceso de creación para los novatos como yo (aqui).

Explicación

En primer lugar declaramos algunas variables y objetos que serán utilizados a lo largo del script, en este paso especificamos el archivo de captura y de salida al igual que los abrimos para asociarlos a sus respectivos objetos.
# Open output file
outfile = open('./Out.lst', 'w')
# Obtain pcap capture file from first arguments
capfile = sys.argv[1]
# Open pcap capture file with scapy
capture = rdpcap(capfile)
# Filter for blank MAC address: 00:00:00:00:00:00
blank = '00:' * 5 + '00'
# Blank array for unique bssids
unique = []
Recorremos el archivo de captura para comprobar que el paquete se trata de un  Beacon Frame (Dot11Beacon) del que obtenemos la dirección física origen, BSSID, y comprobamos que no es un valor nulo: 00:00:00:00:00:00.
# Read pcap capture file
for pcks in capture:

  # If pcks is Dot11 (802.11) package
  if pcks.haslayer(Dot11Beacon):
    # Obtain MAC address from package
    bssid = pcks.addr2
  
    # If bssid is blank go to next iteration
    if bssid == blank:
      continue
La explicación que he encontrado sobre esta dirección (1)(2)(3), es que se utiliza como dirección destino en algunos ARP Request y en paquetes ARP Gratuitous, pero en las capturas aparecen valores nulos como origen de algunos paquetes. En los paquetes Beacon no he encontrado ninguno pero manteniendo el filtro nos aseguramos que se obvien en caso que se cuele alguno.


Si no existe el BSSID en el array unique, se añade a la lista y se escribe en el archivo de salida. En caso que el condicional sea falso, no guardará el BSSID en el array ni en el archivo de salida asegurando así que no se repiten resultados.
    # Check if exist bssid in unique array and append it
    else:
      if unique.count(bssid) == 0:
        unique.append(bssid)
        # Write bssid in outfile
        outfile.write(bssid + "\n")
Para finalizar cerramos el archivo de salida antes de salir del script.
# Close output file
outfile.close()
Pruebas

Auditando una red

Este es el archivo con el que estuve realizando la creación del script, corresponde con una captura realizada con airodump-ng sobre un AP específico en el que hay conectado un cliente. En entradas posteriores intentaré detallar la creación del script donde se entenderá mejor.


Auditando varias redes

Este otro caso, correponde con una captura realizada también con airodump-ng pero sin filtrar por una red concreta. Obtendremos múltiples direcciones MAC que serán filtradas para evitar duplicados en el archivo de salida. Igualmente, en la explicación detallada se verá más en detalle este proceso y el resultado.


Comentario final

Ya para finalizar, solo quiero decir que el script ya estaba inventado... Para crearlo me he basado en información de blogs y páginas de Internet (4)(5) y únicamente lo he ordenado a mi manera así como he personalizado las variables y nombres de los objetos.

La realización del script me ha resultado francamente simple dada la posibilidad que nos brinda Scapy para utilizar su nomenclatura y métodos, que junto a la facilidad de escriptura de Python nos permite crear herramientas complejas y altamente potentes. Sobra decir que esto solo es un pequeño programa que puede ser utilizado en un script más complejo o con más opciones a través de funciones, clases, etc.

En los enlaces anteriores podeis encontrar explicaciones en las que me he basado así como ejemplos y métodos de Python que podemos aplicar en nuestros desarrollos. Yo tengo alguna que otra idea en mente, aunque solo sea por enreadar y aprender el lenguaje...

Enlaces de referencia

1 - http://wiki.wireshark.org/Gratuitous_ARP
2 - http://cauew.blogspot.com/2008/08/arp-rarp-proxy-arp-gratuitous-arp-and.html
3 - http://www.certforums.co.uk/forums/networks/43139-help-wireshark-newbie.html
4 - http://www.packetstan.com/2011/03/extracting-ap-names-from-packet.html
5 - http://www.devx.com/security/Article/34741/1954

Un saludo, Brixton Cat.

7 de enero de 2012

Simulando una red corporativa: Host y otras opciones

Siguiendo con la serie Simulando una red corporativa vamos a ir añadiendo hosts a nuestro escenario, instalaremos varios servidores y comprobaremos desde los clientes que tenemos acceso a los servicios; tanto dentro de la sede como desde la sede externa. Después realizaremos algunas pruebas y otras configuraciones que nos permite Packet Tracer con las que jugar un poco con la red que estamos creando.

El escenario final a configurar será:


Iremos añadiendo equipos y en cada uno deberemos configurar varias cosas: Gateway, la velocidad y el modo de la interfaz, una dirección IP y una máscara de red.





En el caso de los servidores, desactivaremos los servicios que no utilizaremos para evitar tráfico innecesario de la red.


Configuraremos también en cada switch los puertos donde se conectarán los equipos, para ello deberemos especificar el modo de la VLAN y el ID con la que etiquetar los paquetes, el modo y la velocidad de la interfaz y una descripción con la que reconocer fácilmente la configuración.


Podemos comprobar la configuración con el comando show running-config 


Podemos realizar algunas pruebas de pines para comprobar que tenemos conexión desde los servidores hasta la sede externa.


Otras configuraciones

Servidor Syslog

Configuraremos los equipos para que envien los eventos del log a un servidor centralizado donde leer "comodamente" los registros. Para ello, utilizaremos los siguientes comandos para definir el servidor y el nivel de registro de los eventos.


Podemos comprobar que el servidor registra los eventos de los distintos equipos.


Backup Startup-Config

Con el comando copy startup-config tftp: y especificando la dirección IP del servidor TFTP podemos volvar la configuración de arranque del sistema (startup-config).


Actualizar IOS

Podemos actualizar la versión de la IOS de los dispositivos con el comando copy tftp: flash: e indicando la dirección IP del servidor y el nombre origen y destino del fichero.


Podemos especificar las IOS que serán cargadas durante el arranque del equipo con el comando boot system file1;file2;...


Y reiniciamos el equipo para que cargue la nueva IOS


Igualmente podemos actualizar la versión software de los routers que tenemos instalados y especificar la IOS que será cargada durante el arranque.


Cargar configuracion

En el caso que tengamos una avería en uno de los equipos y sea necesario cambiarlo, si tenemos un backup con la configuración podemos cargarla en el nuevo equipo. Primero deberemos configurar una dirección IP válida con la que comunicarnos con el servidor TFTP, en este caso será necesario configurar además una VLAN y un puerto que la utilice.


Le damos una puerta de enlace y comprobamos que tenemos conexión con el servidor TFTP.


Con el comando copy tftp: startup-config, especificando la dirección IP del servidor y el nombre del fichero origen nos guardará la nueva configuración de arranque para el equipo.


Nuevamente con el comando show running-config chequeamos la configuración recien cargada y comprobamos que tenemos conexión con el resto de redes.



Servidor Web

Creamos un servidor Web para realizar algunas pruebas y comprobamos que desde los clientes podemos acceder al mismo.


En siguientes entradas configuraremos los routers de las sedes con el servicio de telefonía e implementar una solución VoIP básica utilizando las configuraciones CME que Packet Tracer nos permite.

Un saludo, Brixton Cat.

2 de enero de 2012

Depecrated error en VirtueMart 1.1.9 Latest Products Module

Estoy últimamente algo liado con Joomla y VirtueMart para crear una tienda virtual a un amigete y así ganar un sobresueldo ; ) A la hora de realizar la instalación de Joomla, me reportó que el servidor tenía activada la opción de mostrar errores por pantalla; display_errors = On en el archivo de configuración php.ini.

Como se puede ver en la documentación de PHP, ésta es una opción de ayuda para el desarrollo del sitio pero debe ser desactivada:
Esta es una característica para apoyar su desarrollo y nunca debería usarse es sistemas de producción (p.ej. sistemas conectados a internet).
Me puse en contacto con la empresa de hosting, dado que no me permiten tocar el archivo de configurción de PHP, pero se ve que no me hicieron mucho caso. Mientras realizada la instalación del módulo Latest Products de VirtueMart, me encontré con el siguiente error:
Deprecated: Assigning the return value of new by reference is deprecated in /.../modules/mod_virtuemart_latestprod/mod_virtuemart_latestprod.php on line 42
Buscando információn por Internet, llegue a la siguiente entrada donde aparece la siguiente información:
Esto en PHP4 (e inferior) significa “crea el objeto de clase class1 y asignar LA REFERENCIA a la variable $var1."
Según la documentación de PHP y de forma resumida:
Las Referencias en PHP son medios de acceder al mismo contenido de una variable mediante diferentes nombres.
Una vez tenemos más claro el problema, sigo buscando información y encuentro otra entrada que explica más en detalle el problema incluyendo algunos ejemplos. Además, enlanzan la documentación de PHP donde podemos econtrar lo siguiente:
Since PHP 5, new returns a reference automatically, so using =& in this context is deprecated and produces an E_DEPRECATED message in PHP 5.3 and later, and an E_STRICT message in earlier versions.
Si revisamos el archivo que nos indica el error, mod_virtuemart_latestprod.php, encontramos:



Por lo que si quitamos el ampersand, &, la variable db se declarará correctamente tomando el valor almacenado en ps_DB.


De momento es una solución, pero seguiré insistiendo hasta que me desactiven display_errors o consiga desde otros médios, htaccess, desactivarlo. De momento no he sido capaz y el servidor me tira un error 500 con las opciones que he probado. Seguiré haciendo pruebas a ver si doy con la tecla, ya os comentaré ; )

Más información:

http://php.net/manual/en/migration53.deprecated.php
http://www.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.new
http://us3.php.net/manual/en/language.oop5.references.php
http://www.php.net/manual/en/language.references.php#93292

Un saludo, Brixton Cat.