RouterSpace presenta una aplicación android la cual nos permitió descubrir una vulnerabilidad Command Injection en la API utilizada por esta lo que nos dio acceso a la máquina. Escalamos privilegios tras identificar la version de sudo y el CVE-2021-3156.
➜ routerspace apktool d RouterSpace.apk
I: Using Apktool 2.4.0-dirty on RouterSpace.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /home/sckull/.local/share/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
➜ routerspace l -lah RouterSpace
total 44K
drwxrwxr-x 9 sckull sckull 4.0K mar 2 20:35 .
drwxrwxr-x 3 sckull sckull 4.0K mar 2 20:35 ..
-rw-rw-r-- 1 sckull sckull 1.2K mar 2 20:35 AndroidManifest.xml
-rw-rw-r-- 1 sckull sckull 3.7K mar 2 20:35 apktool.yml
drwxrwxr-x 3 sckull sckull 4.0K mar 2 20:35 assets
drwxrwxr-x 8 sckull sckull 4.0K mar 2 20:35 kotlin
drwxrwxr-x 6 sckull sckull 4.0K mar 2 20:35 lib
drwxrwxr-x 3 sckull sckull 4.0K mar 2 20:35 original
drwxrwxr-x 141 sckull sckull 4.0K mar 2 20:35 res
drwxrwxr-x 11 sckull sckull 4.0K mar 2 20:35 smali
drwxrwxr-x 3 sckull sckull 4.0K mar 2 20:35 unknown
➜ routerspace
Observamos el archivo AndroidManifest.xml, el cual puede contener información de paquetes, elementos, servicios, activities, etc. Se muestra en este caso:
El nombre del paquete de la aplicación “package=“com.routerspace””.
El Activity“android:name=“com.routerspace.MainActivity””.
Permisos, el único permiso que se muestra: “android:name=“android.permission.INTERNET””.
Si analizamos los archivos vemos que unicamente se muestran archivos .smali que contienen el “codigo fuente” de la aplicación, pero existe otra herramienta que nos permite leer de manera más ’entendible’ el código.
Jadx
Utilizamos jadx que permite generar código java a partir de un .apk o archivo .dex. Ejecutamos jadx-gui y nos presenta los diferentes recursos de la aplicación. Entre ellos encontramos el paquete “principal” de la aplicación. Sin embargo no encontramos código que nos indicara el funcionamiento y/o comportamiento de la aplicación, aunque se muestran distintas ’librerias’ de react.
Basados en lo último, intentamos analizar el codigo de la app como si de React Native se tratase, realizamos lo que se presenta en el siguiente post.
1
2
3
4
5
6
7
8
9
➜ assets l
total 1.1M
drwxrwxr-x 3 sckull sckull 4.0K mar 2 20:35 .
drwxrwxr-x 9 sckull sckull 4.0K mar 2 20:35 ..
drwxrwxr-x 2 sckull sckull 4.0K mar 2 20:35 fonts
-rw-rw-r-- 1 sckull sckull 1.1M mar 2 20:35 index.android.bundle
➜ assets touch index.html
➜ assets echo'<script src="./index.android.bundle"></script>' > index.html
➜ assets
Aún con ello no logramos obtener información completa, unicamente vemos un array que contiene información de manera desordenada.
Aunque podemos decir que realiza algun tipo de solicitud POST con información JSON a una API, al dominio y ruta routerspace.htb/api/v4/, aunque la ruta completa es desconocida. En el caso de tener el fichero index.android.bundle.map podríamos tener el código mucho más entendible.
Si intentamos buscar la ruta de la API completa no es posible, ya que la API detecta como actividad sospechosa cada una de las solicitudes y retorna un numero aleatorio de caracteres y espacios en blanco, por lo que es casi imposible realizar algun tipo de filtro (tamaño, palabras, lineas) ya sea con feroxbuster o ffuf.
Configuramos burpsuite para capturar todo el trafico de la aplicación, en este caso la dirección de la interfaz vmnet8 o en el caso de dar algun problema de conexión en All interfaces.
Descargamos el certificado de burpsuite en la dirección y puerto a la escucha.
Genymotion
Descargamos el emulador Genymotion, y realizamos la instalación de este.
Iniciamos el emulador ejecutando el fichero genymotion en la carpeta de instalación o bien directamente desde el icono de ejecución.
1
2
3
4
5
➜ genymotion ls
completion libEGL_translator.so libGLES_V2_translator.so.1.0.0 libQt5Location.so.5 libQt5XcbQpa.so.5 plugins
[.. snip ..]libdbus-1.so.3 libGLES_V2_translator.so.1.0 libQt5Gui.so.5 libQt5Widgets.so.5 player
➜ genymotion ./genymotion
Tras registrar e ingresar con una cuenta, creamos un dispositivo. Utilizamos la versión 6 de Android (basado en certificate_unknown), como dispositivo el Google Nexus 5.
En la siguiente pantalla nos pide el Network Mode, en esta opción elegimos el adaptador al cual conectar nuestro dispositivo, en este caso el adaptador de VMWare al cual la máquina Kali está conectada y donde Burpsuite está a la escucha, en mi caso vmnet8.
Elegimos vmnet8 y damos a Install para crear el dispositivo virtual.
Al finalizar se mostrará un mensaje de instalación y el dispositivo listo.
Iniciamos el dispositivo con clic derecho > Start.
ADB
Genymotion en su carpeta de instalación contiene la herramienta adb la cual vamos a utilizar para comunicarnos con el dispositivo.
1
2
3
➜ genymotion ls tools/
aapt adb glewinfo lib64
➜ genymotion
Certificado
Incialmente creamos la variable $adb con la dirección completa de adb, vemos que podemos listar los dispositivos, el nuestro en la lista.
1
2
3
4
5
6
7
8
➜ htb_routerspace exportadb=$HOME/Downloads/genymotion/tools/adb
➜ htb_routerspace $adb devices
List of devices attached
192.168.56.104:5555 device
➜ htb_routerspace ls
cacert.der RouterSpace.apk
➜ htb_routerspace
Para instalar el certificado cambiamos la extensión de este a .cer, y movemos el certificado a la carpeta sdcard/. Luego de ello creamos un PIN o Patron de bloqueo para el dispositivo.
Finalmente en Configuraciones nos vamos a Security > Install from sdcard > Google Nexus 5 elegimos el certificado a instalar: cacert.cer, le damos un nombre, nos pedira ingresar el PIN o Patron de bloqueo.
Observamos en Trusted Credentials el certificado de Burpsuite.
Proxy
Finalmente configuramos el proxy en la configuración de Wifi.
Una alternativa para configurar el proxy utilizando adb.
1
2
3
4
5
#Enable proxy$adb shell settings put global http_proxy 192.168.22.129:8080
#Disable proxy$adb shell settings put global http_proxy :0
Tras configurar el Proxy vemos que podemos navegar por internet y capturar las peticiones con burpsuite.
RouterSpace
Instalamos la aplicación ejecutando $adb install RouterSpace.apk, vemos que la instalación fué exitosa.
La aplicación luego de la presentación muestra unicamente un boton.
Tras presionar el boton vemos que realiza una petición POST tipo json, con el atributo "ip" y la dirección "0.0.0.0" a la ruta de la API del dominio routerspace.htb, aunque no hay alguna respuesta ya que dicho dominio no está en el archivo /etc/hosts.
Command Injection
Tras agregar el dominio, vemos que la respuesta de la solicitud muestra la dirección "0.0.0.0".
Manipulando un poco la solicitud descubrimos que es posible inyectar comandos y vemos el resultado en la respuesta de la solicitud, en este caso id nos muestra el usuario y grupo paul.
User - Paul
Shell
Generamos una clave publica con ssh-keygen y la agregamos al archivo authorized_keys en /home/paul/.ssh.
Ingresamos por SSH logrando obtener una shell y la flag user.txt.