Saturday, October 6, 2012

Konsep Exploitasi

Banyak orang yang tau seperti apa itu exploitasi. Namun sedikit sekali yang mengetahui bagai mana sebuah code dan perintah dapat membunuh system dan mengambil alihnya. Pada kesempatan kali ini, saya akan membahas lebih jauh mengenai exploitation.


Apa itu eksploitasi?
Singkatnya, eksploitasi adalah keadaan dimana sebuah system yang tidak terautentikasi mengambil alih system lain yang mengalami kegagalan eksekusi. Eksploitasi sama dengan memanfaatkan buffer overflow.

Apa itu buffer overflow?
Dalam keamanan komputer dan pemrograman, buffer overflow, atau buffer overrun, adalah anomali di mana, sebuah program menulis data ke buffer, melewati batas buffer dan menimpa memori di sekitarnya. Ini merupakan kasus pelanggaran keamanan memori.
Buffer overflows dapat dipicu oleh input yang dirancang untuk mengeksekusi kode, atau mengubah cara program beroperasi. Hal ini dapat mengakibatkan perilaku program menjadi tidak menentu, termasuk kesalahan akses memori, hasil yang salah, atau pelanggaran keamanan sistem.Dengan demikian dasar kerentanan yang dimiliki oleh banyak perangkat lunak dapat dieksploitasi oleh pihak-pihak yang jahat.
Bahasa pemrograman yang umumnya terkait dengan buffer overflows adalah C dan C + +, yang menyediakan built-in perlindungan terhadap pengaksesan program  atau overwriting data dalam setiap bagian dari memori, dan tidak memeriksa bahwa data ditulis ke array (built-in tipe buffer) berada dalam batas-batas array. Pemeriksaan batas-batas array dapat mencegah buffer overflows.

Deskripsi Teknis Buffer Overflow
Sebuah buffer overflow terjadi ketika data ditulis ke buffer, karena keterbatasan pemeriksaan batas-batas array, data yang merusak nilai-nilai dalam memori alamat yang berdekatan ke buffer dialokasikan. Kejadian ini paling sering terjadi ketika menyalin string karakter dari satu buffer ke yang lain.

Contoh dasar
Pada contoh berikut, program telah didefinisikan dua item data yang berdekatan dalam memori: sebuah string buffer 8-byte-panjang, A, dan sebuah integer dua-byte, B. Awalnya, A tidak berisi apa pun kecuali nol byte, dan B berisi nomor 1979. Lebar karakter satu byte.

Nama Variabel
A
B
Value
Null String
1979
Hex Value
00
00
00
00
00
00
00
00
07
BB







Sekarang, program ini berusaha untuk menyimpan string diakhiri dengan null "over" dalam buffer A. Karena gagal untuk memeriksa panjang string, karakter ini menimpa nilai B:

Nama Variabel
A
B
Value
‘e’
‘x’
‘c’
‘e’
‘s’
‘s’
‘i’
‘v’
25856
Hex Value
65
78
63
65
73
73
69
76
65
00









Meskipun programmer tidak berniat untuk mengubah B sama sekali, nilai B kini telah digantikan oleh sejumlah karakter. Dalam contoh ini, pada sistem big-endian yang menggunakan ASCII, "e" diikuti dengan byte nol akan menjadi nomor 25856. Jika B adalah satu-satunya variabel data yang didefinisikan oleh program, menulis sebuah string yang lebih panjang lagi bisa menyebabkan kesalahan seperti kesalahan segmentasi, yang dapat mengakhiri proses.

Exploitasi
Teknik-teknik untuk mengeksploitasi kerentanan buffer overflow bervariasi tergantung arsitektur, sistem operasi, dan memory region. Misalnya, eksploitasi pada tumpukan atau heap (digunakan untuk memori dialokasikan secara dinamis), sangat berbeda dari eksploitasi pada panggilan stack.

