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.
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:
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.
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:
- Dengan menimpa sebuah variabel lokal yang dekat dengan buffer di memori pada stack, untuk mengubah perilaku dari program, yang dapat menguntungkan penyerang.
- 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.
- Dengan menimpa fungsi pointer atau penunjuk, atau exception handler, yang kemudian dieksekusi.
- 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:
Post a Comment