Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #105, СЕНТЯБРЬ 2007 г.

За семью замками

Дмитрий «DiFor» (difor@mail.ru)

Хакер, номер #105, стр. 078

Шифруем эксплойты

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

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

<Script Language="JavaScript">document.write("difor"+"@"+"mail.ru");</script>

Когда и это перестало срабатывать, вспомнили, что есть JS-функция unescape, которая возвращает символ по HEX-значению его ASCII-кода. Вышеописанный скрипт усовершенствовали:

<Script Language="JavaScript">document.write("difor"+unescape("%40")+"mail.ru");</script>

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

Помогла тут опять-таки нелюбимая всеми математика, а точнее, наука, основанная на ней, с гордым именем «криптография» (наука о математических методах обеспечения конфиденциальности и аутентичности информации). Сплоиты стали шифровать, используя кто что может: начиная от пресловутого unescape и до специальных библиотек типа lib.csource, которая, кстати, на текущий момент используется в 90% связок. Однако антивирусные компании должны оправдывать себя и вложенные в них деньги покупателей. Фильтры совершенствуются, часть шифрованных сплоитов ловится по сигнатурам шифра, часть - эвристиками, часть - по содержимому памяти. Одним словом, клиенты рады.

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

<?

$str="difor@mail.ru";

for ($i=0;$i<strlen($str);$i++){

@$str2.="%".dechex(ord($str[$i]));

}

echo "<script>document.write(unescape('".$str2."'))</script>";

?>

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

<script>document.write(unescape('%64%69%66%6f%72%40%6d%61%69%6c%2e%72%75'))</script>

Не всякий додумается, что это. Кстати, подобным способом неплохо скрываются ссылки к файлам, если ты не хочешь, чтобы благодаря поисковикам твои файлы стали достоянием Сети. Способ примитивный, но действенный.

Следующий алгоритм, который мы разберем, - это шифрование методом сдвига, а конкретно, шифр Цезаря, где сдвиг идет на три знака вправо.

<Script Language="JavaScript">

function cesar(data){

var str=new Array();

for (var i=0; i<data.length; i++) {

str[i]=String.fromCharCode(data.charCodeAt(i)-3);

}

return str.join('');

}

document.write(cesar("gliruCpdlo1ux"));

</script>

Фраза «gliruCpdlo1ux» - не что иное, как difor@mail.ru. Сам шифр можно генерировать изначально, вбивая руками в HTML-контент, а можно повесить эту задачу на PHP-скрипт. Создание шифра получается методом chr(ord($str)+n), где n - требуемый интервал сдвига. Вскрыть подобное зверье будет уже сложнее. Кроме того, если замусорить код, то инфа скроется не только от глаз нехороших личеров, но от разного рода ботов и «антивирей» :).

Однако не стоит смотреть в сторону Запада, поддержим российского производителя. Не будем забывать отечественную математическую школу, признанную во всем мире. Перед тобой шифр, официально именуемый «ГОСТ 28147—89 Системы обработки информации. Защита криптографическая. Алгоритм криптографического преобразования». История создания этого шифра до сих пор покрыта мраком. Известно лишь, что алгоритм перешел в разряд «полностью открытых» в мае 1994 года, до этого на нем стояло клеймо «только для служебного использования». Кстати, сегодня его использует Центральный банк Российской Федерации и им же шифруются данные, составляющие государственную тайну. Стоит задуматься :). Однако для нашей задачи он не подходит, так как использование его не бесплатно.

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

Основной алгоритм шифрования я решил взять все-таки RC4, поскольку он довольно прост и не требуется серьезных вычислительных мощностей как на уровне шифрования, так и на уровне дешифрования. Ключ шифрования и сам шифрованный текст будем переводить в base64, чтобы исключить проблемы с битьем кодировки зашифрованного текста. Функциям, отвечающим за дешифрование, будем присваивать каждый раз новые имена, что поможет нам немного сбить общую сигнатуру конечного шифра. И, наконец, последним уровнем будет перевод в HEX-значения и вывод в браузер. Чтобы облегчить использование этого зверя, мы сделаем его в виде библиотеки, которая будет перехватывать генерируемый PHP-интерпретатором конечный код и шифровать его. Для подключения библиотеки просто инклудни ее в файл, генерируемый контент которого ты хочешь скрыть.

3, 2, 1, поехали!

