🔍 Enumeración SNMP en el puerto 161: la puerta trasera que muchos olvidan asegurar
El puerto 161/UDP es el hogar de SNMP (Simple Network Management Protocol), un protocolo pensado para monitorizar y gestionar dispositivos de red de forma remota. Suena inofensivo, pero cuando la configuración es débil (cadenas de comunidad por defecto, acceso de lectura/escritura sin autenticación) se convierte en una mina de información —y a veces en una vía de control— sobre el sistema objetivo. En este artículo repasamos cómo detectarlo, qué configuraciones son peligrosas y cómo enumerarlo a fondo con onesixtyone, snmpwalk/snmpbulkwalk y braa.
💡 Paso 1 — Detectar el puerto 161 abierto
Como SNMP funciona sobre UDP, hay que indicárselo explícitamente a Nmap:
nmap 10.129.2.28 -F -sU
nmap -sU --top-ports 1000 --min-rate 5000 -T4 10.129.144.145
Una vez localizado el puerto, podemos profundizar con un escaneo específico de versión y scripts:
nmap -sUCV -P161 IP -On udpsCAN
El puerto 161 es el puerto predeterminado de los dispositivos de red a los que se envían las consultas SNMP durante los procesos de descubrimiento y supervisión. SNMP (RFC 1157) nació para monitorizar equipos de red, pero también permite gestionar tareas de configuración y cambiar ajustes de forma remota.
🔐 Paso 2 — Entender la configuración del demonio SNMP
La configuración por defecto del demonio SNMP vive en /etc/snmp/snmpd.conf y define aspectos básicos como direcciones IP, puertos, MIB, OID, autenticación y cadenas de comunidad. Un ejemplo típico, filtrando comentarios y líneas vacías:
Jesuslopez@htb[/htb]$ cat /etc/snmp/snmpd.conf | grep -v "#" | sed -r '/^\s*$/d'
sysLocation Sitting on the Dock of the Bay
sysContact Me <[email protected]>
sysServices 72
master agentx
agentaddress 127.0.0.1,[::1]
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
rocommunity public default -V systemonly
rocommunity6 public default -V systemonly
rouser authPrivUser authpriv -V systemonly
Todos los ajustes disponibles para el demonio SNMP están documentados en la página de manual.
🚫 ¿Qué salió mal? Configuraciones peligrosas
Algunos administradores dejan ajustes que amplían demasiado el acceso a SNMP:
| Ajuste | Descripción |
|---|---|
rwuser noauth |
Proporciona acceso al árbol OID completo sin autenticación. |
rwcommunity <community string> <IPv4 address> |
Proporciona acceso al árbol OID completo independientemente de dónde se enviaron las solicitudes. |
rwcommunity6 <community string> <IPv6 address> |
Equivalente a la anterior, pero para IPv6. |
💡 Paso 3 — Encontrar la community string con onesixtyone
Para hacer un seguimiento de SNMP contamos con herramientas como snmpwalk, onesixtyone y braa. onesixtyone se usa para forzar nombres de cadenas de comunidad, ya que el administrador puede nombrarlas de forma arbitraria, mientras que snmpwalk se usa para consultar los OID y su información. Como estas cadenas pueden vincularse a cualquier fuente, identificarlas puede llevar tiempo.
Lo primero es averiguar la community string con onesixtyone:
onesixtyone -c /usr/share/wordlists/seclists/Discovery/SNMP/common-snmp-community-strings-onesixtyone.txt 192.168.201.145
Esto puede devolver algo como:
10.10.10.92 [public] Linux Mischief 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64
En este caso deducimos que la community string es public. Ojo: existen más diccionarios además de ese, así que si no hay resultados conviene probar con otros.
💡 Paso 4 — Volcar información con snmpwalk / snmpbulkwalk
Con la community string en la mano, toca volcar toda la información disponible:
snmpwalk -c public -v2c 10.10.10.10 > snmpenum.rb
# para que vaya mas rapido
snmpbulkwalk -c public -v2c 192.168.201.145 > snmpenum.rb
## tambien para maquinas
snmpwalk -v2c -c public 192.168.201.145 NET-SNMP-EXTEND-MIB::nsExtendObjects
snmpwalk -v2c -c security 192.168.111.110 > enum.rb
Si en la salida vemos nombres en lugar de números a la izquierda (por ejemplo SNMPv2-SMI) y líneas como iso.3.6.1.2.1.1.9.1.2.8 = OID: iso.3.6.1.2.1.50, estamos ante un OID: un nodo en un espacio de nombres jerárquico. Una secuencia de números identifica de forma única cada nodo y permite ubicarlo en el árbol —cuanto más larga es la cadena, más específica es la información—. Muchos nodos no son más que referencias a los que tienen por debajo. Podemos consultar MIB y sus OID asociados en el registro de identificadores de objetos.
Para ver los nombres en lugar de los números crudos, se puede instalar:
apt install snmp-mibs-downloader
Y luego, en /etc/snmp/snmp.conf, comentar la línea:
#mibs
Si el volcado va muy lento, snmpbulkwalk es la alternativa más eficiente, ya que hace lo mismo pero de forma más potente.
💡 Paso 5 — Diferenciar IPv4 e IPv6
Es habitual que por IPv4 se expongan unos puertos/servicios y por IPv6 aparezcan otros distintos. Para detectarlo usamos el parámetro ipAddressType:
snmpwalk -c public -v2c 10.10.10.10 ipAddressType
Lo que puede devolver algo como:
IP-MIB::ipAddressType.ipv6."de:ad:be:ef:00:00:00:00:02:50:56:ff:fe:b9:39:75" = INTEGER: unicast(1)
De esa cadena hexadecimal se obtiene la dirección IPv6: dead:beef::250:56ff:feb9:3975.
💡 Paso 6 — Enumerar procesos en ejecución
Si en una web hemos visto, por ejemplo, un proceso python BaseHTTPServer escuchando en el puerto 33366, podemos enumerar los procesos del sistema con el parámetro hrSWRunName:
snmpwalk -c public -v2c 10.10.10.10 hrSWRunName
Y filtrar por el proceso que nos interesa, en este caso python:
snmpwalk -c public -v2c 10.10.10.10 hrSWRunName | grep "python"
o tambien .1.3.6.1.2.1.25.6.3.1.2 en vez de hrSWRunName
Esto nos da el identificador del proceso:
HOST-RESOURCES-MIB::hrSWRunName.718 = STRING: "python"
Con ese identificador (718 en este caso) podemos obtener más detalle sobre el proceso, incluyendo los comandos ejecutados:
snmpwalk -c public -v2c 10.10.10.10 hrSWRunTable | grep "718"
💡 Paso 7 — Jugar con el árbol OID
Cuando snmpwalk recorre el sistema, por defecto no empieza desde la raíz: arranca desde el 2:
snmpwalk -c public -v2c 10.10.10.10 2
Esto es clave cuando no encontramos nada relevante, ya que forzando el 1 podemos descubrir información mucho más interesante que queda fuera del recorrido por defecto:
snmpwalk -c public -v2c 10.10.10.10 1
🔍 Nota sobre patrones en las community strings
A menudo, cuando ciertas cadenas de comunidad están vinculadas a direcciones IP específicas, se nombran con el nombre de host del equipo, y a veces incluso se añaden símbolos para dificultar su identificación. Sin embargo, en una red extensa con más de 100 servidores gestionados mediante SNMP, esas etiquetas suelen seguir algún patrón, lo que nos permite usar reglas para adivinarlas. Para generar listas de palabras personalizadas basadas en esos patrones podemos usar la herramienta Crunch. Crear wordlists personalizadas no es el foco de este artículo, pero se puede profundizar en el módulo Cracking Passwords With Hashcat.
💡 Paso 8 — Enumerar con Braa como alternativa a snmpwalk
Además de snmpwalk, podemos usar braa una vez tenemos una community string:
Jesuslopez@htb[/htb]$ sudo apt install braa
Jesuslopez@htb[/htb]$ braa @:.1.3.6.* # Syntax
Jesuslopez@htb[/htb]$ braa [email protected]:.1.3.6.*
10.129.14.128:20ms:.1.3.6.1.2.1.1.1.0:Linux htb 5.11.0-34-generic #36~20.04.1-Ubuntu SMP Fri Aug 27 08:06:32 UTC 2021 x86_64
10.129.14.128:20ms:.1.3.6.1.2.1.1.2.0:.1.3.6.1.4.1.8072.3.2.10
10.129.14.128:20ms:.1.3.6.1.2.1.1.3.0:548
10.129.14.128:20ms:.1.3.6.1.2.1.1.4.0:[email protected]
10.129.14.128:20ms:.1.3.6.1.2.1.1.5.0:htb
10.129.14.128:20ms:.1.3.6.1.2.1.1.6.0:US
10.129.14.128:20ms:.1.3.6.1.2.1.1.7.0:78
...SNIP...
✅ Buenas prácticas / conclusión
SNMP es un protocolo potente para administrar redes, pero su configuración por defecto (community strings públicas, acceso de lectura/escritura sin autenticación) lo convierte en una fuente habitual de fugas de información durante una auditoría: procesos en ejecución, comandos lanzados, interfaces de red tanto IPv4 como IPv6, e incluso credenciales expuestas en los OID. Si administras un dispositivo con SNMP activo, evita rwuser noauth y las community strings por defecto como public, restringe el acceso por IP y revisa siempre qué información expone tu árbol OID antes de que lo haga un atacante.
