Dynamic Host Configuration Protocol (DHCP)

Después de unas cuantas entradas de Asterisk, considero que podríamos montar un servidor DHCP en Linux, con el famoso isc-dhcp-server, pero antes de eso, voy a daros la chapada con un poco de teoría de como funciona el protocolo, a que tipo de ataques es susceptible, como configurarlo etc… Así que bien, sin más preámbulos, empecemos comentando que es el protocolo DHCP.

A grandes rasgos, ya iremos concretando, DHCP es el protocolo encargado de asignar direcciones IP de manera automática a los equipos en una red. Normalmente, en casa todos tenemos un servidor DHCP

incluido en nuestro ISR o Router de Servicios Integrados, es por ello que la abuela puede acceder a internet vía WiFi a través de su móvil, sin tener que saber la dirección IP del Gateway, la máscara de la red y sin hacer un ping a una dirección IP aleatoria antes de asignarse una, para evitar duplicidad de IPs en la red… ¡ah! y además sin tener que asignarse un servidor DNS primario y Secundario.

Bien, pues existen diversas métodos de asignación:

  • Asignación manual: el administrador asigna una dirección IPv4 preasignada al cliente, y DHCPv4 comunica solo la dirección IPv4 al dispositivo.
  • Asignación automática: DHCPv4 asigna automáticamente una dirección IPv4 estática de forma permanente a un dispositivo y la selecciona de un conjunto de direcciones disponibles. No hay arrendamiento, y la dirección se asigna de forma permanente al dispositivo.
  • Asignación dinámica: DHCPv4 asigna dinámicamente, o arrienda, una dirección IPv4 de un conjunto de direcciones durante un período limitado elegido por el servidor o hasta que el cliente ya no necesite la dirección.

En una comunicación entre un Servidor DHCP y un Cliente, se utilizan cuatro paquetes de datos distintos:

  1. DHCPDISCOVER
  2. DHCPOFFER
  3. DHCPREQUEST
  4. DHCPACK

El orden de los paquetes es igual al orden descrito arriba y cada paquete realiza una acción distinta:

  1. DHCPDISCOVER: Paquete que es enviado por el cliente y que se envia por broadcast de direcciones de capa 2(MAC) y capa 3(IP) del modelo OSI.
  2. DHCPOFFER: Paquete que es enviado en modo respuesta a DHCPDISCOVER por el Servidor DHCP, el paquete lleva una dirección de capa 3 como propuesta para el cliente, y la dirección de envio es de capa 2(MAC). Es decir, establece la dirección destino tomando la dirección origen del paquete DHCPDISCOVER.
  3. DHCPREQUEST: Paquete que es enviado por el cliente cuando acepta el arrendamiento de la dirección de capa 3(IP). Este paquete es enviado por broadcast, para que este y otros servidores en la red tengan en cuenta que la dirección IP ‘X’ ya esta asignada.
  4. DHCPACK: Cuando recibe la aceptación por parte del cliente, este le envía un paquete con un ACK (ACKnowledge), para avisarle de su aceptación, pero antes realiza un PING a la dirección IP que piensa arrendar para evitar otorgar una dirección IP en uso, es como una medida más para evitar duplicidades.

Los paquetes DHCP mencionados anteriormente son enviados por el servidor con el puerto origen 67 y destino 68, el cliente, lógicamente, lo hace justo al revés, además se utiliza el protocolo UDP para la transmisión de los mismos. Un paquete DHCP tiene el siguiente aspecto:

