自动化渗透框架:从bash开始

概述

使用bash构建自动化渗透框架,实现模块化攻击、自动化扫描和报告生成。本文介绍框架设计、模块化攻击、自动化扫描利用和报告生成。

核心理念

  • 模块化设计:每个功能独立成模块
  • 自动化流程:减少人工干预
  • 可扩展性:易于添加新模块
  • 结果标准化:统一的输出格式

1. 框架设计

#!/usr/bin/env bash
# 自动化渗透框架
 
FRAMEWORK_DIR="/opt/pentest-framework"
MODULES_DIR="${FRAMEWORK_DIR}/modules"
RESULTS_DIR="${FRAMEWORK_DIR}/results"
LOG_FILE="${FRAMEWORK_DIR}/framework.log"
 
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
BLUE='\033[0;34m'; NC='\033[0m'
 
log_info()    { echo -e "${BLUE}[*]${NC} $*" | tee -a "$LOG_FILE"; }
log_success() { echo -e "${GREEN}[+]${NC} $*" | tee -a "$LOG_FILE"; }
log_warn()    { echo -e "${YELLOW}[!]${NC} $*" | tee -a "$LOG_FILE"; }
log_error()   { echo -e "${RED}[-]${NC} $*" | tee -a "$LOG_FILE"; }
 
# 模块加载器
load_module() {
    local module="$1"
    local module_file="${MODULES_DIR}/${module}.sh"
    if [[ ! -f "$module_file" ]]; then
        log_error "模块不存在: $module"
        return 1
    fi
    source "$module_file"
    log_info "已加载模块: $module"
}
 
# 扫描结果存储
declare -A SCAN_RESULTS=()
save_result() {
    local key="$1" value="$2"
    SCAN_RESULTS["$key"]="$value"
}

2. 模块化攻击

# 信息收集模块
module_recon() {
    local target="$1"
    log_info "=== 信息收集模块 ==="
 
    # 端口扫描
    nmap -sC -sV -O "$target" -oN "${RESULTS_DIR}/nmap_${target}.txt"
 
    # 目录枚举
    gobuster dir -u "http://$target" -w /usr/share/wordlists/dirb/common.txt \
        -o "${RESULTS_DIR}/dirs_${target}.txt" 2>/dev/null
 
    # 服务识别
    for port in 21 22 25 80 443 8080; do
        (echo "" | nc -w 3 "$target" "$port" 2>/dev/null | head -1) &
    done
    wait
}
 
# 漏洞扫描模块
module_vulnscan() {
    local target="$1"
    log_info "=== 漏洞扫描模块 ==="
 
    nmap --script vuln "$target" -oN "${RESULTS_DIR}/vuln_${target}.txt"
    nikto -h "http://$target" -o "${RESULTS_DIR}/nikto_${target}.txt" 2>/dev/null
}
 
# 漏洞利用模块
module_exploit() {
    local target="$1" vuln="$2"
    log_info "=== 漏洞利用模块 ==="
 
    case "$vuln" in
        sqli)
            sqlmap -u "http://$target/page?id=1" --batch --dump-all
            ;;
        rce)
            # 自定义RCE利用
            ;;
    esac
}

3. 自动化扫描+利用

full_scan() {
    local target="$1"
    log_info "=== 全自动渗透: $target ==="
 
    # 阶段1: 信息收集
    log_info "阶段1: 信息收集"
    module_recon "$target"
 
    # 阶段2: 漏洞扫描
    log_info "阶段2: 漏洞扫描"
    module_vulnscan "$target"
 
    # 阶段3: 漏洞利用
    log_info "阶段3: 漏洞利用"
    module_exploit "$target" "sqli"
 
    # 阶段4: 报告生成
    log_info "阶段4: 报告生成"
    generate_report "$target"
}

4. 报告生成

generate_report() {
    local target="$1"
    local report_file="${RESULTS_DIR}/report_${target}_$(date +%Y%m%d).html"
 
    cat > "$report_file" << EOF
<!DOCTYPE html>
<html>
<head><title>渗透测试报告: $target</title></head>
<body>
<h1>渗透测试报告</h1>
<p>目标: $target</p>
<p>时间: $(date '+%Y-%m-%d %H:%M:%S')</p>
<h2>发现</h2>
<ul>
$(for key in "${!SCAN_RESULTS[@]}"; do echo "<li>$key: ${SCAN_RESULTS[$key]}</li>"; done)
</ul>
</body>
</html>
EOF
    log_success "报告已生成: $report_file"
}

总结

本文介绍了使用bash构建自动化渗透框架的方法:模块化设计、自动化扫描利用和报告生成。该框架可以快速扩展新的攻击模块。


5. 任务调度

