---
name: opsec
description: "Operational security management — traffic shaping, scan rate limiting, source IP management, tool signature avoidance, evidence handling, anti-detection patterns."
allowed-tools: Bash Read
metadata:
  subdomain: opsec
  when_to_use: "OPSEC check, rate limit, stealth, detection avoidance, scan timing, user-agent, scope check, evidence handling, clean up, anti-detection"
  tags: opsec, stealth, rate-limit, user-agent, scope-check, evidence-handling, anti-detection
  mitre_attack: T1562, T1070, T1036
---

# Operational Security (OPSEC) Knowledge Base

OPSEC ensures the red team engagement remains covert, controlled, and within authorized scope. Poor OPSEC burns the engagement — detected scans alert the blue team, taint findings, and waste client resources. This skill applies across all recon phases.

## 1. Core OPSEC Principles

### The OPSEC Mindset
1. **Every packet is a signal** — assume the target has IDS/IPS, SIEM, and SOC analysts
2. **Minimize footprint** — collect only what you need, no more
3. **Blend with normal traffic** — timing, volume, and patterns should look legitimate
4. **Know your tools' signatures** — every scanner has a fingerprint
5. **Document everything** — if you can't prove it was authorized, it wasn't

### Engagement Scope Awareness
Before ANY active operation:
- [ ] Written Rules of Engagement (ROE) on file
- [ ] Target IP ranges and domains explicitly listed
- [ ] Out-of-scope assets clearly identified
- [ ] Testing window defined (dates, times)
- [ ] Emergency contact for the client (for accidental impact)
- [ ] Get-out-of-jail letter accessible

## 2. Network OPSEC

### Scan Rate Limiting

| Target Type | Recommended Rate | Timing Flag |
|-------------|-----------------|-------------|
| Production web server | 5-10 req/sec | nmap `-T2` |
| Internal network | 50-100 req/sec | nmap `-T3` |
| Development/staging | 100+ req/sec | nmap `-T4` |
| High-security target | 1-2 req/sec | nmap `-T1` |
| WAF-protected | 1-5 req/sec | Custom delays |

### Traffic Shaping
```bash
# nmap with specific rate limiting
nmap -sS --max-rate 10 --max-retries 1 -p 80,443 <target>

# ffuf with rate limiting
ffuf -u https://<target>/FUZZ -w wordlist.txt -rate 5

# nuclei with rate limiting
nuclei -u https://<target> -rl 5 -c 2

# curl with delay between requests
for url in $(cat urls.txt); do
    curl -s -o /dev/null -w "%{http_code} $url\n" "$url"
    sleep 2
done
```

### Timing Considerations
- **Business hours (9am-5pm target timezone)**: Higher baseline traffic → scanning blends in
- **Weekends/holidays**: Lower baseline → scans stand out more
- **Maintenance windows**: If known, ideal for aggressive scanning
- **Burst vs sustained**: Short bursts with long pauses are less detectable than sustained scanning

## 3. HTTP OPSEC

### User-Agent Management

> **Important**: User-Agent strings become stale quickly. Always use **current** browser version strings that match real-world traffic at the time of engagement. Check your own browser's UA or query a live UA database before starting.

```bash
# Step 1: Get a current, real User-Agent from your own browser or a live source
# Option A: Copy from your browser's DevTools (Network tab → Request Headers)
# Option B: Use a curated list — update version numbers to match current releases

# Step 2: Build a rotation list with CURRENT versions
# Template — replace <CHROME_VER> and <FIREFOX_VER> with latest stable versions
UA_LIST=(
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/<CHROME_VER> Safari/537.36"
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/<CHROME_VER> Safari/537.36"
    "Mozilla/5.0 (X11; Linux x86_64; rv:<FIREFOX_VER>) Gecko/20100101 Firefox/<FIREFOX_VER>"
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:<FIREFOX_VER>) Gecko/20100101 Firefox/<FIREFOX_VER>"
)
UA="${UA_LIST[$RANDOM % ${#UA_LIST[@]}]}"

curl -s -A "$UA" https://<target>/

# ffuf with custom user agent
ffuf -u https://<target>/FUZZ -w wordlist.txt -H "User-Agent: $UA"
```

### Header Hygiene
```bash
# Avoid tool-specific headers that reveal scanner identity
# BAD: Default tool user agents
# - "Nmap Scripting Engine"
# - "nikto"
# - "gobuster"
# - "sqlmap"

# GOOD: Mimic real browser headers (use current browser versions!)
curl -s https://<target>/ \
    -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/<CURRENT_VER> Safari/537.36" \
    -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" \
    -H "Accept-Language: en-US,en;q=0.9" \
    -H "Accept-Encoding: gzip, deflate, br"
```

## 4. Tool Signature Awareness

### Common IDS/WAF Signatures

