ANDA MEMASUKI WEBLOG PRIBADI RIZKHY WAHYUDI

HACK STUDY,..!!!: Vulnereabilitas webstudent
HACK STUDY,..!!!
Friday, March 30, 2007
Vulnereabilitas webstudent
Sebagian besar anak-anak UGM menyerahkan urusan hosting situs pribadinya kepada server webstudent milik PusKom UGM. Di sini mahasiswa UGM dapat mendaftar secara gratis untuk hosting (cukup bagus, karena kita mendapat shell, PHP, dan MySQL, yang bila kita menyewa hosting di luar pastinya harga sewanya lumayan mahal untuk kantong mahasiswa). Server ini sebenarnya lumayan bagus walaupun kalo diakses di luar intranet UGM lumayan lambat. Server ini dibangun di atas Linux, salah satu *nix OS yang saya sukai selain FreeBSD (yang ini benar-benar Unix) karena Linux amat open source. Dan memilih distro Red Hat, yang merupakan distro yang paling terkenal selain Mandrake, Debian, Knoppix, dan Slackware. Ini dapat kita cek di www.netcraft.com dengan konfigurasi WebServer, ketika saya menulis artikel ini, menggunakan Apache versi 1.3.xx dengan PHP versi 4.2.x dan MySQL versi 4.0.xx yang masih menggunakan client protokol MySQL yang lama di mana hash passwordnya masih 16 karakter (MySQL versi 4.1.xx menggunakan hash password 32 karakter). Sebelumnya masih menggunakan MySQL 3.23.xx. Hal ini bisa dilihat dari fungsi phpinfo() yang bisa dimasukkan dengan script sbb:

phpinfo()

dan simpan dengan nama test.php atau terserah Anda, yang penting ekstensinya .php dan kemudian di- upload ke server webstudent, maka akan terlihat konfigurasi PHP-nya yang didalamnya terdapat konfigurasi server dan juga konfigurasi client MySQL yang dikompilasi bersama PHP. Maka dari informasi tersebut saya menyimpulkan hal-hal sebagai berikut:

Client MySQL-nya internal (memakai yang built-in PHP) padahal dari situs www.php.net sendiri tidak menyarankan untuk menggunakan client MySQL internal PHP karena biasanya sudah usang. Apalagi PHP 5 nanti tidak akan mem-bundle client internal MySQL untuk PHPnya. Pada manualnya disebutkan bahwa pengguna *nix pada umumnya menggunakan client external yang ada dalam bundle source MySQL.

Fasilitas PHP yang ditawarkan amat dibatasi. Yang di-enable hanya kemampuan mem-parse XML. Sedangkan dukungan terhadap GD, BZip2, Zlib, exif, dan iconv tidak di- compile. Apakah ini inisiatif admin untuk mengurangi load, tidak tahu, karena saya terbiasa menggunakan tarball untuk menginstall program di *nix box saya :) dan saya selalu meng- enable semua feature yang mungkin saya butuhkan.

Apakah analisa saya ini benar atau tidak, saya juga tidak tahu, bisa saja benar semuanya, benar sebagian, atau salah sama sekali karena saya bukan Admin, dan ini hanyalah hipotesis saya sendiri. Selain itu saya juga masih dalam taraf yang amat pemula dan masih perlu banyak belajar, saya juga bukan dan jauh dari tingkatan expert untuk *nix.

Wallahu a'lam bishawab.


INTI PERMASALAHAN

Jadi dari tadi bukan inti permasalahan to, jelas bukan, namanya aja pendahuluan, sebenarnya bab di atas adalah sedikit kritik (dan saran?) untuk webstudent agar bisa lebih baik lagi. Vulnerabilities webstudent bukan untuk mendapatkan privilege sebagai root dan bukan pada Webservernya (setidaknya ketika saya menulis artikel ini), melainkan di sisi user yang hosting di sini. Dengan vulnerabilities ini kita dimungkinkan:

- Melihat password dan username MySQL orang lain.
- Melihat password/username yang di hard-code di PHP.
- Mengganti isi dari file yang vulnerable.
- Membackup seluruh situs user yang vulnerable.

Permasalahan utama di sini adalah pada console. Apa itu? Pernah pakai PuTTY dan login ke webstudent? Nah itu yang namanya console, yang kita bisa ngetik perintah-perintah. Remote console yang digunakan oleh webstudent menggunakan protokol SSH di port 22 yang menggunakan private/public key pair dengan algoritma enkripsi RSA yang sulit sekali di-sniffing, dan tentunya kita tidak menggunakan metode *sniffing* di sini. Protokol SSH yang biasanya sudah built-in di beberapa sistem *nix ini memungkinkan kita menggunakan SCP (Secure CoPy) dan SFTP (Secure File Transfer Protocol) di remote client.

