SNMP (Simple Network Management Protocol)

🔎 Introduction

Le protocole SNMP permet de superviser, configurer et gérer à distance des équipements réseau tels que les routeurs, switches, serveurs, imprimantes ou objets connectés. Il est présent dans trois versions principales : SNMPv1, SNMPv2c, et SNMPv3.

SNMP repose sur un modèle client-serveur :

  • Le serveur SNMP ("agent") est installé sur l'équipement supervisé.

  • Le client SNMP ("manager") interroge ou configure l'agent.

Les communications s'effectuent via :

  • UDP port 161 : requêtes classiques (get, set, etc.)

  • UDP port 162 : messages d'alerte appelés traps


🌐 MIB (Management Information Base)

Pour standardiser les accès SNMP entre équipements de différents constructeurs, la MIB définit tous les objets SNMP disponibles sous forme de hiérarchie arborescente. Une MIB :

  • Est un fichier texte (ASN.1) listant tous les objets interrogeables

  • Contient des OID (Object Identifiers)

  • Décrit les droits d'accès, types et descriptions de chaque objet


🔢 OID (Object Identifier)

Un OID identifie de manière unique chaque objet SNMP dans une arborescence hiérarchique. Il est représenté par une série de chiffres séparés par des points (ex: 1.3.6.1.2.1.1.1.0).

Plus la chaîne est longue, plus l'objet visé est précis.


🏛️ Versions du protocole

🔹 SNMPv1

  • Première version

  • Aucune authentification ni chiffrement

  • Données transmises en clair

🔹 SNMPv2c

  • Version communautaire ("community-based")

  • Fonctionnalités améliorées

  • Pas de sécurité supplémentaire : les community strings sont en clair

🔹 SNMPv3

  • Authentification par nom d'utilisateur + mot de passe

  • Chiffrement des communications (authPriv)

  • Beaucoup plus sûr, mais plus complexe à configurer


🔐 Community Strings

Les community strings sont des "mots de passe" d'accès aux données SNMP.

  • public : souvent utilisé pour lecture seule

  • private : souvent utilisé pour lecture/écriture

Ces chaînes sont transmises en clair dans SNMPv1 et v2c, ce qui les rend vulnérables.


⚙️ Configuration par défaut (Linux SNMP Daemon)

$ 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
rocommunity  public default -V systemonly

⚡ Paramètres à risque

Paramètre
Description

rwuser noauth

Accès complet à l'arbre OID sans authentification

rwcommunity <community> <IP>

Accès en lecture/écriture sans restriction d'origine


🕵️‍♂️ Footprinting & Enumeration

🔹 snmpwalk

Permet de parcourir l'arbre MIB et de récupérer toutes les données disponibles.

snmpwalk -v2c -c public 10.129.14.128

Extrait :

iso.3.6.1.2.1.1.5.0 = STRING: "htb"
iso.3.6.1.2.1.1.4.0 = STRING: "admin@inlanefreight.htb"

🔹 onesixtyone

Brute-force de community strings (avec SecLists) :

onesixtyone -c /opt/useful/seclists/Discovery/SNMP/snmp.txt 10.129.14.128

🔹 braa

Brute-force des OID individuellement :

braa public@10.129.14.128:.1.3.6.*

🔫 Utilisation offensive

  • Si la configuration est trop permissive (v1/v2c + public ouvert), il est possible de récupérer :

    • Liste des paquets installés

    • Interfaces réseau

    • Processus actifs

    • Informations système (nom d'hôte, uptime, etc.)


📚 Ressources utiles


Enumerate the SNMP service and obtain the email address of the admin. Submit it as the answer.

Afin de répondre à cette question ainsi qu'aux prochaines, nous exécutons la commande suivante :

$ snmpwalk -c public -v 2c "10.129.98.246"

Concernant cette question, nous relevons la ligne suivante :

iso.3.6.1.2.1.1.4.0 = STRING: "devadmin <devadmin@inlanefreight.htb>"

Le mail de l'administrateur est donc devadmin@inlanefreight.htb.


What is the customized version of the SNMP server?

Nous observons la ligne suivante :

iso.3.6.1.2.1.1.6.0 = STRING: "InFreight SNMP v0.91"

La version du serveur est donc InFreight SNMP v0.91.


Enumerate the custom script that is running on the system and submit its output as the answer.

La même commande me permets de voir la ligne suivante :

iso.3.6.1.2.1.25.1.7.1.3.1.1.4.70.76.65.71 = STRING: "HTB{5nMp_fl4g_uidhfljnsldiuhbfsdij44738b2u763g}"

Nous obtenons ainsi le flag :

HTB{5nMp_fl4g_uidhfljnsldiuhbfsdij44738b2u763g}

Mis à jour