- Published on
Bin Trunk Writeup
- Authors
- Name
- Gabriel Silva
- @gabriel-silva-509347165
Plataforma: Hacking Club
Dificuldade: Easy
Nome: Bin Trunk
Port Scanning
nmap -sV -sC -p- -v $IP --open
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 23:16:ce:2d:97:22:5d:6b:5e:7c:71:98:2d:6e:70:db (ECDSA)
|_ 256 17:1e:76:5e:c4:54:19:91:40:90:cb:ba:91:44:0c:b7 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
| http-methods:
|_ Supported Methods: GET HEAD
|_http-title: Document
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Enumeration
http://172.16.2.72
Após clicar em Go Gitea
, ele redireciona pra um subdomínio chamado http://gitea.bintrunk.hc
sudo vim /etc/hosts
Agora a aplicação abre normalmente.
Clicando em Explore, foi possível identificar o repositório que contém código fonte da aplicação.
Agora, para acessar as rotas da API precisamos realizar uma enumeração de subdomínios.
Fuzzing
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/shubs-subdomains.txt -u http://bintrunk.hc -H "Host: FUZZ.bintrunk.hc" -ic -c -mc all -fs 1278
#Ou
gobuster vhost -u http://bintrunk.hc -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt --append-domain -t 40
Subdomínio encontrado! 😄
Adicionando o novo subdomínio no /etc/hosts
Após ler o arquivo do repositório /controllers/api/v1beta/users.js
vemos que podemos ver todos os usuários da API; entretanto, pra acessar essa rota, precisamos registrar um novo usuário, pois a ela protegida por um middleware, que requer autenticação.
Ao analisarmos o arquivo /controllers/api/auth.js
, notamos que são necessários três parâmetros: username, email e password
. Verificando o arquivo /controllers/api.js,
identificamos que precisamos fazer uma requisição POST para /api/auth/register
, passando esses três parâmetros.
Depois de registrar o usuário, precisamos nos autenticar para pegarmos o token. Olhando o arquivo auth.js, podemos ver que para se logar, basta realizar uma requisição do tipo POST para /api/auth/login
, passando os parametros email e password.
Com o token em mãos, podemos realizar uma requisição para o endpoint /api/v1beta/users
passando o header "Authorization: Bearer token
”
Ao analisarmos o arquivo /controllers/api/user.js
, identificamos uma vulnerabilidade de BOLA (Broken Object Level Authorization). Essa vulnerabilidade nos permite alterar a senha de qualquer usuário ao fornecer o UUID correspondente. Como previamente listamos os usuários, temos acesso aos UUIDs dos usuários, o que possibilita a troca de senha do usuário "ldantas".
Ao revisarmos o código no arquivo /controllers/api/files.js
, notamos que é possível listar e ler os arquivos dos usuários usando o UUID obtido através do token JWT (req.user.id
). Portanto, precisaremos trocar a senha do usuário e, em seguida, fazer login na conta dele para obtermos o token referente a este usuário.o
Agora vamos logar no usuário ldantas para pegar o token dele.
Com o token em mãos, podemos utilizar a rota /api/files
para ler os arquivos do usuário ldantas.
lendo o arquivo /api/files/ala7u-ldantas.pem
ele retorna a chave ssh do usuário encodada em base64.
Foot Hold
"echo LS0tLS1CRUdJTiBP…tLS0K" | base64 -d > id.rsa
chmod 600 id.rsa
ssh ldantas@172.16.2.72 -i id.rsa
Privillege Escalation
Temos dois arquivos o diretório /opt/webhook , o primeiro se trata de uma aplicação que está rodando no localhost:5000 chamado app.py
OBS: Daria pra descobrir que o app.py está sendo executado como root com o comando ps aux | grep "root”
Basicamente, quando realizamos uma requisição do tipo GET no localhost:5000, o app.py
vai executar o script webhook.sh
.
Temos permissão de escrita do script webhook.sh , então podemos alterar o script para transformar o /bin/bash
em SUID, nos permitindo virar root.
Por fim, é so dar um curl pro localhost.
curl http://localhost:5000/