Paquete DHCP
  • Código OP(1): Indica el tipo de mensaje general, 1 indica un mensaje de solicitud, 2 indica un mensaje de respuesta.
  • Tipo de hardware(1): Indica el tipo de hardware utilizado, 1 es Ethernet, 15 Frame Relay y 20 serial. Son los mismo códigos utilizados en el protocolo ARP.
  • Longitud de dirección de Hardware(1): Especifica la longitud de la dirección de hardware o MAC.
  • Saltos(1): Controla el reenvío de mensajes, un cliente lo establece en Ø antes de enviar.
  • Identificador de transacción: Lo utiliza el cliente para hacer coincidir la solicitud con respuestas recibidas de los servidores de DHCPv4.
  • Segundos(2B): Indica la cantidad de segundos desde que un cliente empezó la solicitud de una dirección. Es utilizado por los servidores DHCP para tener un orden y prioridad.
  • Indicadores(2B):Se utiliza solo 1 de los 16 bits. Cuando el valor es 1, indica al servidor DHCP o al agente de retransmisión que la respuesta la debe enviar como difusión.
  • Dirección IP del cliente (CIADDR) (4B): la utiliza un cliente durante la renovación del arrendamiento cuando la dirección del cliente es válida y utilizable, no durante el proceso de adquisición de una dirección. El cliente coloca su propia dirección IPv4 en este campo solamente si tiene una dirección IPv4 válida mientras se encuentra en el estado vinculado. De lo contrario, establece el campo en 0.
  • Su dirección IP (YIADDR) (4B): la utiliza el servidor para asignar una dirección IPv4 al cliente.
  • Dirección IP del servidor (SIADDR) (4B): la utiliza el servidor para identificar la dirección del servidor que debe utilizar el cliente para el próximo paso en el proceso bootstrap, que puede ser, o no, el servidor que envía esta respuesta. El servidor emisor siempre incluye su propia dirección IPv4 en un campo especial llamado opción DHCPv4 Server Identifier (Identificador de servidores DHCPv4).
  • Dirección IP del gateway (GIADDR) (4B): enruta los mensajes DHCPv4 cuando intervienen los agentes de retransmisión DHCPv4. La dirección del gateway facilita las comunicaciones de las solicitudes y respuestas de DHCPv4 entre el cliente y un servidor que se encuentran en distintas subredes o redes.
  • Dirección de hardware del cliente (CHADDR) (16B): especifica la capa física del cliente.
  • Nombre del servidor (SNAME) (64B): lo utiliza el servidor que envía un mensaje DHCPOFFER o DHCPACK. El servidor puede, de manera optativa, colocar su nombre en este campo. Puede tratarse de un simple apodo de texto o un nombre de dominio DNS, como dhcpserver.gnulinuxdocs.com.
  • Nombre del archivo de arranque (128B): lo utiliza un cliente de manera optativa para solicitar un determinado tipo de archivo de arranque en un mensaje DHCPDISCOVER. Lo utiliza un servidor en un DHCPOFFER para especificar completamente un directorio de archivos y un nombre de archivo de arranque.
  • Opciones de DHCP (variable): lo utiliza un cliente de manera optativa para solicitar un determinado tipo de archivo de arranque en un mensaje DHCPDISCOVER. Lo utiliza un servidor en un DHCPOFFER para especificar completamente un directorio de archivos y un nombre de archivo de arranque.

El protocolo DHCP es susceptible de ser atacado, dentro de esos ataques existen dos con un alto porcentaje de peligrosidad para la integridad de una red:

Agotamiento DHCP

El agotamiento de DHCP se produce cuando un cliente realiza muchas solicitudes de direccionamiento IP y el servidor le otorga todas las direcciones IP que tiene disponibles, de esta forma se produce un ataque DoS evitando que otros futuros clientes de la LAN puedan obtener un direccionamiento

Suplantación DHCP

La suplantación de DHCP consiste en situar un servidor DHCP ilegítimo en la red y conseguir responder solicitudes a los clientes que las realicen, de esta forma se pueden llegar a otorgar servidores DNS falsos, que contengan entradas hacia páginas web ilegitimas, y por ende realizar Phishing, ataques MITM, etc… Este ataque se puede utilizar en conjunto con el ataque de agotamiento para dejar al servidor DHCP legítimo sin uso y tener más probabilidades de que el servidor DHCP ilegítimo sea el encargado de dar el direccionamiento IP.