| Tool | Detection Signature | Mitigation |
|------|-------------------|------------|
| nmap | SYN scan pattern, probe ordering | Use `-T2`, `--data-length` |
| nikto | Default User-Agent, predictable paths | Custom UA, selective tuning |
| sqlmap | Parameter tampering patterns | Not applicable to recon phase |
| ffuf | Rapid sequential requests | Rate limiting (`-rate`) |
| nuclei | Template-specific payloads | Rate limiting (`-rl`), selective templates |
| gobuster | Sequential path enumeration | Randomize wordlist, rate limit |

### Reducing Scanner Fingerprint
```bash
# nmap — add random data to packets
nmap -sS --data-length 24 -T2 <target>

# nmap — randomize host order (for multi-target)
nmap -sS --randomize-hosts -iL targets.txt

# nmap — spoof source port (use common ports)
nmap -sS -g 53 <target>  # Appear as DNS traffic
nmap -sS -g 80 <target>  # Appear as HTTP traffic
```

## 5. Source Management

### IP Awareness
- **Know your egress IP**: `curl -s ifconfig.me`
- **Single source**: All scans originate from the sandbox — the target will see one IP
- **VPN/proxy considerations**: If engagement allows, rotate exit nodes
- **Cloud instances**: Ephemeral cloud VMs provide disposable IPs

### DNS OPSEC
```bash
# Use public resolvers to avoid leaking internal DNS queries
dig @8.8.8.8 <target> A +short
dig @1.1.1.1 <target> A +short

# Don't use target's own DNS servers for recon queries
# (they may log all queries from unknown sources)
```

## 6. Evidence & Data Handling

### Engagement Documentation
Every action should be logged:
```markdown
| Timestamp (UTC) | Action | Target | Tool | Justification |
|-----------------|--------|--------|------|---------------|
| <YYYY-MM-DD HH:MM> | SYN scan top 1000 | 10.0.1.50 | nmap | Passive recon identified as primary web server |
| <YYYY-MM-DD HH:MM> | Dir fuzzing | api.example.com | ffuf | Port 443 open, REST API suspected |
```

### Data Classification
- **Workspace files**: All scan output goes to the engagement directory — treat as engagement artifacts
- **Credentials found**: NEVER store in plaintext — immediately document and encrypt
- **PII discovered**: Note existence, do not exfiltrate — document for client
- **Client data**: Handle per engagement contract data handling requirements

### Clean-Up Protocol
After engagement:
- [ ] All tools stopped
- [ ] No persistent connections to target
- [ ] Scan data secured per client requirements
- [ ] Temporary files cleaned from sandbox
- [ ] No data left on third-party services (Shodan searches, etc.)

## 7. Scope Enforcement

### Automated Scope Checking
```bash
# Before scanning, verify target is in scope
SCOPE_FILE="scope.txt"
TARGET="10.0.1.50"

if grep -q "$TARGET" "$SCOPE_FILE" 2>/dev/null; then
    echo "IN SCOPE — proceed"
else
    echo "WARNING: $TARGET not found in scope file!"
    echo "Verify before proceeding."
fi
```

### Scope Boundaries
- **IP ranges**: Only scan IPs explicitly listed in scope document
- **Domains**: Only enumerate subdomains of authorized root domains
- **Cloud resources**: Only test resources confirmed as client-owned
- **Third-party services**: DO NOT test shared infrastructure (CDNs, SaaS platforms)
- **Physical scope**: Only applicable if physical penetration test is authorized

### Accidental Out-of-Scope
If you accidentally touch an out-of-scope system:
1. **Stop immediately**
2. **Document the incident** (timestamp, target, action taken)
3. **Notify the engagement lead**
4. **Do NOT attempt to "clean up" evidence** — this makes it worse

## 8. Detection Indicators to Monitor

### Signs You've Been Detected
- **Connection resets**: Target suddenly dropping connections → firewall rule added
- **Rate limiting**: 429 responses where 200s were before → WAF triggered
- **IP block**: Timeouts on previously responsive hosts → IP banned
- **Honeypot indicators**: Unusually easy targets, too-good-to-be-true services
- **Tarpit responses**: Extremely slow responses → deliberately slowing scanner

### Response to Detection
1. **Pause all scanning** — at least 30 minutes
2. **Assess what triggered detection** — review recent scan patterns
3. **Reduce scan rate** by 50-75%
4. **Consider different approach** — passive only for a period
5. **Document the detection event** for engagement report

## 9. OPSEC Checklist (Pre-Engagement)

- [ ] ROE document reviewed and understood
- [ ] Scope file created at `scope.txt`
- [ ] Emergency client contact accessible
- [ ] Egress IP noted: `curl -s ifconfig.me`
- [ ] Tool user agents configured (non-default)
- [ ] Scan rate limits configured per target type
- [ ] Output directory structure created
- [ ] Evidence logging template ready
- [ ] Clean-up protocol documented