Sekarang, kita siapkan client SSH kesayangan kita yaitu PuTTY, login dengan username dan password kamu sendiri (tentunya ini hanya berlaku untuk mereka yang sudah mendaftar dan hosting di webstudent). Kita sudah masuk ke sistem server webstudent. Perintah-perintah di server ini sangat dibatasi, misalnya perintah ps, gcc, dan lain-lain yang sekiranya memberikan informasi dan privileges lebih pada user terhadap server. Tetapi perintah-perintah yang sekiranya diperlukan user seperti ls, tar, gzip, bzip2, echo, cat, more, less, rm, mv, chdir, mkdir dan masih banyak lagi. Kita di sini tidak memerlukan perintah- perintah sistem dan mengkompilasi program, kita hanya menggunakan perintah yang sudah disediakan untuk kita yaitu chdir, ls, cat, less, dan editor vi.

Setelah login, kita lihat di mana homedir kita, dapat dicek dengan perintah sbb:

$Â chdir ~
$Â pwd
/home_user/home/fnwaichan

yang dicetak tebal adalah perintah yang kita inputkan (tanpa $Â) dan yang warnanya hijau adalah outputnya. Dalam contoh di atas, misalnya fnwaichan adalah username kita (tentunya di webstudent tidak ada username seperti itu, dan kenapa saya memilih nama itu? rahasia ;P). Jadi sekarang kita tahu bahwa homedir kita berada di /home_user/home/ fnwaichan dan parent dirnya / home_user/home, dari ini kita bisa membuat perkiraan apakah semua user mahasiswa yang mendaftar di webstudent ada di directory ini? Jawabannya ya! Dan ada cara mengetahui daftar user yang menggunakan fasilitas webstudent ini dengan menggunakan alamat webstudent.ugm.ac.id. Misalnya kita sudah melihat situs server webstudent ini dan memutuskan untuk menyerang directory user vheedee (ini juga tidak ada di server webstudent) maka dari homedir kita tadi kita berpindah ke directory user vheedee. Caranya, setelah dari homedir kita tadi:

$Â chdir ../vheedee
$Â pwd
/home_user/home/vheedee

Coba di ls:

$Â ls
ls. : Permission denied

Lho koq permission denied? Jelas! karena directory ini milik orang lain yang mempunyai bit permission kira- kira : drwx--x--x yang berarti orang lain hanya bisa me-chdir tetapi tidak bisa me-read atau me-ls directory tersebut. Tetapi ingatkah kita bahwa directory yang digunakan untuk hosting berada di subdir public_html/ yang berada di bawah homedir user. Untuk itu kita coba masuk ke subdir ini:

$Â chdir public_html/
$Â pwd
/home_user/home/vheedee/ public_html
$Â ls

Lho koq keluar listing filenya? Ya! Karena directory ini untuk kebanyakan user mempunyai permission drwxr-xr-x yang berarti user lain bisa meng-ls directory ini. Setelah ini kita tampilkan semua file beserta permission tiap filenya:

$Â ls -al

Lihat listing file di kolom permission, lihat tiga karakter terakhir kalau mengandung huruf r berarti kita bisa membaca file tersebut. Tetapi kalau ia penggemar Lola Amaria dan memutuskan untuk menghilangkan huruf r sesuai dengan film yang dimainkan idolanya maka kita tidak bisa berbuat apa-apa. Misalnya kita ingin membaca file index.html maka perintahnya:

$Â cat index.html | less

dan terlihat source dari file index.html ini. Cuma itu? Ah ga menarik! Cuma source code HTML doank, berantakan lagi, mana janjinya?! Katanya bisa lihat password orang?! Eit, tunggu dulu. Untuk empat kasus di atas, mari kita bahas satu-satu.


MELIHAT UNAME DAN PASSWORD MYSQL USER LAIN

Ini hanya bisa dilakukan jika user yang bersangkutan menggunakan MySQL sebagai backend databasenya dan menggunakan PHP. Misalnya ia mempunyai blog, mempunyai halaman login, mempunyai guestbook/shoutbox, menggunakan CMS seperti phpNuke atau PostNuke, menggunakan forum misalnya phpBB atau Invision Board. Untuk kasus ini, kita menggunakan feeling dan sedikit logika kita untuk menebak kira-kira file mana yang berisi uname dan password yang bersangkutan yang biasanya diletakkan dalam file konfigurasi yang nantinya akan di-include, biasanya: config.php config.inc.php main.inc.php. Misalkan si vheedee tadi menggunakan MySQL dan file konfigurasinya dinamainya dengan nama sialan.inc.php maka kita coba lihat isinya:

