6 minutos
HackTheBox - Delivery
Neste ‘writeup’ veremos a resolução da máquina ‘Delivery’ do HackTheBox. O autor desta máquina é o ippsec, um conhecido membro do HTB que costuma postar a resolução de máquinas retiradas em seu canal no Youtube. Ele também possui um site que permite filtrar seus vídeos no Youtube de acordo com o que é informado na busca.
Informações da Máquina
IP: 10.10.10.222
Sistema Operacional: Linux
Nível de dificuldade: Easy
Varredura e Enumeração
Port Scan
O primeiro passo é iniciar um scan preliminar pelas portas TCP abertas e logo em seguida um segundo scan para determinar a versão dos serviços que estão rodando no servidor. Este é o resultado do Nmap.
# Nmap 7.91 scan initiated Fri May 14 15:27:04 2021 as: nmap -v -sC -sV -p 22,80,8065 -Pn -oN details 10.10.10.222
Nmap scan report for 10.10.10.222
Host is up (0.31s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 9c:40:fa:85:9b:01:ac:ac:0e:bc:0c:19:51:8a:ee:27 (RSA)
| 256 5a:0c:c0:3b:9b:76:55:2e:6e:c4:f4:b9:5d:76:17:09 (ECDSA)
|_ 256 b7:9d:f7:48:9d:a2:f2:76:30:fd:42:d3:35:3a:80:8c (ED25519)
80/tcp open http nginx 1.14.2
| http-methods:
|_ Supported Methods: GET HEAD
|_http-server-header: nginx/1.14.2
|_http-title: Welcome
8065/tcp open unknown
| fingerprint-strings:
| GenericLines, Help, RTSPRequest, SSLSessionReq, TerminalServerCookie:
| HTTP/1.1 400 Bad Request
| Content-Type: text/plain; charset=utf-8
| Connection: close
| Request
| GetRequest:
| HTTP/1.0 200 OK
| Accept-Ranges: bytes
| Cache-Control: no-cache, max-age=31556926, public
| Content-Length: 3108
| Content-Security-Policy: frame-ancestors 'self'; script-src 'self' cdn.rudderlabs.com
| Content-Type: text/html; charset=utf-8
| Last-Modified: Fri, 14 May 2021 16:47:36 GMT
| X-Frame-Options: SAMEORIGIN
| X-Request-Id: 6iwifyweep85fkyk7iimfj8kfo
| X-Version-Id: 5.30.0.5.30.1.57fb31b889bf81d99d8af8176d4bbaaa.false
| Date: Fri, 14 May 2021 18:38:43 GMT
| <!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"><meta name="robots" content="noindex, nofollow"><meta name="referrer" content="no-referrer"><title>Mattermost</title><meta name="mobile-web-app-capable" content="yes"><meta name="application-name" content="Mattermost"><meta name="format-detection" content="telephone=no"><link re
| HTTPOptions:
| HTTP/1.0 405 Method Not Allowed
| Date: Fri, 14 May 2021 18:38:44 GMT
|_ Content-Length: 0
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-Port8065-TCP:V=7.91%I=7%D=5/14%Time=609EC102%P=x86_64-pc-linux-gnu%r(Ge
SF:nericLines,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20t
SF:ext/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x
SF:20Request")%r(GetRequest,DF3,"HTTP/1\.0\x20200\x20OK\r\nAccept-Ranges:\
SF:x20bytes\r\nCache-Control:\x20no-cache,\x20max-age=31556926,\x20public\
SF:r\nContent-Length:\x203108\r\nContent-Security-Policy:\x20frame-ancesto
SF:rs\x20'self';\x20script-src\x20'self'\x20cdn\.rudderlabs\.com\r\nConten
SF:t-Type:\x20text/html;\x20charset=utf-8\r\nLast-Modified:\x20Fri,\x2014\
SF:x20May\x202021\x2016:47:36\x20GMT\r\nX-Frame-Options:\x20SAMEORIGIN\r\n
SF:X-Request-Id:\x206iwifyweep85fkyk7iimfj8kfo\r\nX-Version-Id:\x205\.30\.
SF:0\.5\.30\.1\.57fb31b889bf81d99d8af8176d4bbaaa\.false\r\nDate:\x20Fri,\x
SF:2014\x20May\x202021\x2018:38:43\x20GMT\r\n\r\n<!doctype\x20html><html\x
SF:20lang=\"en\"><head><meta\x20charset=\"utf-8\"><meta\x20name=\"viewport
SF:\"\x20content=\"width=device-width,initial-scale=1,maximum-scale=1,user
SF:-scalable=0\"><meta\x20name=\"robots\"\x20content=\"noindex,\x20nofollo
SF:w\"><meta\x20name=\"referrer\"\x20content=\"no-referrer\"><title>Matter
SF:most</title><meta\x20name=\"mobile-web-app-capable\"\x20content=\"yes\"
SF:><meta\x20name=\"application-name\"\x20content=\"Mattermost\"><meta\x20
SF:name=\"format-detection\"\x20content=\"telephone=no\"><link\x20re")%r(H
SF:TTPOptions,5B,"HTTP/1\.0\x20405\x20Method\x20Not\x20Allowed\r\nDate:\x2
SF:0Fri,\x2014\x20May\x202021\x2018:38:44\x20GMT\r\nContent-Length:\x200\r
SF:\n\r\n")%r(RTSPRequest,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nConten
SF:t-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n
SF:400\x20Bad\x20Request")%r(Help,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r
SF:\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close
SF:\r\n\r\n400\x20Bad\x20Request")%r(SSLSessionReq,67,"HTTP/1\.1\x20400\x2
SF:0Bad\x20Request\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nCon
SF:nection:\x20close\r\n\r\n400\x20Bad\x20Request")%r(TerminalServerCookie
SF:,67,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20text/plain;
SF:\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Request"
SF:);
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri May 14 15:29:11 2021 -- 1 IP address (1 host up) scanned in 127.39 seconds
Webserver
Para acessar o site pelo seu domínio e não pelo seu ip basta inserir a linha correspondente ao arquivo /etc/hosts.
10.10.10.222 delivery.htb
O site poderá ser acessado pela seguinte URL.
http://delivery.htb
Existem três portas abertas no servidor: 22, 80 e 8065. Acessando pela porta 80 encontramos a seguinte página.
Analisando a página o botão “Contact Us” aponta para duas aplicações, a “HelpDesk” e “MatterMost server”:
Adicionado o subdomínio ao /etc/hosts.
10.10.10.222 delivery.htb helpdesk.delivery.htb
A aplicação agora pode ser acessada diretamente pela sua URL.
Trata-se de um sistema de chamados OS Ticket, uma plataforma web de código fonte aberto (open source) que permite gerenciar chamados. Antes de buscar vulnerabilidades na aplicação foi efetuado o registro de um ticket para obter alguma informação que permita algum tipo de acesso administrativo.
Após o registro do ticket foi gerado um e-mail pelo sistema para que o usuário possa acompanhar o status do chamado. Esta é a informação relevante obtida pelo sistema até o momento, o e-mail.
A segunda aplicação que roda na porta 8065 é o Mattermost e este é o seu propósito segundo o site do fabricante:
O Mattermost foi desenvolvido como um centro de comando de comunicação
para ajudar as equipes de DevOps a orquestrar fluxos de trabalho
de colaboração de incidentes urgentes.
Vulnerabilidade
Acessando esta aplicação na porta 8065 surge uma tela de login e logo abaixo um link “Create one now” que direciona para a tela de cadastro de usuário. O problema é que ao fazer o cadastro o sistema envia um link de confirmação ao e-mail informado. Como não há nenhum serviço de e-mail no servidor com a porta exposta, não há como explorar o serviço e visualizar o link de confirmação. A opção seria receber o e-mail do Mattermost de outra forma, talvez pelo OsTicket. Ao fazer uma pesquisa sobre recebimento de e-mails no site do OSTicket é possível encontrar a seguinte informação:
A configuração do seu sistema para aceitar vários e-mails
de sistema para sistema depende de sua preferência pessoal.
O OsTicket atualmente suporta piping (aliases) e métodos
de pesquisa POP3 / IMAP para rotear e-mails recebidos.
Os tickets são roteados para o departamento e atribuídos
a uma prioridade padrão associada ao e-mail.
No caso, se há roteamento de e-mails de sistema para sistema e de departamento para departamento então o que for enviado pelo sistema Mattermost poderá ser recebido no OSticket. E para visualizar o e-mail será necessário acessar o próprio ticket previamente cadastrado.
Ao enviar o formulário pelo site do Mattermost uma mensagem de confirmação de cadastro é recebida pelo OSTicket.
O link gerado pelo Mattermost para confirmar o cadastro no sistema.
http://delivery.htb:8065/do_verify_email?token=j3wgng8a3qb6tjeescmphz4dhjx9a4edj84i514tyyqy35wz9kcbix87hikh4shk&email=4069966%40delivery.htb
Acessando o link e confirmando o cadastro o usuário é direcionado para a página inicial do Mattermost com a opção para juntar-se ao time “internal”.
Logo em seguida surge o ‘dashboard’ para que o usuário possa comunicar-se com outros usuários.
Exploração
Explorando as mensagens no ‘dashboard’ foi encontrada uma mensagem do usuário root e nela uma credencial de acesso.
mmuser:Crack_The_MM_Admin_PW
Com esta credencial é possível conectar ao host pelo SSH na porta 22.
Obtendo a flag do usuário logado.
Esta credencial não permite acesso ao banco de dados Mysql, então uma enumeração de diretórios e arquivos na máquina foi necessária. Inicialmente foi feita a varredura por arquivos de configuração dos sistemas que rodam no servidor. O resultado mostrou que o Mattermost possui credenciais para acesso ao banco de dados no seu arquivo de configuração.
/opt/mattermost/config/config.json
mmuser:Crack_The_MM_Admin_PW
Acessando o Mysql com a credencial encontrada.
Listando os bancos de dados no servidor.
Acessando a tabela de usuários.
Nesta tabela foi encontrada a credencial do usuário root.
root | $2a$10$VM6EeymRxJ29r8Wjkr8Dtev0O.1STWb4.4ScG.anuu7v0EFJwgjjO
Escalação de Privilégios
As duas ferramentas mais usadas para a quebra de hashes são o john e o hashcat. Na lista de formatos suportados do hashcat a hash é reconhecida como “bcrypt/blowfish”.
Antes de efetuar a quebra da hash com a wordlist rockyou.txt é necessário uma atenção especial na mensagem do root pelo Mattermost, onde alerta que a senha “PleaseSubscribe!” não estará na wordlist e que para proceder com a quebra é necessário criar uma wordlist personalizada baseada nas “rules” do hashcat.
O hashcat possui um manual que explica como criar estas wordlists personalizadas baseadas em um “pattern”.
Portanto, deve-se criar dois arquivos. Um arquivo com a hash e outro com a senha “PleaseSubscribe!”. Esta senha será usada como base para criar outras senhas variadas e assim gerar uma wordlist personalizada.
Existem diversos formatos de “rules” no hashcat para a geração de wordlist personalizada.
ls -l /usr/share/hashcat/rules/
Para gerar esta wordlist foi selecionada a “best64.rule”, muito utilizada em CTFs.
hashcat --force pattern -r /usr/share/hashcat/rules/best64.rule --stdout > passwords.txt
O comando irá gerar um arquivo passwords.txt com todas as variações de senhas. Logo em seguida se procede com a quebra da hash.
hashcat -a 0 -m 3200 hash passwords.txt
A saída do comando revela a senha encontrada do usuário root.
PleaseSubscribe!21
Como citado anteriormente, esta nova senha revelada é uma variação da senha original “PleaseSubscribe!”.
Alterando para o usuário root pelo terminal com a senha descoberta.
Acessando a flag do usuário root.
Com acesso ao root a máquina ‘Delivery’ está terminada.
Até a próxima!