Para evitar este tipo de ataques se podría utilizar un Switch Cisco utilizando el metodo Snooping DHCP, con lo que se conseguiría establecer algunos puertos ‘con permiso’ para enviar, o no, paquetes DHCP. Por ejemplo un rango de puertos tiene permitido recibir paquetes DHCP, pero no enviarlos, si se llega a detectar el envio de un DHCPOFFER en un puerto en el que no esta permitido, este puerto se ‘apagaría’ automáticamente, pero de esto ya hablare otro día, si queréis…

Bueno, después de la teoria básica, vamos a instalar y configurar el servidor DHCP en Linux:

root@linux:/# apt-get install isc-dhcp-server

Al principio nos dará un error al iniciar servicio DHCP, pero podemos omitirlo ya que la subnet no esta declarada, y es normal que ocurra. Acto seguido procederemos a modificar el fichero /etc/dhcp/dhcpd.conf

subnet 192.168.1.0 netmask 255.255.255.0 {
 range 192.168.1.10 192.168.1.254;
 option domain-name-servers 192.168.1.4;
 option domain-name "gnulinuxdocs.com”;
 option broadcast-address 192.168.1.255;
 option router 192.168.1.1;
 default-lease-time 600;
 max-lease-time 7200;
}
  • subnet: la línea subnet declarará la dirección de red con su máscara de red en la cual el servidor DHCP va a trabajar.
  • range: en esta línea estableceremos el rango de direcciones IP sobre las cuales el servidor DHCP dará a los clientes.
  • option domain-name-server: en esta línea pondremos la dirección IP del servidor DNS.
  • option domain-name: en esta linea se declara el nombre del dominio, en nuestro caso pccustombcg.com
  • option broadcast-address: en esta línea declaramos la dirección broadcast de nuestra red.
  • option router: esta dirección IP será la dirección que nuestro servidor DHCP entregará como gateway.
  • default-lease-time: esta línea indica el tiempo de asignación en segundos.
  • max-lease-time: esta línea indica el tiempo máximo de asignación en segundos.

La línea Authoritative, debe estar descomentada.

A continuación modificamos el fichero /etc/default/isc-dhcp-server, y añadimos la interfaz de escucha, por la cual el servicio de DHCP repartirá las IPs.

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. “eth0 eth1”
INTERFACES=”eth1”

Una vez finalizamos la configuración, iniciamos el servicio de DHCP

root@linux:/# service isc-dhcp-server start

De esta forma ya estaría disponible en el servidor DHCP. Cuando un cliente se conecte a nuestra red y en él establezcamos una configuración de direccionamiento IP mediante DHCP, enviará un paquete DHCPDISCOVER sobre la dirección broadcast 255.255.255.255. Nuestro servidor responderá a esta petición con un paquete DHCPOFFER, como comentamos anteriormente.

Como plus, para visualizar los equipos clientes a los que hemos dado un paquete de direccionamiento IP ejecutamos el siguiente comando:

root@linux:/# less /var/lib/dhcp/dhcpd.leases

#The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.2.2


lease 192.168.1.11 {
starts 2 2014/11/04 10:07:13;
end 2    2014/11/04 10:20:11;
tstp 2   2014/11/04 10:20:11;
cltt  2  2014/11/04 10:07:13;
binding state free;
hardware ethernet 49:59:29:a1:4a:ee;
}


lease 192.168.1.12 {
starts 2 2014/11/04 16:16:13;
end 2    2014/11/04 16:26:13;
tstp 2   2014/11/04 16:26:13;
cltt  2  2014/11/04 16:16:13;
binding state free;
hardware ethernet d4:6e:5c:54:f0:7b;
}

De esta forma podemos tener controlados los clientes DHCP así que ¡echar un ojo a lo que tenéis por vuestros dominios!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s