27 de marzo de 2012

Bash Script: Transferencias de zonas públicas

Hoy traigo un post sobre DNS y transferencias de zonas, tanto de forma teórica como práctica, pero también he de decir que en esta entrada no voy a descubrir nada nuevo sobre el protocolo o las maneras de explotarlo. Entremos en materia...

Introducción

El protocolo DNS es utilizado para la resolución de direcciones IP a nombres de hosts y dominios, de forma directa (nombre -> IP) e inversa (IP -> nombre). Tradicionalmente, utiliza el puerto 53 del protocolo de transporte UDP para el envio y recepción de consultas, aunque últimamente han surgido proyectos para la utilización de TCP para proteger dichas conexiones.

Cada dominio es considerado dentro del servidor como un ente independiente que recibe el nombre de zona y entre los registros que se pueden definir dentro de las zonas podemos encontrar:
* A. Resolución de nombre a IP.
* CNAME. Alias para un mismo host.
* PTR. Punteros para resolución inversa.
* MX. Servidores de correo electrónico.
* SRV. Localizador de servicios.
* TXT. Información en texto plano.
Dentro de la configuración de cada dominio, se define el campo SOA (Start of Authority) que se utiliza para realizar un control de cambios sobre dicha información. Puede ser configurado de manera manual o automática pero hay que tener en cuenta que a través de este valor, los servidores determinarán si la información es más reciente que la que tienen almacenada.

Debido a la estructura distribuida del protocolo, se utilizan las denominadas transferencias de zonas para retransmitir la información de servidores maestros hasta otros secundarios. Con ello se asegura la disponibilidad de los nombre de dominio consiguiendo una estructura jerarquizada de tipo árbol.


En caso que las zonas no estén correctamente configuradas, una tercera persona es capaz de obtener dicha información a través de los servidores maestros.

Consultas AXFR

Como comentaba anteriormente, las transferencias de zonas se utilizan para retransmitir los registros DNS entre servidores maestros y esclavos. Existen varias consultas que pueden ser realizadas a dichos servidores: completas (AXFR) e incrementales (IXFR).

Generalmente las transferencias de zonas se realizan utilizando el puerto 53 del protocolo TCP, aunque depende de la configuración del servidor así como de las herramientas que utilicemos.

Primero obtenemos la dirección IP del dominio


Se realiza una consulta SOA y queda a la espera de la respuesta, así se asegura que dispone de la última información sobre el dominio.


Posteriormente se realiza la propia consulta AXFR para obtener la información. En caso de visualizar la captura de red con Wireshark, nos muestra una petición y una respuesta para dicha consulta.


Podemos comprobar con más detalle que se establece la conexión


Se realiza la propia transferencia de zona, en la que se van añadiendo paquetes para formar la consulta.


Y se cierra la conexión


Herramientas

nsloouk

Nslookup es una de las herramientas que tradicionalmente se ha utilizado para la resolución de nombres DNS. Aunque se pueden añadir opciones al comando, su mayor potencial la obtenemos de forma interactiva:

Comandos: # nslookup
                    > set all
                    > dominio


Podemos realizar una consulta para obtener los DNS asociados al dominio

Comandos: > set q=NS
                    > dominio


O consultar cúal es el servidor maestro

Comandos: > set q=HINFO
                    > dominio


En este caso las transferencias de zonas no parecen funcionar, si lanzamos el comando ls o si visitamos el manual de la herramienta, vemos que no esta implementado.


Como comentaba anteriormente, también es posible realizar algunas consultas desde la línea de comandos


host 

La herramienta host también nos permite realizar consultas específicas sobre determinados registros, así como realizar transferencias de zonas.

Comando: host -t NS domain


Comando: host -l domain



En este caso, obtenemos un time out porque no ha conseguido conectar con el servidor, pero no significia que no puedan realizarse.

dig

Dig es un cliente en línea de comandos e interactivo para la resolución de nombres de dominios, viene incluida en la suite BIND y reemplaza a las herramientas anteriormente descritas. Debido al potencial y flexibilidad de la herramienta, es muy utilizado para la resolución de problemas relacionados con servidores DNS.

Para obtener los servidores de nombres asociados con el dominio objetivo, utilizaremos el comando:

Comando: dig NS domain


Para realizar la transferencia de zonas propiamente dicha utilizaremos:

Comando: dig axfr @NS domain


Automatización

Podemos utilizar las herramientas aqui descritas para crear scripts con los que automatizar y filtrar las consultas. En mi caso he creado un script en bash, ZoneTransfers.sh, que utiliza dig para obtener los servidores de nombres e intentar recopilar la información del dominio que pasemos como argumento del mismo.


