Узнать о пользователе интернета хоть какую-то информацию порой весьма
проблематично. Ведь, как известно, в Сети путешествуют не только
чайники, ламеры и секретарши, но и более-менее продвинутые
пользователи, которые не поддаются на уловки, вроде "зайди на эту
страничку" или "скачай файлик ...". Допустим, нам требуется нарыть всю
возможную информацию о пользователе (т.е. получить версию ОС, тип
браузера, провайдера и т.д.), чтобы потом его заттачить и, в случае
удачи, заполучить данные, хранящиеся на жестком диске.
Готовимся к покушению
Нет-нет,
сегодня мы не будем маскировать вирусы, кидать в чатах подозрительные
ссылки и заниматься другой, не внушающей доверия деятельностью. Сегодня
у нас все будет цивильно, технологично и хитро. Получать инфу мы будем
при помощи веб - сайта. Итак, для начала регистрируем новый сайт на
каком-нибудь халявном 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. Теперь все
готово для работы скрипта:
?> Собственно,
что же тут произошло. В переменную $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 - запроса и его запись в файл
выглядит так:
fclose ($fopen); ?> В
PHP любой запрос (GET и POST) записывается в массив. Причем массив
является ассоциативным, т.е. чтобы получить значение переменной loged
необходимо указать $_GET['loged']. Но в своем скрипте я рассмотрел
общий случай, т.е. происходит получение значения каждой переменной.
Осуществляется задумка циклом foreach. Функции Fopen() и Fputs() вам
уже известны.
Собственно, вот и все! Мы по кусочкам написали
скрипт-ловушку, но остались две немаловажные вещи: собрать скрипт
целиком и замаскировать его. Но для начала воссоединяем кусочки кода и
получаем примерно такую картину: <? $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'];
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. Ну чем не
ловушка ? А теперь предлагаю перейти к следующему не менее важному
моменту.
Цыпа-цыпа-цыпа...
Вроде бы, все готово.
Сниффер создан и имеет не внушающую подозрений ссылку:
http://[ваш_логин].jino-net.ru/IMAGES/photo001.jpg . Но как заставит
жертву угодить в запланированную ловушку? Способов не так много, но
сегодня я предложу, на мой взгляд, один из самых интересных и хитрых. В
этом нам поможет сервер, на котором расположен сайт. Создайте в
отдельной директории файл mail_send.php. С помощью этого скрипта мы
будем слать пользователю сообщения. Код для отправки такой:
$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). Теперь подключайте ваше
воображение: какое письмо послать, и, главное, от кого. Вам известно, с
кем пользователь переписывается или от каких сервисов получает новости
? А может, вы являетесь приятелем юзера ? В последнем случае ситуация
заметно облегчается, а в остальном - все зависит от вашей фантазии и
здравости. Но цель - заставить пользователя попасть в лапы созданного
сниффера. И те данные, что мы, возможно, получим, могут здорово
пригодиться собственно при атаке на удаленный ПК.
ИТОГ
Конечно,
для многих статья не донесла ничего принципиально нового. И в данной
статье не раскрывается процесс собственно взлома. Но на базе всего выше
сказанного, по моему мнению, можно организовать хорошую, качественную
удаленную атаку.