Saltar a contenido

SNMP

El Simple Network Management Protocol (SNMP) fue creado para monitorear dispositivos de red. Además, este protocolo también se puede usar para manejar tareas de configuración y cambiar configuraciones de forma remota. El hardware habilitado para SNMP incluye routers, switches, servidores, dispositivos IoT y muchos otros dispositivos que también se pueden consultar y controlar usando este protocolo estándar. Por lo tanto, es un protocolo para monitorear y gestionar dispositivos de red. Además, las tareas de configuración se pueden manejar y los ajustes se pueden hacer de forma remota utilizando este estándar. La versión actual es SNMPv3, que aumenta la seguridad de SNMP en particular, pero también la complejidad de usar este protocolo.

Además del intercambio puro de información, SNMP también transmite comandos de control utilizando agentes a través del puerto UDP 161. El cliente puede establecer valores específicos en el dispositivo y cambiar opciones y configuraciones con estos comandos. Mientras que en la comunicación clásica, siempre es el cliente quien solicita activamente información del servidor, SNMP también permite el uso de los llamados traps a través del puerto UDP 162. Estos son paquetes de datos enviados desde el servidor SNMP al cliente sin ser solicitados explícitamente. Si un dispositivo está configurado en consecuencia, se envía un trap SNMP al cliente una vez que ocurre un evento específico en el lado del servidor.

Para que el cliente y el servidor SNMP intercambien los valores respectivos, los objetos SNMP disponibles deben tener direcciones únicas conocidas en ambos lados. Este mecanismo de direccionamiento es un requisito absoluto para la transmisión exitosa de datos y la supervisión de la red utilizando SNMP.

MIB

Para garantizar que el acceso SNMP funcione a través de fabricantes y con diferentes combinaciones cliente-servidor, se creó la Management Information Base (MIB). MIB es un formato independiente para almacenar información de dispositivos. Un MIB es un archivo de texto en el que se enumeran todos los objetos SNMP consultables de un dispositivo en una jerarquía de árbol estandarizada. Contiene al menos un Object Identifier (OID), que, además de la dirección única necesaria y un nombre, también proporciona información sobre el tipo, los derechos de acceso y una descripción del objeto respectivo. Los archivos MIB se escriben en el formato de texto ASCII basado en Abstract Syntax Notation One (ASN.1). Los MIB no contienen datos, pero explican dónde encontrar qué información y cómo se ve, qué valores devuelve el OID específico o qué tipo de datos se usa.

OID

Un OID representa un nodo en un espacio de nombres jerárquico. Una secuencia de números identifica de manera única cada nodo, lo que permite determinar la posición del nodo en el árbol. Cuanto más larga sea la cadena, más específica será la información. Muchos nodos en el árbol OID no contienen nada excepto referencias a los nodos debajo de ellos. Los OIDs consisten en enteros y generalmente se concatenan por notación de puntos. Podemos buscar muchos MIB para los OIDs asociados en el Object Identifier Registry.

SNMPv1

La versión 1 de SNMP (SNMPv1) se utiliza para la gestión y el monitoreo de redes. SNMPv1 es la primera versión del protocolo y todavía se utiliza en muchas redes pequeñas. Admite la recuperación de información de dispositivos de red, permite la configuración de dispositivos y proporciona traps, que son notificaciones de eventos. Sin embargo, SNMPv1 no tiene mecanismo de autenticación incorporado, lo que significa que cualquiera que acceda a la red puede leer y modificar los datos de la red. Otro fallo principal de SNMPv1 es que no admite la cifrado, lo que significa que todos los datos se envían en texto claro y pueden ser fácilmente interceptados.

SNMPv2

SNMPv2 existió en diferentes versiones. La versión que aún existe hoy en día es v2c, y la extensión c significa SNMP basado en comunidad. En cuanto a la seguridad, SNMPv2 está a la par con SNMPv1 y se ha ampliado con funciones adicionales del SNMP basado en partes que ya no se utiliza. Sin embargo, un problema significativo con la ejecución inicial del protocolo SNMP es que la cadena de comunidad que proporciona seguridad solo se transmite en texto claro, lo que significa que no tiene cifrado incorporado.

SNMPv3

La seguridad se ha incrementado enormemente para SNMPv3 mediante funciones de seguridad como la autenticación utilizando nombre de usuario y contraseña y la cifrado (a través de clave precompartida) de los datos. Sin embargo, la complejidad también aumenta en la misma medida, con muchas más opciones de configuración que v2c.

Community Strings

