SteamCloud
Difficulty: Easy | OS: Linux | Kubernetes

Walkthrough - Youtube Habemus Shell
HackTheBox Machine
Scanning

Services and Versions


Exploration
Port 8443 - HTTPs

Não podemos acessar a raiz do site.
Vamos realizar um fuzzing:

Nada de interessante pra gente.
Port 10250 - Kubelet
Podemos interagir então com o kubelet através do utilitário
kubeletctlEnumerar 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
defaultou 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
RCEtemos um+, ou seja, podemos executar comandos remotamente nesses Pods.Vamos interagir então com o pod do
nginxpara confirmar essa vulnerabilidade.

Confirmamos então que podemos executar comandos nesse POD, então podemos ler a nossa primeira flag:

Privilege Escalation
Já somos
rootnesse 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.crtAgora podemos usar o utilitário
Kubectlpara 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, listEntão vamos criar um novo pod de forma declarativa, ou seja, com um arquivo
.yamlPodemos usar o
.yamlde 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
.ymlpenas 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
Kubeletctlpara 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 ! 🥋
Last updated