Khai thác lỗ hổng thực thi mã (CVE-2019-15107) trong Webmin

DDos

VIP Members
22/10/2013
524
2.191 bài viết
Khai thác lỗ hổng thực thi mã (CVE-2019-15107) trong Webmin
Webmin là một ứng dụng dựa trên nền web cung cấp cho các admin giao diện người dùng đơn giản để quản lý những ứng dụng chạy trên máy chủ Linux/ Unix, FreeBSD, OpenBSD như user, group, database, BIND, Apache, Postfix, Sendmail, Qmail, backup, firewall....

Gần đây, một lỗ hổng thực thi mã từ xa trong Webmin đã được phát hiện với CVE ID là CVE-2019-15107. Sau khi công khai chi tiết lỗ hổng Zero-day tuần trước của webmin, những chuyên gia của dự án đã tiết lộ lỗ hổng không xuất phát từ lỗi lập trình do lập trình viên mắc phải mà nó được bí mật cấy vào bởi một hacker vô danh trong cơ sở xây dựng lên webmin trong hơn hai năm. Lỗ hổng này ảnh hưởng tới các phiên bản của Webmin từ 1.882 đến 1.921. Để ngăn ngừa lỗ hổng này, các bạn đang sử dụng Webmin nên cập nhật lên phiên bản Webmin mới nhất 1.93

Ngày 10/8/2019 nhà nghiên cứu an ninh mạng người Thổ Nhĩ Kỳ Özkan Mustafa Akkuş đã công bố lỗ hổng Zero-day tại DefCon ngoài việc công bố lỗ hổng Akkuş cũng phát hành một modul Metasploit nhằm tự động hóa việc khai thác lỗ hổng này. Trong bài viết này, mình sẽ hướng dẫn các bạn cách khai thác lỗ hổng thực thi mã từ xa trong Webmin.

Phân tích lỗ hổng

Mã:
$ cat -n password_change.cgi | head -n 176 | tail -29
   148   
   149        # Read shadow file and find user
   150        &lock_file($miniserv{'passwd_file'});
   151        $lref = &read_file_lines($miniserv{'passwd_file'});
   152        for($i=0; $i<@$lref; $i++) {
   153            @line = split(/:/, $lref->[$i], -1);
   154            local $u = $line[$miniserv{'passwd_uindex'}];
   155            if ($u eq $in{'user'}) {
   156                $idx = $i;
   157                last;
   158                }
   159            }
   160        defined($idx) || &pass_error($text{'password_euser'});
   161   
   162        # Validate old password
   163        &unix_crypt($in{'old'}, $line[$miniserv{'passwd_pindex'}]) eq
   164            $line[$miniserv{'passwd_pindex'}] ||
   165                &pass_error($text{'password_eold'});
   166   
   167        # Make sure new password meets restrictions
   168        if (&foreign_check("changepass")) {
   169            &foreign_require("changepass", "changepass-lib.pl");
   170            $err = &changepass::check_password($in{'new1'}, $in{'user'});
   171            &pass_error($err) if ($err);
   172            }
   173        elsif (&foreign_check("useradmin")) {
   174            &foreign_require("useradmin", "user-lib.pl");
   175            $err = &useradmin::check_password_restrictions(
   176                    $in{'new1'}, $in{'user'});

Trong webmin, tính năng "cho phép thay đổi mật khẩu người dùng" cần phải được bật để khai thác lỗ hổng này. Đây là điều kiện duy nhất, tuy nhiên, nhiều người quản lý webmin kích hoạt tính năng này. Chúng cho phép người dùng đặt mật khẩu mới với mật khẩu cũ. Trong mã nguồn ứng dụng Webmin, có một số tệp ".cgi" thú vị. Một trong số đó là "password_change.cgi".

defwebmin20-1.png

Chỉ có một yêu cầu để các tham số trong tệp này hoạt động, đó là giá trị "passwd_mode" trong tệp cấu hình "miniserv.conf" được đặt thành "2".
$miniserv{'passwd_mode'} == 2 || die "Password changing is not enabled!";
Ý nghĩa của hàm này là người dùng có thể thay đổi mật khẩu đã hết hạn bằng cách xác minh mật khẩu cũ của họ.

defwebmin20-4.png


"password_change.cgi" gửi mật khẩu cũ đến hàm "encrypt_password" trong tệp "acl/acl-lib.pl". Hàm này gọi một hàm khác là "unix_crypt". Lổ hổng này tồn tại trong hàm mã hóa &unix_crypt. Hàm "unix_crypt" được gọi trong hàm xác thực mật mật khẩu cũ "Validate old password".
defwebmin20-5.png

Ở đây, chúng ta sử dụng kí tự "|" để đọc file shadow trong quá trình xác thực mật khẩu cũ trông qua POST request..
Khi gửi một yêu cầu với POST data bình thường, chúng ta sẽ nhận được một lỗi "Failed to change password: The current password is incorrect."
Tệp "password_change.cgi" sẽ chỉ kiểm tra tham số "old" trên server mà không cần kiểm tra usernam có đúng hay không. Khi thêm ký tự "|" trong POST data, chúng ta có thể chạy bất kỳ lệnh nào trên server thông qua hàm "password_change.cgi."

Khai thác lỗ hổng

Trong Metasploit, sử dụng msf5 > use exploit/unix/webmin_backdoor module

Capture.png

Thiết lập các tham số RHOSTS và RPORT phù hợp, rồi chạy lệnh exploit.
sss.png

 
Bên trên