====== Analyse du protocole ====== Nous allons regarder avec [[http://www.wireshark.org/|Wireshark]], notre sniffeur favori, ce qu'il se passe en utilisant trois commandes classiques : ''snmpget'', ''snmpwalk'' et ''snmpbulkwalk'' (utilisable seulement avec la version v2c ou supérieure de SNMP). ===== snmpget ===== Demandons, une fois encore à notre switch de nous dire son nom : ~$ snmpget -v 1 -c public -Ot 172.16.252.2 SNMPv2-MIB::sysName.0 SNMPv2-MIB::sysName.0 = STRING: ProCurve Switch 2650-1 Voyons ce que notre sniffeur a épié :
No.     Time        Source                Destination           Protocol Info
      1 0.000000    192.168.0.16          172.16.252.2          SNMP     get-request 1.3.6.1.2.1.1.5.0

Frame 1 (85 bytes on wire, 85 bytes captured)
...
User Datagram Protocol, Src Port: 42380 (42380), Dst Port: snmp (161)
    Source port: 42380 (42380)
    Destination port: snmp (161)
    Length: 51
    Checksum: 0x6910 [validation disabled]
        [Good Checksum: False]
        [Bad Checksum: False]
Simple Network Management Protocol
    version: version-1 (0)
    community: public
    data: get-request (0)
        get-request
            request-id: 925410341
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.2.1.1.5.0: Value (Null)
                    Object Name: 1.3.6.1.2.1.1.5.0 (iso.3.6.1.2.1.1.5.0)
Nous sommes bien en UDP et le port cible est bien 161. SNMP est bien utilisé en version 1, la commande est ''get-request'' et l'OID demandée est ''1.3.6.1.2.1.1.5.0''. La réponse :
No.     Time        Source                Destination           Protocol Info
      2 0.072588    172.16.252.2          192.168.0.16          SNMP     get-response 1.3.6.1.2.1.1.5.0

Frame 2 (107 bytes on wire, 107 bytes captured)
...
User Datagram Protocol, Src Port: snmp (161), Dst Port: 42380 (42380)
    Source port: snmp (161)
    Destination port: 42380 (42380)
    Length: 73
    Checksum: 0x180f [validation disabled]
        [Good Checksum: False]
        [Bad Checksum: False]
Simple Network Management Protocol
    version: version-1 (0)
    community: public
    data: get-response (2)
        get-response
            request-id: 925410341
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.2.1.1.5.0: 50726F43757276652053776974636820323635302D31
                    Object Name: 1.3.6.1.2.1.1.5.0 (iso.3.6.1.2.1.1.5.0)
                    Value (OctetString): 50726F43757276652053776974636820323635302D31
Nous avons la réponse (''get-response''), elle n'est pas très lisible car donnée sous forme numérique (la version 1.2.7 de wireshark semblant avoir du mal avec le décodage de SNMP). Nous ne referons pas la manipulation en v2c, le résultat étant le même. ===== snmpwalk ===== Voyons maintenant la branche ''system'' en entier, avec la commande ''snmpwalk'' : $ snmpwalk -v 1 -c public -Ot 172.16.252.2 SNMPv2-MIB::system SNMPv2-MIB::sysDescr.0 = STRING: ProCurve J4899B Switch 2650, revision H.10.35, ROM H.08.02 (/sw/code/build/fish(mkfs)) SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.11.2.3.7.11.44 DISMAN-EVENT-MIB::sysUpTimeInstance = 1123840470 SNMPv2-MIB::sysContact.0 = STRING: sysop SNMPv2-MIB::sysName.0 = STRING: ProCurve Switch 2650-1 SNMPv2-MIB::sysLocation.0 = STRING: SNMPv2-MIB::sysServices.0 = INTEGER: 74 Wireshark a vu une suite de commandes : No. Time Source Destination Protocol Info 1 0.000000 192.168.0.16 172.16.252.2 SNMP get-next-request 1.3.6.1.2.1.1 2 0.101794 172.16.252.2 192.168.0.16 SNMP get-response 1.3.6.1.2.1.1.1.0 3 0.101915 192.168.0.16 172.16.252.2 SNMP get-next-request 1.3.6.1.2.1.1.1.0 4 0.172930 172.16.252.2 192.168.0.16 SNMP get-response 1.3.6.1.2.1.1.2.0 5 0.173003 192.168.0.16 172.16.252.2 SNMP get-next-request 1.3.6.1.2.1.1.2.0 6 0.244100 172.16.252.2 192.168.0.16 SNMP get-response 1.3.6.1.2.1.1.3.0 7 0.244174 192.168.0.16 172.16.252.2 SNMP get-next-request 1.3.6.1.2.1.1.3.0 8 0.315341 172.16.252.2 192.168.0.16 SNMP get-response 1.3.6.1.2.1.1.4.0 9 0.315412 192.168.0.16 172.16.252.2 SNMP get-next-request 1.3.6.1.2.1.1.4.0 10 0.389045 172.16.252.2 192.168.0.16 SNMP get-response 1.3.6.1.2.1.1.5.0 11 0.389109 192.168.0.16 172.16.252.2 SNMP get-next-request 1.3.6.1.2.1.1.5.0 12 0.460725 172.16.252.2 192.168.0.16 SNMP get-response 1.3.6.1.2.1.1.6.0 13 0.460787 192.168.0.16 172.16.252.2 SNMP get-next-request 1.3.6.1.2.1.1.6.0 14 0.532128 172.16.252.2 192.168.0.16 SNMP get-response 1.3.6.1.2.1.1.7.0 15 0.532189 192.168.0.16 172.16.252.2 SNMP get-next-request 1.3.6.1.2.1.1.7.0 16 0.624758 172.16.252.2 192.168.0.16 SNMP get-response 1.3.6.1.2.1.2.1.0 Pas la peine de détailler, nous voyons bien une suite de ''get-next-request'' émises par le client, suivies des ''get-response'' de l'agent SNMP du switch. Nous avons ici 8 trames d'interrogation et 8 trames de réponses. Si l'on désire parcourir une branche importante, le réseau va avoir du travail. ===== snmpbulkwalk ===== Innovation de la version 2c, observons la différence : $ snmpbulkwalk -v 1 -c public -Ot 172.16.252.2 SNMPv2-MIB::system snmpbulkwalk: Cannot send V2 PDU on V1 session Juste pour vérifier que cette commande ne peut fonctionner si l'on utilise SNMP v1. $ snmpbulkwalk -v 2c -c public -Ot 172.16.252.2 SNMPv2-MIB::system SNMPv2-MIB::sysDescr.0 = STRING: ProCurve J4899B Switch 2650, revision H.10.35, ROM H.08.02 (/sw/code/build/fish(mkfs)) SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.11.2.3.7.11.44 DISMAN-EVENT-MIB::sysUpTimeInstance = 1123894614 SNMPv2-MIB::sysContact.0 = STRING: sysop SNMPv2-MIB::sysName.0 = STRING: ProCurve Switch 2650-1 SNMPv2-MIB::sysLocation.0 = STRING: SNMPv2-MIB::sysServices.0 = INTEGER: 74 A première vue, nous obtenons exactement le même résultat qu'avec ''snmpwalk''. Cependant, voici ce qu'a vu Wireshark en vue condensée : No. Time Source Destination Protocol Info 1 0.000000 192.168.0.16 172.16.252.2 SNMP getBulkRequest 1.3.6.1.2.1.1 2 0.077623 172.16.252.2 192.168.0.16 SNMP get-response 1.3.6.1.2.1.1.1.0 1.3.6.1.2.1.1.2.0 1.3.6.1.2.1.1.3.0 1.3.6.1.2.1.1.4.0 1.3.6.1.2.1.1.5.0 1.3.6.1.2.1.1.6.0 1.3.6.1.2.1.1.7.0 1.3.6.1.2.1.2.1.0 1.3.6.1.2.1.2.2.1.1.1 1.3.6.1.2.1.2.2.1.1.2 Deux trames seulement. Voyons maintenant le détail :
Frame 1 (83 bytes on wire, 83 bytes captured)
...
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: getBulkRequest (5)
        getBulkRequest
            request-id: 112026182
            non-repeaters: 0
            max-repetitions: 10
            variable-bindings: 1 item
                1.3.6.1.2.1.1: Value (Null)
                    Object Name: 1.3.6.1.2.1.1 (iso.3.6.1.2.1.1)
                    Value (Null)
La requête est ici ''getBulkRequest'' et elle est unique. Tout le détail de la branche se trouve dans une seule réponse :
Frame 2 (353 bytes on wire, 353 bytes captured)
...
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: get-response (2)
        get-response
            request-id: 112026182
            error-status: noError (0)
            error-index: 0
            variable-bindings: 10 items
                1.3.6.1.2.1.1.1.0: 50726F4375727665204A3438393942205377697463682032...
                    Object Name: 1.3.6.1.2.1.1.1.0 (iso.3.6.1.2.1.1.1.0)
                    Value (OctetString): 50726F4375727665204A3438393942205377697463682032...
                1.3.6.1.2.1.1.2.0: 1.3.6.1.4.1.11.2.3.7.11.44 (iso.3.6.1.4.1.11.2.3.7.11.44)
                    Object Name: 1.3.6.1.2.1.1.2.0 (iso.3.6.1.2.1.1.2.0)
                    Value (OID): 1.3.6.1.4.1.11.2.3.7.11.44 (iso.3.6.1.4.1.11.2.3.7.11.44)
                1.3.6.1.2.1.1.3.0: 1123894614
                    Object Name: 1.3.6.1.2.1.1.3.0 (iso.3.6.1.2.1.1.3.0)
                    Value (Timeticks): 1123894614
                1.3.6.1.2.1.1.4.0: 7379736F70
                    Object Name: 1.3.6.1.2.1.1.4.0 (iso.3.6.1.2.1.1.4.0)
                    Value (OctetString): 7379736F70
                1.3.6.1.2.1.1.5.0: 50726F43757276652053776974636820323635302D31
                    Object Name: 1.3.6.1.2.1.1.5.0 (iso.3.6.1.2.1.1.5.0)
                    Value (OctetString): 50726F43757276652053776974636820323635302D31
                1.3.6.1.2.1.1.6.0: 
                    Object Name: 1.3.6.1.2.1.1.6.0 (iso.3.6.1.2.1.1.6.0)
                    Value (OctetString): 
                1.3.6.1.2.1.1.7.0: 74
                    Object Name: 1.3.6.1.2.1.1.7.0 (iso.3.6.1.2.1.1.7.0)
                    Value (Integer32): 74
                1.3.6.1.2.1.2.1.0: 55
                    Object Name: 1.3.6.1.2.1.2.1.0 (iso.3.6.1.2.1.2.1.0)
                    Value (Integer32): 55
                1.3.6.1.2.1.2.2.1.1.1: 1
                    Object Name: 1.3.6.1.2.1.2.2.1.1.1 (iso.3.6.1.2.1.2.2.1.1.1)
                    Value (Integer32): 1
                    Object Name: 1.3.6.1.2.1.2.2.1.1.2 (iso.3.6.1.2.1.2.2.1.1.2)
                    Value (Integer32): 2
Deux trames qui font le même boulot que les 16 précédentes avec ''snmpwalk'', le réseau va apprécier. De quoi convaincre d'utiliser plutôt v2c, quand c'est possible.