
Фреймворк криминалистики с открытым исходным кодом для анализа метаданных и проектных файлов промышленных ПЛК. Сканирует подозрительные артефакты в средах АСУ ТП для поддержки реагирования на инциденты и ручного расследования.

Microsoft ICS Forensics Tools framework — это фреймворк криминалистики с открытым исходным кодом, позволяющий анализировать метаданные промышленных ПЛК и файлы проектов.
Фреймворк предоставляет следователям удобный способ сканирования ПЛК и выявления подозрительных артефактов в средах АСУ, что может использоваться для ручной проверки, автоматизированных задач мониторинга или операций реагирования на инциденты для обнаружения скомпрометированных устройств.
Будучи инструментом с открытым исходным кодом, ICS Forensics Tools позволяет следователям просматривать результаты и настраивать их под свои конкретные требования.
Эти инструкции помогут вам получить копию проекта и запустить его на локальной машине для целей разработки и тестирования.
git clone https://github.com/microsoft/ics-forensics-tools.git
Установите зависимости Python
pip install -r requirements.txt
| Аргументы | Описание | Обязательный / Необязательный |
|---|---|---|
-h, --help | показать это справочное сообщение и выйти | Необязательный |
-s, --save-config | Сохранить файл конфигурации для удобного использования | Необязательный |
-c, --config | Путь к файлу конфигурации, по умолчанию config.json | Необязательный |
-o, --output-dir | Каталог для вывода файлов, по умолчанию output | Необязательный |
-v, --verbose | Вывод логов в файл и консоль | Необязательный |
-p, --multiprocess | Запуск в многопроцессорном режиме по количеству плагинов/анализаторов | Необязательный |
| Аргументы | Описание | Обязательный / Необязательный |
|---|---|---|
-h, --help | показать это справочное сообщение и выйти | Необязательный |
--ip | Путь к файлу адресов, CIDR или CSV-файл с IP-адресами (требуется колонка ip). добавьте больше колонок для доп. информации об IP (имя пользователя, пароль и т.д.) | Обязательный |
--port | Номер порта | Необязательный |
--transport | tcp/udp | Необязательный |
--analyzer | Имя анализатора для запуска | Необязательный |
python driver.py -s -v PluginName --ip ips.csv
python driver.py -s -v PluginName --ip ips.csv --analyzer AnalyzerName
python driver.py -s -v -c config.json --multiprocess
from forensic.client.forensic_client import ForensicClient
from forensic.interfaces.plugin import PluginConfig
forensic = ForensicClient()
plugin = PluginConfig.from_json({
"name": "PluginName",
"port": 123,
"transport": "tcp",
"addresses": [{"ip": "192.168.1.0/24"}, {"ip": "10.10.10.10"}],
"parameters": {
},
"analyzers": []
})
forensic.scan([plugin])
При локальной разработке убедитесь, что папка src помечена как «Корень источников».
from pathlib import Path
from forensic.interfaces.plugin import PluginInterface, PluginConfig, PluginCLI
from forensic.common.constants.constants import Transport
class GeneralCLI(PluginCLI):
def __init__(self, folder_name):
super().__init__(folder_name)
self.name = "General"
self.description = "General Plugin Description"
self.port = 123
self.transport = Transport.TCP
def flags(self, parser):
self.base_flags(parser, self.port, self.transport)
parser.add_argument('--general', help='General additional argument', metavar="")
class General(PluginInterface):
def __init__(self, config: PluginConfig, output_dir: Path, verbose: bool):
super().__init__(config, output_dir, verbose)
def connect(self, address):
self.logger.info(f"{self.config.name} connect")
def export(self, extracted):
self.logger.info(f"{self.config.name} export")
__init__.py в папке pluginsfrom pathlib import Path
from forensic.interfaces.analyzer import AnalyzerInterface, AnalyzerConfig
class General(AnalyzerInterface):
def __init__(self, config: AnalyzerConfig, output_dir: Path, verbose: bool):
super().__init__(config, output_dir, verbose)
self.plugin_name = 'General'
self.create_output_dir(self.plugin_name)
def analyze(self):
pass
__init__.py в папке analyzers