$Â vi sialan.inc.php

Setelah masuk editor vi ternyata kita menemukan baris sebagai berikut:

$Âmysql_host="localhost";
$Âmysql_username="vheedee";
$Âmysql_password="aishiteru";
.
.
.
.
.

Dan dengan amat mudah kita dapatkan username dan password MySQL untuk user vheedee. Maka kita masuk ke bagian pma di webstudent: joe.student.ugm.ac.id/pma masukkan username dan password yang telah kita dapatkan tadi dan kita bisa mengubah-ubah database user tersebut semau kita. Tentunya format konfigurasi untuk mysql tidak plek seperti contoh di atas, untuk itu tadi saya bilang menggunakan feeling dan sedikit logika. Tetapi itu juga tidak begitu sulit. Cukup buka filenya dan coba di-scroll ke bawah siapa tahu kita mendapatkannya.

MENGGANTI ISI FILE YANG VULNERABLE

Tadi kita sudah membahas bagaimana kita mendapatkan username dan password dari MySQL sekarang kita coba mengganti isi dari beberapa file yang mempunyai bit permission rw untuk other (user lain selain pemilik). File ini amat langka dan jarang. Biasanya, untuk file ini adalah file guestbook atau shoutbox. Beberapa user menggunakan plain- text file untuk membuat shoutbox atau guestbook. Biasanya ini ada di tutorial di internet atau di buku pemrograman PHP. Agar server Apache dapat menulis file tersebut, maka file tersebut diharuskan mempunyai permission write untuk other user. Hal ini disebabkan karena biasanya (entah kalau di webstudent) untuk Apache adalah nobody yang merupakan unprivileged user. Untuk itu kita harus memberikan permission write untuk file teks yang menyimpan isi dari guestbook tersebut. File yang biasanya dipakai berformat sebagai berikut:

z



*-*







*-*



Tetapi bisa juga format lain. Tanda *-* adalah penanda diakhirinya message/ pesan. Untuk menggantinya, ya tinggal dilihat saja dengan editor vi seperti di atas:

$Â vi pesan.txt

setelah diubah, kita bisa keluar dari vi dengan menekan [ESC]:wq![ENTER]


MENDAPATKAN UNAME ATAU PASSWORD YANG DI HARD-CODE DI PHP

Kasusnya hampir sama dengan MySQL tadi tetapi ini lebih mudah. Misalnya kita menemukan halaman login, dan ternyata kita mengetahui kalau login tersebut di-hard code lewat pernyataan pilihan di php maka kita bisa login ke dalam sistem tersebut. Contoh login yang di-hard code:

if (($Â_POST["nama_user"]=="vheedee") && ($Â_POST["password"]=="luvme")) {
.
.
}
.
.

Script di atas berasumsi bahwa nama user dimasukkan dalam input text sebuah form yang bernama nama_user dan password di masukkan dalam field password dalam form yang bernama password, sekarang kita tinggal masukkan username dan password dalam form tersebut yang sesuai dengan isi file tadi.


MEMBACKUP SELURUH SITUS USER YANG VULNERABLE

Karena directory public_html/ dapat kita read maka kita bisa saja membackup semua isi directory tadi, masukkan ke homedir kita dan download, kemudian bawa ke rumah, caranya setelah login dan masuk ke dalam directory public_html/ user korban tadi, kita bisa mengeksekusi perintah di bawah ini:

