Содержание статьи
- Q: Скажи, как оперативно проверить свой софт на наличие уязвимостей, не устанавливая никакие дополнительные программы? Зачастую поставить авер невозможно из-за банального отсутствия прав.
- Q: Пишу приложение для мониторинга, которое в случае проблем должно оповещать администратора с помощью SMS-сообщения. Нынешняя убогая система использует старый телефон, подключенный через COMпорт :).
- Q: Решил потренироваться в построении различных сетей и конфигураций сетевого оборудования. Виртуальную сеть из десктопных компьютеров можно создать в любой программе для виртуализации. Но как быть со сложными сетевыми устройствами, программируемыми роутерами и тому подобным? Как, например, можно подготовиться к сертификации? Ни за что не поверю, что единственный вариант — это отправиться на дорогостоящие курсы, где в лабораториях есть все необходимое оборудование.
- Q: Как вручную уменьшить размер Java-скриптов? Есть сценарий, который занимает 3 Кб — это много. Но пользоваться автоматическими упаковщиками не хочу.
- Q: А как работают автоматические упаковщики JS?
- Q: Винда стала постоянно вываливаться в синий экран смерти. Сложность в том, что система сразу перезагружается, и я не могу даже посмотреть сообщение об ошибке. Как быть?
- Q: Есть ли аналог системы T9 для телефонов с QWERTY-клавиатурой?
- Q: У меня в сети есть роутер, шифрующий весь трафик при помощи SSL. Подскажи, можно ли как-то расшифровать перехваченный трафик пользователей?
- Q: Через мой SMTP часто пытаются отправлять вирусы, спам- и фишинговые сообщения. Это меня расстраивает :). Подскажи, как реализовать антиспам- и антивирусные проверки на уровне SMTP-сервера?
- Q: Использую в своем проекте сложные капчи, в том числе от сервиса reCAPTCHA (google.com/recaptcha), но даже это не спасает от фейковых регистраций ботами. Как им это удается? Ведь не вручную же регистрируются?
- Q: По долгу службы приходится часто разрабатывать правила для ModSecurity. Есть ли какой-нибудь удобный редактор для этих целей?
- Q: Можно ли запустить процесс с постоянно включенной системой DEP без возможности отключения?
- Q: Тогда следующий вопрос: а как подгрузить нужную DLL внутрь процесса?
Есть вопросы — присылай на faq@real.xakep.ru
Q: Скажи, как оперативно проверить свой софт на наличие уязвимостей, не устанавливая никакие дополнительные программы? Зачастую поставить авер невозможно из-за банального отсутствия прав.
A: В такой ситуации выручат клиентские сканеры client-side уязвимостей. Это модный тренд, поэтому многие компании, специализирующиеся на ИБ, сейчас активно разрабатывают подобные решения. Основная фишка в том, что от пользователя требуется лишь перейти на специальный сайт, а устанавливать что-либо в системе не нужно. Вот наш список рекомендуемых сервисов:
- SurfPatrol (surfpatrol.ru). Проверка безопасности браузера и разных браузерных плагинов (QuickTime, Flash, Adobe Reader, Silverlight, Java и так далее). Если что-то из списка устарело, SurfPatrol тут же даст знать.
- Secunia Online Software Inspector (secunia.com/vulnerability_scanning/online). Анализ операционной системы и программ на наличие небезопасных версий и неустановленных патчей. Онлайн-аналог их известной десктопной программы PSI.
- Panda ActiveScan 2.0 (pandasecurity.com/homeusers/solutions/activescan). Реализованный через ActiveX-компонент антивирус от компании Panda Security.
- Check Your Plugins (mozilla.com/plugincheck). Экспресс-проверка безопасности установленных аддонов для Firefox'а.
Q: Пишу приложение для мониторинга, которое в случае проблем должно оповещать администратора с помощью SMS-сообщения. Нынешняя убогая система использует старый телефон, подключенный через COMпорт :).
A: Самый сбалансированный вариант — воспользоваться уже знакомым нам сервисом Clickatell Bulk SMS Gateway (clickatell.com). Мы когда-то давно писали о нем, как о способе отправки SMS’ок с произвольным именем отправителя (атака «Fake ID»). Но этот SMS-шлюз непременно пригодится не только для баловства. Сервис имеет очень толковую систему API, позволяющую встроить отправку сообщений в любое приложение. Полное описание системы представлено на специальной странице для разработчиков (clickatell.com/developers/clickatell_api.php), но чтобы продемонстрировать простоту подхода, приведу пример сценария на PHP. В основе скрипта лежит обращение к HTTP API Clickatell:
<?
// имя пользователя в системе
$user = "user";
// пароль в системе
$password = "password";
// идентификатор API
$api_id = "xxxx";
$baseurl =
"http://api.clickatell.com";
// текст сообщения
$text = urlencode("Hi! This is
alert message. Server id down!");
// номер для отправки
$to = "0123456789";
$url = "$baseurl/http/auth?user=$user&password=$password&api_id=$api_id";
$ret = file($url);
$sess = split(":",$ret[0]);
if ($sess[0] == "OK")
{
$sess_id = trim($sess[1]);
$url = "$baseurl/http/sendmsg?session_id=$sess_id&to=$to&text=$text";
$ret = file($url);
$send = split(":",$ret[0]);
if ($send[0] == "ID")
echo "success message ID: ".
$send[1];
else
echo "send message failed";
}
else
{
echo "Authentication failure: ".
$ret[0];
exit();
}
?>
Понятно, что аналогичным образом можно взаимодействовать с API-системой сервиса, разрабатывая приложения на любом другом языке. Ведь фактически общение со шлюзом осуществляется через обычные HTTP-запросы. Попробовать систему в действии можно совершенно бесплатно.
После регистрации каждый пользователь получает кредиты (это внутренняя валюта сервиса) для отправки десяти сообщений.
Q: Решил потренироваться в построении различных сетей и конфигураций сетевого оборудования. Виртуальную сеть из десктопных компьютеров можно создать в любой программе для виртуализации. Но как быть со сложными сетевыми устройствами, программируемыми роутерами и тому подобным? Как, например, можно подготовиться к сертификации? Ни за что не поверю, что единственный вариант — это отправиться на дорогостоящие курсы, где в лабораториях есть все необходимое оборудование.
A: К счастью, есть программы, позволяющие проектировать сети различной топологии и симулировать их работу. Один из самых видных проектов в этой области — графический симулятор сети GNS3 (gns3.net). Система поддерживает эмуляцию как простых ПК, так и, к примеру, маршрутизаторов Cisco. К тому же, в отличие от большинства аналогов, прога поддерживает все команды Cisco IOS, что непременно пригодится тебе для сертификации.
Q: Как вручную уменьшить размер Java-скриптов? Есть сценарий, который занимает 3 Кб — это много. Но пользоваться автоматическими упаковщиками не хочу.
A: Есть несколько действенных приемов, которые позволяют уменьшить размер JavaScript-сценария. Попробую перечислить общие рекомендации, объяснив их на примерах. Итак:
1. Использовать односимвольные названия:
var iCounter = 0 => i=0
2. Избегать «дорогих» ключевых слов:
x=new Array(); => x=[];
while(){}, do {} while () => for()
{}
x=Math.floor(x); => x=x>>0;
x=Math.round(x); => x=x-.5>>0;
x=Math.pow(2,x); => x=1<<x;
x=x/256; => x=x>>8;
3. Выбрать наиболее эффективную нотацию для цифр:
0x10 => 16
0x20000 => 1<<17
1000 => 1e3
.0001 => 1e-4
4. Оптимизировать for-циклы:
for(x=0;x<50;x++){} =>
for(x=50;x–;){}
5. Удалить комментарии и ненужные фигурные скобки, пробелы, точки с запятой:
for (…) { a+=b; c*=a; } => for(…)
a+=b,c*=a;
function () {a+=b;} => function()
{a+=b}
6. Сохранить наиболее часто используемые сложные значения в переменные:
x=document.createElement(…
);document.body.appendchild(x);
=> d=document;x=d.createElement(…
);d.body.appendchild(x);
y=x*x*x+x*x-4;z=x*x*x+x*x+5; =>
y=(q=x*x*x+x*x)-4;z=q+5;
7. Использовать комбинированные определения переменных:
x=0;y=0; => x=y=0;
x=0;y=[0]; => y=[x=0];
Q: А как работают автоматические упаковщики JS?
A: В основе JS-пакеров во многом лежат описанные выше алгоритмы. Многие из решений основываются на том, что в JS-сценарии часто одни и те же последовательности символов встречаются много раз. Например, 4 символа for() можно заменить односимвольным эквивалентом и серьезно выиграть в размере. Для этого, правда, придется хранить словарь замен, чтобы иметь возможность выполнить декодирование. Допустим, имеется следующий код:
code="o = document.createElement('a');\r\ndocument.body.appendChild(o);"
А вот так он может выглядеть в упакованном виде:
keys="A"
code="o = AcreateElement('a');\r\
nAbody.appendChild(o);Adocument.";
В этом примере последовательность «document.» заменена символом «A». Переменная keys содержит список всех символов, которые используются для замены строк (в нашем случае только «A»).
В переменной code содержится оригинальная строка с выполненными заменами, заканчивающаяся используемым ключом и строкой для выполнения декодирования.
Изначальный код может быть легко восстановлен разбиением строки на подстроки, если в качестве разделителя использовать ключ. В нашем примере разделение будет выглядеть следующим образом:
sub_string=["o = ",
"createElement('a');\r\n", "body.appendChild(o);", "document."];
Удалив последнюю строчку из массива и соединив между собой оставшиеся подстроки, вставляя текст замены, декодер может восстановить оригинальную строку.
Это очень эффективный принцип, который помогает добиться максимальной степени сжатия. Одним из пакеров, которые используют такой подход, является JsSfx (code.google.com/p/jssfx).
Q: Винда стала постоянно вываливаться в синий экран смерти. Сложность в том, что система сразу перезагружается, и я не могу даже посмотреть сообщение об ошибке. Как быть?
A: Чтобы увидеть причину сообщения BSOD, надо отключить автоматическую перезагрузку при падении системы. Для этого переходим «Мой компьютер - Дополнительные параметры системы - Дополнительно - Загрузка и восстановление - Параметры» и снимаем галку с опции «Выполнять автоматическую перезагрузку», после чего Винда уже не будет перезагружаться в случае возникновения критической ошибки. Могу также порекомендовать утилиту BlueScreenView (nirsoft.net), которая сканирует все dump-файлы, создаваемые во время крэша системы, и выводит сообщения об ошибках в виде удобной таблицы.
Q: Есть ли аналог системы T9 для телефонов с QWERTY-клавиатурой?
A: Да, такая технология есть и называется Swype (swypeinc.com). После установки ты получаешь каметод ввода для сенсорного экрана, позволяющего печатать слова, не отрывая палец от тач-скрина.
Принцип во многом очень схож с T9. Для угадывания слова Swype использует алгоритм исправления ошибок и лингвистическую модель языка. Причем это работает настолько здорово, что набор текста ускоряется в разы. Отрывать палец нужно только между словами. С официального сайта (swypeinc.com) можно скачать бета-версию для платформы Android, правда, поддержки русского языка в ней пока нет.
Q: У меня в сети есть роутер, шифрующий весь трафик при помощи SSL. Подскажи, можно ли как-то расшифровать перехваченный трафик пользователей?
A: Да, можно. Ты, наверное, подумаешь, что я знаю какую-то новую уязвимость SSL. На самом деле, ничего нового нет, а проблема известна еще с тех времен, когда зарождалась криптография. Важное требование для надежного шифрования: приватный ключ надо хранить в секрете. Проще простого. Но курьез в том, что многие сетевые устройства используют секретные ключи, которые жестко внедрены в прошивку. Таким образом, чтобы получить заветный ключ, нужно лишь отыскать и распотрошить подходящую прошивку. Но тут есть небольшая проблемка: точная версии прошивки на устройстве заведомо неизвестна.
Возьмем, например, сборки DD-WRT: для каждого поддерживаемого устройства существует несколько версий firmware — микро, обычная, VPN и так далее. Что же теперь, перебирать все прошивки вручную? Нет, к счастью, это необязательно. От дичайшего геморроя нас избавит проект LittleBlackBox (code.google.com/p/littleblackbox), представляющий собой настоящую базу с секретными и ассоциированными с ними открытыми ключами.
Программе можно передать открытый ключ роутера, и она автоматически найдет секретный ключ. Или поступить по-другому и скормить LittleBlackBox’у дамп перехваченного трафика пользователей. В этом случае программа сама извлечет оттуда публичный ключ и уже с его помощью выполнит поиск по своей базе. На текущий момент LittleBlackBox содержит сведения о прочти двух тысячах уникальных секретных ключей, большая часть которых относится к различным прошивкам DDWRT.
Хотя, безусловно, здесь есть ключи и для устройств таких известных вендоров, как Cisco, Linksys, D-Link и Netgear. Это еще увеличивает шансы расшифровать перехваченный трафик и даже организовать MITM-атаку.
Q: Через мой SMTP часто пытаются отправлять вирусы, спам- и фишинговые сообщения. Это меня расстраивает :). Подскажи, как реализовать антиспам- и антивирусные проверки на уровне SMTP-сервера?
A: Можно попробовать разработку от Яндекса — NwSMTP (github.com/khanton/NwSMTP). Это прокси-сервер, который работает перед основным почтовым сервером и может обеспечивать поддержку SSL, фильтрацию по RBL, антиспам- и антивирусные проверки. Именно он работает сейчас на Яндекс.Почте. Вся настройка осуществляется через конфиг-файл, который хорошо откомментирован.
Q: Использую в своем проекте сложные капчи, в том числе от сервиса reCAPTCHA (google.com/recaptcha), но даже это не спасает от фейковых регистраций ботами. Как им это удается? Ведь не вручную же регистрируются?
A: Если регистраций действительно очень много, то заполнение форм явно осуществляется автоматически. Тут надо понимать, что даже самая сложная CAPTCHA нынче не проблема — их решают самые обычные люди. Такие сервисы, как DeCaptcher (decaptcher.com), связывают между собой тех, кто разрабатывает автоматизированные боты, и трудоголиков, которые за копейки готовы «решать» капчи тысячами.
Девелоперам предлагается API для разных языков (C/C++, C#, Perl, PHP и Python), с помощью которого они заливают на сервер капчу и получают ответ с решением, а желающим заработать (в основном это китайцы) предоставляется простенькая форма для решения капчи. Желающих поживиться настолько много, что любая капча распознается практически мгновенно.
Q: По долгу службы приходится часто разрабатывать правила для ModSecurity. Есть ли какой-нибудь удобный редактор для этих целей?
A: Попробуй REMO — Rule Editor for ModSecurity (netnea.com/cms/?q=remo). Это графический редактор для управления правилами, который поможет сгенерировать whitelist корректных запросов для твоего веб-приложения. Даже хорошо разбираясь в синтаксисе для составления правил, конфигурировать ModSecurity гораздо приятнее и быстрее именно с помощью таких графических помощников. REMO написан на Ruby и легко устанавливается на любой сервер, где есть интерпретатор Ruby версии 1.8 или выше.
Q: Можно ли запустить процесс с постоянно включенной системой DEP без возможности отключения?
A: Напомню, что DEP (Data Execution Prevention) — это функция безопасности, встроенная в семейство операционных систем Windows, которая не позволяет приложению исполнять код из области памяти, помеченной как «только для данных». Короткий ответ на твой вопрос: «Да, можно». Для этого потребуется специальная DLL-библиотека — EnforcePermanentDEP (blog.didierstevens.com/2010/11/08/enforcepermanentdep).
Будучи загруженной внутрь процесса, эта DLL вызывает SetProcessDEPPolicy с аргументом PROCESS_DEP_ENABLE, тем сам активируя для приложения функцию DEP. После этого отключить защиту уже нельзя.
Q: Тогда следующий вопрос: а как подгрузить нужную DLL внутрь процесса?
A: Для этого есть разные техники. Ты можешь добавить библиотеку и нужную функцию в таблицу импорта. Не ясно? Сейчас объясню. Любая программа имеет такой список DLL’ек, которые нужны ей для корректного выполнения. Чтобы добавить в этот список требуемую DLL-библиотеку, понадобится редактор PE-файлов, например, LorePE (woodmann.net/collaborative/tools/index.php/LordPE). Запускаем прогу, жмем на кнопку <PE Editor> и выбираем нужный исполняемый файл. В следующем окне, где будут отображаться параметры PE-файла, нажми на <Directories> и кликни на кнопку <...> напротив Import table. Теперь перед тобой находится таблица импорта со списком подгружаемых DLL-библиотек. Если вызвать контекстное меню и выбрать пункт Add import, то можно указать новую DLL’ку, а также функции, которые необходимо импортировать. После этого остается только сохранить изменения, и дело можно считать сделанным.
Еще один вариант — воспользоваться специальными утилитами вроде LoadDLLViaAppInit (blog.didierstevens.com/2010/10/26/update-loaddllviaappinit). В конфиге проги необходимо прописать имя процесса и через точку с запятой имена всех DLL-библиотек, которые требуется импортировать. Например, так:
acrord32.exe hook-createprocess.dll;
EnforcePermanentDEP.dll