Stack-based exploitation
Seorang attacker cenderung cerdas dan jahat sehingga dapat mengeksploitasi tumpukan berbasis buffer overflows untuk memanipulasi program dari beberapa cara:
  1. Dengan menimpa sebuah variabel lokal yang dekat dengan buffer di memori pada stack, untuk mengubah perilaku dari program, yang dapat menguntungkan penyerang.
  2. Dengan menimpa alamat dalam stack frame. Setelah fungsi kembali, eksekusi akan dilanjutkan kembali ke alamat yang ditentukan oleh penyerang, biasanya attacker memasukan buffer yang terisi.
  3. Dengan menimpa fungsi pointer atau penunjuk, atau exception handler, yang kemudian dieksekusi.
  4. Dengan metode yang disebut "trampolining", jika alamat dari user tidak diketahui, tetapi lokasi disimpan dalam register, maka alamat pengirim dapat ditimpa dengan alamat dari opcode yang akan menyebabkan eksekusi untuk meloncat data yang disediakan. Jika lokasi disimpan dalam R, kemudian melompat ke lokasi yang mengandung opcode untuk melompat R, panggilan R atau instruksi serupa, akan menyebabkan data pengguna dieksekusi. Lokasi yang cocok untuk opcodes, atau byte dalam memori, dapat ditemukan dalam DLL atau eksekusi itu sendiri.
Namun alamat biasanya opcode tidak boleh berisi karakter null dan lokasi opcodes ini dapat bervariasi antara aplikasi dan versi dari sistem operasi. Proyek Metasploit adalah salah satu database seperti opkode yang cocok, meskipun hanya yang ditemukan dalam sistem operasi Windows. Stack berbasis buffer overflows sama dengan stack overflow. Perlu dicatat bahwa kerentanan ini biasanya ditemukan melalui penggunaan sebuah fuzzer.

Heap-Based Exploitation
Sebuah buffer overflow yang terjadi di area data tumpukan disebut heap overflow dan dieksploitasi dengan cara yang berbeda dengan exploit berbasis stack overflow. Memori di heap dialokasikan secara dinamis oleh aplikasi pada saat run-time dan biasanya berisi data program. Eksploitasi dilakukan dengan merusak data ini dengan cara-cara khusus untuk menyebabkan aplikasi menimpa struktur internal seperti pointer linked list. Teknik tumpukan kanonik ini dapat menimpa hubungan alokasi memori dinamis dan menggunakan pertukaran pointer yang dihasilkan untuk menimpa fungsi program pointer.
Kerentanan Microsoft GDI + JPEG adalah contoh dari bahaya heap-overflow yang dapat terjadi dalam sebuah system.

Barriers To Exploitation
Manipulasi dari buffer, yang terjadi sebelum pembacaan atau pengeksekusian, dapat menyebabkan kegagalan dari upaya eksploitasi. Manipulasi-manipulasi ini dapat mengurangi ancaman eksploitasi, tetapi tidak selalu berhasil. Manipulasi dapat mencakup konversi, penghapusan metakarakter dan menyaring string non-alfanumerik. Namun, teknik yang ada untuk memotong, memfilter dan manipulasi, kode alfanumerik maupun kode polimorfik,dapat dimodifikasi dan kembali diesksekusi. Metode yang sama dapat digunakan untuk menghindari deteksi oleh sistem deteksi intrusi seperti anti-virus. Dalam beberapa kasus, di mana kode diubah menjadi unicode, ancaman kerentanan telah disalahpahami oleh disclosers sebagai Denial of Service padahal itu adalah shell code remote system.

Teknik NOP-sled
Sebuah NOP-sled adalah teknik terlama dan yang paling banyak diketahui untuk melakukan exploitasi berbasis stack buffer iverflow. Teknik ini memecahkan masalah dalam menemukan alamat asli dari sebuah buffer dengan memperbesar area target secara efektif. Untuk melakukan hal ini, setidaknya ada satu stack yang dirusak dengan instruksi no-op ke dalam sebuah system. Pada akhirnya, seorang attacker mengirimkan data, setelah instruksi no-op sebuak instruksi untuk melakukan relative jump ke buffer teratas dimana shellcode akan ditempatkan akan dieksekusi. koleksi no-ops ini disebut sebagai "NOP-sled" karena jika alamat pengirim diganti dengan alamat dalam wilayah no-op dari buffer akan dilewat ke bawah dimana no-ops diarahkan ke shell code yang sebenarnya, dengan melompat di akhir stack. Teknik ini membutuhkan penyerang untuk menebak dimana letak stack NOP-sled dan membuak shellcode yang berukuran relatif kecil.