Me he inspirado en el siguiente script del amigo Zerial, para obtener un listado único de nombres de hosts así como de direcciones  relacionadas con el dominio objetivo.




Recientemente he estrenado un repositorio público en Github donde almacenar los distintos scripts que vaya desarrollando, en él podeis encontrar este último así como un pequeño archivo README con la descripción del mismo.

Tened en cuenta que la transferencia de zonas es un ataque activo dado que consultamos directamente los servidores DNS objetivos. Esta entrada se publica de modo informativo y para un uso educativo del protocolo y las herramientas disponibles. En ningún caso se incita a los lectores a realizar dichas consultas y no me responsabilizo del uso que terceras personas puedan dar de esta información, así como los daños que puedan provocar.

Un saludo, Brixton Cat.

11 de marzo de 2012

Python Script: ToSCalc.py

ToSCalc.py

En esta entrada se muestra el código fuente del script ToSCalc.py con el que calcular los distintos valores ToS y DSCP para configuraciones de calidades de servicio.

Sintaxis: ./TosCalc.py VALUE

VALUE corresponde a los posibles valores configurables dentro del campo IP Precedence o Class Selectors para la priorización de tráfico en las redes IP.

Código fuente:
#!/usr/bin/env python
#
# Name: ToSCalc.py
# Description: Calculate ToS and DSCP values for IP Precedence
# or Class Selector argument.
# Author: Brixton Cat
# Date: 10 Mar 2012
# Version: 0.1
# Sintax: ./ToSCalc.py VALUE
#

### Dependencies
import sys

### Functions
def Arguments(decimal):
    """ This function check the introduced argument and call ThreeBits
    function if the value is correct """

    # If not valid value, exit of script
    if decimal < 1 or decimal > 7:
        print "ERROR: %d not valid CS or IP Precedence value" % \
            decimal
        sys.exit(1)
    else:
        ThreeBits(decimal)

def ThreeBits(decimal):
    """ This function convert decimal argument to a 3 bits value and
    check correct lenght of this """

    # Array ['0', 'value']
    bina = bin(decimal).split('b')

    # If less of 3 bits, add 0s to left of binary variable
    if bina[1] < "3":
        rest = 3 - len(bina[1])
        binary = str(0) * rest + bina[1]
    else:
        binary = bina[1]
 
    # Run SixBits functions
    SixBits(decimal, binary)

def EightBits(decimal, binary, dscpb, dscpd):
    """ This function add 0s to right of tosb variable and run Results
    function with all prints values """

    # Rest of 8 and binary lenght
    rest = 8 - len(binary)
    # Type of Service binary value
    tosb = binary + str(0) * rest
    # Type of Service decimal value
    tosd = int(tosb, 2)

    # Call Results function with all values
    Results(decimal, binary, dscpb, dscpd, tosb, tosd)

def Main():
    """ Declare decimal variable and run Arguments function with
    this value """

    # Fisrt argument of the script
    decimal = int(sys.argv[1])
    # Run Arguments functions
    Arguments(decimal)

def Results(decimal, binary, dscpb, dscpd, tosb, tosd):
    """ Prints values relationated with IP Precedence or Class
    Selectors introduced argument"""

    # Header
    print "Value  3bits   DSCP Bin  DSCP   ToS Bin   ToS"
    print "-----  -----   --------  ----   -------   ---"
    # Values
    print "  %d\t%s\t%s\t  %d\t%s  %d" % \
        (decimal, binary, dscpb, dscpd, tosb, tosd)
 
def SixBits(decimal, binary):
    """ This function add 0s to right of dscpb variable and calculate
    their decimal value """

    # DSCP binary value
    dscpb = binary + str(0) * 3
    # DSCP decimal value
    dscpd = int(dscpb, 2)
 
    # Run EightBits function
    EightBits(decimal, binary, dscpb, dscpd)

### Script
Main()

### Exit
# Exit Codes
# 0 -> Normal exit
# 1 -> No valid argument
sys.exit(0)

#EOF
##FVE
En la siguiente entrada hay información sobre el mismo así como algunas pruebas multiplataforma.

Un saludo, Brixton Cat.

Python Script: Calculando calidades de servicio

Como hace poco he estado indagando sobre Quality of Service, Type of Service, Class Selectors y demás campos con los que priorizar el tráfico en las redes IP, he creado un script (ToSCalc.py) en Python que calcula los distintos valores decimales y binarios de estos.

