Ideas, información y conocimientos compartidos por el equipo
de Investigación, Desarrollo e Innovación de BASE4 Security.
El título de este artículo hace referencia a “So Many Ways to Own Dell EMC Networker”. Durante un pentest, ese artículo nos fue muy útil ¡Muchas gracias! Recomendamos leerlo antes de continuar. En nuestro pentest, descubrimos muchas instalaciones de Networker Client en la red interna. Algunas nos permitían ejecutar comandos de Networker de forma remota. Así que intentamos explotar la inyección de comandos en “nsrdump”. Sin embargo, ese comando no estaba instalado. Por suerte, “nsr_render_log” si estaba y nos permitió obtener los hashes de los usuarios pero no logramos crackearlos. La explotación a través de Erlang tampoco fue posible porque los hosts no ejecutaban ese servicio. Por ello, decidimos probar con otros comandos de Networker.
⦁ nsrrcopy arbitrary file upload
Empezamos por listar los comandos de Networker disponibles en una instalación por defecto. Uno que nos llamó la atención fue “nsrrcopy”. Quizá porque suena como “Remote Copy”.
El archivo “nsrrcopy” es en realidad un script de Bash. En su código podemos ver que ejecuta otro programa llamado “uasm” pasándole algunos parámetros controlados por nosotros.
En la documentación de “uasm” vemos que su función es “salvar” y “recuperar” datos del sistema de ficheros. Además, dice que se puede usar de forma similar al comando “tar”.
Por ejemplo, para salvar el archivo “/etc/passwd”, utilizamos la opción “-s”. Esto crea un flujo de bytes que se envía a la salida estándar y que redirigimos al archivo “stream”.
Y, para restaurar el archivo “/etc/passwd”, utilizamos la opción “-r”. Esto lee el flujo de bytes creado anteriormente por la entrada estándar y reconstruye los archivos. El parámetro “-iY” es para sobreescribir archivos sin preguntar.
En “nsrrcopy” vemos que “uasm” se ejecuta en modo de restauración y sobrescribe archivos sin preguntar. Adicionalmente vemos que recibe un parámetro “$1”. Ese parámetro es opcional y debería ser una ruta. Cuando está presente, evita que se escriban archivos fuera de esa ruta. Por suerte, lo controlamos nosotros y si colocamos “/” podremos escribir en todo el sistema de archivos.
La idea es ejecutar “nsrrcopy” desde “nsrexec” para subir archivos arbitrarios al equipo remoto. Pero claro, “nsrrcopy” (uasm) lee el flujo de bytes de la entrada estándar ¿Cómo podemos controlar la entrada estándar del programa remoto? Por suerte “nsrexec” admite una variable de entorno “STDIN” que permite especificar los datos que se pasarán como entrada estándar al programa remoto.
La dificultad está en que el flujo de bytes generado con “uasm” contiene muchos bytes nulos y no podemos meterlo directamente en una variable de entorno porque se truncaría.
Una forma de resolver este problema es utilizando “netsed” y reemplazando el valor de STDIN directamente en el paquete de red que se envía al host remoto.
Otra forma sería programando un script que hable el protocolo de Networker y le envíe directamente nuestro payload.
⦁ Explotación paso a paso
Creamos nuestro script malicioso en “/usr/sbin/nsrwoot”
Y le damos permisos de ejecución
Lo empaquetamos con “uasm”
Codificamos el flujo de bytes para pasarlo a “netsed”
Obtenemos lo siguiente:
Generamos un patrón “AAA…” con la misma longitud de bytes
Configuramos la redirección de puertos con socat
Configuramos la redirección y sustitución de bytes con netsed
Asignamos STDIN con el patrón “AAA...”
Ejecutamos “nsrrcopy” en el host remoto
Al finalizar el comando anterior, el script “nsrwoot” se habrá creado en el host remoto y podremos ejecutarlo con “nsrexec”.
⦁ Disclosure Timeline