FastNetMon

Показаны сообщения с ярлыком chroot. Показать все сообщения
Показаны сообщения с ярлыком chroot. Показать все сообщения

четверг, 19 мая 2011 г.

Самый простой способ выполнить команду в chroot

chroot /mnt /bin/bash -c 'ls -la /dev'
total 8
drwxr-xr-x 2 root root 4096 Mar 25 12:13 .
drwxr-xr-x 21 root root 4096 May 19 15:59 ..

Вот честно - стыдно, что сам до такого не додумался :(

суббота, 13 ноября 2010 г.

Breaking chroot()

Отлично знаю, что если в chroot попадает юзер с root привилегиями, то он может оттуда сбежать. Но никогда не понимал механизма, как это делается, вот отличная инструкция: http://www.bpfh.net/simes/computing/chroot-break.html

воскресенье, 17 октября 2010 г.

chroot: cannot run command `/bin/bash': No such file or directory

С такой проблемой столкнуться очень легко - достаточно удалить пару библиотек внутри системы или VPS. Бороться с напастью мы будем из Debian LiveCD.

Ставим спецовый баш, который не имеет зависимостей - он слинкован статически (и удаленные либы ему безразличны):
apt-get install -y bash-static

Данный пакетик несет в себе множество файлов:
dpkg -L bash-static
/.
/bin
/bin/bash-static
/usr
/usr/share
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/bash-static.1.gz
/usr/share/doc
/usr/share/doc/bash-static
/usr/share/doc/bash-static/copyright
/usr/share/doc/bash-static/changelog.Debian.gz

Но нам нужен лишь один - /bin/bash-static.

Итак, допустим сломанная система смонтирована как /mnt. Тогда нужно сделать следующее:
cp /bin/bash-static /mnt/bin
chroot /mnt /bin/bash-static

Вуаяля, чрут сработал :)

пятница, 21 мая 2010 г.

Соображения по генерации chroot окружения в CentOS / Debian или засовываем wget в chroot

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

Экспериментировать мы будем над wget, так как на него я более всего времени потратил. Ставим его:
apt-get install -y wget



Что нужно приложению?

1) Динамические библиотеки явно указанные при линковке. Узнать, какие библиотеки требуются программе крайне легко - ldd /usr/bin/wget.

Вот пример результата работы программы:
ldd /usr/bin/wget
linux-vdso.so.1 => (0x00007fff481ff000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fdea4e7c000)
librt.so.1 => /lib/librt.so.1 (0x00007fdea4c73000)
libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x00007fdea4a22000)
libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x00007fdea4687000)
libc.so.6 => /lib/libc.so.6 (0x00007fdea4334000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdea5080000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fdea4118000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007fdea3f01000)


2) Кроме явно указанных библиотек также возможно, что приложение в процессе запуска через dl_open и другие функции подгружает еще какие-то библиотеки (либо это делает даже не программа, а некая библиотека из зависимостей). Без запуска программы это выяснить нельзя. Так что заюзаем strace:


strace -e trace=open -f /usr/bin/wget ya.ru 2>&1 | grep lib
open("/lib/libdl.so.2", O_RDONLY) = 3
open("/lib/librt.so.1", O_RDONLY) = 3
open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = 3
open("/usr/lib/libcrypto.so.0.9.8", O_RDONLY) = 3
open("/lib/libc.so.6", O_RDONLY) = 3
open("/lib/libpthread.so.0", O_RDONLY) = 3
open("/usr/lib/libz.so.1", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/lib/libnss_files.so.2", O_RDONLY) = 3
open("/lib/libnss_dns.so.2", O_RDONLY) = 3
open("/lib/libresolv.so.2", O_RDONLY) = 3


Итого, выяснили еще несколько библиотек, которые нам нужны для работы.

3) Кроме библиотек приложению часто требуются специализированные устройства, /dev/null, /dev/zero, /dev/urandom, /dev/random и ряд других.
4) Также часто приложения требуют смонтированной файловой системы /proc, но это часто игнорируется ими и они без нее работают корректно.
5) Конфигурационные файлы, например: /etc/resolv.conf. Тут также сложность в том, что конфиги могут требоваться не самой программой, а зависимыми библиотеками.
6) Файлы документации, локали и проч - их также ловить только по strace.

На основе всего выше сказанного, задача правильного помещения большого числа программ в chroot становится почти неавтиматизируемой при подходе со стороны реверс инжиниринга. А вот со стороны:

dpkg -L wget
и
apt-cache depends wget


Она вполне решаемая. Но тут также без файлов устройств не обойтись.

воскресенье, 14 февраля 2010 г.

Symink изнутри chroot наружу?

По понятным причинам (т.к. это всего лишь символическая ссылка), невозможен. Но можно использовать mount -o bind для монтирования папки под другим именем :)

Запуск SSHD в chroot на Debian 5 Lenny: подготовка дерева каталогов

ЭТО НЕ CHROOTED SSH в папку пользователя!!! Это запуск демона в CHROOT!!!! В 95% случаев ЭТА СТАТЬЯ ВАМ НЕ НУЖНА.

Мы будем использовать makejail, но есть еще ряд аналогов: jailer и jailtool.

Ставим тулзу для сборки chroot среды:
apt-get install -y makejail


В его стандартной поставке есть ряд шаблонов для запуска различных сервисов в chroot:

ls /usr/share/doc/makejail/examples
apache.py global.OpenBSD mysqld.py postgresql.py
bind.py mldonkey.py ntpd.py sshd.py


Теперь создаем папку, куда будет "сложен" комплект файлов для успешного чрута sshd:
mkdir -p /var/chroot/sshd


Но при попытке запуска:
makejail /usr/share/doc/makejail/examples/sshd.py


Нас постигает полный облом:

Loading configuration file /usr/share/doc/makejail/examples/sshd.py
Cannot load configuration file '/usr/share/doc/makejail/examples/sshd.py' as a python module
Executing it with python which should display a syntax error:
File "/usr/share/doc/makejail/examples/sshd.py", line 3
SyntaxError: Non-ASCII character '\xf1' in file /usr/share/doc/makejail/examples/sshd.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details


К счастью, это крайне легко фиксица добавлением в файл:
vi /usr/share/doc/makejail/examples/sshd.py


Следующих строк в самое начало:
# -*- coding: utf-8 -*-


Также добавляем в низ файла подключение стандартных утилит работы с файлами - ls, dir, ln, chown и проч ( в примере конфига опечатка, fileutils теперь зовут coreutils):
packages=["coreutils"]


И повторяем запуск команды.

После того, как программа отработает в нашей chroot папке будет построено дерево каталогов, необходимое sshd для работы:

ls /var/chroot/sshd/
bin dev etc lib lib64 sbin usr var


Причем, занимаемое им пространство крайне скромно:

du -sh /var/chroot/sshd/
16M /var/chroot/sshd/


Теперь пробуем сделать chroot на созданную папку:
chroot /var/chroot/sshd/



Основано на: http://www.debian.org/doc/manuals/securing-debian-howto/ap-chroot-ssh-env.en.html и http://stephan.paukner.cc/syslog/archives/332-SSH-daemon-in-a-chroot-on-Debian-lenny.html

пятница, 29 января 2010 г.

Debian: удобный chroot

Для многого софта необходимо чтобы в chroot были /dev, /proc, /sys. Обычно это делается вручную, но на Debian есть более простой способ, простенький скрипт:

chroot-prepare /mnt


После чего:
mount
/proc on /mnt/proc type none (rw,bind)
/sys on /mnt/sys type none (rw,bind)
/dev on /mnt/dev type none (rw,bind)


Теперь чрутимся:
chroot /mnt


Выходить из чрута в обратном порядке:

umount /mnt/proc
umount /mnt/dev
umount /mnt/sys
umount /mnt


А вот сам скрипт:

#!/bin/bash

mount --bind /dev /mnt/dev/
mount --bind /proc /mnt/proc/
mount --bind /sys /mnt/sys/

воскресенье, 24 января 2010 г.

sftp в chrooted ssh в Debian 6 Wheezy

Открываем конфиг:
vi /etc/ssh/sshd_config


Ищем там:
Subsystem sftp /usr/lib/openssh/sftp-server


Заменяем на:
Subsystem sftp internal-sftp


То есть иными словами, мы не можем использовать внешнюю программу, т.к. ее не будет у нас в чруте и поэтому переключаемся на встроенный механизм.

Создаем юзера:
useradd nrg -m
passwd nrg


Меняем владельца домашней папки юзера - это обязательное требования для чрута в нее (иначе получите: sshd[6341]: fatal: bad ownership or modes for chroot directory "/home/nrg"):
chown root.root /home/nrg/


Также добавляем юзера, которого будем чрутить:

Match user nrg
ForceCommand internal-sftp 
ChrootDirectory %h

X11Forwarding no
AllowTcpForwarding no


Перезапускаем демона SSH:
/etc/init.d/ssh restart


Подключаемся:

sftp -oPort=22 nrg@v1.test.ru
Connecting to v1.test.ru...
nrg@v1.test.ru's password:
sftp> ls /
/123123 /suxxxx
sftp>


Вот и все, пользователь не имеет доступа никуда, кроме своей домашней папки :)

Подробности можно прочесть в мане:
man 5 sshd_config


Источник: http://undeadly.org/cgi?action=article&sid=20080220110039 и http://www.howtoforge.com/chrooted-ssh-sftp-tutorial-debian-lenny и http://blog.antage.name/posts/sftp-chroot-%D0%B2-%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D1%8E%D1%8E-%D0%BF%D0%B0%D0%BF%D0%BA%D1%83.html