Passive ICS/SCADA network discovery and topology visualization for OT security assessments.
Passive discovery of ICS/SCADA devices from a PCAP capture — topology visualization, protocol identification, and device fingerprinting in action.
Kusanagi Kajiki is a ground-up rewrite of the NSA's GRASSMARLIN (archived 2023), rebuilt from scratch with a Rust backend (Tauri 2.0) and SvelteKit frontend. It passively discovers and maps Industrial Control System (ICS) and SCADA network devices by analyzing network traffic captures and integrating data from external security tools.
In operational technology environments, active scanning can crash PLCs and disrupt physical processes. Assessors need visibility into OT networks without generating a single packet. Kusanagi Kajiki operates in passive-only mode — it observes captured traffic, identifies devices and protocols, maps network topology, and flags security concerns, all without touching the production network.
The tool achieves full feature parity with GRASSMARLIN 3.2 and extends well beyond it with MITRE ATT&CK for ICS detection (40+ rules), Purdue Model enforcement, deep protocol analysis for 10 protocols, ICS malware behavioral detection, CVE matching, IEC 62443/NIST 800-82/NERC CIP compliance mapping, 7 external tool importers, professional PDF reporting, SBOM/STIX export, baseline drift detection, and a modern dark/light UI.
[active-scan] tagging.kkj archives — Portable ZIP-based session format--open <file> (PCAP or .kkj), --import-pcap <path>| Capability | GRASSMARLIN 3.2 | Kusanagi Kajiki |
|---|---|---|
| Signature format | XML (opaque) | YAML (human-readable, git-friendly) |
| Security analysis | None | ATT&CK for ICS (40+ rules) + Purdue + anomaly + CVE + malware |
| Deep protocol parsing | Limited | 10 protocols with full dissection |
| ICS malware detection | None | FrostyGoop, PIPEDREAM, Industroyer2 behavioral detection |
| CVE matching | None | OT-focused CVE database with vendor/product/firmware matching |
| Compliance mapping | None | IEC 62443, NIST 800-82, NERC CIP |
| External tool integration | None | Zeek, Suricata, Nmap, Masscan, Wazuh, SINEMA, TIA Portal |
| Reporting | None | PDF assessment reports + remediation priority lists |
| Compliance export | None | SBOM (CISA BOD 23-01), STIX 2.1 |
| Baseline comparison | None | Session drift detection with scoring |
| Physical topology | Cisco only | Cisco, Juniper, HP/Aruba, generic CSV/JSON + traffic inference |
| Communication analysis | None | Per-connection stats, jitter, periodicity, allowlisting |
| Session format | XML archives | SQLite + portable .kkj ZIP + project management |
| Default credential check | None | 35-entry ICS vendor database |
| Redundancy detection | None | MRP/RSTP/HSR/PRP/DLR ring topology |
| Theming | Java Swing | Modern dark/light CSS custom properties |
| CLI support | None | --open, --import-pcap |
| Architecture | Monolithic Java | 10 Rust crates + SvelteKit frontend |
| Protocol | Port(s) | Detection | Standard / Vendor |
|---|---|---|---|
| Modbus TCP | 502 | Deep parse | Schneider Electric, multi-vendor |
| DNP3 | 20000 | Deep parse | IEEE 1815 (utilities, substations) |
| EtherNet/IP (CIP) | 44818, 2222 | Deep parse | Rockwell / Allen-Bradley (ODVA) |
| S7comm | 102 | Deep parse | Siemens S7 PLCs |
| BACnet/IP | 47808 | Deep parse | ASHRAE (building automation) |
| IEC 60870-5-104 | 2404 | Deep parse | Power grid SCADA |
| PROFINET DCP | 34962-34964 | Deep parse | Siemens / PROFIBUS International |
| LLDP | — | Deep parse | IEEE 802.1AB (network infrastructure) |
| SNMP | 161, 162 | Deep parse | Network management |
| Ring Redundancy | — | Deep parse | MRP / RSTP / HSR / PRP / DLR |
| OPC UA | 4840 | Port + Signature | OPC Foundation |
| MQTT | 1883, 8883 | Port | IIoT gateways |
| HART-IP | 5094 | Port | Process instrumentation |
| Foundation Fieldbus HSE | 1089-1091 | Port | Process automation |
| GE SRTP | 18245-18246 | Port + Signature | GE Automation PLCs |
| Wonderware SuiteLink | 5007 | Port + Signature | AVEVA / Wonderware |
Quick start: Clone → npm install → drop a PCAP in tests/pcaps/ → npm run tauri dev → import the PCAP from the Capture tab.
| Platform | System Dependencies | Special Notes |
|---|---|---|
| Fedora/RHEL | libpcap-devel webkit2gtk4.1-devel libsoup3-devel javascriptcoregtk4.1-devel |
Primary dev platform |
| Ubuntu/Debian | libpcap-dev libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf |
|
| macOS | brew install libpcap + Xcode CLI tools |
|
| Windows | VS C++ Build Tools + Npcap (WinPcap mode) + Npcap SDK | Set LIB env var to SDK Lib/x64 path |
sudo dnf install libpcap-devel webkit2gtk4.1-devel libsoup3-devel javascriptcoregtk4.1-devel
git clone https://github.com/TheSecurityLead/KusanagiNoKajiki.git
cd KusanagiNoKajiki
npm install
npm run build
npm run tauri dev
sudo apt install libpcap-dev libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
git clone https://github.com/TheSecurityLead/KusanagiNoKajiki.git
cd KusanagiNoKajiki
npm install
npm run build
npm run tauri dev
brew install libpcap
xcode-select --install
git clone https://github.com/TheSecurityLead/KusanagiNoKajiki.git
cd KusanagiNoKajiki
npm install
npm run build
npm run tauri dev
Prerequisites (install in order):
LIB to SDK Lib\x64git clone https://github.com/TheSecurityLead/KusanagiNoKajiki.git
cd KusanagiNoKajiki
npm install
npm run build
npm run tauri dev
If
npm installfails with ERESOLVE, see Troubleshooting below.
sudo setcap cap_net_raw,cap_net_admin=eip src-tauri/target/release/kusanaginokajiki
kusanaginokajiki --open capture.pcap
kusanaginokajiki --open session.kkj
kusanaginokajiki --import-pcap /path/to/capture.pcap
┌────────────────────────────────────────────────────────────┐
│ SvelteKit Frontend (Tauri Webview) │
│ Topology · Inventory · Analysis · Export · Projects │
├────────────────────────────────────────────────────────────┤
│ Tauri IPC: 93 Commands + Event Streaming │
├────────────────────────────────────────────────────────────┤
│ Rust Backend (10 crates, 25k+ lines) │
│ gm-capture · gm-parsers · gm-signatures · gm-topology │
│ gm-db · gm-physical · gm-ingest · gm-analysis │
│ gm-report · commands │
└────────────────────────────────────────────────────────────┘
Data Pipeline: PCAP → L2-L4 parsing → protocol ID + deep parse (10 protocols) → signature matching (30 YAML) → topology graph → OUI/GeoIP enrichment → ATT&CK analysis (40+ rules) → CVE matching → compliance mapping → SQLite persistence → PDF/CSV/STIX reporting → frontend visualization.
Tech Stack: Tauri 2.0, pcap, etherparse, petgraph, rusqlite, genpdf, clap 4 (Rust). SvelteKit, Svelte 5, TypeScript, Cytoscape.js + fcose, Tailwind CSS 4, CodeMirror 6 (Frontend).
cd src-tauri && cargo test --all # 356 Rust tests
cargo clippy --all -- -D warnings # Zero warnings
cd .. && npm run check # Frontend type check
Test data: automayt/ICS-pcap, Wireshark Samples, 4SICS
npm install fails with ERESOLVE: Clean install with pinned versions. Do NOT use npm audit fix --force.
error: linker 'link.exe' not found: Install VS Build Tools with "Desktop development with C++". Restart terminal.
Npcap linking errors on Windows: Ensure WinPcap API-compatible mode. Set LIB to Npcap SDK Lib/x64.
Zone.Identifier files in git: Windows NTFS artifacts. Blocked by .gitignore. Remove: find . -name "*Zone.Identifier" -delete
Contributions welcome — signatures for additional ICS vendors, protocol parsers, test PCAPs, and bug reports.
Apache License 2.0 — See LICENSE.