Eksploit, buffer overflow dan shellcode adalah tiga saudara kandung. Semua berawal dari keteledoran sang programmer sehingga programnya mengandung vulnerability yang dapat dieksploit untuk membuat program tersebut menjalankan code apapun yang diinginkan hacker (arbitrary code execution), code ini disebut dengan shellcode. Shellcode adalah kunci keberhasilan eksploitasi buffer overflow (hole/lubang keamanan yang paling rentan) dan lubang keamanan lainnya yang berorientasi memori.
Dihubungkan dengan pembahasan di bab pendahuluan, shellcode merupakan program yang akan mengambil alih suatu sistem sesaat setelah eksploit memanfaatkan buffer overflow lalu membuat sistem tersebut 'crash'. Shellcode dapat diibaratkan seperti telur yang di bungkus oleh eksploit, saat eksploit berhasil meng-buffer-overflow-kan suatu sistem maka telur yang ada didalamnya akan segera mengambil alih sistem tersebut.
Penerapan dalam prinsip dasar cara kerja komputer, prosesor hanya akan melakukan satu buah instruksi dalam satu waktu. Yang memberikan instruksi tersebut adalah program (contoh program: winamp, notepad, dan sebagainya). Saat program akan dieksekusi (misal : kita klik icon winamp), maka program winamp yang semula ada di hardisk akan diload ke suatu lokasi di memori komputer, dan kemudian prosesor akan mengeksekusi kode-kode program winamp tersebut. Ini artinya saat eksploit berhasil merusak program winamp tersebut, eksploit akan menempatkan shellcode di lokasi memori pada mesin target, selanjutnya eksploit akan membuat prosesor menuju lokasi memori tempat shellcode telah ditanam dan kemudian akan mengeksekusinya yaitu mengacaukan program winamp sesuai yang diinginkanya. Kesimpulannya, mekanisme ini berhubungan langsung dengan prosesor dan memori, itu sebabnya shellcode dibuat agar dapat langsung ditanam pada memori sehingga bentuknya cukup aneh.
Jumat, 31 Desember 2010
KONSEP SHELLCODE
Dalam keamanan komputer, shellcode dalam arti yang paling harfiah, berarti menulis code yang akan mengembalikan remote shell ketika dieksekusi. Kenapa disebut shellcode? Bila hacker dapat membuat program mengeksekusi code apapun yang dia mau, maka code apakah yang dipilihnya? Pilihan terbaik adalah code yang memberikan dia shell sehingga dia dapat memberi perintah lain yang dia mau dengan leluasa. Oleh karena itu code itu disebut shell-code.
Walaupun umumnya shellcode memberikan shell, shellcode tidak selalu memberikan shell. Attacker bebas menentukan code apa yang akan dieksekusi di komputer korban. Shellcode dimasukkan ke dalam kode eksploit dengan tujuan membypass fungsi suatu software, sehingga software tersebut tidak berjalan secara semestinya, melainkan menjalankan fungsi pada shellcode. Oleh karenanya arti dari shellcode pun telah berkembang, sekarang merupakan code byte yang digunakan dengan payload untuk mengeksploitasi komputer target sesuai yang diinginkan. Biasanya shellcode dibuat untuk dapat mengontrol komputer, ataupun mendapatkan hak akses komputer target, atau yang lainnya seperti mulai dari menghapus file, memformat hardisk, mengirimkan data, menginstall program baru dan sebagainya terserah keinginan attacker.
Code dalam shellcode adalah dalam bentuk bahasa mesin atau opcode. Opcode ini bersifat independen yang tidak memiliki instruksi yang terdiri dari byte NULL atau mengandung operan byte NULL, hal ini disebabkan situasi yang unik ketika pemanfaatan buffer overflow, attacker cenderung mengirimkan instruksi pointer dengan pointer ke shellcode sewenang-wenang. Dengan demikian, pengendalian eksekusi mengalir melalui shellcode/opcode independen tersebut. Biasanya opcode ini tidak dituliskan dalam nilai binary karena akan menjadi sangat panjang, melainkan memakai nilai hexa yang lebih kompak seperti contoh sebagai berikut :
char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x0f\x59\xb3"
"\x01\xb2\x0d\xb0\x04\xcd\x80\xfe\xcb\xb0\x01\xcd"
"\x80\xe8\xec\xff\xff\xff\x48\x65\x6c\x6c\x6f\x2c"
"\x20\x77\x6f\x72\x6c\x64\x21";
Karakter-karakter di atas merupakan bentuk shellcode yang dapat langsung ditempakan pada memori komputer, dan dapat segera dieksekusi oleh prosesor. Apabila dieksekusi, shellcode di atas akan menginstruksikan prosesor untuk menampilkan tulisan "Hello, World!" pada monitor (STDOUT).
Walaupun umumnya shellcode memberikan shell, shellcode tidak selalu memberikan shell. Attacker bebas menentukan code apa yang akan dieksekusi di komputer korban. Shellcode dimasukkan ke dalam kode eksploit dengan tujuan membypass fungsi suatu software, sehingga software tersebut tidak berjalan secara semestinya, melainkan menjalankan fungsi pada shellcode. Oleh karenanya arti dari shellcode pun telah berkembang, sekarang merupakan code byte yang digunakan dengan payload untuk mengeksploitasi komputer target sesuai yang diinginkan. Biasanya shellcode dibuat untuk dapat mengontrol komputer, ataupun mendapatkan hak akses komputer target, atau yang lainnya seperti mulai dari menghapus file, memformat hardisk, mengirimkan data, menginstall program baru dan sebagainya terserah keinginan attacker.
Code dalam shellcode adalah dalam bentuk bahasa mesin atau opcode. Opcode ini bersifat independen yang tidak memiliki instruksi yang terdiri dari byte NULL atau mengandung operan byte NULL, hal ini disebabkan situasi yang unik ketika pemanfaatan buffer overflow, attacker cenderung mengirimkan instruksi pointer dengan pointer ke shellcode sewenang-wenang. Dengan demikian, pengendalian eksekusi mengalir melalui shellcode/opcode independen tersebut. Biasanya opcode ini tidak dituliskan dalam nilai binary karena akan menjadi sangat panjang, melainkan memakai nilai hexa yang lebih kompak seperti contoh sebagai berikut :
char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x0f\x59\xb3"
"\x01\xb2\x0d\xb0\x04\xcd\x80\xfe\xcb\xb0\x01\xcd"
"\x80\xe8\xec\xff\xff\xff\x48\x65\x6c\x6c\x6f\x2c"
"\x20\x77\x6f\x72\x6c\x64\x21";
Karakter-karakter di atas merupakan bentuk shellcode yang dapat langsung ditempakan pada memori komputer, dan dapat segera dieksekusi oleh prosesor. Apabila dieksekusi, shellcode di atas akan menginstruksikan prosesor untuk menampilkan tulisan "Hello, World!" pada monitor (STDOUT).
KONSEP BUFFER OVERFLOW
Jika kita mengakses suatu situs web kemudian saat kita memberikan input yang tidak semestinya pada field browser ataupun pada field userId dan password, maka web yang memiliki vulnerability akan terjadi buffer overflow. Apakah yang dimaksud dengan buffer overflow? buffer adalah tempat penampungan, overflow artinya kelebihan muatan. Jadi buffer overflow adalah suatu kondisi dimana element-element yang ada tidak dapat lagi menempati tempat penampungan yang ada.
Contohnya : char rumah[25]; // rumah yang dapat berisi 25 orang saja, char kamar[10]; // kamar yang dapat berisi 10 orang saja. Jika semua yang ada di rumah (25 orang) masuk ke dalam kamar (yang hanya dapat berisi 10 orang saja), kamar itu tidak akan dapat menampung 15 orang lainnya. Hal inilah yang dapat kita katakan buffer overflow, dimana kamar itu adalah buffer dan karena kapasitas kamar lebih kecil dari kapasitas yang akan masuk maka dapat dikatakan overflow. Dengan kata lain mengenai pemahaman buffer overflow sendiri adalah keadaan dimana buffer (variabel yang di gunakan suatu aplikasi untuk menyimpan datanya di memori) terisi dengan data yang ukurannya melebihi kapasitasnya sendiri dan akibatnya kelebihan data itu akan mengisi alamat memori lain yang bukan milik variabel tersebut atau dalam hal ini disebut dengan overwrite.
Menurut NeoTekno Buffer overflow adalah salah satu metode yang digunakan oleh hacker untuk mengeksploitasi sebuah sistem komputer yang memiliki kelemahan pada salah satu aplikasi yang digunakan oleh sistem tersebut. Eksploitasi ini dikenal dengan input validation attack yang dapat mengakibatkan suatu sistem crash (buffer overflow) yaitu variabel yang tersedia pada aplikasi tidak dapat menampung input yang sengaja dibuat berlebihan. Teknik ini banyak digunakan pada man in the middle attack maupun untuk mendapatkan shell console. Sebuah aplikasi dapat di-buffer-overflow karena memang aplikasi tersebut tidak memiliki kontrol data yang baik dan biasanya ini tidak disadari oleh si pembuat program tersebut. Lalu bagaimana seorang hacker dapat memperoleh hak akses terhadap sistem hanya dengan memanfaatkan kelemahan dari suatu aplikasi yang ada di sistem komputer target? Tentu hal ini berkaitan erat dengan otoritas (baca: akses) yang di miliki oleh aplikasi tersebut.
Agar dapat memahami dan melihat secara nyata dampak dan akibat dari buffer overflow ini, di bab selanjutnya akan dibahas implementasi metode buffer overflow ini dalam bahasa C/C++ yang hingga saat ini masih menjadi bahasa yang paling banyak digunakan dalam pembuatan aplikasi untuk Linux dan Unix. Kemudian untuk sistem operasinya menggunakan Linux RedHat 7.2 Enigma.
Contohnya : char rumah[25]; // rumah yang dapat berisi 25 orang saja, char kamar[10]; // kamar yang dapat berisi 10 orang saja. Jika semua yang ada di rumah (25 orang) masuk ke dalam kamar (yang hanya dapat berisi 10 orang saja), kamar itu tidak akan dapat menampung 15 orang lainnya. Hal inilah yang dapat kita katakan buffer overflow, dimana kamar itu adalah buffer dan karena kapasitas kamar lebih kecil dari kapasitas yang akan masuk maka dapat dikatakan overflow. Dengan kata lain mengenai pemahaman buffer overflow sendiri adalah keadaan dimana buffer (variabel yang di gunakan suatu aplikasi untuk menyimpan datanya di memori) terisi dengan data yang ukurannya melebihi kapasitasnya sendiri dan akibatnya kelebihan data itu akan mengisi alamat memori lain yang bukan milik variabel tersebut atau dalam hal ini disebut dengan overwrite.
Menurut NeoTekno Buffer overflow adalah salah satu metode yang digunakan oleh hacker untuk mengeksploitasi sebuah sistem komputer yang memiliki kelemahan pada salah satu aplikasi yang digunakan oleh sistem tersebut. Eksploitasi ini dikenal dengan input validation attack yang dapat mengakibatkan suatu sistem crash (buffer overflow) yaitu variabel yang tersedia pada aplikasi tidak dapat menampung input yang sengaja dibuat berlebihan. Teknik ini banyak digunakan pada man in the middle attack maupun untuk mendapatkan shell console. Sebuah aplikasi dapat di-buffer-overflow karena memang aplikasi tersebut tidak memiliki kontrol data yang baik dan biasanya ini tidak disadari oleh si pembuat program tersebut. Lalu bagaimana seorang hacker dapat memperoleh hak akses terhadap sistem hanya dengan memanfaatkan kelemahan dari suatu aplikasi yang ada di sistem komputer target? Tentu hal ini berkaitan erat dengan otoritas (baca: akses) yang di miliki oleh aplikasi tersebut.
Agar dapat memahami dan melihat secara nyata dampak dan akibat dari buffer overflow ini, di bab selanjutnya akan dibahas implementasi metode buffer overflow ini dalam bahasa C/C++ yang hingga saat ini masih menjadi bahasa yang paling banyak digunakan dalam pembuatan aplikasi untuk Linux dan Unix. Kemudian untuk sistem operasinya menggunakan Linux RedHat 7.2 Enigma.
KONSEP EKSPLOIT
Eksploit dalam konteks harfiah yaitu pemanfaatan. Tentunya eksploit-eksploit 'hacking' lebih spesifik lagi, yang kurang lebih dapat diartikan sebagai pemanfaatan kelemahan dari sebuah sistem untuk tujuan-tujuan yang di luar dari penggunaan normal. Kelemahan-kelemahan (vulnerability) ini dapat berupa kesalahan pemrograman, sesuatu yang tidak direncanakan oleh pemrogram asli dan lain-lain.
Umumnya, yang jelas paling menarik perhatian kita, adalah eksploit yang akan memberikan kita akses tidak terbatas ke seluruh aspek dari sebuah sistem. Dalam Linux, sering kita dengar istilah mengeksploit program tertentu untuk mendapat privilese root. Tentu saja mendapatkan 'root' bukanlah satu-satunya tujuan pengeksploitan sistem. Seperti yang mungkin sering dialami, kadang sebuah cacat dalam program seperti maild atau ftpd dapat dimanfaatkan untuk tujuan seperti header forging, ip spoofing, denial of service attack, dan mail bombing.
Eksploit secara besar sering dibagi menjadi dua, yaitu eksploit lokal dan eksploit remote. Eksploit lokal adalah jenis eksploit yang hanya dapat dijalankan jika kita sudah punya akses ke dalam suatu sistem (baik itu melalui login telnet, ftp, dll). Eksploit jenis ini jumlahnya banyak, sebab kita sudah punya akses ke ribuan program yang berpotensi untuk dieksploit. Contoh-contoh dari eksploit jenis ini adalah buffer overflow (i.e. mh di RedHat 5, SuperProbe, dan lain-lain), race conditions (dimana dua proses saling berlomba untuk menyelesaikan tugas masing-masing, biasanya proses A disuruh untuk menjalankan suatu utilitas yang membutuhkan privilese root temporer sementara proses B dirancang untuk mencegat proses A sebelum proses A kembali statusnya ke privilese user biasa, mengakibatkan dispawnnya shell beridentitas root sering terjadi di mesin-mesin IRIX dan SunOS). Bagaimana caranya agar kita dapat mendapatkan eksploit seperti ini? Tentu saja kita dapat menghabiskan waktu berjam-jam untuk mengutak-utik sebuah program sampai berhasil kita tembus/jebol. Biasanya eksploit diprogram dengan bahasa C, perl, atau sh.
Eksploit jenis satunya lagi adalah eksploit remote, dimana kita dapat mengeksploit sistem tanpa mengetahui otorisasi user/password. Tentu saja eksploit-eksploit jenis ini jauh lebih sedikit jumlahnya, dan terkadang dampaknya juga tidak separah eksploit lokal. Lubang cgi phf adalah salah satu contoh dari pemanfaatan eksploit remote untuk mendapatkan file/etc/passwd. Mungkin belum terlihat fatal, namun sekalinya sang 'cracker' berhasil masuk ke dalam sistem memanfaatkan login dan password dari salah seorang user, maka dia dapat menjalankan eksploit-eksploit lokal untuk mendapatkan akses tak terbatas milik root.
Umumnya, yang jelas paling menarik perhatian kita, adalah eksploit yang akan memberikan kita akses tidak terbatas ke seluruh aspek dari sebuah sistem. Dalam Linux, sering kita dengar istilah mengeksploit program tertentu untuk mendapat privilese root. Tentu saja mendapatkan 'root' bukanlah satu-satunya tujuan pengeksploitan sistem. Seperti yang mungkin sering dialami, kadang sebuah cacat dalam program seperti maild atau ftpd dapat dimanfaatkan untuk tujuan seperti header forging, ip spoofing, denial of service attack, dan mail bombing.
Eksploit secara besar sering dibagi menjadi dua, yaitu eksploit lokal dan eksploit remote. Eksploit lokal adalah jenis eksploit yang hanya dapat dijalankan jika kita sudah punya akses ke dalam suatu sistem (baik itu melalui login telnet, ftp, dll). Eksploit jenis ini jumlahnya banyak, sebab kita sudah punya akses ke ribuan program yang berpotensi untuk dieksploit. Contoh-contoh dari eksploit jenis ini adalah buffer overflow (i.e. mh di RedHat 5, SuperProbe, dan lain-lain), race conditions (dimana dua proses saling berlomba untuk menyelesaikan tugas masing-masing, biasanya proses A disuruh untuk menjalankan suatu utilitas yang membutuhkan privilese root temporer sementara proses B dirancang untuk mencegat proses A sebelum proses A kembali statusnya ke privilese user biasa, mengakibatkan dispawnnya shell beridentitas root sering terjadi di mesin-mesin IRIX dan SunOS). Bagaimana caranya agar kita dapat mendapatkan eksploit seperti ini? Tentu saja kita dapat menghabiskan waktu berjam-jam untuk mengutak-utik sebuah program sampai berhasil kita tembus/jebol. Biasanya eksploit diprogram dengan bahasa C, perl, atau sh.
Eksploit jenis satunya lagi adalah eksploit remote, dimana kita dapat mengeksploit sistem tanpa mengetahui otorisasi user/password. Tentu saja eksploit-eksploit jenis ini jauh lebih sedikit jumlahnya, dan terkadang dampaknya juga tidak separah eksploit lokal. Lubang cgi phf adalah salah satu contoh dari pemanfaatan eksploit remote untuk mendapatkan file/etc/passwd. Mungkin belum terlihat fatal, namun sekalinya sang 'cracker' berhasil masuk ke dalam sistem memanfaatkan login dan password dari salah seorang user, maka dia dapat menjalankan eksploit-eksploit lokal untuk mendapatkan akses tak terbatas milik root.
Langganan:
Postingan (Atom)