Las cadenas de comunidad se pueden ver como contraseñas que se utilizan para determinar si la información solicitada se puede ver o no. Es importante tener en cuenta que muchas organizaciones todavía utilizan SNMPv2, ya que la transición a SNMPv3 puede ser muy compleja, pero los servicios aún deben permanecer activos. Esto causa mucha preocupación a muchos administradores y crea algunos problemas que desean evitar. La falta de conocimiento sobre cómo se puede obtener la información y cómo nosotros, como atacantes, la usamos, hace que el enfoque de los administradores parezca inexplicable. Al mismo tiempo, la falta de cifrado de los datos enviados también es un problema. Porque cada vez que las cadenas de comunidad se envían a través de la red, pueden ser interceptadas y leídas.


Default Configuration

La configuración predeterminada del daemon SNMP define la configuración básica para el servicio, que incluye las direcciones IP, los puertos, MIB, OIDs, autenticación y cadenas de comunidad.

SNMP Daemon Config

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 systemonly

La configuración de este servicio también se puede cambiar de muchas maneras. Por lo tanto, recomendamos configurar una VM para instalar y configurar el servidor SNMP nosotros mismos. Todas las configuraciones que se pueden hacer para el daemon SNMP están definidas y descritas en la manpage.


Dangerous Settings

Algunas configuraciones peligrosas que el administrador puede hacer con SNMP son:

Configuraciones Descripción
rwuser noauth Proporciona acceso al árbol completo de OID sin autenticación.
rwcommunity <community string> <IPv4 address> Proporciona acceso al árbol completo de OID sin importar de dónde se enviaron las solicitudes.
rwcommunity6 <community string> <IPv6 address> Mismo acceso que con rwcommunity con la diferencia de usar IPv6.

Footprinting the Service

Para reconocer SNMP, podemos usar herramientas como snmpwalk, onesixtyone y braa. Snmpwalk se utiliza para consultar los OIDs con su información. Onesixtyone se puede usar para forzar los nombres de las cadenas de comunidad, ya que pueden ser nombrados arbitrariamente por el administrador. Dado que estas cadenas de comunidad pueden estar vinculadas a cualquier fuente, identificar las cadenas de comunidad existentes puede llevar bastante tiempo.

SNMPwalk

snmpwalk -v2c -c public 10.129.14.128

iso.3.6.1.2.1.1.1.0 = STRING: "Linux htb 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: "mrb3n@inlanefreight.htb"
iso.3.6.1.2.1.1.5.0 = STRING: "htb"
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.1.9.1.4.3 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.4 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.5 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.6 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.7 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.8 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.9 = Timeticks: (0) 0:00:00.00
iso.3.6.1.2.1.1.9.1.4.10 = 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...

En caso de una configuración incorrecta, obtendríamos aproximadamente los mismos resultados de snmpwalk como se muestra arriba. Una vez que conocemos la cadena de comunidad y el servicio SNMP que no requiere autenticación (versiones 1, 2c), podemos consultar información interna del sistema como en el ejemplo anterior.

Aquí reconocemos algunos paquetes de Python que se han instalado en el sistema. Si no conocemos la cadena de comunidad, podemos usar onesixtyone y las listas de palabras de SecLists para identificar estas cadenas de comunidad.

OneSixtyOne

sudo apt install onesixtyone
onesixtyone -c /opt/useful/SecLists/Discovery/SNMP/snmp.txt 10.129.14.128

Scanning 1 hosts, 3220 communities
10.129.14.128 [public] Linux htb 5.11.0-37-generic #41~20.04.2-Ubuntu SMP Fri Sep 24 09:06:38 UTC 2021 x86_64

A menudo, cuando ciertas cadenas de comunidad están vinculadas a direcciones IP específicas, se nombran con el nombre del host y, a veces, se agregan símbolos a estos nombres para hacerlos más difíciles de identificar. Sin embargo, si imaginamos una red extensa con más de 100 servidores diferentes gestionados mediante SNMP, las etiquetas, en ese caso, tendrán algún patrón. Por lo tanto, podemos usar diferentes reglas para adivinarlas. Podemos usar la herramienta crunch para crear listas de palabras personalizadas. Crear listas de palabras personalizadas no es una parte esencial de este módulo, pero se pueden encontrar más detalles en el módulo Cracking Passwords With Hashcat.

Una vez que conocemos una cadena de comunidad, podemos usarla con braa para forzar los OIDs individuales y enumerar la información detrás de ellos.

Braa

sudo apt install braa
braa <community string>@<IP>:.1.3.6.*   # Syntax
braa public@10.129.14.128:.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:mrb3n@inlanefreight.htb
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...

Una vez más, nos gustaría señalar que la configuración independiente del servicio SNMP nos brindará una gran variedad de experiencias diferentes que ningún tutorial puede reemplazar. Por lo tanto, recomendamos encarecidamente configurar una VM con SNMP, experimentar con ella y probar diferentes configuraciones. SNMP puede ser una bendición para un administrador de sistemas de TI, así como una maldición para los analistas de seguridad y los gerentes por igual.