YumanBlazer/SOAR-EDR-Incident-Response-Lab

GitHub: YumanBlazer/SOAR-EDR-Incident-Response-Lab

Stars: 0 | Forks: 0

# SOAR & EDR Incident Response Automation Lab ## Architecture ![SOAR EDR Architecture](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/dadbf69645071154.png) **Data flow:** Endpoint (Windows 11 VM) ↓ lazagne.exe executed LimaCharlie Agent ↓ D&R rule fires → Detections webhook Tines Webhook (Retrieve Detections) ↓ parallel ├── Slack alert ──────────────────────────────────────── analyst channel ├── Email alert ──────────────────────────────────────── audit trail └── User Prompt (FormAgent) ─── Isolate? [Yes] / [No] ├── Yes → POST /isolation → GET /isolation → Slack confirmation └── No → Slack "not isolated, please investigate" ## Tech Stack | Component | Tool | Role | |-----------|------|------| | EDR | LimaCharlie | Endpoint telemetry + D&R rules + sensor isolation API | | SOAR | Tines | Workflow orchestration (10-agent story) | | Notification | Slack | Real-time analyst alerts + confirmation messages | | Notification | Email | Audit trail via EmailAgent | | Test payload | LaZagne | Open-source credential harvester used as benign red-team trigger | | Endpoint | Windows 11 VM | Target machine running LimaCharlie sensor | ## Demo ### 1. Attack Simulation — LaZagne Executed on Endpoint ![LaZagne Execution](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/5c8e5dfd67071154.webp) ### 2. LimaCharlie — Detections Triggered ![LimaCharlie Detections](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/f48d887dc4071155.webp) ### 3. Slack — Initial Alert Received ![Slack Alerts](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/9e550b8d44071200.webp) ### 4. Tines — Analyst Decision Prompt (Human-in-the-Loop) ![Tines User Prompt](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/4efbc0919d071201.webp) ### 5. LimaCharlie — Sensor Isolated ![LimaCharlie Isolated](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/1357a6afc6071202.webp) ### 6. Tines — Full Storyboard ![Tines Storyboard](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/6f770da5fb071203.webp) ## Tines Workflow (10 Agents) Story name: **`mannntek-SOAR-EDR`** | # | Agent Type | Name | Purpose | |---|-----------|------|---------| | 0 | `WebhookAgent` | Retrieve Detections | Receives JSON payload from LimaCharlie Outputs | | 1 | `HTTPRequestAgent` | Send a message (Slack) | Posts initial detection alert to analyst channel | | 2 | `EmailAgent` | Send Email | Sends alert email for audit trail | | 3 | `FormAgent` | User Prompt | Presents "Isolate?" boolean toggle (Yes / No) + Submit | | 4 | `TriggerAgent` | No | Routes when `<>` == `"false"` | | 5 | `HTTPRequestAgent` | Send a message (Slack) | Posts "not isolated" notice to channel | | 6 | `TriggerAgent` | Yes | Routes when `<>` == `"true"` | | 7 | `HTTPRequestAgent` | Isolate Sensor | `POST /v1/{sid}/isolation` to LimaCharlie API | | 8 | `HTTPRequestAgent` | Send a message (Slack) | Posts isolation confirmation to channel | | 9 | `HTTPRequestAgent` | Get Isolation Status | `GET /v1/{sid}/isolation` — verifies isolation succeeded | **Link order:** `0→1`, `0→2`, `0→3`, `3→4`, `3→6`, `4→5`, `6→7`, `7→9`, `9→8` ## LimaCharlie D&R Rule Rule name: **`mannntek-Lazagne-SOAR-EDR`** Saved at: [`limacharlie/dnr-rule.yml`](limacharlie/dnr-rule.yml) events: - NEW_PROCESS - EXISTING_PROCESS op: and rules: - op: is windows - op: or rules: - case sensitive: false op: ends with path: event/FILE_PATH value: lazagne.exe - case sensitive: false op: ends with path: event/COMMAND_LINE value: all - case sensitive: false op: contains path: event/COMMAND_LINE value: lazagne - case sensitive: false op: is path: event/HASH value: dc06d62ee95062e714f2566c95b8edaabfd387023b1bf98a09078b84007d5268 - action: report metadata: author: mannntek description: Detects Lazagne (SOAR-EDR Tool) falsepositives: - To the moon level: medium tags: - attack.credential_access name: mannntek - HackTool - Lazagne (SOAR-EDR) ## Alert & Notification Content ### Initial Slack / Email Alert Title: <> Time: <> Computer: <> Source IP: <> Username: <> File Path: <> Command Line: <> Sensor ID: <> Detection Link: <> ### Isolation API Calls # Isolate sensor POST https://api.limacharlie.io/v1/<>/isolation Authorization: Bearer <> # Verify isolation GET https://api.limacharlie.io/v1/<>/isolation Authorization: Bearer <> ### Confirmation Slack Message Isolation Status: <> The computer: <> has been isolated ### No-Isolation Slack Message The computer: <> was not isolated, please investigate. ## Test Results | Metric | Result | |--------|--------| | Detection trigger | `.\lazagne.exe` on Windows 11 VM (ARM 64-bit) | | Detection latency | < 500 ms | | Slack alert delivery | < 2 seconds | | Email alert delivery | < 5 seconds | | Isolation execution | < 2 seconds after analyst approval | | Workflow success rate | 100% across all test runs | ## Key Lessons Learned 1. **SOAR variable syntax** — Tines uses `<>` liquid-style references, not `{{ }}` or `${}`. 2. **API endpoint accuracy** — LimaCharlie isolation uses `POST /v1/{sid}/isolation`; the same URL with `GET` returns current isolation status. 3. **Overly broad D&R rules cause false positives** — `ends with: all` alone matches unrelated Windows processes (e.g., `PushToInstall`). Rules should combine multiple conditions with AND. 4. **Human-in-the-loop for destructive actions** — A boolean toggle with explicit Yes/No labels reduces accidental isolation far better than a single-click button. 5. **Credentials in SOAR** — Store API keys as named credentials (`<>`, `<>`); never hard-code them in agent options. 6. **Audit trail matters** — Parallel Slack + Email delivery ensures there is a searchable record even if one channel is unavailable. ## Repo Structure SOAR-EDR-Incident-Response-Lab/ ├── README.md ├── limacharlie/ │ └── dnr-rule.yml # Detection & Response rule (YAML) ├── tines/ │ └── workflow-export.json # Full Tines story export (importable) ├── docs/ │ └── architecture.png # Drawio architecture diagram └── screenshots/ ├── 01-slack-alerts.webp ├── 02-limacharlie-sensor-isolated.webp ├── 03-tines-user-prompt.webp ├── 04-limacharlie-detections.webp ├── 05-lazagne-execution.webp └── 06-tines-storyboard.webp ## References - [LimaCharlie Documentation](https://docs.limacharlie.io) - [Tines Documentation](https://docs.tines.com) - [Slack API — chat.postMessage](https://api.slack.com/methods/chat.postMessage) - [LaZagne on GitHub](https://github.com/AlessandroZ/LaZagne) - MITRE ATT&CK: [T1555 — Credentials from Password Stores](https://attack.mitre.org/techniques/T1555/)