SteamCloud

Difficulty: Easy | OS: Linux | Kubernetes

Walkthrough - Youtube Habemus Shell


HackTheBox Machine


Scanning


image.png

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 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:

Privilege Escalation


  • 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 .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 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.

circle-exclamation

É isso pessoal, vamos juntos sempre aprendendo ! 🥋

Last updated