Dalam keamanan komputer, sebuah shellcode adalah sebagian kecil dari kode yang digunakan sebagai muatan dalam eksploitasi kerentanan perangkat lunak. Hal ini disebut "shellcode" karena biasanya dimulai perintah shell dari mana penyerang dapat mengontrol mesin dikompromikan, tetapi setiap bagian dari kode yang melakukan tugas yang sama bisa disebut shellcode. Karena fungsi muatan tidak terbatas hanya pemijahan shell, beberapa telah menyarankan bahwa shellcode nama tidak mencukupi Namun, upaya mengganti istilah tidak mendapatkan penerimaan luas.. Shellcode umumnya ditulis dalam kode mesin.
Jenis shellcode
Shellcode dapat menjadi lokal atau remote, tergantung pada apakah itu memberikan kontrol penyerang selama mesin berjalan pada (lokal), atau komputer lain melalui jaringan (remote).
Lokal
Shellcode lokal digunakan oleh penyerang yang memiliki akses terbatas ke mesin tetapi dapat mengeksploitasi kerentanan, misalnya buffer overflow, dalam proses yang lebih tinggi-hak istimewa pada mesin itu. Jika berhasil dieksekusi, shellcode akan menyediakan akses ke mesin penyerang dengan hak istimewa yang lebih tinggi sama dengan proses yang ditargetkan.
Jarak Jauh
Shellcode Remote digunakan ketika penyerang ingin menargetkan proses rentan berjalan pada komputer lain pada jaringan lokal atau intranet. Jika berhasil dieksekusi, shellcode dapat memberikan akses penyerang untuk mesin target melalui jaringan. Jauh shellcodes biasanya menggunakan koneksi standar TCP / IP socket untuk memungkinkan akses ke shell penyerang pada mesin target. Shellcode tersebut dapat dikategorikan berdasarkan bagaimana koneksi ini sudah diatur: jika shellcode dapat membuat koneksi ini, itu disebut "reverse shell" atau shellcode connect-back shellcode karena menghubungkan kembali ke mesin penyerang. Di sisi lain, jika penyerang perlu membuat sambungan, shellcode disebut bindshell karena shellcode mengikat ke port tertentu di mana penyerang dapat terhubung ke mengendalikannya. Jenis ketiga, apalagi umum, adalah soket-reuse shellcode. Jenis shellcode kadang-kadang digunakan ketika eksploitasi mengadakan sambungan ke proses rentan yang tidak ditutup sebelum shellcode dijalankan. Shellcode kemudian dapat kembali menggunakan koneksi ini untuk berkomunikasi dengan penyerang. Socket kembali menggunakan shellcode lebih sulit untuk menciptakan karena shellcode perlu mengetahui koneksi kembali menggunakan dan mesin mungkin memiliki banyak koneksi terbuka.
Firewall dapat digunakan untuk mendeteksi koneksi keluar yang dibuat oleh menghubungkan kembali shellcodes dan upaya untuk menerima koneksi masuk yang dibuat oleh bindshells. Oleh karena itu mereka dapat menawarkan beberapa perlindungan terhadap penyerang, bahkan jika sistem ini rentan, dengan mencegah penyerang dari mendapatkan akses ke shell diciptakan oleh shellcode. Inilah salah satu alasan mengapa soket kembali menggunakan shellcode kadang-kadang digunakan: karena tidak membuat sambungan baru dan karena itu lebih sulit untuk mendeteksi dan memblokir.
Download dan Eksekusi
Download dan jalankan adalah jenis shellcode terpencil yang mendownload dan mengeksekusi beberapa bentuk malware pada sistem target. Jenis shellcode tidak menelurkan shell, melainkan memerintahkan mesin untuk men-download file eksekusi tertentu dari jaringan, simpan ke disk dan jalankan. Dewasa ini, umumnya digunakan dalam serangan drive-by download, di mana korban mengunjungi sebuah halaman web berbahaya yang pada gilirannya upaya untuk menjalankan seperti download dan mengeksekusi shellcode untuk menginstal perangkat lunak pada mesin korban. Sebuah variasi dari jenis download shellcode dan beban perpustakaan. Keuntungan dari teknik ini adalah bahwa kode bisa lebih kecil, yang tidak memerlukan shellcode untuk menelurkan sebuah proses baru pada sistem target, dan bahwa shellcode tidak perlu kode untuk membersihkan proses ditargetkan karena hal ini dapat dilakukan oleh perpustakaan dimuat ke dalam proses.
Tahapan
Bila jumlah data yang penyerang dapat menyuntikkan ke dalam proses target terlalu terbatas untuk mengeksekusi shellcode berguna langsung, dimungkinkan untuk melaksanakannya secara bertahap. Pertama, sepotong kecil shellcode (tahap 1) dijalankan. Kode ini kemudian men-download potongan yang lebih besar dari shellcode (tahap 2) ke memori proses dan mengeksekusinya.
Egg-Hunt
Ini adalah bentuk lain dari dipentaskan shellcode, yang digunakan jika seorang penyerang dapat menyuntikkan lebih besar shellcode ke dalam proses tetapi tidak dapat menentukan di mana dalam proses itu akan berakhir. Kecil berburu telur shellcode disuntikkan ke dalam proses di lokasi yang diprediksi dan dieksekusi. Kode ini kemudian pencarian ruang alamat proses untuk shellcode yang lebih besar (telur) dan mengeksekusinya.
Omelette
Jenis shellcode mirip dengan telur berburu shellcode, tetapi mencari blok kecil beberapa data (telur) dan recombines mereka ke dalam satu blok yang lebih besar (omelet) yang kemudian dieksekusi. Ini digunakan ketika penyerang hanya dapat menyuntikkan sejumlah blok kecil data ke dalam proses.
Strategi Pelaksanaan Shellcode
Eksploitasi umumnya akan menyuntikkan sebuah shellcode ke dalam proses target sebelum atau pada saat yang sama ia mengeksploitasi kerentanan untuk mendapatkan kontrol atas program counter. Program counter disesuaikan untuk menunjuk ke shellcode, setelah itu dijalankan dan melakukan tugasnya. Penyuntikan shellcode ini sering dilakukan dengan menyimpan shellcode dalam data yang dikirim melalui jaringan ke proses rentan, dengan memasok dalam file yang dibaca oleh proses rentan atau melalui baris perintah atau lingkungan dalam kasus eksploitasi lokal.
Shellcode encoding
Karena proses yang paling menyaring atau membatasi data yang dapat disuntikkan, shellcode sering perlu ditulis untuk memungkinkan pembatasan ini. Ini termasuk membuat kode kecil, null-free atau alfanumerik. Berbagai solusi telah ditemukan untuk berkeliling pembatasan tersebut, termasuk:
Desain dan implementasi optimasi untuk mengurangi ukuran shellcode.
Pelaksanaan modifikasi untuk berkeliling keterbatasan dalam kisaran byte yang digunakan dalam shellcode.
Self-memodifikasi kode yang mengubah sejumlah byte kode sendiri sebelum mengeksekusi mereka untuk menciptakan kembali byte yang biasanya tidak mungkin untuk menyuntikkan ke dalam proses.
Sejak deteksi intrusi dapat mendeteksi tanda tangan shellcodes sederhana yang dikirim melalui jaringan, sering dikodekan, membuat diri mendekripsi atau polimorfik untuk menghindari deteksi.
Percent encoding
Eksploitasi bahwa browser sasaran umum shellcode encode dalam string JavaScript menggunakan Persen-encoding, melarikan diri urutan pengkodean "\ uXXXX" atau pengkodean entitas. Beberapa mengeksploitasi juga mengaburkan string disandikan shellcode lanjutan untuk mencegah deteksi oleh IDS.
Sebagai contoh, pada arsitektur IA-32, berikut adalah cara dua NOP (no-operasi) instruksi akan terlihat, pertama unencoded:
90 NOP
Kemudian dikodekan menjadi string menggunakan persen-encoding (menggunakan unescape () fungsi untuk memecahkan kode):
unescape ("% u9090");
Berikutnya dikodekan menjadi string menggunakan "\ uXXXX"-encoding:
"\ U9090";
Dan akhirnya dikodekan menjadi string menggunakan encoding entitas:
"邐"
atau
"邐"
Null-free shellcode
Shellcodes Kebanyakan ditulis tanpa menggunakan byte null karena mereka dimaksudkan untuk disuntikkan ke dalam proses target melalui diakhiri null-string. Ketika string null-dihentikan disalin, maka akan disalin sampai dengan byte null tapi berikutnya pertama shellcode tidak akan diproses. Ketika shellcode yang berisi nulls disuntikkan dengan cara ini, hanya bagian dari shellcode akan disuntik, sehingga tidak mampu berjalan dengan sukses.
Untuk menghasilkan nol bebas shellcode dari shellcode yang berisi null byte, seseorang dapat mengganti instruksi mesin yang mengandung nol dengan petunjuk yang memiliki efek yang sama tetapi bebas dari nulls. Sebagai contoh, pada arsitektur IA-32 yang bisa menggantikan instruksi ini:
01000000 MOV EAX B8, 1 / / Set register EAX untuk 0x000000001
yang berisi nol sebagai bagian dari literal (1 mengembang untuk 0x00000001) dengan petunjuk ini:
33C0 XOR EAX, EAX / / Set register EAX untuk 0x000000000
40 INC EAX / / Meningkatkan EAX untuk 0x00000001
yang memiliki efek yang sama tetapi mengambil byte lebih sedikit untuk mengkodekan dan bebas dari nulls.
shellcode alfanumerik dan cetak
Lihat juga: kode alfanumerik
Dalam keadaan tertentu, proses target akan menyaring setiap byte dari shellcode disuntikkan yang bukan karakter yang dapat dicetak atau alfanumerik. Dalam keadaan seperti itu, berbagai instruksi yang dapat digunakan untuk menulis sebuah shellcode menjadi sangat terbatas. Sebuah solusi untuk masalah ini diterbitkan oleh Rix di Phrack 57 di mana ia menunjukkan adalah mungkin untuk mengubah kode apapun ke dalam kode alfanumerik. Sebuah teknik yang sering digunakan adalah untuk menciptakan diri-memodifikasi kode, karena ini memungkinkan kode untuk memodifikasi byte sendiri untuk memasukkan byte di luar rentang normal diperbolehkan, sehingga memperluas jangkauan instruksi dapat digunakan. Menggunakan trik ini, decoder memodifikasi diri dapat dibuat yang awalnya hanya menggunakan byte dalam kisaran diperbolehkan. Kode utama dari shellcode dikodekan, juga hanya menggunakan byte dalam kisaran diperbolehkan. Ketika shellcode keluaran dijalankan, decoder dapat memodifikasi kode sendiri untuk dapat menggunakan suatu instruksi yang diperlukan untuk berfungsi dengan baik dan kemudian berlanjut untuk memecahkan kode shellcode asli. Setelah decoding shellcode transfer decoder mengontrol untuk itu, sehingga dapat dijalankan seperti biasa. Telah ditunjukkan bahwa adalah mungkin untuk membuat shellcode sewenang-wenang kompleks yang terlihat seperti teks normal di Inggris
Unicode bukti shellcode
Platform
Shellcode Kebanyakan ditulis dalam kode mesin karena tingkat rendah di mana kerentanan dieksploitasi memberikan akses penyerang untuk proses. Shellcode Oleh karena itu sering dibuat untuk menargetkan satu kombinasi tertentu dari prosesor, sistem operasi dan paket layanan, yang disebut platform. Untuk beberapa eksploitasi, karena kendala memakai shellcode oleh proses target, sebuah shellcode yang sangat spesifik harus diciptakan. Namun, bukan tidak mungkin untuk satu shellcode untuk bekerja untuk beberapa eksploitasi, service pack, sistem operasi dan bahkan prosesor. [9] fleksibilitas semacam ini umumnya dicapai dengan menciptakan beberapa versi shellcode yang menargetkan berbagai platform dan menciptakan header bahwa cabang-cabang untuk versi yang benar untuk platform kode ini berjalan. Ketika dijalankan, kode berperilaku berbeda untuk platform yang berbeda dan mengeksekusi bagian kanan shellcode untuk platform yang digunakan pada.
Shellcode Analisis
Sejak shellcode hanya baku biner kode dan data, tidak dapat dieksekusi langsung. Untuk menganalisis apa yang shellcode mencoba untuk melakukannya harus dimuat ke proses lain. Salah satu teknik analisis yang umum adalah untuk menulis sebuah program C yang kecil yang memegang shellcode sebagai penyangga byte, dan kemudian menggunakan fungsi pointer atau menggunakan inline assembler untuk mentransfer eksekusi untuk itu. Teknik lain adalah dengan menggunakan alat online seperti shellcode_2_exe untuk menanamkan shellcode ke dalam sekam dieksekusi pra-dibuat yang kemudian dapat dianalisis dalam debugger standar. Alat analisis shellcode khusus juga ada, seperti proyek sclog iDefense yang awalnya dirilis pada tahun 2005 sebagai bagian dari Paket Analis malcode. Sclog dirancang untuk memuat file shellcode eksternal dan mengeksekusi mereka dalam kerangka penebangan API. Emulasi alat shellcode berdasarkan analisis juga ada seperti aplikasi sctest yang merupakan bagian dari paket platform yang libemu silang. Lain shellcode emulasi alat analisis berbasis, dibangun di sekitar perpustakaan libemu, yang scdbg yang meliputi shell debug dasar dan fitur pelaporan terpadu.
Shell Coder Handbook kalo berminat tinggal donload disini (link update)
The shellcoders handbook 2nd Edition (pdf)
The shellcoders handbook 2nd Edition (pdf)
0 komentar:
Posting Komentar