From lc-advanced-skills
Evaluates threat reports in LimaCharlie orgs: extracts IOCs (hashes, IPs, domains, paths), hunts compromises, generates LCQL queries and D&R rules for investigations.
npx claudepluginhub refractionpoint/lc-ai --plugin lc-advanced-skillsThis skill is limited to using the following tools:
Systematically evaluate threat reports to determine organizational impact and create comprehensive defense-in-depth detections.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Reviews prose for communication issues impeding comprehension, outputs minimal fixes in a three-column table per Microsoft Writing Style Guide. Useful for 'review prose' or 'improve prose' requests.
Systematically evaluate threat reports to determine organizational impact and create comprehensive defense-in-depth detections.
Prerequisites: Run
/init-lcto initialize LimaCharlie context.
All LimaCharlie operations use the limacharlie CLI directly:
limacharlie <noun> <verb> --oid <oid> --output yaml [flags]
For command help and discovery: limacharlie <command> --ai-help
| Rule | Wrong | Right |
|---|---|---|
| CLI Access | Call MCP tools or spawn api-executor | Use Bash("limacharlie ...") directly |
| Output Format | --output json | --output yaml (more token-efficient) |
| Filter Output | Pipe to jq/yq | Use --filter JMESPATH to select fields |
| LCQL Queries | Write query syntax manually | Use limacharlie ai generate-query first |
| D&R Rules | Write YAML manually | Use limacharlie ai generate-detection + limacharlie dr validate |
| Timestamps | Calculate epoch values | Use date +%s or date -d '7 days ago' +%s |
| OID | Use org name | Use UUID (call limacharlie org list if needed) |
This skill uses specialized sub-agents to reduce context usage and enable parallel processing:
Main Skill (Orchestrator)
├── Phase 0: Download report to /tmp/ (keeps content out of main context)
├── Phase 1: Spawn threat-report-parser → Get structured IOCs/behaviors
├── Phase 2: Platform check (lightweight API call)
├── Phase 3: Spawn ioc-hunter agents (parallel, one per org)
├── Phase 4: Spawn behavior-hunter agents (parallel, one per org)
├── Phase 5: User checkpoint - present findings
├── Phase 6: Spawn detection-builder agents (parallel, by layer)
├── Phase 7: User approval - confirm rules to deploy
├── Phase 8: Deploy approved rules
└── Phase 9: Generate final report from aggregated summaries
Before starting, obtain:
IMPORTANT: Before spawning the parser agent, download the report to a local file. This keeps the report content out of the main context and allows sub-agents to process it independently.
# Download HTML/web reports
curl -sL "https://example.com/threat-report.html" -o /tmp/threat_report.html
# Download PDF reports
curl -sL "https://example.com/report.pdf" -o /tmp/threat_report.pdf
# Google Cloud Storage
curl -sL "https://storage.googleapis.com/bucket/report.pdf" -o /tmp/threat_report.pdf
# S3 (public)
curl -sL "https://bucket.s3.amazonaws.com/report.pdf" -o /tmp/threat_report.pdf
Important Notes:
/tmp/ for downloaded files-sL flags to follow redirects silentlyRead tool which handles PDFs nativelySpawn the threat-report-parser agent to extract all IOCs and behaviors. Always pass the local file path from Phase 0 (not the original URL).
Task(
subagent_type="lc-essentials:threat-report-parser",
prompt="Parse threat report and extract all IOCs and behaviors:
Report Source: /tmp/threat_report.pdf
Report Type: pdf"
)
Agent returns structured JSON with:
Display to user: Summary of extracted IOCs and behaviors with counts.
Use a lightweight API call to verify platforms exist in target org(s).
limacharlie event types --oid <oid> --output yaml
Filter IOCs and behaviors to matching platforms only.
Spawn one ioc-hunter agent per organization. For multi-org scenarios, spawn all agents in a SINGLE message for parallel execution.
Task(
subagent_type="lc-essentials:ioc-hunter",
prompt="Search for IOCs in organization '{org_name}' (OID: {oid})
IOCs:
{iocs_json}
Time Window: 30 days"
)
Spawn multiple in parallel for multi-org:
# Single message with multiple Task calls = parallel execution
Task(subagent_type="lc-essentials:ioc-hunter", prompt="...org1...")
Task(subagent_type="lc-essentials:ioc-hunter", prompt="...org2...")
Task(subagent_type="lc-essentials:ioc-hunter", prompt="...org3...")
Agent returns:
Spawn one behavior-hunter agent per organization.
Task(
subagent_type="lc-essentials:behavior-hunter",
prompt="Search for behaviors in organization '{org_name}' (OID: {oid})
Behaviors:
{behaviors_json}
Platforms Available: {platforms}
Time Window: 7 days"
)
Agent returns:
Present aggregated findings to user:
## IOC Hunt Results
### Critical Findings (Immediate Investigation)
- [IOC type]: [value] - Found on [X] sensors
### High Priority Findings
- ...
### No Findings
- [X] IOCs searched, [Y] not found
## Behavior Hunt Results
### Suspicious Activity Detected
- [Behavior]: [X] events on [Y] sensors
- Sample: [hostname]: [command_line]
### No Activity Detected
- ...
## Affected Sensors Summary
| Hostname | IOC Hits | Behavior Hits | Action Required |
|----------|----------|---------------|-----------------|
Ask user: "Continue with detection creation? Which layers are needed?"
Based on findings and user input, spawn detection-builder agents for each detection layer.
Detection Layers:
Task(
subagent_type="lc-essentials:detection-builder",
prompt="Build detections for layer 'process' in organization '{org_name}' (OID: {oid})
Threat Name: {threat_name}
Detection Requirements:
{detection_requirements_json}"
)
Spawn layers in parallel:
Task(subagent_type="lc-essentials:detection-builder", prompt="...layer: process...")
Task(subagent_type="lc-essentials:detection-builder", prompt="...layer: network...")
Task(subagent_type="lc-essentials:detection-builder", prompt="...layer: file...")
Agent returns:
Present all generated rules for approval:
## Generated Detection Rules
### Process Detections (5 rules)
| Rule Name | MITRE | Priority | Status |
|-----------|-------|----------|--------|
| apt-x-process-encoded-powershell | T1059.001 | 8 | validated |
### Network Detections (3 rules)
| Rule Name | MITRE | Priority | Status |
|-----------|-------|----------|--------|
[Show full YAML for each rule if requested]
## Validation Failures
- apt-x-network-exfil: Schema error - bytes_sent not available
## Deploy Rules?
- [ ] Deploy all validated rules
- [ ] Select specific rules to deploy
- [ ] Skip deployment (rules returned for manual review)
For each approved rule, deploy using:
# Write rule to temp file
cat > /tmp/rule.yaml << 'EOF'
detect:
<detect_yaml>
respond:
<respond_yaml>
EOF
limacharlie dr set --key <rule_name> --input-file /tmp/rule.yaml --oid <oid>
Also create IOC lookup tables:
cat > /tmp/lookup.yaml << 'EOF'
<ioc_data>
EOF
limacharlie lookup set --key <threat>-<ioc-type> --input-file /tmp/lookup.yaml --oid <oid>
Generate final report from aggregated agent outputs:
# Threat Report Evaluation: [Report Name]
Date: [YYYY-MM-DD]
Organization: [OID(s)]
## Executive Summary
[2-3 sentences on findings from agent summaries]
## IOC Search Results
| IOC Type | Searched | Found | Critical | High |
|----------|----------|-------|----------|------|
| Hashes | 12 | 2 | 1 | 1 |
| Domains | 8 | 0 | 0 | 0 |
## Behavioral Query Results
| Behavior | MITRE | Events | Sensors | Status |
|----------|-------|--------|---------|--------|
| Encoded PS | T1059.001 | 45 | 3 | Review |
## Detections Created
### D&R Rules Deployed
| Rule Name | Layer | Priority |
|-----------|-------|----------|
### Lookups Created
| Lookup Name | IOC Count |
|-------------|-----------|
## Affected Sensors
| Sensor | Findings | Action |
|--------|----------|--------|
## Recommendations
1. [Action items based on findings]
For comprehensive coverage, ensure agents cover:
All rules follow: [threat-name]-[layer]-[indicator]
Examples:
apt-x-process-encoded-powershellapt-x-network-c2-domainapt-x-file-malicious-dllapt-x-persistence-runkeyPriority-based response actions:
High Priority (8-10):
Medium Priority (5-7):
Low Priority (1-4):
All responses include metadata:
For MSSP scenarios with multiple organizations:
limacharlie org list --output yaml# Parallel IOC hunting across 5 orgs
Task(subagent_type="lc-essentials:ioc-hunter", prompt="...org1...")
Task(subagent_type="lc-essentials:ioc-hunter", prompt="...org2...")
Task(subagent_type="lc-essentials:ioc-hunter", prompt="...org3...")
Task(subagent_type="lc-essentials:ioc-hunter", prompt="...org4...")
Task(subagent_type="lc-essentials:ioc-hunter", prompt="...org5...")
Download fails: Check URL accessibility, try with curl -v for verbose output
Parser fails on PDF: Ensure Phase 0 downloaded to /tmp/, then Read tool (handles PDFs natively)
Too many IOC results: Check for ubiquitous IOCs (>100 hits) - likely weak indicators
Behavior queries return excessive events: Ask agent to refine with more specific exclusions
Rule validation fails: Agent will retry; if still failing, review error in output
Platform missing: Agent automatically skips behaviors/detections for unavailable platforms
This skill uses sub-agents and file-based report handling to reduce main context usage by ~90%:
| Phase | Without Optimization | With Optimization | Savings |
|---|---|---|---|
| Report Download | ~200KB in context | ~0KB (file on disk) | 100% |
| PDF Parsing | ~200KB | ~10KB JSON | 95% |
| IOC Search | ~100KB | ~20KB summaries | 80% |
| Behavior Search | ~150KB | ~15KB summaries | 90% |
| Detection Rules | ~50KB | ~25KB validated | 50% |
Key optimizations:
/tmp/ - never enters main context