#!/usr/bin/env bash # The Analyzer - Shared Utilities # Load colors __UTILS_SRC="${BASH_SOURCE[0]}" if command -v readlink &>/dev/null; then while [ -h "$__UTILS_SRC" ]; do __UTILS_SRC="$(readlink "$__UTILS_SRC")" [[ "$__UTILS_SRC" != /* ]] && __UTILS_SRC="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$__UTILS_SRC" done fi SCRIPT_DIR="$(cd "$(dirname "$__UTILS_SRC")" && pwd 2>/dev/null)" || SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" unset __UTILS_SRC source "$SCRIPT_DIR/colors.sh" # Config export ANALYZER_DIR="$SCRIPT_DIR/.." export VECTORS_DIR="$ANALYZER_DIR/vectors" export REPORTS_DIR="$ANALYZER_DIR/reports" export ENGINE_DIR="$ANALYZER_DIR/engine" export TIMEOUT=30 export MAX_VECTORS=10 export OLLAMA_HOST="${OLLAMA_HOST:-http://10.30.20.110:11434}" export OLLAMA_MODEL="${OLLAMA_MODEL:-granite4.1:8b}" # Check dependencies check_deps() { local missing=() for cmd in curl jq; do if ! command -v $cmd &>/dev/null; then missing+=("$cmd") fi done if [ ${#missing[@]} -gt 0 ]; then print_error "Missing dependencies: ${missing[*]}" print_info "Install: apt install ${missing[*]}" exit 1 fi } # Check Ollama is running check_ollama() { if ! curl -s "$OLLAMA_HOST/api/tags" >/dev/null 2>&1; then print_error "Ollama not running at $OLLAMA_HOST" print_info "Start it: ollama serve" return 1 fi print_ok "Ollama connected ($OLLAMA_HOST)" return 0 } # Call Ollama with a prompt, return response ollama_prompt() { local prompt="$1" local system="$2" local model="${3:-$OLLAMA_MODEL}" local payload=$(jq -n \ --arg model "$model" \ --arg prompt "$prompt" \ --arg system "$system" \ '{ model: $model, prompt: $prompt, system: $system, stream: false, options: { temperature: 0.2, num_predict: 2048 } }') local response=$(curl -s "$OLLAMA_HOST/api/generate" \ -H "Content-Type: application/json" \ -d "$payload" 2>/dev/null) echo "$response" | jq -r '.response // "ERROR: No response"' 2>/dev/null } # Sanitize URL for filenames sanitize() { echo "$1" | sed 's|https\?://||' | sed 's|/|_|g' | sed 's|[^a-zA-Z0-9._-]|_|g' } # Extract domain from URL get_domain() { echo "$1" | sed 's|https\?://||' | cut -d/ -f1 | cut -d: -f1 } # Extract base URL (protocol + domain) get_base() { echo "$1" | sed 's|\(https\?://[^/]*\).*|\1|' } # Quick HTTP check http_check() { local url="$1" curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 "$url" 2>/dev/null } # Get response headers get_headers() { local url="$1" curl -sI --connect-timeout 5 --max-time 10 "$url" 2>/dev/null } # Get page title get_title() { local url="$1" curl -s --connect-timeout 5 --max-time 10 "$url" 2>/dev/null | sed -n 's/.*\([^<]*\)<\/title>.*/\1/p' | sed 's/<[^>]*>//g' | head -1 } # Check if target is alive target_alive() { local code=$(http_check "$1") [[ "$code" =~ ^[23] ]] && return 0 return 1 } # Run a command with timeout, return output run_timeout() { local cmd="$1" local timeout="${2:-$TIMEOUT}" timeout $timeout bash -c "$cmd" 2>/dev/null || echo "TIMEOUT_OR_ERROR" } # Colorize severity severity_color() { case "$1" in critical|CRITICAL) echo -e "${BRIGHT_RED}${BOLD}CRITICAL${NC}" ;; high|HIGH) echo -e "${RED}${BOLD}HIGH${NC}" ;; medium|MEDIUM) echo -e "${YELLOW}${BOLD}MEDIUM${NC}" ;; low|LOW) echo -e "${BLUE}${BOLD}LOW${NC}" ;; info|INFO) echo -e "${DIM}INFO${NC}" ;; *) echo -e "${DIM}$1${NC}" ;; esac } # Create report header init_report() { local target="$1" local domain=$(get_domain "$target") local ts=$(date '+%Y-%m-%d_%H%M%S') local report_file="$REPORTS_DIR/${domain}_${ts}.md" cat > "$report_file" << EOF # The Analyzer Report **Target:** $target **Domain:** $domain **Date:** $(date '+%Y-%m-%d %H:%M:%S') **Analyst:** The Analyzer v1.0 **Status:** In Progress --- ## Reconnaissance EOF echo "$report_file" } # Append to report append_report() { local report="$1" local content="$2" echo -e "$content" >> "$report" } # Finalize report finalize_report() { local report="$1" local find_count="$2" local vuln_count="$3" local ts=$(date '+%Y-%m-%d %H:%M:%S') cat >> "$report" << EOF --- ## Summary - **Total Findings:** $find_count - **Vulnerabilities:** $vuln_count - **Completed:** $ts - **Status:** Complete --- *Generated by The Analyzer v1.0 — Authorized Bug Bounty Use Only* EOF echo "$report" } # List available vector modules list_vectors() { echo -e "${BOLD}Available Attack Vectors:${NC}" echo "" for f in "$VECTORS_DIR"/*.sh; do local name=$(basename "$f" .sh) local desc=$(head -5 "$f" | grep "^# Desc:" | sed 's/^# Desc: //') local num=$(echo "$name" | cut -d- -f1) printf " ${CYAN}[%02d]${NC} %-30s %s\n" "$num" "${name#?-}" "$desc" done } # User prompt with default prompt_default() { local msg="$1" local default="$2" read -p " ${ICON_ARROW} $msg [$default]: " input echo "${input:-$default}" }