SteamCloud
Difficulty: Easy | OS: Linux | Kubernetes
Last updated
Difficulty: Easy | OS: Linux | Kubernetes
Last updated
Não podemos acessar a raiz do site.
Vamos realizar um fuzzing:
Nada de interessante pra gente.
Podemos interagir então com o kubelet através do utilitário kubeletctl
Enumerar os pods.
Temos aqui então apenas namespaces que são criados por padrão. Porém, temos um Pod que está no namespace de default
ou seja, não criaram um namespace para segregar ele.
Vamos verificar quais pods temos permissão de execução remota de código.[RCE]
Observe que na coluna RCE
temos um +
, ou seja, podemos executar comandos remotamente nesses Pods.
Vamos interagir então com o pod do nginx
para confirmar essa vulnerabilidade.
Confirmamos então que podemos executar comandos nesse POD, então podemos ler a nossa primeira flag:
Já somos root
nesse pod, mas não temos acesso ao volume que esta montada a verdadeira pasta root.
Então precisamos fazer essa montagem. Podemos criar um novo pod para explorarmos isso.
Antes disso, precisamos obter um token e um certificado para podermos ver as permissões que temos e para criarmos um novo Pod.
Normalmente o token fica no caminho:
/var/run/secrets/kubernetes.io/serviceaccount/token
E os certificados ficam em:
/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Extrair o token:
Vamos colocar esse token em uma variável de ambiente chamava token:
Obter o certificado:
Salva ele em um arquivo com o mesmo nome: ca.crt
Agora podemos usar o utilitário Kubectl
para podermos verificar as permissões que temos com esse token no cluster Kubernetes.
Observe que no recurso dos Pods, nosso token tem permissão de get, create, list
Então vamos criar um novo pod de forma declarativa, ou seja, com um arquivo .yaml
Podemos usar o .yaml
de um pod já em execução como modelo, e aqui como não conseguirÃamos baixar uma nova imagem para o container, podemos reaproveitar a que já tem no alvo.
Podemos simplificar bastante esse .yml
penas colocando o que é necessário para criarmos o pod e montarmos o volume.
Agora podemos simplesmente criar esse pod de forma declarativa informando o arquivo .yml
Refazemos o comando com Kubeletctl
para verificarmos se foi criado o nosso pod.
Agora podemos executar comandos nesse pod, para tentarmos ler a flag de root final
Agora conseguimos ver que dentro da pasta de root, temos a pasta verdadeira do root, e listando ela, conseguimos ver a última flag e lê-la.
Pessoal, viram que algumas vezes eu escrevi .yaml
e outras .yml
, isso foi erro mesmo rsrs.
Mas elas realmente existem, sua diferença é bem sutil e na prática não faz diferença no Kubernetes ou em muitas outras ferramentas.
Bizu é sempre manter a consistência, se começou com .yaml
continua usando-a, e vice-versa.
É isso pessoal, vamos juntos sempre aprendendo !