Karena popularitas dari teknik ini, banyak vendor sistem melakukan pencegahan intrusi, dengan mencari pola instruksi no-op pada mesin dalam upaya untuk mendeteksi penggunaan shellcode. Penting untuk dicatat bahwa PDN-sled tidak selalu hanya berisi no-op instruksi mesin yang lama, setiap instruksi yang tidak merusak mesin di mana shellcode tidak akan berjalan dapat digunakan instruksi no-op. Akibatnya telah menjadi praktek umum untuk menyusun exploitasi berbasis NOP-sled berinstruksi no-op.
Metode ini meningkatkan kemungkinan serangan akan berhasil. Eksploitasi menggunakan teknik ini masih harus bergantung pada beberapa sejumlah keberuntungan bahwa attacker harus menebak offset pada stack yang berada dalam wilayah NOP-sled. Sebuah dugaan yang salah biasanya akan menghasilkan target program menabrak dan bisa membuat administrator sistem untuk mendeteksi adanya intrusi. Masalah lain adalah bahwa NOP-sled membutuhkan jumlah yang jauh lebih besar dari memori di mana untuk melakukan NOP-sled yang cukup besar untuk mencapai target exploitasi. Hal ini dapat menjadi masalah ketika ukuran buffer yang dialokasikan terlalu kecil dan kedalaman saat stack yang terlalu dangkal (yaitu tidak ada ruang yang banyak dari akhir stack frame saat ini ke awal stack). Meskipun memiliki banyak masalah dalam metode ini, NOP-sled adalah satu-satunya metode yang bekerja dengan baik di system manapun, dengan arsitektur apapun, dan bahasa pemrograman apapun.

Teknik Jump To Register
Teknik Jump To Register memungkinkan untuk eksploitasi karena dapat dapat menyebabkan heap buffer overflows tanpa memerlukan ruang ekstra untuk NOP-sled dan tanpa harus menebak offset stack. Strategi ini digunakan untuk menimpa pointer dengan sesuatu yang akan menyebabkan program melompat ke pointer yang dikenal  kemudian disimpan dalam daftar yang menunjuk ke buffer yang selanjutnya dikontrol oleh penyerang dengan menggunakan shellcode. Sebagai contoh jika register A berisi pointer ke awal buffer maka setiap melompat atau pemanggilan register A dapat digunakan untuk mendapatkan kontrol dari aliran eksekusi.


Dalam prakteknya, program mungkin tidak sengaja berisi petunjuk untuk melompat ke sebuah register tertentu. Solusi yang biasa diberikan adalah menemukan sebuah contoh dari opcode yang cocok di lokasi yang tetap di suatu tempat dalam memori program. Di E, Anda dapat melihat contoh dari sebuah instance tidak disengaja instruksi JMP esp i386. Opcode untuk instruksi ini adalah FF E4. Urutan byte dua ini dapat ditemukan di satu byte offset dari awal instruksi call DbgPrint pada alamat 0x7C941EED. Jika penyerang menimpa alamat program dengan alamat ini program pertama akan melompat ke 0x7C941EED, menafsirkan opcode FF E4 sebagai instruksi JMP esp, dan kemudian akan melompat ke atas stack dan mengeksekusi kode penyerang.
Teknik ini mungkin teknik yang paling berbahaya dan hampir mustahil dihindari. Hal ini karena eksploitasi akan bekerja cukup andal untuk mengotomatisasi serangan dengan jaminan keberhasilan ketika dijalankan. Untuk alasan ini, ini adalah teknik yang paling umum digunakan di Internet, dimana worm yang akan mengeksploitasi kerentanan stack buffer overflow.
Metode ini juga memungkinkan shellcode untuk ditempatkan setelah alamat pengirim ditimpa. Karena executable yang sebagian besar didasarkan pada alamat 0x00400000, dan x86 adalah sebuah arsitektur Little Endian, byte terakhir dari alamat pengirim harus menjadi nol. Hal ini membatasi ukuran shellcode dengan ukuran buffer. DLL yang terletak di memori atas (di atas 0x01000000) dan tidak memiliki alamat yang mengandung byte null, dapat dihapusdengan metode ini. Metode ini sering disebut sebagai "trampolining DLL".

No comments:

Template by : mhiman@ hacker-newbie.org