declare -A TASK_QUEUE=()
declare -A TASK_RESULTS=()
 
add_task() {
    local task_id="$1" module="$2" target="$3" params="${4:-}"
    TASK_QUEUE["$task_id"]="${module}|${target}|${params}"
    log_info "添加任务: $task_id ($module -> $target)"
}
 
execute_task() {
    local task_id="$1"
    local data="${TASK_QUEUE[$task_id]:-}"
    [[ -z "$data" ]] && { log_error "任务不存在: $task_id"; return 1; }
 
    IFS='|' read -r module target params <<< "$data"
    log_info "执行任务: $task_id"
 
    local start_time
    start_time=$(date +%s)
 
    # 执行模块
    load_module "$module"
    "module_${module}" "$target" $params
 
    local end_time
    end_time=$(date +%s)
    local duration=$((end_time - start_time))
 
    TASK_RESULTS["$task_id"]="completed|${duration}s"
    log_success "任务完成: $task_id (耗时: ${duration}s)"
}
 
run_all_tasks() {
    log_info "执行所有任务..."
    for task_id in "${!TASK_QUEUE[@]}"; do
        execute_task "$task_id" &
    done
    wait
    log_success "所有任务完成"
}

6. 会话管理

SESSION_DIR="/tmp/pentest_sessions"
 
save_session() {
    local session_name="${1:-default}"
    local session_file="${SESSION_DIR}/${session_name}.session"
    mkdir -p "$SESSION_DIR"
 
    cat > "$session_file" << EOF
# 会话保存
TARGETS=${TARGETS[@]:-}
RESULTS=${!SCAN_RESULTS[@]:-}
TIMESTAMP=$(date -Iseconds)
EOF
    log_info "会话已保存: $session_file"
}
 
load_session() {
    local session_name="$1"
    local session_file="${SESSION_DIR}/${session_name}.session"
 
    if [[ ! -f "$session_file" ]]; then
        log_error "会话不存在: $session_name"
        return 1
    fi
 
    source "$session_file"
    log_info "会话已加载: $session_name"
}
 
list_sessions() {
    log_info "可用会话:"
    for session in "${SESSION_DIR}"/*.session; do
        [[ -f "$session" ]] && echo "  $(basename "$session" .session)"
    done
}

7. 并发控制

MAX_PARALLEL=10
ACTIVE_JOBS=0
 
wait_for_slot() {
    while (( ACTIVE_JOBS >= MAX_PARALLEL )); do
        sleep 0.1
        ACTIVE_JOBS=$(jobs -r | wc -l)
    done
    ((ACTIVE_JOBS++))
}
 
job_done() {
    ((ACTIVE_JOBS--))
}
 
parallel_execute() {
    local cmd="$1"
    wait_for_slot
    eval "$cmd" &
    job_done
}

8. 错误恢复

with_retry() {
    local max_attempts="${1:-3}"
    local delay="${2:-2}"
    shift 2
    local cmd=("$@")
 
    local attempt=1
    while (( attempt <= max_attempts )); do
        if "${cmd[@]}"; then
            return 0
        fi
        log_warn "尝试 $attempt/$max_attempts 失败, ${delay}s后重试"
        sleep "$delay"
        ((attempt++))
    done
    log_error "所有尝试均失败"
    return 1
}
 
with_timeout() {
    local timeout="$1"
    shift
    timeout "$timeout" "$@"
    local rc=$?
    if (( rc == 124 )); then
        log_warn "命令执行超时 (${timeout}s)"
    fi
    return $rc
}

9. 数据持久化

export_results_json() {
    local output_file="${1:-results.json}"
    echo "{" > "$output_file"
    echo "  \"timestamp\": \"$(date -Iseconds)\"," >> "$output_file"
    echo "  \"results\": {" >> "$output_file"
 
    local first=true
    for key in "${!SCAN_RESULTS[@]}"; do
        [[ "$first" == true ]] && first=false || echo "," >> "$output_file"
        echo "    \"$key\": \"${SCAN_RESULTS[$key]}\"" >> "$output_file"
    done
 
    echo "  }" >> "$output_file"
    echo "}" >> "$output_file"
    log_info "结果已导出: $output_file"
}
 
import_results_json() {
    local input_file="$1"
    if [[ ! -f "$input_file" ]]; then
        log_error "文件不存在: $input_file"
        return 1
    fi
    # 使用python3解析JSON
    python3 -c "
import json, sys
with open('$input_file') as f:
    data = json.load(f)
for k, v in data.get('results', {}).items():
    print(f'{k}={v}')
" | while IFS='=' read -r key value; do
        SCAN_RESULTS["$key"]="$value"
    done
    log_info "结果已导入"
}