Files
th-analyzer/vectors/21-nuclei.sh
2026-06-19 15:29:50 -07:00

107 lines
3.2 KiB
Bash

#!/usr/bin/env bash
# Vector 21: Nuclei — Real CVE Detection
# Desc: Runs nuclei templates against discovered endpoints to find real CVEs
# Detect: Any target with reachable endpoints
# Severity: CRITICAL
# Tools: nuclei
vector_nuclei() {
local target="$1"
local report="$2"
local domain=$(get_domain "$target")
local findings=0
print_info "Running Nuclei — real CVE detection..."
if ! command -v nuclei &>/dev/null; then
print_skip "nuclei not installed. Skipping CVE scanning."
return 0
fi
# Check nuclei templates exist
if [ ! -d "$HOME/nuclei-templates" ] && [ ! -d "/root/nuclei-templates" ]; then
print_warn "Nuclei templates not found. Updating..."
nuclei -update-templates 2>/dev/null | tail -1
fi
# Nuclei output file
local nuclei_out="$REPORTS_DIR/.${domain}_nuclei.json"
print_sub "Scanning with nuclei (severity: critical, high, medium)..."
print_info "This may take 1-3 minutes..."
# Run nuclei with focused templates
nuclei -u "$target" \
-s critical,high,medium \
-j \
-o "$nuclei_out" \
-rl 50 \
-c 10 \
-timeout 8 \
-retries 1 \
-silent 2>/dev/null &
local nuclei_pid=$!
# Show spinner while waiting
local waited=0
while kill -0 $nuclei_pid 2>/dev/null; do
sleep 2
waited=$((waited + 2))
if [ $waited -ge 120 ]; then
print_warn "Nuclei timeout (2min), killing..."
kill $nuclei_pid 2>/dev/null
break
fi
done
wait $nuclei_pid 2>/dev/null
# Parse results
if [ -f "$nuclei_out" ] && [ -s "$nuclei_out" ]; then
local vuln_count=$(wc -l < "$nuclei_out" | tr -d ' ')
if [ "$vuln_count" -gt 0 ]; then
print_find "Nuclei found $vuln_count vulnerabilities!"
while IFS= read -r line; do
[ -z "$line" ] && continue
local template=$(echo "$line" | jq -r '.templateID // "unknown"' 2>/dev/null)
local name=$(echo "$line" | jq -r '.info.name // "Unknown"' 2>/dev/null)
local severity=$(echo "$line" | jq -r '.info.severity // "unknown"' 2>/dev/null)
local matched=$(echo "$line" | jq -r '.matched // ""' 2>/dev/null)
local curl_cmd=$(echo "$line" | jq -r '.curl-command // ""' 2>/dev/null)
local extract=$(echo "$line" | jq -r '.extracted-results // [] | join(", ")' 2>/dev/null)
local sev_upper=$(echo "$severity" | tr '[:lower:]' '[:upper:]')
# Save finding
echo "SEVERITY: $sev_upper
VECTOR: Nuclei - $template
DETAIL: $name on $matched
EVIDENCE: $extract
EXPLOIT: $curl_cmd" > "$REPORTS_DIR/.finding_$(date +%s)_nuclei-${template}.txt"
findings=$((findings + 1))
# Print to screen
case "$severity" in
critical) echo -e " ${BRIGHT_RED}🔴 [CRITICAL]${NC} $name" ;;
high) echo -e " ${RED}🟠 [HIGH]${NC} $name" ;;
medium) echo -e " ${YELLOW}🟡 [MEDIUM]${NC} $name" ;;
*) echo -e " ${BLUE}🔵 [$severity]${NC} $name" ;;
esac
[ -n "$matched" ] && echo -e " ${DIM} $matched${NC}"
done < "$nuclei_out"
else
print_ok "Nuclei found no vulnerabilities"
fi
else
print_ok "Nuclei found no vulnerabilities"
fi
return $findings
}