Страница 1 из 1

NetBSD глазами хакера

Добавлено: 20 май 2010, 18:32
Raven
Автор: Валерия Комиссаровa

В куче самых разных осей есть три белые вороны - QNX, Solaris и NetBSD.Они все мало распространены в России и вокруг них создался ореол неприступности (в плане изучения) и неподъёмной сложности. Но это не так: изучать их любому человеку, хоть самую малость знакомому с *nix-ами, легко и просто. В этой статье мы поговорим о NetBSD.Изучать эту ось мы будем не с точки зрения админа или простого пользователя, а глазами хакера. NetBSD в студию!

Интра

Первое, что необходимо отметить - офигительная мультиплатформенность: PC, Opteron, SPARC, UltraSPARC, Alpha, Amiga, Atari, m68k, PowerPC...- всего в списке около 50 платформ. На главной паге NetBSD ты можешь заценить полный список. Кроме того,мало распространённая система не так привлекает внимание хакеров, поэтому эксплойтов для этой оси намного меньше, чем у того же линуха. Пока NetBSD не стала достоянием широких масс, ты успеешь построить свой суперсекьюрный сервер, который будет не по зубам ни одному взломщику, и выжать максимум возможностей из этой чудесной оси. Да и после, я думаю, NetBSD (как и OpenBSD) не утратит своей ценности. Несмотря на то, что главные представители семейства xBSD выросли в одних (Берклиевских) стенах, они пошли по разным путям: FreeBSD больше по linux-тропке, а Net- и OpenBSD так и остались в установленных разработчиками рамках. Этот жёсткий аудит дал свои плоды - безопасность в NetBSD на высоте. Ну всё, хватит теории. Давай устанавливать.

Установка

Установить NetBSD можно по FTP, NFS, с локальной диры, с размонтированной ФС, с флопика или с CD/DVD. Рассмотрим установку с CD/DVD.

Самый подробный мануал по установке находится в файле INSTALL. Процесс инсталляции, в общем, стандартен. Выберешь язык, временную зону, раскладку клавиатуры, комплектацию устанавливаемых дистрибутивов, установишь пароль root`а, разобьёшь диск на разделы и т. д. Кстати, о разделах.

В отличие от фряхи, где все разделы обозначаются acd0, ad0, ad0s1. . . , в NetBSD названия разделов, как правило, имеют вид wd0a, sd0a . . . Wd0a обозначает a-раздел IDE диска, sd0a - a-раздел SCSI диска. Fdisk и disklabel привычные. Если ты собираешься устанавливать NetBSD в качестве хакерского desktop, то не стоит разбивать диск на /, /usr, /var, /tmp, /home и др. Такое дробление больше подходит серверам и для рабочей станции избыточно. В качестве оболочки можно выбрать csh, ksh или sh. Bash`ик надо устанавливать дополнительно. Инсталляция завершена. Небольшая Эрих Мария Ремарка для тех, кто знаком с *nix-системами, но никогда не работал с xBSD. Во время и после установки системы ты будешь добавлять и удалять аккаунты пользователей. Вся инфа о юзере сохранится в /etc/passwd, а шифрованные пароли не запишутся в /etc/shadow. Почему? Всё просто - в xBSD файла /etc/shadow нет! Вместо него используется файл /etc/master. passwd, в котором и хранятся криптованные пароли.

Конфигурирование и перекомпиляция ядра

Конфигурирование и перекомпиляция ядра - один из важнейших аспектов работы с любыми open-source системами. Всё потому, что ядро - основа любой unix-системы. Грамотная перекомпиляция имеет много преимуществ: уменьшение занимаемого ядром пространства на диске (так как из ядра выключаются все ненужные на твоей машине драйверы), увеличение производительности системы путём оптимизации ядра под конкретную архитектуру (зачем тебе нужна поддержка Mac и SPARC, если у тебя PC?) и многое другое. К тому же некоторые сетевые проги (фаерволы, например), могут требовать каких-то экзотических опций сети, ядра и системы, которых не установить без перекомпиляции ядра. Вместе с тем бытует мнение о непомерной сложности этого предприятия, поэтому новичкам категорически не советуют заниматься перекомпиляцией ядра. Типичная страшилка для малышей. Если ты умеешь читать текст на экране и в наличии есть толковый мануал, отконфигурить ядрышко - раз плюнуть! Этим мы сейчас и займёмся.

Прежде всего ты должен установить сорцы ядра. Их можно найти на дистрибутивном диске или скачать с ближайшего CVS`а. В большинстве случаев сорцы ядра находятся в каталоге /source/sets. Имя архива - syssrc. tgz. Компиляцию ядра можно выполнять двумя способами: вручную и с помощью скрипта build.sh. В данной статье я рассмотрю оба варианта. Конфигурационный файл ядра лежит в /usr/src/sys/arch/твоя архитектура/conf. Там открывай GENERIC. Разберём архитектуру i386.

Сначала нужно создать резервную копию конфига ядра:

Код: Выделить всё

$ cp GENERIC MYFIRSTKERNEL

Код: Выделить всё

$ vi MYFIRSTKERNEL
Закомментируй символом # ненужные строки, а нужные расскоментируй. Все строки снабжены понятными и краткими комментариями, поясняющими суть параметра.

Выключи поддержку ненужных устройств, архитектур и т. д. Есть один интересный полуавтоматический вариант конфигурирования. Установи через pkgsrc perlовый сценарий adjustkernel. Стоп, а ты знаешь, как устанавливать софт в xBSD-пакеты и/или сорцы? Если нет, то отвлечёмся на секунду от ядра и расскажем об установке софта.

Установка программ из сорцов осуществляется стандартными командами make, make install. Затем для удаления временных файлов набей make clean, make clean-depends. Последняя команда нужна в том случае, если устанавливались зависимые пакеты. Также можно набрать make clean CLEANDEPENDS=1. Эта команда идентична make depends. Для установки прекомпилированных бинарников нужен пакет pkgtools. Команды управления пакетами напоминают аналогичные соляровые:
  • pkg_add-добавляет пакет
    pkg_delete-удаляет уже установленный
    pkg_info-показывает информацию о пакете
    pkg_create-создает новый пакет для коллекции пакетов (что необходимо для создания новых скомпилированных пакетов. Эта команда автоматически вызывается системой сборки и ее не нужно запускать вручную)
    pkg_admin-создает переменные административные функции в системе пакетов
Так, о главных командах управления пакетами рассказала, а о создании пакетов как-нибудь в другой раз-это довольно большая тема и заслуживает отдельной статьи. Теперь возвращаемся к ядру. Ты установил (теперь уже со знанием дела) пакет с adjustkernel. Топай в каталог с конфигом ядра и набивай:

Код: Выделить всё

$ adjustkernel GENERIC > MYFIRSTKERNEL
Сценарий adjustkernel анализирует вывод dmesg и на основе этого генерирует минимальный конфигурационный файл. Подчёркиваю - минимальный! Всё остальное в конфиг ты должен дописать сам. Перед компиляцией ядрышка нужно проверить корректность конфига командой

Код: Выделить всё

$ config MYFIRSTKERNEL
Если в конфиге есть ошибки, то config сообщит об этом и выведет их на экран. Если ошибок нет, config создаст все необходимые файлы для компиляции. Ошибок нет? Тогда начинай компилировать. Командуй:

Код: Выделить всё

$ cd ../compile/MYFIRSTKERNEL
$ make depend
$ make
Вывод команды make помещается в файл netbsd в каталоге компиляции. Затем переносишь файл в корневой каталог, предварительно сделав резервную копию старого файла netbsd. Становись root`ом и распоряжайся:

Код: Выделить всё

# mv /netbsd /netbsd.old
# mv netbsd /
Ребуться:

Код: Выделить всё

# shutdown -r now
Всё, новое ядро установлено.

Для автоматического компилирования ядра делай следующее:

Код: Выделить всё

$ cd /usr/src
$ ./build.sh -u kernel=MYFISRKERNEL
По умолчанию build.sh удаляет старые обьектные файлы и всё собирает заново, что в большинстве случаев излишне - достаточно пересобрать те обьектники, зависимости которых были изменены. Флаг -u позволяет сделать это. По окончании работы build. sh выведет на экран информацию о том, где можно найти новое ядро. Что делать, если ты напортачил так, что система не грузится. Во время загрузочного 5-ти секундного ожидания нажми пробел и набери:

Код: Выделить всё

> boot netbsd.old -s
Вот нам и пригодилась резервная копия файлика netbsd. Теперь набивай следующее:

Код: Выделить всё

# fsck /
# mount /
# mv netbsd.old netbsd
# reboot
Примечание: всё вышеизложенное насчёт восстановления системы предполагает, что перед этим ты перезагрузился в single-user mode (однопользовательский режим). Всё, система спасена, можешь продолжать мучить ядро дальше. Как видишь, ничего сложного в конфигурировании ядра нет. Да и страшного тоже: ты в любой момент можешь восстановить свою убитую систему. Помни главное: бэкапы правят миром. Удачных тебе перезагрузок, конфигурирования и компилирования!

Шифрование данных

Шифрование данных - это, безусловно, одна из сильных сторон NetBSD. И тебе, как профессиональному хакеру, думаю, будет очень интересно и важно разобраться в этом. Ведь если к тебе вдруг неожиданно нагрянут парни из отдела "К" (тьфу-тьфу-тьфу, не дай бог), выйдет очень неприятно, если на твоем винте plain-текстом будут лежать все твои списки паролей от взломанных серваков, заказы и прочие хакерские атрибуты. Ну а что бы этого не произошло, читай дальнейшее вдумчиво и не забывай применять всё сказанное на деле. Начнём.

Основа шифрования в NetBSD-некое псевдо-устройство cgd (и, соответственно, одноимённый драйвер). Устройство cgd ведёт себя в системе точно так же, как и обычное дисковое устройство. Непосредственные шифрацию/дешифрацию диска выполняет драйвер cgd, а управление криптованным диском осуществляется утилиткой cgdconfig. Разбиение его на разделы-программой disklabel. Монтирование - mount, создание свап раздела - swapctl, а организация файловой системы - newfs. А теперь разберём cgd по косточкам.

Прежде всего нужно включить поддержку cgd в ядро. В конфиге ядра для этого должна присутствовать следующая строка:

Код: Выделить всё

pseudo-device cgd 4 # cryptographic disk driver
Вместо 4 подставь нужное тебе число - оно указывает, какое число криптографических псевдо-устройств может быть одновременно примонтировано в системе. Компилируй и устанавливай ядро. Если всё нормально, можно продолжать.

Поддерживаются следующие алгоритмы шифрования: aes-cbc, blowfish-cbc, 3des-cbc. Сам процесс криптования проходит так (способ, немного знакомый тем, кто хоть раз криптовал вирусы или shell-код): шифрованный диск состоит из блоков шифротекста. К каждому блоку применяется XOR с предыдущим зашифрованным блоком перед кодированием. Так работают все три алгоритма. Дальше нужно разобрать методы верификации. Их также три: none, disklabel и ffs. None - отсутствие проверки. Наиболее опасный метод. Если введён неправильный ключ, то все данные на криптованном диске будут разрушены. Disklabel - проверка соответствия раздела и ключа. Ffs - провека соответствия файловой системы и ключа.

Процесс создания cgd диска довольно сложен, поэтому его лучше рассмотреть по шагам. Буду предполагать, что ты хочешь шифрануть всю свою рабочую систему. Корень шифровать не надо - системе надо загрузить ядро, сценарий rc.d и т. д. Так что криптуй всё, кроме него. Затем создавай резервную копию всего, что только можно (тебе придётся стирать все данные и пересоздавать разделы) и приступай. Бэкап лучше делать, загрузившись в однопользовательском режиме. В этом же режиме монтируй корень на чтение/запись. Все остальные фс-отмонтируй и удали (я предупреждала - сделай бэкап!). Затем disklabel`ом на свободном месте сделай один раздел с типом ccd (это не опечатка!). Сохраняйся. Набивай:

Код: Выделить всё

# cgdconfig -s cgd0 /dev/твоё устройство aes-cbc 128 < /dev/urandom 
# dd if=/dev/zero of=/dev/rcgd0d (редко-/dev/rcgd0c) bs=32k
# cgdconfig -u cgd0
Что мы сделали? Если тебя волнует абсолютно полная секурность, ты не захочешь оставить и байта нешифрованных данных. А даже после переконфигурирования таблицы разделов куски данных могли сохраниться. Надо это устранить. Каким образом? Создадим временное устройство cgd со случайным ключом и запишем его в настоящий раздел, а в конце расконфигурим случайный ключ cgd.

Для управления cgd-устройствами проге cgdconfig нужны конфиги, и мы должны сами их сейчас создать. Командуй:

Код: Выделить всё

# cgdconfig -g -V disklabel -o /etc/cgd/твоё устройство aes-cbc 256
Конфиг ляжет в /etc/cgd/твоё устройство. Там будут записаны алгоритм, длина ключа и т. д. Кстати: тебе, наверное, знаком по линуху сервис с такой обьясняловкой: ". . . сохраняет и повышает пул системной энтропии для повышения качества генерации случайных чисел". Вот сейчас тебе эта самая энтропия вместе с пулом очень даже понадобится. Если энтропии будет мало, то выполнить последнюю команду нифига не получится. В таком случае потыкай клавиши или поклацай мышкой - энтропия мигом вырастет как на дрожжах. Вероятность возникновения такой проблемы довольно невелика, но мало ли. . . Теперь:

Код: Выделить всё

# cgdconfig -V re-enter cgd0 /dev/твоё устройство
Тебя два раза спросят паролик. Упаси боже забыть тебе его! В таком случае можешь помахать системе ручкой. Испугался? Успокаиваю: создание раздела окончено! Но теперь нужно создать на нём файловые системы:

Код: Выделить всё

# newfs /dev/имя твоего cgd раздела
Отредактируй файлик /etc/fstab. Посмотри, какое устройство указано напротив корня. Там оставь, а напротив всех остальных разделов смени на имя твоего cgd раздела(cgd0b, cgd0e и т. д. ). Теперь вставь в /etc/cgd/cgd. conf:

Код: Выделить всё

cgd0 /dev/твоё устройство
Последний штришок - добавить в /etc/rc. conf:
Теперь каждый раз при загрузке тебе надо будет вводить паролик. Всё, восстанавливай данные. Шифрование всей рабочей системы - довольно сложное и опасное предприятие, поэтому советую сначала потренироваться на эмуляторах или ещё где-нибудь.

В заключение хочу рассказать об одной интересной фишке для параноиков: шифрование файла подкачки. Для этого используется random-key cgd. С применением данной технологии при каждой загрузке системы будет генерироваться новый, случайный ключ. Нужно конвертнуть существующий cgd раздел в cgd1:

Код: Выделить всё

# cgdconfig -g -o /etc/cgd/существующий раздел -V none -k randomkey blowfish-cbc
На новом диске каждый раз при загрузке будут пропадать метка и раздел, поэтому пропиши восстановление разделов после каждой перезагрузки. Тут уж додумайся сам (подсказка - гляди man на disklabel). Не сможешь - мыль мне, помогу. Естественно, в рамках одной статьи сложно рассказать обо всех возможностях системы шифрования NetBSD. Но начальный ликбез ты получил. Читай маны - там ты найдёшь всю необходимую тебе информацию.

Сеть

Ты хакер? А какой же хакер без сети? Значит, её нужно настроить. Открываем файлик /etc/rc. conf и пишем:

Код: Выделить всё

hostname =“имя твоего хоста“
defaultrouter =“айпишник маршрутизатора“
ifconfig_имя_сетевого_интерфейса =“твой айпишник и/или маска подсети“
Пропиши, что нужно. Маску подсети также можно указать в виде:

Код: Выделить всё

netmask айпишник 
Если ты хочешь соединяться со своей системой по ssh, пропиши:

Код: Выделить всё

sshd=YES
IP DNS-серверов-в /etc/resolv. conf. Синтаксис:

Код: Выделить всё

netmask айпишник
Пример /etc/rc.conf - в /etc/defaults/rc.conf. Ping, traceroute, netstat, tcpdump и т. д. естественно на месте.

О технологии IPSec я уже рассказывала в статье "Solaris для всех и каждого". Состав IPSec по прежнему такой - же:IPsec = AH + ESP + IPcomp + IKE. Напомню про IPcomp (IP payload compression). Все пакеты, шифрованные ESP, имеют не лучшую степень сжатия. Перед использованием ESP пакеты можно пожать, а можно скомпрессировать без использования ESP. За более подробной информацией можешь обратиться к RFC 1825 и 2401. Теперь об управлении правилами IPSec в NetBSD.

По умолчанию ядро NetBSD не поддерживает IPSec, поэтому его надо перекомпилить, раскомментировав соответствующие строки в конфиге:

Код: Выделить всё

options IPSEC
options IPSEC_ESP
Желательно иметь NetBSD посвежее, иначе не избежать проблем: надо будет искать патчи, обновлять дерево каталогов и т. д. , в общем совершать много лишних телодвижений. А в последних версиях нужный код уже интегрирован в деревце системы.

Правил, которые можно настроить, очень много, поэтому я для примера рассмотрю всего одно: host-to-host encryption.

Правила удобнее всего реализовывать в виде скриптиков и мы сейчас попробуем написать такой. В данном примере мы воспользуемся вручную сгенерированными ключами, которые создаются утилиткой setkey. Начнём с основ. Правила могуть быть реализованы двумя способами: per-packet и per-socket. Per-packet конфигурируется в ядрышке (как и сам пакетный фильтр) и его удобнее всего использовать на маршрутизаторах, а для работы с per-socket нужно использовать setsockopt. Мы в примере будем использовать per-packet. Итак, корябаем:

Код: Выделить всё

#! /bin/sh
#
setkey -c <<EOF
add 20.1.1.1 30.1.1.1 esp 8432 -E 3des-cbc "секретный ключ";
add 30.1.1.1 20.1.1.1 esp 1195 -E 3des-cbc секретный ключ;
spdadd 20.1.1.1 30.1.1.1 any -P out ipsec esp/transport//use;
EOF
Разберёмся. Сначала - запуск setkey (мы же вручную ключи генерируем). Затем мы прописываем, что все пакетики, идущие с 20.1.1.1 на 30.1.1.1 шифрятся esp с использованием алгоритма 3des-cbc с секретным ключом и SPI равен 8432. В обратном направлении пакетики криптуются с использованием того же алгоритма, только секретный ключ другой, и SPI равен 1195. Далее мы генерим per-packet правило IPSec. Ты можешь отбрасывать некриптованные пакеты. Для этого добавь:

Код: Выделить всё

spdadd 30.1.1.1 20.1.1.1 any -P in ipsec esp/transport//require;
Это мы настроили на хосте 20.1.1.1, а на хосте 30.1.1.1 всё почти то же самое, кроме последней строки. Там пиши:

Код: Выделить всё

spdadd 30.1.1.1 20.1.1.1 any -P out ipsec esp/transport//use; 
(изменились адреса хостов)

Синтаксис правил IPSec более подробно описывается в мане ipsec_set_policy. Вот и всё на первый раз об IPSec.

Заключение

Вот ты и разобрался с осью, которая считается одной из самых сложных. Теперь ты, я думаю, понял, что такое мнение - не более чем очередная страшилка для новичков. Но если ты всё таки боишься сразу ставить эту ось - что ж, попробуй NetBSD Live, на котором ты сможешь наработать базовые навыки по работе в этой чудесной оси. Да не облысеют твои пятки!