El script recibe los posibles valores de nuestras configuraciones IP Precedence y Class Selectors, devolviendo los valores decimales y binarios para los campos Differentiated Services Code Points (DSCP) y Type of Service (ToS).


Como todavía estoy aprendiendo Python no he sido capaz de hacer una función ayuda, por lo que si se lanza el script sin argumentos falla.


Los posibles valores van del 0 al 7, por lo que en caso de introducir argumentos superiores o inferiores muestra un mesaje de error indicando que no es un valor válido.


Como el script necesita únicamente el módulo sys para recibir el argumento y para los código de salida, es compatible entre sistemas operativos sin necesidad de realizar ningún cambio.


Conclusiones

He de decir que estoy aprendiendo Python y el paradigma de la programación orientada a objetos.

El script funciona de manera secuencial dada la versatibilidad del lenguaje aunque utilizando la variable self propia de éste, sería mucho más simple e igual de funcional. Tal vez para versiones posteriores, alguien se apunta?

Un saludo, Brixton Cat.

9 de marzo de 2012

Quality of Service: ToS, CoS y otros bits

Con los nuevos vientos provenientes del mundo del networking: Comunicaciones unificadas, redes convergentes, soluciones NGN, el tan llamado Cloud... Se hace cada vez más necesario la utilización de mecanismos para garantizar la conexión de las nuevas tecnologías de telefonía, video, Internet movil, telepresencia, etc.

Para ello, en 1994 el ITU define las calidades de servicio (Quality of Service) con las que asegurar las conexiones telefónicas así como corregir fallos como el eco, lentitud, ruido, etc. Estás han sido aplicadas a las redes de datos y han posibilitado la unificación de ambas tecnologías sobre un mismo soporte físico, como el uso de softphones.

Entrando un poco más en materia, vamos a bucear entre las cabeceras IP y Ethernet para entender cómo se reflejan las configuraciones de nuestros dispositivos.


Dado que utilizamos el modelo de capas basado en el modelo OSI, la pila TCP/IP difenrencia tareas y delega funciones entre ellas. Como transmitir en binario los impulsos eléctricos/ópticos enviados desde el puerto físico, utilizando la información lógica que proviene de las aplicaciones de usuario. Esto es en pocas palabras, si quieres una definición más exacta no sé que haces visitando éste blog... Ponte a estudiar de verdad cacho patán! : p

Layer 2

A nivel de trama, en la cabecera Ethernet se define el campo CoS (Class of Service) dentro de la etiqueta que añade el protocolo 802.1Q para discriminar tráfico a través de VLANs. Añadiendo 32 bits a la trama Ethernet donde se define un campo de 16 bits con valor 0x8100 para identificar las que son marcadas.


El resto de campos corresponden a:

- Priority Code Point (PCP): Los 3 bits más significativos restantes, los llamados Class Selectors que van del 0 (CS0) al 7 (CS7) para indicar el nivel de prioridad de menor a mayor numericamente.
- Cannonical Format Indicator (CFI): Debido a un fallo de implementación a la hora de transmitir la dirección MAC (dcha->izq VS izq->dcha), se establece éste valor booleano. Y hasta aqui puedo hablar...
- VLAN Identifier: Campo de 12 bits que corresponde al identificador de la VLAN con la que se marcarán los paquetes. Los valores 0x000 y 0xFFF están reservados pudiendo definirse 4096 redes virtuales según el estandar.

Layer 3

A nivel de red, en capa 3, se utilizan 8 bits de la cabecera IPv4 para definir el campo ToS (Type of Service) del que se utilizan los tres bits más significativos para definir la precedencia (IP Precedence). El bit menos significativo debe valer 0. ¿Alguien capaz de explicarlo?


En diciembre de 1998, se restructura y se definen los Differentiated Services Code Points (DSCPs) que utilizan los 6 bits más significativos del campo. Los dos bits restantes definen el Explicit Congestion Notification (ECN), que se utiliza para informar que se están rechazando paquetes por congestión.


Relaciones

Dado que inicialmente se utilizaba IP Precedence para definir las calidades de servicio junto con los Class Selectors, en la siguiente tabla se muestra la relación entre ambos:


Como comentaba anteriormente, en 1998 se definen los códigos DSCP que proporcionan más opciones con las que controlar el tráfico. La siguiente tabla muestra la relación entre ellos:


Dado que los códigos DSCP proporcionan mayor granularidad, en esta tabla se muestran las relaciones entre DSCP, IP Precedence y Class Selectors:


Se introduce el concepto de AF (Assured Forwarding) que completa y proporciona todo un nuevo sistema de control de tráfico.


Posibilita la retrocompatilibidad y utiliza el campo que se añade para generar un sistema con el que diferenciar los paquetes.
Precedence                   ECN
      000     |    XX YY    |    00
        Priority (Class+Level)
Hibrido L2/L3

He de decir que a nivel de ISP, en los cores de red: MPLS/VPLS hasta donde conozco, también se utilizan las QoS para priorizar tráfico. Sino hay concordancia entre el equipo final y el de central, mal vamos... luego vienen las averias : p


Como no tengo mucha experiencia sobre el tema y la documentación que he encontrado es un poco abstracta... Sólo puedo decir que se utiliza el campo experimental de la cabecera MPLS (Exp), de 3 bits de tamaño, para arrastrar el valor establecido en la trama Ethernet (L2). Eso tengo entendido, ¿Alguien nuevamente puede corregir?

Enlaces

http://www.cisco.com/en/US/prod/collateral/switches/ps5718/ps708/prod_white_paper0900aecd803e5269.html
http://mccltd.net/blog/?p=1199
http://www.pbxphreak.com/QoS/
http://www.cisco.com/en/US/docs/solutions/Enterprise/WAN_and_MAN/QoS_SRND_40/QoSIntro_40.html#wp62023
http://bogpeople.com/networking/dscp.shtml
http://www.network-core.net/2010/02/comparacion-entre-ip-precedence-y-dscp.html
http://blog.ine.com/2010/02/21/the-mpls-forwarding-plane/

Un saludo, Brixton Cat.

6 de marzo de 2012

VirtueMart 1.1.9: Solucionando algunos errores

Ya comentaba anteriormente algún problema que tengo en una Web para un amiguete al que le estoy creando una tienda virtual (enlace). En este caso, continuo recibiendo errores y sin posibilidad de deshabilitar la opción display_errors.

Todo el jaleo viene provocado por el uso de la versión 5.3 del servidor PHP y que por defecto el servidor muestra los errores por pantalla. Creo que el problema puede estar en la versión PHP definida en el archivo .htaccess que, repito: por defecto, no he modificado. Tengo que estudiarlo...


De momento me ha dado por corregirlos y a continuación podeis encontrar algunos fallos que he encontrado a la hora de realizar el pago, utilizando el componente VirtueMart 1.1.9 para Joomla 1.5.25 como gestor de contenido.

Archivo: phpmailer.php

Como se puede observar en la captura anterior, para los errores del fichero con ruta /www/libraries/phpmailer/phpmailer.php, obtenemos dos funciones despreciadas a partir de la versión 5.3 de PHP.


* Función split() 

Deprecated: Function split() is deprecated in /www/libraries/phpmailer/phpmailer.php on line 470

Como siempre, buscando información por Internet llego a la documentación del fabricante. En este caso, la función split() es sustituida por explode() que cumple la misma función. 



* Función set_magic_quotes_runtime()

Deprecated: Function set_magic_quotes_runtime() is deprecated in /www/libraries/phpmailer/phpmailer.php on line 1218
Deprecated: Function set_magic_quotes_runtime() is deprecated in /www/libraries/phpmailer/phpmailer.php on line 1222


Nuevamente rebuscando por los confineres de Internet, gracias a nuestro Gran Hermano Google y su eficacia para rastrear todo lo que se encuentra publicado. Llego a la documentación de PHP para descubir que a partir de la versión 5.4 la funcionalidad magic_quotes_runtime será eliminada.


Archivo ps_payment.php

Notice: Undefined property: ps_payment::$payment_code in /www/administrator/components/com_virtuemart/classes/ps_checkout.php on line 1220

Aunque en este caso, el error nos lo marca en el archivo ps_checkout.php, como podemos ver en el siguiente enlace corrrespondiente al foro oficial de VirtueMart, el fallo se encuentra en el archivo ps_payment.php.


En la versión 1.1.9 de éste componente, dicho archivo se encuentra en el directorio /www/administrator/components/com_virtuemart/classes/payment y se soluciona inicializando la variable payment_code dentro de la clase ps_payment.


Probando cambios

Una vez tenemos los cambios realizados y subidos los archivos al servidor, si probamos a realizar una nueva compra no aparece ningún error por pantalla.


Tengo que revisar los archivos .htaccess a ver si encuentro la raiz del problema para deshabilitar display_errors. Os mantendré informado...

Un saludo, Brixton Cat.