
Framework forense de código aberto para analisar metadados de CLPs industriais e arquivos de projeto. Escaneia artefatos suspeitos em ambientes ICS para apoiar a resposta a incidentes e a investigação manual.

A estrutura de ferramentas forenses ICS da Microsoft é uma estrutura forense de código aberto que permite a análise de metadados e arquivos de projeto de CLPs industriais.
A estrutura oferece aos investigadores uma maneira conveniente de escanear CLPs e identificar quaisquer artefatos suspeitos em ambientes ICS, que podem ser usados para verificação manual, tarefas de monitoramento automatizadas ou operações de resposta a incidentes para detectar dispositivos comprometidos.
Sendo uma ferramenta de código aberto, o ICS Forensics Tools permite que os investigadores revisem a saída e a personalizem de acordo com seus requisitos específicos.
Estas instruções fornecerão uma cópia do projeto em execução na sua máquina local para fins de desenvolvimento e teste.
git clone https://github.com/microsoft/ics-forensics-tools.git
Instalar os requisitos Python
pip install -r requirements.txt
python driver.py -s -v NomeDoPlugin --ip ips.csv
python driver.py -s -v NomeDoPlugin --ip ips.csv --analyzer NomeDoAnalisador
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": "NomeDoPlugin",
"port": 123,
"transport": "tcp",
"addresses": [{"ip": "192.168.1.0/24"}, {"ip": "10.10.10.10"}],
"parameters": {
},
"analyzers": []
})
forensic.scan([plugin])
Ao desenvolver localmente, certifique-se de marcar a pasta src como "Sources root"
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 dentro da pasta 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 dentro da pasta analyzersMicrosoft Defender for IoT é uma solução de segurança sem agente na camada de rede que permite que organizações monitorem e descubram continuamente ativos, detectem ameaças e gerenciem vulnerabilidades em dispositivos IoT/OT e Sistemas de Controle Industrial (ICS), tanto no local quanto em ambientes conectados ao Azure.
Section 52 no blog MSRC
Palestra ICS sobre a ferramenta
Section 52 - Investigando Lógica Ladder Maliciosa | Webinar Microsoft Defender for IoT - YouTube
Este projeto aceita contribuições e sugestões. A maioria das contribuições exige que você concorde com um Contrato de Licença de Colaborador (CLA) declarando que você tem o direito de, e de fato concede, a nós os direitos de usar sua contribuição. Para mais detalhes, visite https://cla.opensource.microsoft.com.
Quando você enviar um pull request, um bot do CLA determinará automaticamente se você precisa fornecer um CLA e decorará o PR apropriadamente (por exemplo, verificação de status, comentário). Basta seguir as instruções fornecidas pelo bot. Você só precisará fazer isso uma vez em todos os repositórios que usam nosso CLA.
Este projeto adotou o Código de Conduta de Código Aberto da Microsoft. Para mais informações, veja as Perguntas Frequentes sobre o Código de Conduta ou entre em contato com [email protected] para quaisquer perguntas ou comentários adicionais.
Este projeto pode conter marcas registradas ou logotipos de projetos, produtos ou serviços. O uso autorizado de marcas registradas ou logotipos da Microsoft está sujeito e deve seguir as Diretrizes de Marcas Registradas e Marcas da Microsoft. O uso de marcas registradas ou logotipos da Microsoft em versões modificadas deste projeto não deve causar confusão ou implicar patrocínio da Microsoft. Qualquer uso de marcas registradas ou logotipos de terceiros está sujeito às políticas desses terceiros.
Copyright (c) 2018 Microsoft Corporation. Todos os direitos reservados.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM QUALQUER TIPO DE GARANTIA, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM PROPÓSITO ESPECÍFICO E NÃO VIOLAÇÃO. EM NENHUM CASO OS AUTORES OU DETENTORES DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, FORA OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.
| Args | Descrição | Obrigatório / Opcional |
|---|
-h, --help | mostra esta mensagem de ajuda e sai | Opcional |
-s, --save-config | Salva arquivo de configuração para uso futuro | Opcional |
-c, --config | Caminho do arquivo de configuração, padrão é config.json | Opcional |
-o, --output-dir | Diretório para gerar os arquivos de saída, padrão é output | Opcional |
-v, --verbose | Registra a saída em um arquivo e também no console | Opcional |
-p, --multiprocess | Executa em modo multiprocesso pelo número de plugins/analisadores | Opcional |
| Args | Descrição | Obrigatório / Opcional |
|---|
-h, --help | mostra esta mensagem de ajuda e sai | Opcional |
--ip | Caminho do arquivo de endereços, CIDR ou CSV de endereços IP (coluna ip obrigatória). adicione mais colunas para informações adicionais sobre cada IP (nome de usuário, senha, etc...) | Obrigatório |
--port | Número da porta | Opcional |
--transport | tcp/udp | Opcional |
--analyzer | Nome do analisador a executar | Opcional |