Bedah exploitasi linux kernel beserta contoh kasusnya


baik,di sini kita akan mempelajari bagaimana local exploit
bekerja untuk mendapatkan akses root di linux dengan cara sebagai berikut :
mendapatkan inode(index node)/object id di shell
dengan cara compile shell,untuk getdents(),setdummy xattr,
untuk di jadikan satu dengan getdents()
nah di sini dia akan nulis lagi CAP_SETUID di xattr,
hingga eksekusi shell then..got root!

exploitnya seperti ini
http://jon.oberheide.org/files/team-edward.py
untuk kernel 2.6.34-rc3 yang memiliki bug privilege escalation

bagaimanakah bug tersebut bisa terjadi dan
seperti apa sih pola/konsep eksploitasi terhadap
mesin bekerja??

step by step eksploitasinya kurang-lebih seperti ini :


1.manggil mmap untuk jadi map zero page
apa itu mmap dan map zero page?

mmap adalah POSIX-compliant nya di unix syscall
tugasnya yang memetakan file atau perangkat ke dalam memori.
selanjutnya dia ini mengimplementasikan permintaaan halaman
karena pada awalnya isi file gk bisa di baca dari disk
tanpa memori fisik sekalipun,
sederhananya,mmap dapat membuat beberapa jenis pemetaan dari memori tsb.
di sini maksudnya pemetaan secara virtual yang sama dengan malloc untuk implementasi dari alokasi memori tertentu
jadi file ini akan di dukung pemetaan area memori virtual untuk proses selanjutnya,yang akan mengalokasikan memori

2.merubah fake mbuf di 0x0
contoh :
mbuf> data yang akan di ponting ke address
yang masuk ke table syscall

3.memangil getsockopt untuk mentrigger vulnerabilitiesnya

getsockopt() ini ibaratnya kayak asistennya kernel
yang tugasnya identifier paket yg akan masuk ke kernel
jadi dia akan memeriksa apakah yg akan di kirim ke kernel ini
ipv4 atau ipv6
nah karena tugasnya getsockopt ini banyak
dia masih ada lagi yang ngebantuin tugasnya yaitu si 'packet.h'
(skip di sini tidak akan membahas lebih lanjut tentang packet.h biar gk meluber)
yang akan memvalidasi ipv4 atau SCTP yang valid
untuk menghindari stack di mem nya fully loaded bahkan hingga crash --"

4.membuat fake akses untuk kernel dengan fungsi mbuf
yang akan di alocated ke 0x0 dan menjadikan 0x1 ke address mbuf->data
dengan meng-overwrite di syscall nya

5.set up root buat jalanin shellcode
di address 0x1

6.memanggil syscall untuk di overwrite

7.dengan memanggil system yang vulner di 0x1
(dalam hal ini null pointer dereference)
untuk eksekusi shellcode/exploit di sini

biasanya di /proc/sys/vm/mmap_min_addr
ini gak bisa mmaping untuk addres < mmap_min_addr
karena dia ngeblock null ptr derefs yang leak sensitive kernel memory untuk userspace
biasanya sih karena di batasi oleh copy_to_user()

info leak w/setuid exploit
leak dari task_struct/vma untuk bypass ASLR
untuk mencari nilai canaries dari task_struct

contoh codenya :

static int sctp_getsockopt_hmac_ident(struct sock *sk, int len, char __user *optval, int __user *optlen)
{
struct sctp_hmac_algo_param *hmacs;
__ul6 param_len;
[b](di len ini lah attacker mengeksploitasinya)[/b]

hmacs = sctp_sk(sk)->ep->auth_hmacs_list;
param_len = ntohs(hmacs->param_hdr.length);

if (len < param_len)
return -EINVAL;
if (put_user(len, optlen))
return -EFAULT;
if (copy_to_user(optval, hmacs->hmac_ids, len))
return -EFAULT;
[b]unbounded copy_to_user[/b]
return 0;
}

menggunakan ptrace_attach untuk user copies
contoh menggunakan sendmsg() untuk multiple user copy yang vulner

contoh race_condition.c

while(ucmsg != NULL)
{
if(get_user(ucmlen, &ucmsg->cmsg_len))
return -EFAULT;
if(CMSG_COMPAT_ALIGN(ucmlen) < CMSG_COMPAT_ALIGN(sizeof(struct compat_cmsghdr)))
return -EINVAL;
if((unsigned long) (((char __user *)ucmsg - (char __user *)kmsg->msg_control) + ucmlen) > kmsg->msg_controllen)
return -EINVAL;
tmp = ((ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg))) +
CMSG_ALIGN(sizeof(struct cmsghdr)));
kcmlen += tmp;
ucmsg = cmsg_compat_nxthdr(kmsg, ucmsg, ucmlen);
}

if(kcmlen > stackbuf_size)
kcmsg_base = kcmsg = kmalloc(kcmlen, GFP_KERNEL);

while(ucmsg != NULL)
{
__get_user(ucmlen, &ucmsg->cmsg_len);
tmp = ((ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg))) + CMSG_ALIGN(sizeof(struct cmsghdr)));
kcmsg->cmsg_len = tmp;
__get_user(kcmsg->cmsg_level, &ucmsg->cmsg_level);
__get_user(kcmsg->cmsg_type, &ucmsg-<cmsg_type);

if(copy_from_user(CMSG_DATA(kcmsg), CMSG_COMPAT_DATA(ucmsg),

yeepp saya jelasin maksud dari kode di atas

if(get_user(ucmlen, &ucmsg->cmsg_len))
return -EFAULT;

dia akan mengkopi semua nilai sepanjang yang ada di userspace
dengan mensanitasi nilai panjang yang di check terlebih dahulu di

(char __user *)kmsg->msg_control) + ucmlen) > kmsg->msg_controllen)
slab sebagai allocator default di kernel yang tugasnya kerja sama dengan kmalloc()

yeppp kita sudah cukup tahu bugnya
dan sekarang kita akan pelajari source code xplnya
yang memanfaatkan kesalahan klasifikasi null pointer dereferences
yang sebenarnya dia hanya menspesifikasikan case di 0x0

mensetup payload untuk mmap kemudian
menjadikan nilai memcpy null dengan shellcode seperti ini:
Quote:
XATTR = '\x41\x58\x46\x52\xc1\x00\x00\x02\x01\x00\x00\x02\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
(0,shellcode,sizeof(shellcode));

dengan mentrigger bug null derefercens
untuk mengirim file di (__get_user,CMSG_COMPAT_ALIGN,);
tinggal mengisi space untuk kemudian trigger functionnya

ref : phrack.org/issues.html?issue=66&id=15#article
0.00 / 0 votes

In order to comment, please sign in

Comments


Loading

Testimonials


User Menu