
Режим борьбы за свободу: открытый хакерский каркас
FFM — это хакерская упряжь, которую можно использовать во время пост-эксплуатационной фазы red-team задания. Идея инструмента была взята из конференции 2007 года от @thegrugq.
Она была представлена на SSTIC 2018 (видео), а сопутствующие слайды доступны по этой ссылке. Если вы не знакомы с этим классом инструментов, настоятельно рекомендуется ознакомиться с ними, чтобы понять, каково назначение хакерской упряжи. Все комментарии включены в слайды.
Этот проект распространяется на условиях лицензии GPL v3.
Основная документация находится в этом README и в модулях команд в commands/.
Ссылки на доклад на SSTIC, приведённые выше, остаются лучшим высокоуровневым введением в то, как предполагается использовать упряжь.
Дополнительные материалы с пошаговыми инструкциями доступны по адресу:
ice-wzl внёс вклад в виде команд, документации и рефакторинга на протяжении истории проекта.docker с этим инструментом.Dockerfile из этого репозитория значительно сократит количество возможных ошибок.Docker.git clone https://github.com/JusticeRage/FFM.git
cd /FFM
docker build Docker_Install/ -t ffm:ffm
docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/ffm ffm fb6dd17e3b91 9 minutes ago 614 MB
docker.io/library/ubuntu 22.04 3b418d7b466a 2 weeks ago 80.3 MB
#run your new container and drop into a /bin/bash prompt as root
docker run -it --entrypoint /bin/bash -u 0 fb6dd17e3b91
passwd для root и neo.su neo и теперь всё готово. git clone https://github.com/JusticeRage/FFM.git
cd /FFM
pip install -r requirements.txt
Цель хакерской упряжи — выступать в роли помощника, который автоматизирует распространённые задачи во время пост-эксплуатационной фазы, а также защищает пользователя от ошибок, которые он может совершить.
Это инструментарий оболочки. Запустите ./ffm.py, чтобы активировать его, и вы сможете начать работу
немедленно. Команды распределены по небольшим модулям в commands/, причём
commands/command_manager.py отвечает за обнаружение и регистрацию. Основные группы:
перечисление, справка, скрытность, передача и выполнение.
Есть две команды, которые вам нужно знать:
!list, чтобы отобразить все команды, предоставляемые упряжью.!list tags, чтобы увидеть различные теги, по которым можно группировать команды.!list tags
List of commands available:
enumeration
execution
help
stealth
transfer
!list enumeration (или один из других тегов), чтобы увидеть команды, относящиеся к этой категории.!list enumeration
List of commands available:
!backup-hunter: Hunts for backup files
!info: Returns CPU(s), Architecture, Memory, and Kernel Verison for the current machine.
!log: Toggles logging the harness' input and output to a file.
!mtime: Returns files modified in the last X minutes
!os: Prints the distribution of the current machine.
!db-hunter: Hunts for .sqlite, .sqlite3, and .db files
!sshkeys: Hunts for Private and Public SSH keys on the current machine.
!suid: Finds SUID, SGID binaries on the current machine.
--snip--
SHIFT+TAB, чтобы выполнить автодополнение на локальной машине. Это может быть полезно, если вы
подключены по SSH к удалённому компьютеру, но вам нужно обратиться к файлу, который находится на вашей локальной машине.Эта хакерская упряжь предоставляет несколько функций, описанных ниже. По мере их описания будет также представлена философия дизайна инструмента. Не ожидается, что все команды, реализованные в FFM, подойдут вам. У каждого свой подход к работе, и настройка упряжи под ваши конкретные потребности, скорее всего, потребует от вас изменения некоторого кода и/или написания нескольких плагинов. Было приложено много усилий, чтобы сделать эту задачу безболезненной.
!os — чрезвычайно простая команда, которая просто выполняет cat /etc/*release*, чтобы показать, какая ОС
установлена на текущей машине. Вероятно, она наиболее ценна как демонстрация того, что в
контексте хакерской упряжи вы можете определять псевдонимы, которые работают на разных машинах.
Подключитесь по SSH к любому компьютеру, введите !os, и команда будет выполнена. Команды перечисления находятся в
commands/enumeration_commands.py, команды справки — в commands/help_commands.py, а
команды, связанные со скрытностью, распределены по commands/stealth_commands.py,
commands/notty_sudo.py и commands/log_control.py.!backup-hunter Ищет файлы резервных копий.!info Возвращает информацию о CPU, архитектуре, памяти и версии ядра для текущей машины.!log Включает/выключает журналирование ввода и вывода упряжи в файл. Реализовано в
commands/log_control.py.!download [remote file] [local path] получает файл с удалённой машины и копирует его
локально через терминал. Эта команда немного сложнее, так как требуется более строгая
проверка ошибок, но это ещё одна команда, которую вы легко можете прочитать, чтобы начать работу. Она находится
в commands/download_file.py. Обратите внимание, что для её корректной работы требуется xxd или od на удалённой машине.!download-dir [remote directory] [local destination] передаёт tar-архив удалённой
директории через терминал и извлекает его локально, не затрагивая удалённую файловую систему.
Находится в commands/download_directory.py. Требует tar и base64 на удалённой
машине, а также использует gzip, если он доступен.!upload [local file] [remote path] работает точно так же, как предыдущая команда,
за исключением того, что локальный файл помещается на удалённую машину. Находится в commands/upload_file.py.!sh [local script] Запускает shell-скрипт с локальной машины в памяти. Находится в
commands/remote_script.py.!py [local script] выполняет локальный Python-скрипт на удалённой машине, причём
полностью в памяти. Находится в commands/remote_script.py. Загляните в мой
другой репозиторий для скриптов, которые вы,
возможно, захотите использовать. Эта команда использует многострочный синтаксис с <<, что означает,
что псевдо-оболочки, не поддерживающие его (хорошим примером является Weevely), сильно сломают эту команду.!py3 [local script] делает то же самое, но для систем с python3. Использует тот же модуль commands/remote_script.py.!elf [local script] Запускает исполняемый файл с локальной машины в памяти, используя любой совместимый интерпретатор Python, доступный на удалённой машине. Находится в commands/remote_elf.py.!pty порождает TTY, что в большинстве случаев нежелательно, так как это обычно оставляет
криминалистические следы. Однако некоторые команды (sudo) или эксплойты требуют TTY для
работы, поэтому это предоставляется для удобства. UNSET HISTFILE HISTFILESIZE HISTSIZE PROMPT_COMMAND передаётся в него сразу после
порождения, вместе с export TERM=xterm.!sudo Вызывает sudo без TTY. Находится в commands/notty_sudo.py.Плагины можно дополнительно настроить, отредактировав ffm.conf.
Концептуально команды (как описано выше) используются для генерации некоторого bash-кода, который передаётся
оболочке. Они могут выполнять более сложные операции, захватывая вывод оболочки и
генерируя дополнительные инструкции на основе того, что было возвращено.
Процессоры немного отличаются: они скорее используются для перезаписи данных, циркулирующих между
пользователем и базовым bash-процессом. Хотя любой процессор можно переписать
как команду, казалось более чистым разделить их. Входные процессоры работают с тем, что
вводит пользователь после нажатия клавиши ENTER, а выходные процессоры могут модифицировать всё, что
возвращает оболочка.
processors/ssh_command_line.py. Он просто добавляет
опцию -T к любой команде SSH, которую видит, если она отсутствует. Обязательно посмотрите на его простой
код, если вы заинтересованы в написании своего процессора.processors/assert_torify.py, содержит
чёрный список сетевых команд (ssh, nc) и блокирует их, если они не кажутся проксированными
через такой инструмент, как torify. Упряжь делает всё возможное, чтобы беспокоить пользователя только в том случае, если
команда выполняется на локальной машине. Очевидно, это не должно быть вашей единственной
защитой от утечки вашего домашнего IP-адреса.processors/sample_output_processor.py — это очень простой выходной процессор, который
выделяет красным цветом любое вхождение слова "password". Поскольку он совершенно бесполезен, он не включён
в фреймворк, но вы всё равно можете использовать его как отправную точку, если хотите сделать что-то более
сложное.CTRL+R ещё не реализован, и мы все по нему скучаем.
Более проблематично то, что фреймворк время от времени зависает. В 99% случаев
это происходит, когда он не может обнаружить, что запущенная им команда завершила работу. Обычно
это означает, что приглашение командной строки машины, на которую вы вошли, не было распознано
как таковое. В этом случае вы можете попробовать улучшить регулярное выражение в самом
начале файла ffm.py или войти на ту же машину с помощью ssh -T, так как там больше не будет
проблемного приглашения.
По умолчанию FFM перестаёт пытаться читать вывод команды через 5 минут (некоторые
плагины могут реализовывать другие таймауты); поэтому, если фреймворк завис, вам придётся подождать,
пока не увидите сообщение об ошибке (хотя если базовый процесс всё ещё выполняется, вы
всё равно не сможете вводить команды).
Думаю, я рассказал всё об этом инструменте. Опять же, он немного отличается от того, что я обычно выпускаю, так как большинству людей, вероятно, придётся его модифицировать, прежде чем он станет для них полезен.
Многие плагины ещё предстоит написать, поэтому обязательно делитесь своими улучшениями, которые вы вносите в FFM. Не стесняйтесь открывать issues не только для сообщения об ошибках, но и если вы пытаетесь что-то сделать и не можете понять, как; так я смогу улучшить документацию для всех.
!mtime Возвращает файлы, изменённые за последние X минут. Например, !mtime 5 покажет все файлы на локальной машине (которые вы имеете право видеть), изменённые за последние 5 минут.!db-hunter Ищет файлы .sqlite, .sqlite3, .db и другие файлы баз данных.!sshkeys Ищет приватные и публичные ключи SSH на текущей машине.!suid Находит SUID, SGID-бинарники на текущей машине.!strange-dirs Проверяет устройство, начиная с указанного пользователем пути, на наличие странных директорий на хосте.!sudo-version Проверяет уязвимую версию sudo.!vm Проверяет, является ли устройство виртуальной машиной.