WonderCMS 3.1.3 - Authenticated RCE & Blind SSRF Vulnerability

Overview

Halo, pada kesempatan kali ini saya akan menulis sedikit tentang vulnerability yang ditemukan pada CMS WonderCMS yang memiliki impact paling tinggi yaitu RCE (Remote Code Execution). Sebenarnya ini research kecil-kecilan untuk mengisi kegabutan weekend kali ini, yah… itung-itung sambil belajar research dan belajar kontribusi kepada komunitas infosec dengan cara menulis, semoga bermanfaat buat teman-teman yang membacanya.

Awalnyakan saya gabut, terus iseng buka exploit-db dan lihat salah satu nama exploit “WonderCMS 3.1.3 - ‘uploadFile’ Stored Cross-Site Scripting”, karena penasaran WonderCMS itu apa, akhirnya saya mengunjungi website WonderCMS ini. Masih penasaran, kira-kira ada ‘sesuatu’ yang bisa ditemukan lagi ngga dari CMS ini, kemudian saya download dan saya install di VM ubuntu saya. Dan pada akhirnya saya menemukan possibility untuk RCE dan menemukan celah SSRF yang akan saya bahas pada postingan ini. Oh iya, karena core CMS ini cuma ada 1 file php, dan semua fitur yang tidak memerlukan autentikasi tidak ada yang menarik, maka saya fokuskan pada fitur-fitur yang memerlukan autentikasi, jadi attack vectornya adalah attacker berhasil mendapatkan credential dan bisa digunakan untuk login ke dashboard CMS.

WonderCMS

WonderCMS adalah website builder yang simple dan gratis, CMS ini sangat mudah dipasang (1 step), ringan dan mudah digunakan. CMS ini termasuk salah satu CMS Open Source yang didevelop dari tahun 2008. Benar saja, ketika saya mencoba untuk install CMS ini, ternyata memang cuma berisi beberapa file untuk ditaruh di server. CMS ini berhasil saya install dengan modal web server dan php saja, tanpa memerlukan DBMS karena semua konfigurasi akan disimpan pada file bernama database.js.

Authenticated Remote Code Execution

Vulnerabilituy Discovery

Celah keamanan ini memanfaatkan fitur theme/plugin installer, sesuai namanya fitur ini digunakan untuk menginstall theme dan plugin dari repository. Fitur ini sangat mudah digunakan, sekali klik kita bisa install plugin atau tema baru.

Pada saat klik tombol install, maka request yang tertangkap pada burpsuite seperti ini:

Fitur installer ini setidaknya menggunakan 2 fungsi, yaitu installUpdateThemePluginAction dan addCustomThemePluginRepository, tapi saya akan fokus pada fungsi installUpdateThemePluginAction saja, mari kita sedikit membaca source codenya :

Singkatnya, fungsi ini akan mendownload plugin dari server dan secara temporary disimpan pada direcotry data/files/ZIPFromURL.zip, lalu file zip tadi diekstrak ke folder data/plugins/folderplugin-master/ kemudian direname menjadi data/plugins/folderplugin/ seperti ini,

Attack Scenario

Karena kita bisa mengontrol plugin yang ingin diinstall, maka kita bisa menyisipkan php backdoor kedalam file zip, ditambah lagi file hasil proses ekstrak ini predictable dan dapat diakses secara langsung, jadi ketika kita install crafted plugins kita bisa akses php backdoornya pada path /data/plugins/folderplugin/evil.php

Cukup mudah bukan?

Exploit

Saya sedikit membuat script untuk mengautomate prosesnya sehingga mendapatkan akses shell seperti ini,

exploit ini bisa diakses melalui exploit-db.

Authenticated Blind SSRF Vulnerability

SSRF Vulnerability

SSRF (Server Side Request Forgery) adalah celah keamanan web dimana memungkinkan penyerang dapat membuat permintaan HTTP ke domain yang dipilih penyerang. Dalam contoh SSRF biasa, penyerang dapat melakukan koneksi ke server itu sendiri, atau ke layanan berbasis web lainnya dalam infrastruktur, atau ke sistem pihak ketiga eksternal.

Vulnerability Discovery

Sebenarnya celah ini terdapat pada fitur yang telah kita bahas sebelumnya, yaitu fitur theme/plugin installer. Terdapat 2 fungsi yang berperan pada fitur ini, masih ingat? disini saya akan fokuskan kepada fungsi addCustomThemePluginRepository yg lebih menarik untuk dibahas karena terdapat filter terhadap destinasi plugin yang ingin diinstall. Fungsi ini akan digunakan ketika kita ingin menginstall costum plugin melalui fitur ini,

Ketika menggunakan fitur ini, kita harus menggunakan repository github dan gitlab sebagai destinasinya. Mari kita baca source codenya :

disana jelas terlihat kita dilarang menggunakan destinasi plugin selain github dan gitlab, dengan menggunakan fungsi strpos untuk mengecek posisi string "https://github.com/" dan "https://gitlab.com/" pada variable $url. Pengecekan ini sangat lemah, karena dengan menggunakan fungsi strpos ini jika terdapat karakter yang dicari, maka hasilnya akan berupa angka(Integer) yang menunjukkan posisi dari karakter tersebut, tetapi jika karakter yang dicari tidak ditemukan maka nilai yang dikembalikan adalah FALSE (Boolean). Maka, untuk membypass pengecekan ini dapat menggunakan url apapun asalkan terdapat string "https://github.com/" dan "https://gitlab.com/". Mari kita coba test dengan mengalihkan destinasi ke server milik kita :

YAY! berhasil bypass filter, selanjutnya apa? karena SSRF ini bersifat Blind SSRF, karena tidak terefleksikan pada response body maka kita tidak bisa langsung mengakses internal files menggunakan scheme file://.

Blind SSRF to RCE using Gopher Scheme

Untuk mendemonstrasikan impact paling tinggi yaitu RCE pada celah SSRF, maka saya akan memanfaatkan FastCGI yang secara default berjalan menggunakan socket, tapi agar dapat melakukan command execution pada konfigurasi FastCGI kita ganti menggunakan tcp connection dengan port 9000.

Untuk berinteraksi dengan internal network, kita dapat memanfaatkan protokol gopher. Dengan menggunakan scheme gopher:// kita bisa berinteraksi dengan spesifik IP, port, dan mengirimkan byte data.

Sebenarnya tidak terbatas hanya service FastCGI saja, kita bisa memanfaatkan service lain seperti Redis,MySQL,PostgreSQL,Memcached,Zabbix, dan SMTP. Karena kita sudah menyiapkan service FastCGI sebelumnya, maka kita dapat mengirimkan payload kepada service tersebut.

Generating Payload

Untungnya, ada sebuah tool bernama Ghoperus yang dapat membantu kita untuk membuat payload, langsung buat payload untuk reverse shell :

Exploit

Sedikit mengautomate proses exploit dengan script python :

exploit ini bisa diakses melalui exploit-db.

Sebenarnya SSRF ini juga berdampak pada fungsi installUpdateThemePluginAction, bahkan lebih mudah karena tidak ada filter terhadapat destinasi repositorynya:

Timelines

References