Language:

Search

Bedah exploitasi linux kernel beserta contoh kasusnya

  • Share this:
post-title

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-

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:

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

Armin

Armin

IT Dev, SEO & Digital Marketing Specialist with 7+ years experience, Coder, Sys Admin, Designer, Blogger