Старый 21.12.2011, 22:12   #11
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

SynQ, просто я не правильно тебя понял =) backtrace



При неудачи серв неминуемо падает в панику.
После проверки uid можно добавить что-то вроде
Код:
char read_buf[1024] = "";
int fd = open("/etc/master.passwd",  O_RDONLY);
if(fd) {
  read(fd, read_buf, sizeof(read_buf));
  fprintf(stderr, "%s\n", read_buf);
  close(fd);
}
Если упадет, то перед смертью хоть успеет прочесть важные файлы.
__________________
[IO]
overxor вне форума   Ответить с цитированием
Старый 22.02.2012, 14:21   #12
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

overxor
Возникло еще несколько вопросов:

Цитата:
Нам важно заполнить границу между соседними слабами и потом единовременно освободить эту память. Для этого и введена задержка на 6 секунд. После освобождения у нас останется ~32
1) Заполняем границу, чтобы следующие malloc шли последовательно?

2) argp в статье создавал подобия uma_zone и keg структур, заполняя их оригинальными значениями, тут этого нет - никак не влияет на успешность?

Код:
        while(l < 210) {
            getsockname(sd, (struct sockaddr*)&myaddr, &size);
            if(!getuid() || !geteuid()) {
               fprintf(stderr, "ROOT!!!\n");
               close(sd);
               unlink(saddr.sun_path);
               system("killall ping");
               system("sh -i");
               return 0;
            }
            fprintf(stderr, "Try [%d] free items: %d\n", l, get_free());
            forker("5000");
            l ++;
       }
3) тут getsockname эксплуатирует багу, а forker на случай, если мы еще не в том 128-байтном кусочке кучи?
3-a) зачем тут unlink()? %)

4) в конфе ты уже отвечал - ping используется для выделения памяти и не особо надежен в этом качестве?

P.S. В Линуксе afair нашли удобный способ выделять память контролируемо - сисколл shmat(), и еще видел скрипт для поиска в сорсе ядра структур, которые выделяются через kmalloc(): https://github.com/jonoberheide/kstructhunter
SynQ вне форума   Ответить с цитированием
Старый 22.02.2012, 18:30   #13
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

Цитата:
1) Заполняем границу, чтобы следующие malloc шли последовательно?
ага, чтобы последовательно переполняли, не перетирая другие важные занятый слабы.

Цитата:
2) argp в статье создавал подобия uma_zone и keg структур, заполняя их оригинальными значениями, тут этого нет - никак не влияет на успешность?
Здесь на успешность это никак не влияет, главное воспроизвести обращение us_keg->us_zones->uz_dtors
Если посмотришь работу free по сути только берется http://fxr.watson.org/fxr/source/ker...FREEBSD82#L503 (еще берется size из kega, но не участвует дальше).
и в начале функции вызывается dtors http://fxr.watson.org/fxr/source/vm/...82;im=10#L2548
В конце шел кода мы восстаналиваем uz_keg на свое место, пропускаем несколько значений из стека и выходим из uma_zfree_arg ничего при этом не разрушав. Будет болтаться только один слаб не освобожденный, думаю это не критично. Еще значение uz_keg берет из соседнего slab_head. Как правило соседнии slab_head существуют, но не всегда так. Это еще одно вероятно место краха сплойта.
Впринципе можно использовать фиксированые адреса, на 8.2 они одни и те же

Цитата:
3) тут getsockname эксплуатирует багу, а forker на случай, если мы еще не в том 128-байтном кусочке кучи?
да, если мы все еще не переписали хедер слаба, мы занимаем следующий незанятый кусок. И так пока не дойдем до заголовка будем последовательно переполнять.

Цитата:
3-a) зачем тут unlink()? %)
чтобы удалить следы постэкскплуатации. Файл в дире из 237 последовательных символов А мало кому понравится. По хорошему надо бы все файлы удалять. (Если кернел упадет в панику, будет не понятно почему произошел крах).

Цитата:
4) в конфе ты уже отвечал - ping используется для выделения памяти и не особо надежен в этом качестве?
Пинг был использован как самое очевидное решение. При коррупте было замечено что перетираются именно стурктуры отвечающие за процессы в системе.(У некоторых програм uid gid становился 1094795585 == 0x41414141 == "AAAA"). Но он имеет кучу недостатков:
Иногда он выделяет сразу 2 слаба под свои нужны. Кроме того при создании нового процесса выделяет/освобождает какое-то количество памяти(не знаю сколько). И создание процесса ресурсоемкое занятие. Если свободных итемов достаточно много, можно исчерпать все ресурсы системы, в итоге до тригера дело может не дойти. Надо найти удобное средство выделения/освобождения памяти ядра на подобии, как ты написал, сисколла shmat() в линуксе.
__________________
[IO]
overxor вне форума   Ответить с цитированием
Старый 02.10.2014, 12:16   #14
John.d
 
Регистрация: 02.10.2014
Сообщений: 3
Репутация: 0
По умолчанию

Так понимаю, на amd64 не пашет? И тема утухла?
John.d вне форума   Ответить с цитированием
Старый 04.12.2014, 03:49   #15
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

На amd64 данная реализация не пашет. Если сможете найти годный аллокатор под amd64, можете попробовать написать.
Сплойт скорее для тепличных условий и крайне не стабилен.
__________________
[IO]
overxor вне форума   Ответить с цитированием
Старый 07.05.2015, 13:48   #16
sT1myL
 
Регистрация: 09.07.2014
Сообщений: 15
Репутация: 1
По умолчанию

А есть под freeBSD 8.4 эксплоит для поднятие прав ?
sT1myL вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot