Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
ics-forensics-tools — Open-source forensics framework for analyzing Industrial PLC metadata and project files. Scans for suspicious artifacts in ICS environments to support incident response and manual investigation. | Kitploit
Tools/GitHubGitHub/microsoft/ics-forensics-tools
Vulnerability AnalysisSCADA/ICS SecurityForensicsDigital ForensicsIncident Response
GitHubmicrosoft/ics-forensics-tools

ics-forensics-tools

Open-source forensics framework for analyzing Industrial PLC metadata and project files. Scans for suspicious artifacts in ICS environments to support incident response and manual investigation.

View Repository
37143741 year agoReviewed by Kitploit

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

ICSpector: Microsoft ICS Forensics Framework

Microsoft ICS Forensics Tools framework is an open-source forensics framework that enables the analysis of Industrial PLC metadata and project files.
The framework provides investigators with a convenient way to scan for PLCs and identify any suspicious artifacts within ICS environments, which can be used for manual checking, automated monitoring tasks, or incident response operations to detect compromised devices.
By being an open-source tool, ICS Forensics Tools allows investigators to review the output and customize it to their specific requirements.

Getting Started

These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.

git clone https://github.com/microsoft/ics-forensics-tools.git

Prerequisites

  • Install Python >= 3.9: https://www.python.org/downloads
  • Install Microsoft Visual C++ 14.0. Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/

Installing

  • Install python requirements

    pip install -r requirements.txt
    

Usage

General application arguments:

ArgsDescriptionRequired / Optional
-h, --helpshow this help message and exitOptional
-s, --save-configSave config file for easy future usageOptional
-c, --configConfig file path, default is config.jsonOptional
-o, --output-dirDirectory in which to output any generated files, default is outputOptional
-v, --verboseLog output to a file as well as the consoleOptional
-p, --multiprocessRun in multiprocess mode by number of plugins/analyzersOptional

Specific plugin arguments:

ArgsDescriptionRequired / Optional
-h, --helpshow this help message and exitOptional
--ipAddresses file path, CIDR or IP addresses csv (ip column required).
add more columns for additional info about each ip (username, pass, etc...)
Required
--portPort numberOptional
--transporttcp/udpOptional
--analyzerAnalyzer name to runOptional

Executing examples in the command line

 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

Import as a library example

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])

Architecture

Adding Plugins

When developing locally make sure to mark src folder as "Sources root"

  • Create new directory under plugins folder with your plugin name
  • Create a new Python file with your plugin name
  • Use the following template to write your plugin and replace 'General' with your plugin name
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")


  • Make sure to import your new plugin in the __init__.py file under the plugins folder
  • In the PluginInterface inherited class there is 'config' parameters, you can use this to access any data that's available in the PluginConfig object (plugin name, addresses, port, transport, parameters).
    There are 2 mandatory functions (connect, export).
    • The connect function receives single ip address and extracts any relevant information from the device and return it.
    • The export function receives the information that was extracted from all the devices and there you can export it to file.
  • In the PluginCLI inherited class you need to specify in the init function the default information related to this plugin.
    There is a single mandatory function (flags), in which you must call base_flags, and you can add any additional flags that you want to have.

Adding Analyzers

  • Create new directory under analyzers folder with the plugin name that related to your analyzer.
  • Create new Python file with your analyzer name
  • Use the following template to write your plugin and replace 'General' with your plugin name
from 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

  • Make sure to import your new analyzer in the __init__.py file under the analyzers folder
Download Tool