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