作業6 : 要監聽特定 Pod 的封包時都必須在裡面安裝及執行 tcpdump 後再透過 kubectl cp 把檔案複製出來,感覺實在是很麻煩。請研究一下如何透過 ksniff 針對特定節點抓取封包,這個工具的排錯方法以及用法會在期中考的時候用到,屆時也會一併公布解答。
解答 : 這題如果要用在期中考上必須要在靶機上執行,所以期中考第六題的部分就改為 arp spoofing 的部分還是透過正向的 shell 去進行呼叫,但是做完之後的封包監聽改為交由 ksniff 去完成。參考 ksniff 的 github 確認安裝方式,看起來還要先安裝krew。
# 下載 github 專案後直接解壓縮來用,然後安裝 krew
wget https://github.com/kubernetes-sigs/krew/releases/download/v0.4.4/krew-linux_amd64.tar.gz ;
tar xvf krew-linux_amd64.tar.gz ;
./krew-linux_amd64 install krew ;
# 按照提示把設定加到 ~/.bashrc,' ' 符號代表不要針對 $ 做變數轉換
echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> ~/.bashrc ;
source ~/.bashrc ;
# 透過 krew 安裝 sniff
kubectl krew install sniff ;
# 順便安裝一下 wireshark ;
sudo apt update && sudo apt install -y wireshark ;
接下來要測試封包監聽功能,就隨便建立一個 pod 來聽聽看吧。
# 如果 minikube 沒啟動的話就記得先啟動一下
minikube start ;
kubectl run test-sniff --image=aeifkz/my-ubuntu:v1.0 ;
# 先不設定條件進行封包監聽,然後就失敗了
kubectl sniff test-sniff ;
所以安裝到現在作業6 才正要開始,這個作業的設計目的主要要考驗各位的看 Log 能力以及解決問題的思路。首先出錯的第一步當然不是果斷放棄,而是先看錯誤 Log 寫甚麼。
INFO[0000] start sniffing on remote container
INFO[0000] executing command: '[/tmp/static-tcpdump -i any -U -w - ]' on container: 'test-sniff', pod: 'test-sniff', namespace: 'default'
INFO[0000] command: '[/tmp/static-tcpdump -i any -U -w - ]' executing successfully exitCode: '139', stdErr :''
ERRO[0000] failed to start remote sniffing, stopping wireshark error="executing sniffer failed, exit code: '139'"
INFO[0000] starting sniffer cleanup
看起來它好像丟了一個檔案到 pod 內並且命名成 /tmp/static-tcpdump ,然後呼叫它的時候出錯了,但是這個檔案室從哪來的呢?
INFO[0000] using tcpdump path at: '/home/aeifkz/.krew/store/sniff/v1.6.2/static-tcpdump'
INFO[0000] no container specified, taking first container we found in pod.
INFO[0000] selected container: 'test-sniff'
INFO[0000] sniffing method: upload static tcpdump
INFO[0000] sniffing on pod: 'test-sniff' [namespace: 'default', container: 'test-sniff', filter: '', interface: 'any']
INFO[0000] uploading static tcpdump binary from: '/home/aeifkz/.krew/store/sniff/v1.6.2/static-tcpdump' to: '/tmp/static-tcpdump'
所以看起來這個檔案的位置在 ~/.krew/store/sniff/v1.6.2/static-tcpdump,那呼叫看看這個指令是啥?
# 出現權限不夠的錯誤訊息
~/.krew/store/sniff/v1.6.2/static-tcpdump ;
# 出現 Segmentation fault
sudo ~/.krew/store/sniff/v1.6.2/static-tcpdump ;
# 感覺它就是個包裝過的 tcpdump
~/.krew/store/sniff/v1.6.2/static-tcpdump -h ;
然後各位想到甚麼解法了嗎? 看起來它給的 tcpdump 有問題,要嘛找出問題重新編譯一個,要嘛動態偵錯找出出錯的地方。或是來點偷吃步的找個可以執行的 tcpdump 丟給它。
# 先試試看蓋檔執行,不成功再說
cp $(which tcpdump) /home/aeifkz/.krew/store/sniff/v1.6.2/static-tcpdump ;
# 還是失敗咧
kubectl sniff test-sniff ;
所以做到這邊要果斷放棄了嗎? 還記得我剛說的出錯先看錯誤 Log 再說。
INFO[0000] executing command: '[/bin/sh -c test -f /tmp/static-tcpdump]' on container: 'test-sniff', pod: 'test-sniff', namespace: 'default'
INFO[0000] command: '[/bin/sh -c test -f /tmp/static-tcpdump]' executing successfully exitCode: '0', stdErr :''
INFO[0000] file found: ''
INFO[0000] file was already found on remote pod
INFO[0000] tcpdump uploaded successfully
推測該不會是 pod 已經有之前上傳無法執行的檔案,導致沒辦法更新正確的檔案進去,所以執行指令刪掉後重做看看。
kubectl exec -it test-sniff -- rm /tmp/static-tcpdump ;
# 成功了,還會幫忙把 wireshrk 的 UI 導出來
kubectl sniff test-sniff ;
# 試打一些流量測試看看
kubectl exec test-sniff -- ping www.google.com.tw ;