Enumeracion SNMP puerto 161

Enumeracion SNMP puerto 161

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio