12.01.2003

TrinuxOid: Вскрытие дискеты

В серии TrinuxOid на SecurityLab.ru я хотел бы рассказать более подробно о мини-дистрибутивах (вроде Trinux или RTK), их плюсы и минусы, а также способы их успешного применения и использования. Начнем с самого начала - поговорим о процессе загрузки Trinux версий 0.71 и 0.80rc2.

Stalsen stalsen@trinux.atanor.ru http://trinux.atanor.ru

Intro

В серии TrinuxOid на SecurityLab.ru я хотел бы рассказать более подробно о мини-дистрибутивах (вроде Trinux или RTK), их плюсы и минусы, а также способы их успешного применения и использования. Начнем с самого начала - поговорим о процессе загрузки Trinux версий 0.71 и 0.80rc2.

От самого начала...

Давайте посмотрим, как создается сам образ и что туда добавляют. Сердце самой системы - это ядро, в обычном виде оно занимает намного больше, чем емкость всей дискеты и естественно его предется всячески урезать, вот например зачем тринуксоиду поддержка звука (да и прочей мультимедии), скази, всякиз файловых систем и пр. Это ведь можно загрузить через модули, главное включить такую функцию в ядре. Кому очень интересно посмотреть его конфиги, пора идти на www.trinux.org (или на trinux.atanor.ru для РТК). У Мэтью (создателя трунукса) ядра получаются примерно на 590 Кб!

Далее сжатый виртуальный диск, не менее важная часть. Он содержит дерево каталогов, основных команд и библиотек, без которых невозможно нормально работать. При загрузке раздел Тринукса создается в виртуальной/временной памяти машины (RAM), так что данные невозможно сохранить и чтобы вы не делали, после каждого ребута их не будет... Если вам срочно нужно что-то записать (например логи сканирования), то можете подключить любой раздел жесткого диска и писать туда (только естественно надо знать, какая файловая система на партишине, если например NTFS - придется качать модуль, если MS-DOS/FAT - качать ничего не надо, вообще модули можно подключать во время загрузки системы, добавив их на дискету/ы и в скрипт/ы, либо во время работы системы, монитровав диск с модулем и написав insmod [modname].o).

Естественно все это само зупускаться не будет, нужен загрузщик, по дефолту используется syslinux (хотя вполне подошел бы lilo (linux loader)). Финальными штрихами является дополнение основными пакетами, необходимыми для работы, а также help-файлом и лицензией.

Качаем и устанавливаем образ

Во первых для создания дискеты вам надо загрузить floppy image с trinux.sourceforge.net. Сразу говорю для счастливых пользователей Windows - Drag'n'Drop тут не прокатит. Нужен специализированный софт для записи образа, например RaWrite (можно найти на trinux.atanor.ru). Для UNIX-совместимых ОС достаточно набрать:

# dd if=[floppy_image] of=/dev/fd0
И хочу заметить - Rawrite часто пишет с ошибками, то CRC, то I/O Error и т.д. Лучше используйте dd. В состав Trinux 0.70 входят два инсталяционных скрипта для UNIX и Windows. Процесс этот, собственно говоря, не занимает много времени. Вы скопировали систему, но нужна ли она без пакетов, модулей и прочих дополнений? Вот например нужно залезть на диск с NTFS под Win2k, на входе пароль, что делать? Конечно, загружаете тринукс, встявляете модуль (insmod ntfs.o), монтируйте диск и вперед. Все пакеты и модули можно найти на www.trinux.org или на trinux.atanor.ru.

Что происходит во время загрузки? v0.71

Итак, вы загружаете Тринукс, сразу появляется надпись: SYSLINUX 1.48 1999-09-26 Copyright © 1994-1999 H. Peter Anvin. Указывает на то, что в данном случае загрузщиком является SYSLINUX v1.48. Немного о нем. Он создан специально для того, чтобы грузить Линукс из "стандартных" файловых систем ОС Windows (вроде MS-DOS/FAT fs.), но никак не ext2/ext3. Подобный выбор хоть и является немного странным, но большой роли не играет. Если вы хотите все грузить из "чисто линуховской файлухи", используйте lilo. Для установки лоадера достаточно набрать команду из ДОСА:
"A:> syslinux a:" или из Линукса: "# syslinux /dev/fd0".
После этого шага в корне загрузочной дискеты появится файл LDLINUX.SYS. По дефолту syslinux при "запуске" судорожно пытается найти ядро с именем LINUX (хотя в строке "boot:" можно быстренько написать имя нужного kernel'а, да и еще передать какие-нибудь параметры, например местонахождение сжатого виртуального диска, а то без него будет паника), конечно это можно изменить, используя конфиг файл, но об этом чуть позже. Далее следует краткая информация о Trinux, ее авторе и копирайтах (эта инфа берется из файла license boot-диска, который в свою очередь указан в конфиге загрузщика):
==========================================================
                       Trinux: A Linux Security Toolkit
                        http://trinux.sourceforge.net
                      (C) 2000 Open Security Solutions
=============================================================
 Any original code in this distribution, as well as most of its 
source  base, is free software, which can be redistributed and/or modified 
under  the terms of the GNU General Public License as published by the Free
 Software Foundation, either version 2 of the License, or 
(at your option) any later version. This program is distributed in 
the hope that it will be  useful but WITHOUT ANY WARRANTY; without 
even the implied warranty of  MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE.  See the GNU General  Public License for more details.

 Trinux was originally released by Matthew Franz <mdfranz@io.com> in 1998,
 but many other folks have helped out along the way.  See the Trinux Project
 Page on SourceForge <http://sourceforge.net/projects/trinux/> for
 more information about the project or to join support mailing lists.

 Links to most of the network security tools used by Trinux are available
 at http://www.opensec.net or at 
PacketStorm (http://packetstorm.securify.com).  This version of Trinux 
relies up BusyBox (http://busybox.lineo.com).  Trinux  is developed using 
Slackware 7.x with the help of VMWare.
============================================
Хотя данные этого сообщения время от времени меняются с течением версий (но думаю лицензия не изменится никогда) и появлется до боли знакомая строчка "boot:". Здесь вам предстоит выбрать image или просто ввести имя ядра (но, как я уже говорил, с дополнительными параметрами) для загрузки. Конфиг загрузщика находится в syslinux.cfg (на дискете):
------- syslinux.cfg ---------
display license # понятное дело, выводит файл license
promtp 1 # эта штука указывает выводить boot: и 
ждать ввода определенное количество времени (указанное в
timeout)
default floppy # по дефолту будет грузиться label floppy
timeout 30 # процесс ожидания в десятых секунды (следовательно 0.3 сек)
label floppy # имя данного image для ввода после boot:
kernel bzimage # указывает месторасположение ярда.
append initrd=initrd.gz root=/dev/ram0 pkg=tflp
# append - передача специальных параметров ядру.
# initrd - указывает на путь к сжатому виртуальному диску.
# root - точка монтирования файловой системы.
# pkg - способ загрузки пакетов.
# Дальше уже все идет по аналогии:
label cdrom
kernel bzimage
append initrd=initrd.gz root=/dev/ram0 pkg=tcd
label network
kernel bzimage
append initrd=initrd.gz root=/dev/ram0 pkg=tnet
label fixed
append initrd=initrd.gz root=/dev/ram0 pkg=tfix
От вас зависит, что вы введете в строке boot: (это довольно логично, верно :-)?). Далее видим строки: Loading initrd.gz... Здесь распаковывается вирутальный диск, если открыть архив и посмотреть на initrd каким-нибудь текстовым редактором, то можно увидеть отрывки многих файлов. Чтобы все правильно изменить, вам нужно монтировать распакованный initrd:
# gzip -d initrd.gz
# mount -o loop initrd /[точка-монтирования]

Теперь переходите в /[точку-монтирования] и модифицируйте все по своему усмотрению. После размонтируйте устройство и упакуйте initrd:
# umount /[точку-монтирования]
# gzip initrd
А теперь можете положить его на дискету или слепить с ним новый образ. Loading bzimage... # загружается ядро, как я уже говорил, его конфиг можно найти на trinux.sourceforge.net/kernel/.

Идем дальше! - Часть 1

После грузится linuxrc, который устанавливает некоторые переменный ENV (такие как PATH, TERM, PS1), экспортирует их, ставит права доступа на новоиспеченные файлы (umask 022, 022 = 0644 -> rw-r--r--) и монтирует файловую систему proc (mount -t proc proc /proc), создаются каталоги /etc/tux/config (вообще /etc/tux - это зеркало каталога /tux boot-диска) и /lib/modules. Потом линкуются следующие файлы:
ln -sf /proc/self/fd/0 /dev/stdin
ln -sf /proc/self/fd/2 /dev/stderr
ln -sf /proc/self/fd/1 /dev/stdout
Опция [-sf] означает создать символические ссылки и убрать файлы назначения. Если в самом Тринуксе посмотреть на эти файлы, то все они линкуются с терминалом, на котором вы сидите (например tty1, tty2 etc.). Потом начининаются попытки найти девайсы для загрузки пакетов, такие как флоппи, UML, CD-ROM и если что-нибудь найдено, его адрес (например /dev/cdrom) записывается в переменную $BOOT и идет следующий код:
  1. echo "BOOT: $BOOT"
  2. echo "KERNEL: $KERNEL"
  3. if [ "$BOOT" = "/dev/fd0" ]
  4. then
  5. BOOTFS="vfat"
  6. elif [ "$UML" ]
  7. then
  8. BOOTFS="ext2"
  9. else
  10. BOOTFS="iso9660"
  11. PREFIX="trinux/"
  12. fi
  13. echo "BOOTFS: $BOOTFS"
Разбор кода:

1-2. Уведомляет пользователя о найденном загрузочном девайсе и ядре, например: BOOT: /dev/fd0, KERNEL: 2.4.5

3-5. Если переменная $BOOT равна /dev/fd0 (дискета), тогда выводит используемую файловую систему vfat: BOOTFS: vfat.

6-8. В другом случае (то есть $BOOT не равен /dev/fd0) если переменная $UML существует, выводит BOOTFS: ext2.

10-12. И если ничего не найдено, ставится iso9660 (CD-ROM) с префиксом trinux/ (это стандартная корневая папка расположения пакетом на HDD/CD-R/RW).

13. После всех этих проверок выводится в STDOUT (на монитор) определенная файловая система (например если доступен флопик - vfat, если что-то найдено на cdrom'е - то iso9660).

Следующим шагом является выполнение init скрипта (специально создан для ввода ваших команд в начале загрузки, его можно найти по адресу tux/init/first загрузочной дискеты) и постороение RAM-диска, при успешной конфигурации увидите что-то вроде:

RAM is > 48 MB
Creating /usr
Creating /usr/local
Creating /home
--------------------FILESYSTEM CONFIGURATION---------------------
Filesystem	1k-blocks	Used	Available	Use%	Mounted on
/dev/ram0	6076		1567	    4509	 26%	/
/dev/null	16000		   0	   16000	  0%    /usr
/dev/null	8000		   0	    8000	  0%	/usr/local
/dev/null	2000	    	   0	    2000	  0%	/home

Идем еще дальше! - Часть 2

Пройдя все это создается несколько директорий и симлинков, вас уведомляют об этом: "Creating misc links and directories..." и происходит опрос разделов жесткого (жестких) дисков в FS minix, ext2 и vfat + устанавливаются базовые пакеты с boot-диска (pkg.tgz и basenet.tgz), конфигурируется и запускается syslog, а также выполняется скрипт tux/init/prenet (отвечающий за настройку сети) и вот вы видите знакомое сообщение "Do you have a package disk?", разберемся с ним:
if [ "$PKGSRC" = "/dev/fd0" ]
then
echo -n "Do you have a package disk? "
read response
until  [ "$response" != "y" ]
do
if mount -t vfat -r /dev/fd0 /floppy
then
cd /floppy
if ls *.o > /dev/null 2> /dev/null
then
echo "Copying modules from package disk"
cp *.o /lib/modules 2> /dev/null
fi
for i in *.tgz
do
cd /floppy
pkgadd $i
done
fi
Этот простой код проверяет значение переменной $PKGSRC, и если она равна /dev/fd0 то выводится: "Do you have a package disk?" и слушается ввод юзера, если вы ввели "у", то происходит монтирование дискеты, а также поиск и соответственно установку пакетов и модулей. Потом запускается несколько скриптов (они специально созданы для вашего редактирования), а также некоторые демоны и выводится сообщение:
"Welcome to Trinux: A Linux Security Toolkit"
"Type 'man' for a list of help topics.  ALT-<Left/Right>"
"allows you to view other virtual terminals. "
Если вы вдруг решили пересмотреть загрузочные сообщения ядра, воспользуйтесь командой dmesg (попрошу заметить, ядра, а не linuxrc). Конечно расписать весь linuxrc здесь не удастся (это ведь более 1200 строк кода!).

Но время идет, появляются новые версии, а следовательно и новые возможности, но увы не новая документация (во всяком случае применительно к Trinux :-()! Итак, что изменилось в версии 0.80rc2? Загрузщик остался тот же (SYSLINUX), но вот конфиг файл немного изменен:

------- syslinux.cfg ---------
display license # выводит файл license
prompt 1 # эта штука указывает выводить boot: и ждать ввода 
определенное количество времени (указанное в
timeout)
default network # по дефолту будет грузиться label network
timeout 30 # процесс ожидания в десятых секунды (следовательно 0.3 сек)
label floppy
kernel bzimage # месторасположение ядра
append initrd=initrd.gz root=/dev/ram0 pkg=floppy # передает дополнительные 
параметры ядру - путь находжения сжатого виртуального диска,
точка монтирования и способ загрузки. Здесь каждому названию label
 соответствует способ загрузки пакетов. Далее все по аналогии...
label cdrom
kernel bzimage
append initrd=initrd.gz root=/dev/ram0 pkg=cdrom
label network
kernel bzimage
append vga=4 initrd=initrd.gz root=/dev/ram0 pkg=network console=/dev/ttyS1
label fixed
kernel bzimage
append initrd=initrd.gz root=/dev/ram0 pkg=fixed
Да и linuxrc немного другой, не считая мелких изменений (точнее усовершенствований, которых нет смылса тут обсуждать), а вот работу с созданием виртуальных дисков (точнее разделов) следует рассмотреть:
MEMORY=`grep MemTotal /proc/meminfo | cut -d':' -f2 | cut -d'k' -f1` 
# узнаем общий объем оперативной памяти.
echo "RAM: $MEMORY MB" # уведомляем об этом тринуксоида, например RAM: 64 MB.
echo -n "RAM is " # далее видим на мониторе RAM is, 
а дальше в зависимости от кода (и возможностей твоего компа): 
  1. if [ $MEMORY -lt 16000 ]
  2. then
  3. echo "< 16MB, you may run into problems"
  4. USR="2048"
  5. HOMEP="128"
  6. elif [ $MEMORY -lt 24000 ]
  7. then
  8. echo "> 16MB"
  9. USR="4096"
  10. HOMEP="256"
  11. elif [ $MEMORY -lt 32000 ]
  12. then
  13. echo "> 24MB"
  14. USR="8192"
  15. HOMEP="512"
Разборка кода:

1-5. Если RAM меньше 16 мегов, то значение USR и HOMEP (HOME) равно 2048/128 соответственно.

6-10. Если RAM больше 16 мегов, то значение USR и HOMEP (HOME) равно 4096/256 соответственно.

11-15. Если RAM больше 24 мегов, то значение USR и HOMEP (HOME) равно 8192/512 соответственно.

Это довольно интересный подход, теперь вес "каталогов" определяется не наобум/по дефолту, а в зависимости от возможностей вашего компутера. Далее идет следующий код (естественно часть пропущена):

if [ "$USR" != "" ]
then
echo "Creating /usr"
mkdir /usr 2> /dev/null
mkfs.minix /dev/ram3 $USR 2> /dev/null > /dev/null
mount -t minix /dev/ram3 /usr
fi
fi
Если переменная USR чему-то равна, то на мониторе ты лицезрешь "Creating /usr" и создается /usr в виртуальном диске /dev/ram3 с файловой системой MINIX размером (при условии что USR равна 2048) 2048 блоков.

Разбираемся с Дискетой! v0.71

Итак, после успешной загрузки Тринукса вам следует примонтировать загрузочную дискету (вообще это можно сделать из любой распостраненной ОС):
 # mount /dev/fd0 /floopy; ls
readme      bzImage       tux        nichelp
ramdisk     syslinux.cfg  version    ldlinux.sys
initrd.gz   pkg.tgz       license
Разберемся с каждым из них:
  • readme - нижеследующее описание, только на английском.
  • initrd.gz - сжатый виртульный диск.
  • license - окно копирайта при загрузке тринукса (под gnu gpl).
  • version - версия ОС.
  • ramdisk - определяет количество и "вес" виртуальных дисков (данные статичны).
  • bzimage - ядро.
  • ldlinux.sys - загрузщик (SYSLINUX в данном случае).
  • syslinux.cfg - конфиг загрузщика.
  • pkg.tgz - необходимые команды/пакеты (типа man, pkgadd и т.д.)
  • basenet.tgz - минимальный набор сетевых утилит, а также несколько необходимых библиотек.
  • nichelp - инфа о проверенных сетевых картах, стабильно работающих в Тринуксе и встроенных по дефолту.
  • tux - каталог со скриптами.
Итак, перейдем в каталог tux (ибо с остальным все понятно):
#cd tux; ls
  • OPTIONS - настройки. Содержит следующие файлы:
  • dhcp - если подключаете тринукс к сети где автоматически выдаются ip'адреса, укажите "нуждающийся" интерфейс (по дефолту стоит eth0). Сразу хочу предупредить, если вам это не надо, стирайте все сразу, просто эта процедура занимает довольно продолжительное время. network - загрузка пакетов из сети (можно использовать специальный тринуксоидовский, а можно разместить свой в локалке).
  • CONFIG - конфигурационные файлы системы. Содержит следующие файлы:
  • dns - адрес dns сервака, если вы имеете к нему доступ.
  • eth0 - IP и маска подсети интерфейса (устанавливается если dhcp молчит). gateway - адрес шлюза.
  • INIT - скрипты, выполняющиеся во время загрузки. Содержит следующий файл: 1netcfg - настраивает сетевые параметры eq поднимает интерфейс обратной петли (lo), задает начальную таблицу маршрутизации, пытается (или не пытается) найти dhcp-серверы в сети (в зависимости от содержания файла dhcp).

Разбираемся с дискетой! v0.80rc2

В чем отличия этой версии? Во первых более грамотное расположение и функционирование скриптов в каталоге tux/. Немного о них: CONFIG - сетевые и системные параметры. Содержит следующие файлы:

  • server - адрес сервака для скачивания пакетов, если есть возможность, то создайте свой в сети, а так можно пользоваться этими:
    http://www.ibiblio.org/pub/Linux/distributions/trinux/latest/pkg/
    http://www.io.com/~mdfranz/trinux/pkg/
    
  • pkglist - список пакетов, которые надо установить (не будет же он вам все с сервака качать!).
  • kpkglist - спец. пакеты для ядра.
  • crontab - почитайте мэны к крону.
  • mailmon - мэлбокс для посылки системных сообщений.
  • emailsrc - исходный мылбокс.
  • smtp - SMTP сервак.
  • dns - адрес ДНС.
  • eth0 - IP/Маска подсети.
  • gateway - Ваш шлюз (если есть).
  • hostname - Имя вашего хоста.
  • home - Новшество в Тринуксе. Позволяет указать местонахождение вашего домашнего каталога в сети чтобы сохранять там данные посредством savehome и загружать посредством gethome. Но имхо удобнее писать в разделы жесткого диска, хотя если его нет... hosts - Аналог /etc/hosts, соответствие [IP-адрес имя_машины], это если в сети нет dns сервера или она просто слишком маленькая.
  • INIT - директория содержит в себе несколько "чистых" (eq пустых) скриптов для вашей модификации, допустим надо вам чтобы при загрузке выполнялись определенные команды (pkgadd, insmod и пр.), аналог rc.local в Линуксе, только их намного больше, аж 5 штук для разных периодов загрузки (например до и после установки сетевых конфигов и тд.).
  • PKG - содержит конфиги для пакетов.
  • OPTIONS - настройки системы:
  • dhcp - использования dhcp сервера, описано выше... Во вторых немного изменилось расположение файлов в корне дискеты. Теперь уже нет всяких basenet и pkg, а есть dhcpd.tgz - поддержка dhcp и dnslibs.tgz - необходимые библиотеки. Добавлен скрипт getpkg - загрузка пакета (пакетов) с сервака.
или введите имя

CAPTCHA