SNMP (Simple Network Management Protocol)
El protocolo SNMP se creó para supervisar los dispositivos de red. Además, puede utilizarse para gestionar tareas de configuración y cambiar ajustes de forma remota. El hardware compatible con SNMP incluye routers, conmutadores, servidores, dispositivos IoT y muchos otros dispositivos que también se pueden consultar y controlar mediante este protocolo estándar. La versión actual es SNMPv3, que aumenta la seguridad de SNMP en particular, pero también la complejidad de uso del protocolo.
SNMP se basa en UDP, un protocolo simple y sin estado, por lo que es susceptible a ataques de IP spoofing y de repetición (replay). Además, las versiones más usadas del protocolo (SNMPv1, v2 y v2c) no ofrecen ningún cifrado del tráfico, lo que significa que la información y las credenciales de SNMP pueden interceptarse fácilmente en una red local. Estas versiones también tienen esquemas de autenticación débiles y suelen dejarse configuradas con las community strings por defecto public (lectura) y private (lectura/escritura). Hasta hace poco, incluso SNMPv3 —que sí incorpora autenticación y cifrado— solía venir configurado por defecto solo con DES-56, un esquema de cifrado débil y fácil de forzar por fuerza bruta; las implementaciones más recientes ya soportan AES-256.
Precisamente por tratarse de un protocolo diseñado para "administrar la red", SNMP es un objetivo de enumeración muy valioso cuando está mal configurado.
Configuración por defecto
La configuración por defecto del demonio SNMP define los ajustes básicos del servicio, incluyendo direcciones IP, puertos, MIB, OIDs, autenticación y cadenas de comunidad.
❯ cat /etc/snmp/snmpd.conf | grep -v "#" | sed -r '/^\s*$/d'
sysLocation Sitting on the Dock of the Bay
sysContact Me <me@example.org>
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 systemonlyConfiguraciones peligrosas
| 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> | Mismo acceso que rwcommunity pero para IPv6. |
Footprinting del servicio
SNMPwalk
❯ snmpwalk -v2c -c public 172.16.61.10
iso.3.6.1.2.1.1.1.0 = STRING: "Linux fileserver01 5.11.0-34-generic #36~20.04.1-Ubuntu SMP Fri Aug 27 08:06:32 UTC 2021 x86_64"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
iso.3.6.1.2.1.1.3.0 = Timeticks: (5134) 0:00:51.34
iso.3.6.1.2.1.1.4.0 = STRING: "jsmith@domain.local"
iso.3.6.1.2.1.1.5.0 = STRING: "fileserver01"
iso.3.6.1.2.1.1.6.0 = STRING: "Sitting on the Dock of the Bay"
iso.3.6.1.2.1.1.7.0 = INTEGER: 72
iso.3.6.1.2.1.1.8.0 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.2.1 = OID: iso.3.6.1.6.3.10.3.1.1
iso.3.6.1.2.1.1.9.1.2.2 = OID: iso.3.6.1.6.3.11.3.1.1
iso.3.6.1.2.1.1.9.1.2.3 = OID: iso.3.6.1.6.3.15.2.1.1
iso.3.6.1.2.1.1.9.1.2.4 = OID: iso.3.6.1.6.3.1
iso.3.6.1.2.1.1.9.1.2.5 = OID: iso.3.6.1.6.3.16.2.2.1
iso.3.6.1.2.1.1.9.1.2.6 = OID: iso.3.6.1.2.1.49
iso.3.6.1.2.1.1.9.1.2.7 = OID: iso.3.6.1.2.1.4
iso.3.6.1.2.1.1.9.1.2.8 = OID: iso.3.6.1.2.1.50
iso.3.6.1.2.1.1.9.1.2.9 = OID: iso.3.6.1.6.3.13.3.1.3
iso.3.6.1.2.1.1.9.1.2.10 = OID: iso.3.6.1.2.1.92
iso.3.6.1.2.1.1.9.1.3.1 = STRING: "The SNMP Management Architecture MIB."
iso.3.6.1.2.1.1.9.1.3.2 = STRING: "The MIB for Message Processing and Dispatching."
iso.3.6.1.2.1.1.9.1.3.3 = STRING: "The management information definitions for the SNMP User-based Security Model."
iso.3.6.1.2.1.1.9.1.3.4 = STRING: "The MIB module for SNMPv2 entities"
iso.3.6.1.2.1.1.9.1.3.5 = STRING: "View-based Access Control Model for SNMP."
iso.3.6.1.2.1.1.9.1.3.6 = STRING: "The MIB module for managing TCP implementations"
iso.3.6.1.2.1.1.9.1.3.7 = STRING: "The MIB module for managing IP and ICMP implementations"
iso.3.6.1.2.1.1.9.1.3.8 = STRING: "The MIB module for managing UDP implementations"
iso.3.6.1.2.1.1.9.1.3.9 = STRING: "The MIB modules for managing SNMP Notification, plus filtering."
iso.3.6.1.2.1.1.9.1.3.10 = STRING: "The MIB module for logging SNMP Notifications."
iso.3.6.1.2.1.1.9.1.4.1 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.2 = Timeticks: (0) 0:00:00.00
...
iso.3.6.1.2.1.25.1.1.0 = Timeticks: (3676678) 10:12:46.78
iso.3.6.1.2.1.25.1.2.0 = Hex-STRING: 07 E5 09 14 0E 2B 2D 00 2B 02 00
iso.3.6.1.2.1.25.1.3.0 = INTEGER: 393216
iso.3.6.1.2.1.25.1.4.0 = STRING: "BOOT_IMAGE=/boot/vmlinuz-5.11.0-34-generic root=UUID=9a6a5c52-f92a-42ea-8ddf-940d7e0f4223 ro quiet splash"
iso.3.6.1.2.1.25.1.5.0 = Gauge32: 3
iso.3.6.1.2.1.25.1.6.0 = Gauge32: 411
iso.3.6.1.2.1.25.1.7.0 = INTEGER: 0
iso.3.6.1.2.1.25.1.7.0 = No more variables left in this MIB View (It is past the end of the MIB tree)
...SNIP...
iso.3.6.1.2.1.25.6.3.1.2.1232 = STRING: "printer-driver-sag-gdi_0.1-7_all"
iso.3.6.1.2.1.25.6.3.1.2.1233 = STRING: "printer-driver-splix_2.0.0+svn315-7fakesync1build1_amd64"
iso.3.6.1.2.1.25.6.3.1.2.1234 = STRING: "procps_2:3.3.16-1ubuntu2.3_amd64"
iso.3.6.1.2.1.25.6.3.1.2.1235 = STRING: "proftpd-basic_1.3.6c-2_amd64"
iso.3.6.1.2.1.25.6.3.1.2.1236 = STRING: "proftpd-doc_1.3.6c-2_all"
iso.3.6.1.2.1.25.6.3.1.2.1237 = STRING: "psmisc_23.3-1_amd64"
iso.3.6.1.2.1.25.6.3.1.2.1238 = STRING: "publicsuffix_20200303.0012-1_all"
iso.3.6.1.2.1.25.6.3.1.2.1239 = STRING: "pulseaudio_1:13.99.1-1ubuntu3.12_amd64"
iso.3.6.1.2.1.25.6.3.1.2.1240 = STRING: "pulseaudio-module-bluetooth_1:13.99.1-1ubuntu3.12_amd64"
iso.3.6.1.2.1.25.6.3.1.2.1241 = STRING: "pulseaudio-utils_1:13.99.1-1ubuntu3.12_amd64"
iso.3.6.1.2.1.25.6.3.1.2.1242 = STRING: "python-apt-common_2.0.0ubuntu0.20.04.6_all"
iso.3.6.1.2.1.25.6.3.1.2.1243 = STRING: "python3_3.8.2-0ubuntu2_amd64"
iso.3.6.1.2.1.25.6.3.1.2.1244 = STRING: "python3-acme_1.1.0-1_all"
iso.3.6.1.2.1.25.6.3.1.2.1245 = STRING: "python3-apport_2.20.11-0ubuntu27.21_all"
iso.3.6.1.2.1.25.6.3.1.2.1246 = STRING: "python3-apt_2.0.0ubuntu0.20.04.6_amd64"
...SNIP...- Con la community string
public(lectura) se puede volcar el árbol MIB completo: hostname, contacto del administrador (jsmith@domain.local), lista de paquetes/software instalado y mucho más, sin autenticación real.
OneSixtyOne - Fuerza bruta de community strings
❯ sudo apt install onesixtyone❯ onesixtyone -c /opt/useful/SecLists/Discovery/SNMP/snmp.txt 172.16.61.10
Scanning 1 hosts, 3220 communities
172.16.61.10 [public] Linux fileserver01 5.11.0-37-generic #41~20.04.2-Ubuntu SMP Fri Sep 24 09:06:38 UTC 2021 x86_64-c: archivo con la lista de community strings a probar.- Útil cuando
public/privateno funcionan directamente y se necesita descubrir la cadena real configurada.
Braa - Consultas SNMP en bloque
❯ sudo apt install braaSintaxis general:
braa <community string>@<IP>:.1.3.6.*❯ braa public@172.16.61.10:.1.3.6.*
172.16.61.10:20ms:.1.3.6.1.2.1.1.1.0:Linux fileserver01 5.11.0-34-generic #36~20.04.1-Ubuntu SMP Fri Aug 27 08:06:32 UTC 2021 x86_64
172.16.61.10:20ms:.1.3.6.1.2.1.1.2.0:.1.3.6.1.4.1.8072.3.2.10
172.16.61.10:20ms:.1.3.6.1.2.1.1.3.0:548
172.16.61.10:20ms:.1.3.6.1.2.1.1.4.0:jsmith@domain.local
172.16.61.10:20ms:.1.3.6.1.2.1.1.5.0:fileserver01
172.16.61.10:20ms:.1.3.6.1.2.1.1.6.0:US
172.16.61.10:20ms:.1.3.6.1.2.1.1.7.0:78
...SNIP...- A diferencia de
snmpwalk(que hace una consulta secuencial),braaes mucho más rápido para consultas masivas porque envía múltiples solicitudes en paralelo.
snmp-mibs-downloader - Legibilidad de OIDs
❯ sudo apt install snmp-mibs-downloaderSin las MIBs cargadas, los OIDs se muestran en formato numérico crudo:
iso.3.6.1.2.1.4.31.1.1.32.1 = Counter32: 22214591Para habilitar la resolución de nombres, hay que comentar la línea mibs en /etc/snmp/snmp.conf:
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
#mibs :
# If you want to globally change where snmp libraries, commands and daemons
# look for MIBS, change the line below. Note you can set this for individual
# tools with the -M option or MIBDIRS environment variable.
#
# mibdirs /usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietfAsí se obtiene una salida mucho más legible, con nombres en vez de OIDs numéricos:
IF-MIB::ifInOctets.1 = Counter32: 22214591MIB Tree - OIDs útiles en entornos Windows
Al igual que en Linux, en hosts Windows con SNMP habilitado se pueden consultar OIDs específicos para obtener información sensible:
| OID | Descripción |
|---|---|
1.3.6.1.2.1.25.1.6.0 | System Processes |
1.3.6.1.2.1.25.4.2.1.2 | Running Programs |
1.3.6.1.2.1.25.4.2.1.4 | Processes Path |
1.3.6.1.2.1.25.2.3.1.4 | Storage Units |
1.3.6.1.2.1.25.6.3.1.2 | Software Name |
1.3.6.1.4.1.77.1.2.25 | User Accounts |
1.3.6.1.2.1.6.13.1.3 | TCP Local Ports |
Ejemplo de consulta de usuarios locales de Windows vía SNMP:
❯ snmpwalk -c public -v1 172.16.61.20 1.3.6.1.4.1.77.1.2.25
iso.3.6.1.4.1.77.1.2.25.1.1.5.71.117.101.115.116 = STRING: "Guest"
iso.3.6.1.4.1.77.1.2.25.1.1.6.107.114.98.116.103.116 = STRING: "krbtgt"
iso.3.6.1.4.1.77.1.2.25.1.1.7.115.116.117.100.101.110.116 = STRING: "student"
iso.3.6.1.4.1.77.1.2.25.1.1.13.65.100.109.105.110.105.115.116.114.97.116.111.114 = STRING: "Administrator"Enumerar procesos en ejecución:
❯ snmpwalk -c public -v1 172.16.61.20 1.3.6.1.2.1.25.4.2.1.2
iso.3.6.1.2.1.25.4.2.1.2.1 = STRING: "System Idle Process"
iso.3.6.1.2.1.25.4.2.1.2.4 = STRING: "System"
iso.3.6.1.2.1.25.4.2.1.2.316 = STRING: "svchost.exe"
iso.3.6.1.2.1.25.4.2.1.2.540 = STRING: "winlogon.exe"
iso.3.6.1.2.1.25.4.2.1.2.616 = STRING: "services.exe"
iso.3.6.1.2.1.25.4.2.1.2.632 = STRING: "lsass.exe"
...Enumerar la ruta completa de cada proceso (complementa el listado anterior, revelando desde qué directorio se ejecuta cada binario — útil para detectar software instalado en rutas no estándar):
❯ snmpwalk -c public -v1 172.16.61.20 1.3.6.1.2.1.25.4.2.1.4
iso.3.6.1.2.1.25.4.2.1.4.316 = STRING: "C:\Windows\System32\svchost.exe"
iso.3.6.1.2.1.25.4.2.1.4.632 = STRING: "C:\Windows\System32\lsass.exe"
...Enumerar unidades de almacenamiento (discos, particiones y su uso):
❯ snmpwalk -c public -v1 172.16.61.20 1.3.6.1.2.1.25.2.3.1.4
iso.3.6.1.2.1.25.2.3.1.4.1 = STRING: "C:\ Label: Serial Number 1a2b3c4d"
iso.3.6.1.2.1.25.2.3.1.4.4 = STRING: "Virtual Memory"
iso.3.6.1.2.1.25.2.3.1.4.7 = STRING: "D:\ Label:Backup Serial Number 5e6f7g8h"
...- Un disco
D:etiquetado como "Backup" puede ser una pista para investigar recursos compartidos adicionales o buscar copias de seguridad con información sensible expuesta.
Enumerar puertos TCP actualmente en escucha:
❯ snmpwalk -c public -v1 172.16.61.20 1.3.6.1.2.1.6.13.1.3
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.88.0.0.0.0.0 = INTEGER: 88
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.445.0.0.0.0.0 = INTEGER: 445
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.3389.0.0.0.0.0 = INTEGER: 3389- Esto puede revelar puertos que escuchan solo localmente y que no aparecerían en un escaneo de puertos normal desde fuera del host.
Footprinting con Nmap
Escaneo del puerto UDP 161 (SNMP) a nivel de red:
❯ sudo nmap -sU --open -p 161 172.16.61.1-254 -oG open-snmp.txtScripts NSE específicos de SNMP:
❯ nmap -sU -p161 --script snmp-sysdescr,snmp-processes,snmp-win32-users,snmp-win32-shares 172.16.61.20snmp-sysdescr: obtiene la descripción del sistema.snmp-processes: lista procesos en ejecución.snmp-win32-users: enumera usuarios locales en hosts Windows.snmp-win32-shares: enumera recursos compartidos SMB visibles vía SNMP.
Explotación adicional
Escritura remota con snmpset (community de escritura)
Si además de la rocommunity (solo lectura) existe una rwcommunity (lectura/escritura) accesible, se puede modificar valores del sistema de forma remota usando snmpset:
❯ snmpset -c private -v2c 172.16.61.10 1.3.6.1.2.1.1.6.0 s "Ubicacion modificada por pentest"- La sintaxis general es
snmpset -c <community> -v<version> <IP> <OID> <tipo> <valor>(s= string,i= integer, etc.). - Muchos dispositivos de red empresariales (routers, switches, firewalls) exponen, a través de sus propios MIBs privados (extensiones del árbol OID específicas de cada fabricante), funciones de gestión avanzada como exportar su configuración completa hacia un servidor remoto. Si la community de escritura está expuesta, un atacante puede invocar esa misma función para forzar al dispositivo a enviar su configuración hacia un servidor bajo su control (por ejemplo, vía TFTP), sin necesidad de acceder al dispositivo por ningún otro medio.
- El archivo de configuración resultante suele contener información muy sensible: contraseñas de administración, claves precompartidas de VPN, y otras credenciales almacenadas en texto plano o con cifrado débil/reversible.
- Este vector es especialmente crítico en entornos donde la misma community string de escritura se reutiliza en todos los dispositivos de red de una organización (un error de gestión común): comprometer un solo equipo mal configurado puede llevar a comprometer toda la infraestructura de red mediante el mismo procedimiento repetido contra cada dispositivo.
- La sintaxis exacta de los OIDs a usar depende del fabricante y modelo del dispositivo (cada uno define su propio MIB privado para estas funciones), por lo que conviene consultar la documentación del fabricante o el propio MIB del dispositivo antes de intentarlo.