Для начала определимся с реализацией алгоритмов RC4 и base64. Добрый человек Ali Farhadi (farhadi.ir) реализовал RC4 как на JS, так и на PHP, также его рук дело - написание функции, отвечающей за base64-декодирование на Java-скрипте, за что ему выражено спасибо в виде респекта на мыло. Далее, приведу несколько небольших функций, которые понадобятся для реализации задуманного и могут быть полезны в твоих проектах.

Функция, переводящая осмысленный код в вид «%64%69%66%6f%72%40%6d%61%69%6c%2e%72%75», упоминалась выше.

function gen_rnd($len,$type="default"){

$rnd_text=null;

for ($i=0;$i<$len;$i++){

$temp=rand(1,3);

if ($i==0 and $type=="var"){

$temp2=rand(1,2);

if ($temp2==1) {

$rnd_text.=chr(rand(65,90));

} else {

$rnd_text.=chr(rand(97,122));

}

} else {

if ($temp==1) {

$rnd_text.=chr(rand(65,90));

} elseif ($temp==2) {

$rnd_text.=chr(rand(97,122));

} else {

$rnd_text.=chr(rand(48,57));

}

}

}

return $rnd_text;

}

Функция для генерации разнообразных рандомных имен переменных, функций, констант по правилам программирования всегда начинается со строкового символа. Далее объявим флаг и переменную, отвечающую за вывод сообщения при отключенном JS.

$error_msg_show=true;

if ($error_msg_show){

$error_msg='<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<noscript>

Включи поддержку JS в твоем браузере для корректной работы

</noscript><br>';

} else {

$error_msg=null;

}

Тестируем шифрацию

Теперь настала пора протестировать боевой функционал системы. Возьмем какой-нибудь жутко спаленный сплоит и попробуем сделать так, чтобы его по возможности не увидел ни один антивирус. Первый взгляд мой пал на сплоит MDAC (MS06-014).

Для пополнения знаний об эксплойтах советую почаще заглядывать на milw0rm.com и packetstormsecurity.org. Данные, находящиеся там, при правильном их использовании поистине бесценны.

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

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

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

Итак, сканирование нашего шифрованного кода завершено, смотрим результаты и радуемся им. Не один из антивирусных пакетов Вирустотала не обнаружил в безобидном Java-коде боевого сплоита. Это не может не радовать.

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

Пожинаем плоды

Итак, что мы в итоге получили? А получили мы средство для шифрования генерируемого HTML-кода страницы, с помощью которого можно спрятать не только ссылки на файлы или картинки, но и вышеуказанные сплоиты. Но не стоит шифровать подобным образом все и вся, поскольку это очень сильно сказывается на скорости дешифровки контента на стороне конечного пользователя, - пару ссылок, емейл-адреса, тэги с картинками. Для задания вывода какого-нибудь error-сообщения при отключенных скриптах в функцию можно добавить переменную типа $type, в которой будет содержаться тип шифруемого контента. Вместо исходной картинки будет отображаться другая, с надписью типа: «No image, activate JS». Вместо ссылки - текст типа: «No url, activate JS». В общем, куча способов заставить пользователя включить требуемые Java-скрипты. Пример системы, описанной в статье, требует еще долгой, возможно, для кого-то нудной доработки. Однако, посидев вечерок-другой над скриптами, ты сможешь получить действительно многофункциональный инструмент для шифрования данных. С помощью PHP-реализаций криптоалгоритмов можно сделать дешифрование информации из базы данных, либо, наоборот, шифрование заносимых в нее данных. Возможности, которые открывается, по истине безграничны, все зависит лишь от твоей усидчивости и желания.

Вместо заключения

В своих проектах я часто реализую следующую связку. Пароли шифруются моим алгоритмом усиления MD5 (][, №103); вся информация, касаемая личных данных пользователей, шифруется RC4; файл конфига, содержащий ключи для расшифровки, закрыт либо моим обфускатором, либо последним зендом. Доступ к админ-панели осуществляется только по IP-адресу, либо стоит проверка на перебор. Происходит анализ: просто ли человек ломится на все возможные комбинации в админ-панель (в таком случае выдается блок по IP и куки»), или идет подбор пароля к конкретному администратору. После энных неудачных попыток авторизации этот аккаунт блокируется на некоторое время, плюс администратору, владельцу этой учетной записи, на почтовый ящик высылается сообщение о попытке взлома аккаунта.

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

WWW

Danger

Внимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несут!

DVD

На диске ты найдешь набор программ и скриптов, отвечающих за шифрование генерируемого HTML-кода. Плюс к этому - варианты реализации нескольких простых криптоалгоритмов и полный код библиотеки.

Содержание