214 lines
5.0 KiB
Bash
Executable File
214 lines
5.0 KiB
Bash
Executable File
#!/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>\([^<]*\)<\/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}"
|
|
}
|