Старый 20.12.2011, 22:26   #1
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию FreeBSD UIPC local root exploit

Уязвимость в обработке unix сокетов
CVE: 2011-4062
Дата публикации уязвимости: 2011-09-28
Патч с сайта производителя: http://security.freebsd.org/advisories/FreeBSD-SA-11:05.unix.asc
Код тестировался на FreeBSD 8.2
Код эксплойта http://www.sendspace.com/file/ezpxl3
Запуск: распаковать и запустить sh start.sh

POC видео http://www.sendspace.com/file/a6z4d6

Потенциальных уязвимых мест несколько:
1. в функции unp_connect под буфер выделяется 255 и в него копируется путь нашего unix сокета, длина которого не проверяется.
Код:
1160:	char buf[SOCK_MAXADDRLEN];
...
1171:	bcopy(soun->sun_path, buf, len);
...
Но до этого вызова происходит проверка длины передаваемого аргумента в функции getsockaddr.
Код:
1680:	if (len > SOCK_MAXADDRLEN)
1681:		return (ENAMETOLONG);
Здесь мы ограничиваемся 255 байтами, переполнение стека исключено.
2. в unp_connect выделяется память под структуру sockaddr_un(106 байт), а скопировать может до 255-2 байт
Код:
1181: sa = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK);
...
1251: bcopy(unp2->unp_addr, sa, unp2->unp_addr->sun_len);
3. в uipc_sockaddr
Код:
1006: *nam = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK);
...
1012: bcopy(sa, *nam, sa->sa_len);
Описание работы эксплойта
Для вызова тригера уязвимости проще использовать getsockname, т.к. не надо создавать полную имитацию подключения.

Смысл сплойта заключается в выделении нескольких кусков памяти в ядре размером слаба 128 байт и перезаписать указатель на бочонок(keg) в верхушке слаба. Нам необходимо создать фейковый keg в памяти и переписать указатель на uma_zone для нашего keg, а потом в uma_zone указатель на dtors функцию. Поскольку выделенный участок памяти долго не задерживается, практически сразу происходит освобождение памяти и управление передается на наш указатель фейковой структуры. По адресу keg->dtors располжен шелкод.
Повышаем привилегии для текущего процесса. Так как адрес для keg используется из пользовательского пространства после завершения нашего процесса и для других процесов(и потоков ядра) этот адрес существовать не будет. Что может привести к падению системы. Нам надо восстановить указатель на keg. Для этого, как правило, можно использовать соседний slab. Проверяем их +- 0x1000(стандартный размер slaba), если валидны, подставляем в наш поврежденный слаб. После пропускаем несколько инструкций в стеке, попадаем на ret и возвращаемся в user space с уже повышенными привилегиями.
Более детальную информацию по UMA в FreeBSD можно посмотреть на http://phrack.org/issues.html?issue=66&id=8#article.

Проблема эксплойта заключается в его нестабильной работе.
Результат успешного выполнение примерно 1 к 20. Здесь многое зависит от того как часто выделяется/освобождается память в ядре для 128 байт.
В качестве управления памяти я использовал вызов suid программы ping. Нам важно заполнить границу между соседними слабами и потом единовременно освободить эту память. Для этого и введена задержка на 6 секунд. После освобождения у нас останется ~32(значение 32 происходит из того, что 4096 разбивается по 128 байт на 31 кусок + заголовок slab + 1 кусок, то есть занимаем полный слаб) свободных подряд идущих кусков, которые наш сплойт должен последовательно попробовать. Чем раньше наш эксплойт попадет на верхушку слаба и чем меньше он до этого перепробует адресов, от этого и будет зависеть успешность его выполнения.

Для проверки выделяемых адресов можно использовать небольшой модуль ядра http://www.sendspace.com/file/8xxaua
Вложения
Тип файла: tgz sploit.tgz (1.8 Кб, 1099 просмотров)
Тип файла: tgz memvisor.tgz (943 байт, 818 просмотров)
__________________
[IO]

Последний раз редактировалось Jokester; 28.01.2012 в 18:46.. Причина: неточности
overxor вне форума   Ответить с цитированием
Старый 21.12.2011, 03:09   #2
dumb
 
Регистрация: 01.10.2011
Сообщений: 63
Репутация: 1
По умолчанию

Красавец!

На 1ом:
Код:
8.2-STABLE FreeBSD 8.2-STABLE #2 r112: Tue Nov 29
$ ./start.sh
Can't get 0
2ой:
Код:
8.2-RELEASE-p2 FreeBSD 8.2-RELEASE-p2 #0: Wed Oct  5 
$ ./start.sh
Before allocation free items: 5360
....
Current pid [19025] free items: 5178
Current pid [19029] free items: 5178
Current pid [19033] free items: 5178
Current pid [19038] free items: 5177
Current pid [19042] free items: 5177
Current pid [19046] free items: 5176
Current pid [19050] free items: 5178
Current pid [19054] free items: 5178
Current pid [19058] free items: 5178
Current pid [19062] free items: 5178
Current pid [19066] free items: 5178
Current pid [19071] free items: 5177
Current pid [19075] free items: 5048
Current pid [19079] free items: 5048
Current pid [19084] free items: 5048
Current pid [19088] free items: 5048
Current pid [19093] free items: 5048
Current pid [19098] free items: 5048
Current pid [19102] free items: 5048
Current pid [19106] free items: 5048
Current pid [19110] free items: 5048
Current pid [19114] free items: 5048
Current pid [19118] free items: 5048
Current pid [19122] free items: 5048
Current pid [19126] free items: 5048
After allocation free items: 5048
Current pid [19133] free: 5045
Current pid [19138] free: 5045
Current pid [19142] free: 5045
Current pid [19146] free: 5045
Current pid [19150] free: 5044
Current pid [19155] free: 5045
Current pid [19159] free: 5045
Current free items 5045
Sleep 6 seconds ...
End = 5048
bind: Invalid argument
тут никак?

на 3ем рут! ядро майское!
dumb вне форума   Ответить с цитированием
Старый 21.12.2011, 07:17   #3
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

Цитата:
Сообщение от dumb Посмотреть сообщение
На 1ом:
Код:
8.2-STABLE FreeBSD 8.2-STABLE #2 r112: Tue Nov 29
$ ./start.sh
Can't get 0
Здесь сплойт не смог определить сколько выделяется itemов за 1 fork. Ничего страшного, просто перезапусти сплойт.

во 2ом случае ядро патченое
__________________
[IO]
overxor вне форума   Ответить с цитированием
Старый 21.12.2011, 10:03   #4
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

overxor
Ты крут! Спасибо за пост и потраченное время.

Цитата:
После пропускаем несколько инструкций в стеке, попадаем на ret
Код:
        memset(ptr, 0x5b, 13);
        ptr += 13;
        *(unsigned char *)ptr = 0xc3;
//
00000000  5B                pop ebx
00000000  C3                ret
Зачем это делается? Что приходится пропускать в стеке?

Цитата:
Vulnerable:
FreeBSD Freebsd 8.2-RELEASE-p2
FreeBSD Freebsd 8.2-RELEASE-p1
FreeBSD Freebsd 8.2
FreeBSD Freebsd 8.1-RELEASE-p4
FreeBSD FreeBSD 8.1-RELEASE
FreeBSD FreeBSD 8.1-PRERELEASE
FreeBSD Freebsd 8.1
FreeBSD FreeBSD 8.0-STABLE
FreeBSD FreeBSD 8.0-RELEASE
FreeBSD Freebsd 7.4-RELEASE-p2
FreeBSD Freebsd 7.4
FreeBSD FreeBSD 7.3-STABLE
FreeBSD Freebsd 7.3-RELEASE-p6
FreeBSD FreeBSD 7.3-RELEASE-p1
FreeBSD Freebsd 7.3

Not Vulnerable:
FreeBSD Freebsd 9.0-RC1
FreeBSD Freebsd 8.2-STABLE
FreeBSD Freebsd 8.2 - RELEASE -p3
FreeBSD Freebsd 8.1-RELEASE-p5
FreeBSD Freebsd 7.4-STABLE
FreeBSD Freebsd 7.3 - RELEASE - p7
Неактуальная нонче соседняя тема по этой баге.
SynQ вне форума   Ответить с цитированием
Старый 21.12.2011, 13:48   #5
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

Цитата:
Сообщение от SynQ Посмотреть сообщение
Код:
        memset(ptr, 0x5b, 13);
        ptr += 13;
        *(unsigned char *)ptr = 0xc3;
//
00000000  5B                pop ebx
00000000  C3                ret
Зачем это делается? Что приходится пропускать в стеке?
В стеке пропукаем аргументы до адреса возврата на функцию free. Регистры указывают на поддельный keg и если этого не делать, ядро упадет.

Цитата:
Сообщение от SynQ Посмотреть сообщение
Неактуальная нонче соседняя тема по этой баге.
Эксплойт, да, неактуальный. Хотя под bsd давненько ничего не выходило.
Писался скорее для себя, чем как боевой сплойт. Целью было получить опыт в написании и понять как можно эксплуатировать уязвимость. К тому же решены не все проблемы. Поэтому буду рад любым идеям.

PS: Спасиб, ребят. Приятно осознавать, что кому-то тоже интересна эта тема.
__________________
[IO]
overxor вне форума   Ответить с цитированием
Старый 21.12.2011, 14:10   #6
kfor
 
Аватар для kfor
 
Регистрация: 27.01.2011
Сообщений: 120
Репутация: 39
По умолчанию

Цитата:
Сообщение от overxor Посмотреть сообщение

Эксплойт, да, неактуальный. .
Мне кажется ты не правильно понял SynQ.

За проделанную работу тебе огромный респект. Продолжай в том же духе!
kfor вне форума   Ответить с цитированием
Старый 21.12.2011, 16:11   #7
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Цитата:
Сообщение от overxor
Эксплойт, да, неактуальный
Я такого не говорил Имел в виду, что соседняя тема теперь неактуальна, раз тут готовый эксплойт появился.


Цитата:
Сообщение от overxor
В стеке пропукаем аргументы до адреса возврата на функцию free.
А не сохранилось бектрейса? Откуда идет вызов uipc_sockaddr() и где тот free()?
SynQ вне форума   Ответить с цитированием
Старый 21.12.2011, 18:05   #8
dumb
 
Регистрация: 01.10.2011
Сообщений: 63
Репутация: 1
По умолчанию

А серво-в-дауны предполагаются?
А то у меня на
Цитата:
FreeBSD 8.1-RELEASE-p1 FreeBSD 8.1-RELEASE-p1 #0: Thu Sep 29 17:18:39 MSD 2011
Цитата:
dumb@localhost:~$ nc 188.*.*.* 8282
sh: can't access tty; job control turned off
$ ./start.sh
тут никакого вывода не было
(минуты 3 подождал, глянул шелл - серв в дауне)

И еще, никто не замечал, пока работает сплойт, скомпиленный файл free находится при правах(пользователь/группа) моего же юзера, только нельзя ни чмод на нем поменять ни переименовать (вообщем, в всо, белого цвета на нем права). Это так, фигня наверное...
dumb вне форума   Ответить с цитированием
Старый 21.12.2011, 19:44   #9
Andrey1800
 
Регистрация: 31.08.2010
Сообщений: 196
Репутация: 154
По умолчанию

dumb, какая архитектура?
стоило наверное отметить, что эксплоит только под i386
Andrey1800 вне форума   Ответить с цитированием
Старый 21.12.2011, 20:46   #10
azid
 
Регистрация: 21.10.2010
Сообщений: 61
Репутация: 1
По умолчанию

кто возьмется допилить чтоб пахало на всех архитектурах?)
Ну и вообще багфикс)...а то не хочется серв уронить вкусный)
ЗЫ:Мегореспект те,давно ждем
azid вне форума   Ответить с цитированием
Ответ

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

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

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

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

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



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