$Â tar -cvzf ~/situs_orang_lain.tar.gz public_html/*

atau

$Â tar -cvjf ~/situs_orang_lain.tar.bz2 public_html/*

perbedaannya hanya terletak pada kompresi filenya, yang pertama dengan gzip dan yang kedua dengan bzip2. Perintah di atas akan membackup semua isi public_html dan menyimpannya di homedir kita yang kemudian kita bisa download menggunakan WinSCP atau program lain. Untuk mengekstraknya, pengguna M$Â Windows memerlukan WinRAR dan pengguna *nix menggunakan perintah di bawah ini, (misalnya kita ingin mengekstraknya di subdir output/ di homedir kita dan file yang kita download tadi sudah kita copy ke homedir kita):

$Â tar -xvzf ~/situs_orang_lain.tar.gz ~/ output/

atau

$Â tar -xvjf ~/situs_orang_lain.tar.bz2 ~/ output/

dan kita sudah mempunyai copyan seluruh file situs korban :)


KESIMPULAN

Dari uraian yang saya kemukakan di atas maka dapat disimpulkan permasalahan sebagai berikut:

Disatukannya user dalam /home_user/ home dan adanya listing user di situs webstudent.
Permission di public_html/ yang drwxr- xr-x memungkinkan user lain untuk melihat isi file di directory tersebut. Jika Anda berpikir, mengapa tidak langsung saja memblok akses read untuk public_html/ secara rekursif dengan perintah

$Â chmod -R o-r public_html/

Sebenarnya hal ini bisa dilakukan, tetapi akan membuat masalah baru yaitu Apache tidak akan bisa membaca file Anda dan berarti situs tidak bisa ditampilkan, dan percuma Anda telah bersusah payah membuat situs tetapi tidak bisa ditampilkan.

Banyak user yang menggunakan MySQL dan file konfigurasi yang berisi password dalam plain-text disimpan mau tidak mau harus mempunyai permission read di dalamnya.
Banyak user yang masih menggunakan file teks untuk menyimpan data seperti shoutbox atau guestbook dan sekali lagi mau tidak mau harus mempunyai permission read dan write di dalamnya.

CARA MENGATASI


-- FOR USER --

Untuk USER, sebelum masalah ini di- fix oleh Admin, maka untuk sementara user bisa memperkecil lubang ini dan mempersulit user lain mengakses file Anda dengan cara:

Hilangkan permission read untuk directory, karena Apache hanya memerlukan permission execute untuk men-chdir directory. INGAT! LAKUKAN INI HANYA UNTUK DIRECTORY JANGAN PADA FILE jika tidak ingin menemui masalah baru dengan tidak terbacanya file situs Anda. Caranya dengan memasukkan perintah di bawah ini untuk public_html/ dan seluruh subdir di bawah public_html/, paling tidak ini mencegah user lain meng-ls directory Anda:

$Â chmod o-r public_html/

$Â chmod o-r public_html/ nama_subdir

Untuk yang menggunakan phpBB, kita tidak bisa menghilangkan permission read di subdir admin karena jika kita coba lakukan maka modul administrasi tidak akan berjalan sebagaimana mestinya.
Hilangkan kebiasaan menyimpan data dengan plaintext. Beralihlah menggunakan database.
Enkripsi uname dan password Anda dengan algoritma enkripsi yang Anda kenal. Jika Anda bukan programmer, setidaknya sembunyikan nama variabelnya agar tidak terlalu vulgar.

Tetapi cara-cara di atas tidak akan berpengaruh jika ada orang jahat yang sudah mengetahui struktur file dalam situs Anda.


-- FOR ADMIN--

Sebenarnya ada beberapa cara untuk mengatasi hal ini jika Anda adalah root. Akan tetapi, cara yang menurut saya efektif adalah men-chroot user yang login dengan SSH seperti di OpenBSD :) daripada mendisable perintah-perintah yang saya gunakan tadi. Dengan men-chroot, berarti Anda memberikan satu lapis keamanan lagi di server Anda. Caranya:

Download tarball source OpenSSH dan juga OpenSSL yang bersesuaian.
Jika saat me-make OpenSSL keluar masalah dengan Perl maka berarti Anda perlu mengupdate Perl Anda.
Download patch OpenSSH-chroot dari sourceforge.net .
Patch source OpenSSH yang asli dengan OpenSSH-chroot dan konfigurasi sesuai dengan manual OpenSSH maupun OpenSSH-chroot, tentunya sebagai Admin saya percaya, Anda sudah sangat mengerti pentingnya RTFM (Read The Fuckin' Manual, saya tidak bermaksud tidak sopan, tetapi itulah istilah yang beredar, karena membaca manual memang sedikit menyebalkan).
Setelah sourcenya di-patch, putuskan dulu protokol SSH-nya atau alihkan ke server backup.
Kompilasi dengan make sesuai dalam manual.
Edit user skeleton, sehingga sesuai dengan lingkungan chroot-jail yang kita siapkan dengan cara meng-copy beberapa file binary yang perlu sesuai dengan manual openssh-chroot. Untuk automatisasi ketika dibuat user baru.
Edit user yang sudah ada, sebagai Admin, saya percaya, Anda sudah sangat ahli untuk membuat batch script untuk mengcopykan file yang perlu ke dalam chroot-jail (dalam hal ini homedir user) untuk seluruh user.
Testing... apakah berjalan dengan baik.
Jika dalam tahap testing lolos, maka sudah siap untuk online lagi, dengan tambahan sebuah lapis keamanan baru.
Terima kasih, semoga berguna.

from http://zaki.web.ugm.ac.id
posted by rizkhey wahyudi @ 10:25 AM  
0 Comments:
Post a Comment
<< Home
 
 
My Menu In Blog's
Previous Post
Archives
Shoutbox

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis ligula lorem, consequat eget, tristique nec, auctor quis, purus. Vivamus ut sem. Fusce aliquam nunc vitae purus.

Links
Powered by

Isnaini Dot Com

BLOGGER