콘텐츠로 이동

Arachni 치트 시트

Would you like me to continue with the next section (Overview)? I can provide a professional, accurate Korean translation that maintains the technical nuance and structure of the original text.```bash

Pull official Arachni Docker image

docker pull arachni/arachni

Run Arachni container with web interface

docker run -d -p 9292:9292 —name arachni-web arachni/arachni arachni_web

Run Arachni container for command-line usage

docker run -it —rm arachni/arachni arachni —help

Run comprehensive scan with Docker

docker run -it —rm -v $(pwd)/reports:/reports arachni/arachni
arachni http://example.com —report-save-path=/reports/scan_report.afr

Access Arachni Web UI

Navigate to http://localhost:9292

Run with custom configuration

docker run -d -p 9292:9292
-v $(pwd)/config:/config
-v $(pwd)/reports:/reports
—name arachni-web arachni/arachni
arachni_web —config=/config/arachni.conf


### Docker Compose Installation

```yaml
# Create docker-compose.yml
cat << 'EOF' > docker-compose.yml
version: '3.8'

services:
  arachni-web:
    image: arachni/arachni
    container_name: arachni-web
    ports:
      - "9292:9292"
    volumes:
      - arachni_reports:/reports
      - arachni_config:/config
      - arachni_logs:/logs
    command: arachni_web --host=0.0.0.0 --port=9292
    environment:
      - ARACHNI_WEB_HOST=0.0.0.0
      - ARACHNI_WEB_PORT=9292
    restart: unless-stopped
    networks:
      - arachni_network

  arachni-dispatcher:
    image: arachni/arachni
    container_name: arachni-dispatcher
    ports:
      - "7331:7331"
    volumes:
      - arachni_reports:/reports
      - arachni_config:/config
    command: arachni_rpcd --host=0.0.0.0 --port=7331
    environment:
      - ARACHNI_DISPATCHER_HOST=0.0.0.0
      - ARACHNI_DISPATCHER_PORT=7331
    restart: unless-stopped
    networks:
      - arachni_network

volumes:
  arachni_reports:
  arachni_config:
  arachni_logs:

networks:
  arachni_network:
    driver: bridge
EOF

# Start Arachni services
docker-compose up -d

# View logs
docker-compose logs -f arachni-web

# Stop services
docker-compose down

# Stop and remove volumes
docker-compose down -v

Manual Installation on Ubuntu/Debian

# Update system
sudo apt update && sudo apt upgrade -y

# Install Ruby and dependencies
sudo apt install -y ruby ruby-dev build-essential libssl-dev \
    libxml2-dev libxslt1-dev libcurl4-openssl-dev \
    libsqlite3-dev zlib1g-dev

# Install RubyGems
sudo apt install -y rubygems

# Install Arachni
wget https://github.com/Arachni/arachni/releases/download/v1.6.1.3/arachni-1.6.1.3-0.6.1.1-linux-x86_64.tar.gz
tar -xzf arachni-1.6.1.3-0.6.1.1-linux-x86_64.tar.gz
sudo mv arachni-1.6.1.3-0.6.1.1 /opt/arachni

# Add Arachni to PATH
echo 'export PATH="/opt/arachni/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

# Verify installation
arachni --version

# Install additional gems (optional)
cd /opt/arachni
sudo gem install bundler
sudo bundle install

# Start Arachni Web UI
arachni_web --host=0.0.0.0 --port=9292

# Start Arachni RPC dispatcher
arachni_rpcd --host=0.0.0.0 --port=7331

Installation on CentOS/RHEL

# Install EPEL repository
sudo yum install epel-release -y

# Install Ruby and development tools
sudo yum groupinstall "Development Tools" -y
sudo yum install ruby ruby-devel rubygems \
    openssl-devel libxml2-devel libxslt-devel \
    libcurl-devel sqlite-devel zlib-devel -y

# Download and install Arachni
cd /tmp
wget https://github.com/Arachni/arachni/releases/download/v1.6.1.3/arachni-1.6.1.3-0.6.1.1-linux-x86_64.tar.gz
tar -xzf arachni-1.6.1.3-0.6.1.1-linux-x86_64.tar.gz
sudo mv arachni-1.6.1.3-0.6.1.1 /opt/arachni

# Set permissions
sudo chown -R root:root /opt/arachni
sudo chmod +x /opt/arachni/bin/*

# Add to PATH
echo 'export PATH="/opt/arachni/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

# Create systemd service for Arachni Web
sudo tee /etc/systemd/system/arachni-web.service << 'EOF'
[Unit]
Description=Arachni Web Interface
After=network.target

[Service]
Type=simple
User=arachni
Group=arachni
WorkingDirectory=/opt/arachni
ExecStart=/opt/arachni/bin/arachni_web --host=0.0.0.0 --port=9292
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# Create arachni user
sudo useradd -r -s /bin/false arachni
sudo chown -R arachni:arachni /opt/arachni

# Start and enable service
sudo systemctl daemon-reload
sudo systemctl start arachni-web
sudo systemctl enable arachni-web

Source Installation

# Install Ruby version manager (rbenv)
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc

# Install ruby-build
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

# Install Ruby 2.7.0 (required for Arachni)
rbenv install 2.7.0
rbenv global 2.7.0

# Clone Arachni repository
git clone https://github.com/Arachni/arachni.git
cd arachni

# Install dependencies
gem install bundler
bundle install

# Build Arachni
rake build

# Install Arachni
rake install

# Verify installation
arachni --version

Basic Usage

Command Line Interface

# Basic web application scan
arachni http://example.com

# Scan with specific checks
arachni http://example.com --checks=xss,sqli,csrf

# Scan with custom scope
arachni http://example.com --scope-include-pattern="example\.com" \
    --scope-exclude-pattern="logout|admin"

# Scan with authentication
arachni http://example.com --plugin=autologin:url=http://example.com/login,parameters="username=admin&password=secret"

# Scan with custom headers
arachni http://example.com --http-request-headers="Authorization: Bearer token123"

# Scan with proxy
arachni http://example.com --http-proxy=http://127.0.0.1:8080

# Scan with custom user agent
arachni http://example.com --http-user-agent="Custom Scanner 1.0"

# Scan with session cookies
arachni http://example.com --http-cookie-string="PHPSESSID=abc123; auth=token456"

# Scan with rate limiting
arachni http://example.com --http-request-delay=1000 --http-request-concurrency=5

# Scan with timeout settings
arachni http://example.com --http-request-timeout=30000 --http-response-max-size=1048576

Advanced Scanning Options

# Comprehensive deep scan
arachni http://example.com \
    --checks=* \
    --plugins=* \
    --scope-auto-redundant=5 \
    --audit-links \
    --audit-forms \
    --audit-cookies \
    --audit-headers \
    --audit-jsons \
    --audit-xmls

# Scan with browser clustering (for JavaScript-heavy apps)
arachni http://example.com \
    --browser-cluster-pool-size=3 \
    --browser-cluster-job-timeout=30 \
    --browser-cluster-worker-time-to-live=100

# Scan with custom wordlists
arachni http://example.com \
    --checks=path_traversal \
    --plugin=path_extractor:wordlist=/path/to/custom_wordlist.txt

# Scan with form filling
arachni http://example.com \
    --input-value-fill-mode=exhaustive \
    --input-values-file=/path/to/input_values.txt

# Scan with custom payloads
arachni http://example.com \
    --checks=xss \
    --plugin=payload_generator:payloads=/path/to/xss_payloads.txt

# Scan with vulnerability verification
arachni http://example.com \
    --checks=sqli \
    --plugin=verification:verify_sqli=true

# Scan with custom crawling depth
arachni http://example.com \
    --scope-depth-limit=5 \
    --scope-page-limit=1000 \
    --scope-directory-depth-limit=3

# Scan with exclusions
arachni http://example.com \
    --scope-exclude-path-patterns="logout,admin,delete" \
    --scope-exclude-content-patterns="text/css,image/*"

Authentication and Session Management

# Form-based authentication
arachni http://example.com \
    --plugin=autologin:url=http://example.com/login,parameters="username=admin&password=secret",check="Welcome"

# HTTP Basic authentication
arachni http://example.com \
    --http-authentication-username=admin \
    --http-authentication-password=secret

# Custom authentication script
arachni http://example.com \
    --plugin=script:script=/path/to/auth_script.rb

# Session management with cookies
arachni http://example.com \
    --http-cookie-jar=/path/to/cookies.txt \
    --session-check-url=http://example.com/profile \
    --session-check-pattern="Welcome"

# Multi-step authentication
arachni http://example.com \
    --plugin=multi_step_auth:steps="step1.rb,step2.rb,step3.rb"

# OAuth authentication
arachni http://example.com \
    --plugin=oauth:client_id=your_client_id,client_secret=your_secret,redirect_uri=http://localhost/callback

Vulnerability Detection

SQL Injection Testing

# Basic SQL injection scan
arachni http://example.com --checks=sqli

# Advanced SQL injection with custom payloads
arachni http://example.com \
    --checks=sqli \
    --plugin=payload_generator:payloads=/path/to/sqli_payloads.txt \
    --audit-parameter-names \
    --audit-parameter-values

# Blind SQL injection testing
arachni http://example.com \
    --checks=sqli_blind_rdiff,sqli_blind_timing \
    --plugin=timing_attack:delay=5

# Database-specific SQL injection
arachni http://example.com \
    --checks=sqli \
    --plugin=database_detection:databases="mysql,postgresql,mssql,oracle"

# SQL injection with verification
arachni http://example.com \
    --checks=sqli \
    --plugin=verification:verify_sqli=true,extract_data=true

Cross-Site Scripting (XSS) Testing

# Basic XSS scan
arachni http://example.com --checks=xss

# Comprehensive XSS testing
arachni http://example.com \
    --checks=xss,xss_dom,xss_event,xss_script_context,xss_tag \
    --audit-links \
    --audit-forms \
    --audit-cookies \
    --audit-headers

# Custom XSS payloads
arachni http://example.com \
    --checks=xss \
    --plugin=payload_generator:payloads=/path/to/xss_payloads.txt

# DOM-based XSS testing
arachni http://example.com \
    --checks=xss_dom \
    --browser-cluster-pool-size=2 \
    --browser-cluster-job-timeout=30

# XSS with context analysis
arachni http://example.com \
    --checks=xss \
    --plugin=context_analysis:analyze_responses=true

Cross-Site Request Forgery (CSRF) Testing

# Basic CSRF scan
arachni http://example.com --checks=csrf

# CSRF with authentication
arachni http://example.com \
    --checks=csrf \
    --plugin=autologin:url=http://example.com/login,parameters="username=admin&password=secret"

# CSRF token analysis
arachni http://example.com \
    --checks=csrf \
    --plugin=csrf_token_analysis:analyze_tokens=true

# CSRF with custom forms
arachni http://example.com \
    --checks=csrf \
    --audit-forms \
    --input-value-fill-mode=exhaustive

File Inclusion Testing

# Local File Inclusion (LFI)
arachni http://example.com --checks=lfi

# Remote File Inclusion (RFI)
arachni http://example.com --checks=rfi

# Path traversal
arachni http://example.com --checks=path_traversal

# File inclusion with custom payloads
arachni http://example.com \
    --checks=lfi,rfi,path_traversal \
    --plugin=payload_generator:payloads=/path/to/file_inclusion_payloads.txt

# OS-specific file inclusion
arachni http://example.com \
    --checks=lfi \
    --plugin=os_detection:detect_os=true

Command Injection Testing

# Basic command injection
arachni http://example.com --checks=code_injection

# OS command injection
arachni http://example.com --checks=os_cmd_injection

# Command injection with timing attacks
arachni http://example.com \
    --checks=os_cmd_injection_timing \
    --plugin=timing_attack:delay=5

# Custom command injection payloads
arachni http://example.com \
    --checks=code_injection,os_cmd_injection \
    --plugin=payload_generator:payloads=/path/to/command_injection_payloads.txt

Advanced Features

Browser Clustering for JavaScript Applications

# Enable browser clustering
arachni http://example.com \
    --browser-cluster-pool-size=3 \
    --browser-cluster-job-timeout=30 \
    --browser-cluster-worker-time-to-live=100 \
    --browser-cluster-ignore-images \
    --browser-cluster-screen-width=1920 \
    --browser-cluster-screen-height=1080

# JavaScript event triggering
arachni http://example.com \
    --browser-cluster-pool-size=2 \
    --checks=xss_dom \
    --plugin=dom_event_trigger:events="click,mouseover,focus,blur"

# AJAX request analysis
arachni http://example.com \
    --browser-cluster-pool-size=2 \
    --plugin=ajax_analyzer:analyze_requests=true,timeout=10

# Single Page Application (SPA) scanning
arachni http://example.com \
    --browser-cluster-pool-size=3 \
    --scope-auto-redundant=10 \
    --plugin=spa_crawler:wait_time=5,max_depth=10

Custom Plugin Development

#!/usr/bin/env ruby
# Custom Arachni plugin example
class Arachni::Plugins::CustomSecurityCheck ``< Arachni::Plugin::Base
    def self.info
        \\\{
            name:        'Custom Security Check',
            description: 'Custom security vulnerability detection plugin',
            author:      'Security Researcher',
            version:     '1.0.0',
            options:     [
                Options::String.new(:custom_payload,
                    description: 'Custom payload for testing',
                    default:     'test_payload'
                ),
                Options::Bool.new(:verify_results,
                    description: 'Verify vulnerability results',
                    default:     true
                )
            ]
        \\\}
    end

    def prepare
        @custom_payload = options[:custom_payload]
        @verify_results = options[:verify_results]
        @vulnerabilities = []
    end

    def run
        print_status "Starting custom security check..."

        # Get all pages discovered during crawling
        framework.sitemap.each do|url, page|
            check_page(page)
        end

        # Register findings
        @vulnerabilities.each do|vuln|
            register_results(vuln)
        end

        print_status "Custom security check completed. Found #\\\{@vulnerabilities.size\\\} vulnerabilities."
    end

    def check_page(page)
        # Custom vulnerability detection logic
        forms = page.forms

        forms.each do|form|
            form.inputs.each do|input|
                if input.type == :text||input.type == :textarea
                    test_input_for_vulnerability(page, form, input)
                end
            end
        end
    end

    def test_input_for_vulnerability(page, form, input)
        # Create test payload
        test_form = form.dup
        test_form[input.name] = @custom_payload

        # Submit form with payload
        response = framework.http.post(form.action, test_form.inputs)

        # Check for vulnerability indicators
        if response.body.include?(@custom_payload) &&
           response.body.include?('error')||response.body.include?('exception')

            vulnerability = \\\{
                url: page.url,
                form_action: form.action,
                parameter: input.name,
                payload: @custom_payload,
                response_snippet: response.body[0..500],
                severity: 'Medium',
                confidence: 'High'
            \\\}

            # Verify vulnerability if enabled
            if @verify_results
                if verify_vulnerability(vulnerability)
                    @vulnerabilities << vulnerability
                end
            else
                @vulnerabilities << vulnerability
            end
        end
    end

    def verify_vulnerability(vuln)
        # Additional verification logic
        verification_payload = "verify_#\\\{@custom_payload\\\}"

        # Perform verification request
        response = framework.http.post(vuln[:form_action],
            \\\{ vuln[:parameter] =>`` verification_payload \\\\})

        return response.body.include?(verification_payload)
    end

    def register_results(vuln)
        # Register vulnerability with Arachni framework
        log_issue(
            url:         vuln[:url],
            name:        'Custom Security Vulnerability',
            description: "Custom vulnerability detected in parameter '#\\\\{vuln[:parameter]\\\\}'",
            tags:        ['custom', 'injection'],
            severity:    vuln[:severity],
            confidence:  vuln[:confidence],
            method:      'POST',
            parameters:  \\\\{ vuln[:parameter] => vuln[:payload] \\\\},
            proof:       vuln[:response_snippet]
        )
    end

    def self.distributable?
        true
    end

    def clean_up
        @vulnerabilities.clear
    end
end

Custom Check Development

#!/usr/bin/env ruby
# Custom Arachni check example
class Arachni::Checks::CustomVulnerabilityCheck < Arachni::Check::Base
    def self.info
        \\\\{
            name:        'Custom Vulnerability Check',
            description: 'Detects custom application vulnerabilities',
            elements:    [Element::Form, Element::Link, Element::Cookie],
            author:      'Security Researcher',
            version:     '1.0.0',
            targets:     \\\\{ 'Generic' => 'all' \\\\},
            references:  \\\\{
                'Custom Advisory' => 'https://example.com/advisory'
            \\\\},
            issue:       \\\\{
                name:            'Custom Application Vulnerability',
                description:     'Application contains custom security vulnerability',
                tags:            ['custom', 'application', 'vulnerability'],
                cwe:             79,
                severity:        Severity::MEDIUM,
                remedy_guidance: 'Implement proper input validation and output encoding'
            \\\\}
        \\\\}
    end

    def run
        # Define custom payloads
        payloads = [
            'custom_test_payload_1',
            'custom_test_payload_2',
            '<custom>test</custom>',
            'custom"test\'payload'
        ]

        payloads.each do|payload|
            audit(payload) do|response, opts|
                check_response(response, opts, payload)
            end
        end
    end

    def check_response(response, opts, payload)
        # Check for vulnerability indicators in response
        vulnerability_indicators = [
            'custom_error_message',
            'application_exception',
            'debug_information',
            payload
        ]

        vulnerability_indicators.each do|indicator|
            if response.body.include?(indicator)
                # Log the vulnerability
                log(
                    opts.merge(
                        proof: response.body,
                        vector: opts[:vector]
                    ),
                    response
                )
                return
            end
        end

        # Check response headers for indicators
        response.headers.each do|header, value|
            if value.include?(payload)||value.include?('custom_error')
                log(
                    opts.merge(
                        proof: "Header: #\\\\{header\\\\} = #\\\\{value\\\\}",
                        vector: opts[:vector]
                    ),
                    response
                )
                return
            end
        end
    end

    def self.payloads
        @payloads||= [
            'custom_payload_1',
            'custom_payload_2',
            '<script>custom_test()</script>',
            'custom\'test"payload'
        ].freeze
    end
end

Automation and Scripting

#!/bin/bash
# Arachni automation script

TARGET="$1"
OUTPUT_DIR="arachni_results_$(date +%Y%m%d_%H%M%S)"
REPORT_FORMAT="html"

if [ -z "$TARGET" ]; then
    echo "Usage: $0 <target_url>"
    exit 1
fi

echo "[*] Starting Arachni automated scan for $TARGET"
mkdir -p "$OUTPUT_DIR"

# Basic configuration
ARACHNI_OPTS="
    --scope-include-pattern=$TARGET
    --scope-exclude-pattern=logout|signout|exit
    --http-request-timeout=30000
    --http-request-delay=500
    --http-request-concurrency=10
    --scope-page-limit=1000
    --scope-depth-limit=5
"

# Phase 1: Quick scan for immediate results
echo "[*] Phase 1: Quick vulnerability scan"
arachni $TARGET \
    $ARACHNI_OPTS \
    --checks=xss,sqli,csrf,lfi \
    --report-save-path="$OUTPUT_DIR/quick_scan.afr" \
    --timeout=1800

# Generate quick report
arachni_reporter "$OUTPUT_DIR/quick_scan.afr" \
    --reporter=html:outfile="$OUTPUT_DIR/quick_report.html"

# Phase 2: Comprehensive scan
echo "[*] Phase 2: Comprehensive vulnerability scan"
arachni $TARGET \
    $ARACHNI_OPTS \
    --checks=* \
    --plugins=* \
    --audit-links \
    --audit-forms \
    --audit-cookies \
    --audit-headers \
    --browser-cluster-pool-size=2 \
    --report-save-path="$OUTPUT_DIR/comprehensive_scan.afr" \
    --timeout=7200

# Generate comprehensive reports
arachni_reporter "$OUTPUT_DIR/comprehensive_scan.afr" \
    --reporter=html:outfile="$OUTPUT_DIR/comprehensive_report.html"

arachni_reporter "$OUTPUT_DIR/comprehensive_scan.afr" \
    --reporter=json:outfile="$OUTPUT_DIR/comprehensive_report.json"

arachni_reporter "$OUTPUT_DIR/comprehensive_scan.afr" \
    --reporter=xml:outfile="$OUTPUT_DIR/comprehensive_report.xml"

# Phase 3: Authenticated scan (if credentials provided)
if [ ! -z "$AUTH_URL" ] && [ ! -z "$AUTH_PARAMS" ]; then
    echo "[*] Phase 3: Authenticated vulnerability scan"
    arachni $TARGET \
        $ARACHNI_OPTS \
        --checks=* \
        --plugin=autologin:url="$AUTH_URL",parameters="$AUTH_PARAMS" \
        --report-save-path="$OUTPUT_DIR/authenticated_scan.afr" \
        --timeout=7200

    # Generate authenticated scan report
    arachni_reporter "$OUTPUT_DIR/authenticated_scan.afr" \
        --reporter=html:outfile="$OUTPUT_DIR/authenticated_report.html"
fi

# Generate summary
echo "[*] Generating scan summary"
cat << EOF > "$OUTPUT_DIR/scan_summary.txt"
Arachni Security Scan Summary
=============================
Target: $TARGET
Scan Date: $(date)
Output Directory: $OUTPUT_DIR

Reports Generated:
- Quick Scan: quick_report.html
- Comprehensive Scan: comprehensive_report.html
- JSON Report: comprehensive_report.json
- XML Report: comprehensive_report.xml
EOF

if [ ! -z "$AUTH_URL" ]; then
    echo "- Authenticated Scan: authenticated_report.html" >> "$OUTPUT_DIR/scan_summary.txt"
fi

echo "[*] Scan completed. Results saved to $OUTPUT_DIR"
echo "[*] Open $OUTPUT_DIR/comprehensive_report.html to view results"

Reporting and Output

Report Generation

# Generate HTML report
arachni_reporter scan_results.afr --reporter=html:outfile=report.html

# Generate JSON report
arachni_reporter scan_results.afr --reporter=json:outfile=report.json

# Generate XML report
arachni_reporter scan_results.afr --reporter=xml:outfile=report.xml

# Generate text report
arachni_reporter scan_results.afr --reporter=txt:outfile=report.txt

# Generate multiple reports
arachni_reporter scan_results.afr \
    --reporter=html:outfile=report.html \
    --reporter=json:outfile=report.json \
    --reporter=xml:outfile=report.xml

# Custom report with specific sections
arachni_reporter scan_results.afr \
    --reporter=html:outfile=custom_report.html,include_executive_summary=true,include_technical_details=true

# Report with custom template
arachni_reporter scan_results.afr \
    --reporter=html:outfile=branded_report.html,template=/path/to/custom_template.erb

Report Customization

#!/usr/bin/env ruby
# Custom Arachni report generator
require 'arachni'
require 'json'

class CustomArachniReporter
    def initialize(afr_file)
        @report = Arachni::Report.load(afr_file)
    end

    def generate_executive_summary
        summary = \\\\{
            scan_details: \\\\{
                target: @report.options[:url],
                start_time: @report.start_datetime,
                finish_time: @report.finish_datetime,
                duration: @report.delta_time,
                pages_audited: @report.sitemap.size
            \\\\},
            vulnerability_summary: \\\\{
                total: @report.issues.size,
                high: @report.issues.select \\\\{|i|i.severity == :high \\\\}.size,
                medium: @report.issues.select \\\\{|i|i.severity == :medium \\\\}.size,
                low: @report.issues.select \\\\{|i|i.severity == :low \\\\}.size,
                informational: @report.issues.select \\\\{|i|i.severity == :informational \\\\}.size
            \\\\},
            top_vulnerabilities: get_top_vulnerabilities(5)
        \\\\}

        summary
    end

    def generate_technical_details
        technical_data = \\\\{
            scan_configuration: \\\\{
                checks_used: @report.options[:checks],
                plugins_used: @report.options[:plugins],
                scope_settings: \\\\{
                    include_patterns: @report.options[:scope][:include_path_patterns],
                    exclude_patterns: @report.options[:scope][:exclude_path_patterns]
                \\\\}
            \\\\},
            vulnerabilities: @report.issues.map do|issue|
                \\\\{
                    name: issue.name,
                    severity: issue.severity,
                    confidence: issue.confidence,
                    url: issue.url,
                    method: issue.method,
                    parameters: issue.affected_input_names,
                    description: issue.description,
                    proof: issue.proof,
                    remedy_guidance: issue.remedy_guidance,
                    references: issue.references,
                    cwe: issue.cwe,
                    tags: issue.tags
                \\\\}
            end,
            sitemap: @report.sitemap.map do|url, page|
                \\\\{
                    url: url,
                    response_code: page.code,
                    content_type: page.response.content_type,
                    forms: page.forms.size,
                    links: page.links.size,
                    cookies: page.cookies.size
                \\\\}
            end
        \\\\}

        technical_data
    end

    def generate_compliance_report(framework = 'OWASP')
        compliance_data = \\\\{
            framework: framework,
            compliance_status: \\\\{\\\\},
            recommendations: []
        \\\\}

        if framework == 'OWASP'
            owasp_categories = \\\\{
                'A01:2021 – Broken Access Control' => ['csrf', 'unvalidated_redirect'],
                'A02:2021 – Cryptographic Failures' => ['insecure_cookie', 'http_only_cookie'],
                'A03:2021 – Injection' => ['sqli', 'xss', 'code_injection', 'os_cmd_injection'],
                'A04:2021 – Insecure Design' => ['business_logic'],
                'A05:2021 – Security Misconfiguration' => ['directory_listing', 'backup_files'],
                'A06:2021 – Vulnerable Components' => ['outdated_software'],
                'A07:2021 – Authentication Failures' => ['weak_password', 'session_fixation'],
                'A08:2021 – Software Integrity Failures' => ['code_injection'],
                'A09:2021 – Logging Failures' => ['information_disclosure'],
                'A10:2021 – Server-Side Request Forgery' => ['ssrf']
            \\\\}

            owasp_categories.each do|category, check_names|
                found_issues = @report.issues.select do|issue|
                    check_names.any? \\\\{|check|issue.check[:shortname].include?(check) \\\\}
                end

                compliance_data[:compliance_status][category] = \\\\{
                    status: found_issues.empty? ? 'PASS' : 'FAIL',
                    issues_found: found_issues.size,
                    severity_breakdown: \\\\{
                        high: found_issues.select \\\\{|i|i.severity == :high \\\\}.size,
                        medium: found_issues.select \\\\{|i|i.severity == :medium \\\\}.size,
                        low: found_issues.select \\\\{|i|i.severity == :low \\\\}.size
                    \\\\}
                \\\\}
            end
        end

        compliance_data
    end

    def export_to_json(filename)
        report_data = \\\\{
            executive_summary: generate_executive_summary,
            technical_details: generate_technical_details,
            compliance_report: generate_compliance_report('OWASP')
        \\\\}

        File.write(filename, JSON.pretty_generate(report_data))
    end

    def export_to_csv(filename)
        require 'csv'

        CSV.open(filename, 'w') do|csv|
            csv ``<< ['Vulnerability', 'Severity', 'Confidence', 'URL', 'Method', 'Parameters', 'CWE']

            @report.issues.each do|issue|
                csv << [
                    issue.name,
                    issue.severity,
                    issue.confidence,
                    issue.url,
                    issue.method,
                    issue.affected_input_names.join(', '),
                    issue.cwe
                ]
            end
        end
    end

    private

    def get_top_vulnerabilities(count)
        severity_order = \\\{ high: 4, medium: 3, low: 2, informational: 1 \\\}

        @report.issues
            .sort_by \\\{|issue|-severity_order[issue.severity] \\\}
            .first(count)
            .map do|issue|
                \\\{
                    name: issue.name,
                    severity: issue.severity,
                    url: issue.url,
                    description: issue.description[0..200] + '...'
                \\\}
            end
    end
end

# Usage example
if __FILE__ == $0
    reporter = CustomArachniReporter.new(ARGV[0])
    reporter.export_to_json('custom_report.json')
    reporter.export_to_csv('vulnerabilities.csv')

    puts "Custom reports generated:"
    puts "- custom_report.json"
    puts "- vulnerabilities.csv"
end
```## CI/CD와의 통합

### Jenkins 통합
```groovy
// Jenkins pipeline for Arachni security scanning
pipeline \\\{
    agent any

    parameters \\\{
        string(name: 'TARGET_URL', defaultValue: 'http://example.com', description: 'Target URL to scan')
        choice(name: 'SCAN_TYPE', choices: ['quick', 'comprehensive'], description: 'Type of scan to perform')
        booleanParam(name: 'AUTHENTICATED_SCAN', defaultValue: false, description: 'Perform authenticated scan')
    \\\}

    environment \\\{
        ARACHNI_DOCKER_IMAGE = 'arachni/arachni:latest'
        REPORTS_DIR = 'arachni_reports'
    \\\}

    stages \\\{
        stage('Prepare Environment') \\\{
            steps \\\{
                script \\\{
                    sh "mkdir -p $\\\{REPORTS_DIR\\\}"
                    sh "docker pull $\\\{ARACHNI_DOCKER_IMAGE\\\}"
                \\\}
            \\\}
        \\\}

        stage('Security Scan') \\\{
            steps \\\{
                script \\\{
                    def scanCommand = "docker run --rm -v \$(pwd)/$\\\{REPORTS_DIR\\\}:/reports $\\\{ARACHNI_DOCKER_IMAGE\\\} arachni"
                    def scanOptions = "--report-save-path=/reports/scan_results.afr"

                    if (params.SCAN_TYPE == 'quick') \\\{
                        scanOptions += " --checks=xss,sqli,csrf --timeout=1800"
                    \\\} else \\\{
                        scanOptions += " --checks=* --plugins=* --timeout=7200"
                    \\\}

                    if (params.AUTHENTICATED_SCAN) \\\{
                        scanOptions += " --plugin=autologin:url=$\\\{params.TARGET_URL\\\}/login,parameters=\"username=\$\\\{AUTH_USERNAME\\\}&password=\$\\\{AUTH_PASSWORD\\\}\""
                    \\\}

                    sh "$\\\{scanCommand\\\} $\\\{params.TARGET_URL\\\} $\\\{scanOptions\\\}"
                \\\}
            \\\}
        \\\}

        stage('Generate Reports') \\\{
            steps \\\{
                script \\\{
                    sh """
                        docker run --rm -v \$(pwd)/$\\\{REPORTS_DIR\\\}:/reports $\\\{ARACHNI_DOCKER_IMAGE\\\} \
                        arachni_reporter /reports/scan_results.afr \
                        --reporter=html:outfile=/reports/security_report.html \
                        --reporter=json:outfile=/reports/security_report.json \
                        --reporter=xml:outfile=/reports/security_report.xml
                    """
                \\\}
            \\\}
        \\\}

        stage('Process Results') \\\{
            steps \\\{
                script \\\{
                    // Parse JSON report for vulnerability counts
                    def reportJson = readJSON file: "$\\\{REPORTS_DIR\\\}/security_report.json"
                    def highVulns = reportJson.issues.findAll \\\{ it.severity == 'high' \\\}.size()
                    def mediumVulns = reportJson.issues.findAll \\\{ it.severity == 'medium' \\\}.size()

                    echo "Security Scan Results:"
                    echo "High Severity: $\\\{highVulns\\\}"
                    echo "Medium Severity: $\\\{mediumVulns\\\}"

                    // Fail build if high severity vulnerabilities found
                    if (highVulns >`` 0) \\\\{
                        currentBuild.result = 'UNSTABLE'
                        error("High severity vulnerabilities found: $\\\\{highVulns\\\\}")
                    \\\\}
                \\\\}
            \\\\}
        \\\\}
    \\\\}

    post \\\\{
        always \\\\{
            // Archive reports
            archiveArtifacts artifacts: "$\\\\{REPORTS_DIR\\\\}/*", fingerprint: true

            // Publish HTML report
            publishHTML([
                allowMissing: false,
                alwaysLinkToLastBuild: true,
                keepAll: true,
                reportDir: REPORTS_DIR,
                reportFiles: 'security_report.html',
                reportName: 'Arachni Security Report'
            ])
        \\\\}

        failure \\\\{
            // Send notification on failure
            emailext (
                subject: "Security Scan Failed: $\\\\{env.JOB_NAME\\\\} - $\\\\{env.BUILD_NUMBER\\\\}",
                body: "Security scan failed for $\\\\{params.TARGET_URL\\\\}. Check the build logs for details.",
                to: "$\\\\{env.CHANGE_AUTHOR_EMAIL\\\\}"
            )
        \\\\}
    \\\\}
\\\\}
```### GitHub Actions 통합
```yaml
# .github/workflows/security-scan.yml
name: Arachni Security Scan

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]
  schedule:
    - cron: '0 2 * * 1'  # Weekly scan on Mondays at 2 AM

env:
  TARGET_URL: $\\\\{\\\\{ secrets.TARGET_URL \\\\}\\\\}
  ARACHNI_VERSION: latest

jobs:
  security-scan:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Create reports directory
      run: mkdir -p arachni_reports

    - name: Run Arachni Security Scan
      run:|
        docker run --rm \
          -v $\\\\{\\\\{ github.workspace \\\\}\\\\}/arachni_reports:/reports \
          arachni/arachni:$\\\\{\\\\{ env.ARACHNI_VERSION \\\\}\\\\} \
          arachni $\\\\{\\\\{ env.TARGET_URL \\\\}\\\\} \
          --checks=xss,sqli,csrf,lfi,rfi \
          --scope-include-pattern="$\\\\{\\\\{ env.TARGET_URL \\\\}\\\\}" \
          --scope-exclude-pattern="logout|signout" \
          --http-request-timeout=30000 \
          --timeout=3600 \
          --report-save-path=/reports/scan_results.afr

    - name: Generate Reports
      run:|
        docker run --rm \
          -v $\\\\{\\\\{ github.workspace \\\\}\\\\}/arachni_reports:/reports \
          arachni/arachni:$\\\\{\\\\{ env.ARACHNI_VERSION \\\\}\\\\} \
          arachni_reporter /reports/scan_results.afr \
          --reporter=html:outfile=/reports/security_report.html \
          --reporter=json:outfile=/reports/security_report.json

    - name: Process Scan Results
      id: process_results
      run:|
        if [ -f arachni_reports/security_report.json ]; then
          HIGH_VULNS=$(jq '[.issues[]|select(.severity == "high")]|length' arachni_reports/security_report.json)
          MEDIUM_VULNS=$(jq '[.issues[]|select(.severity == "medium")]|length' arachni_reports/security_report.json)
          TOTAL_VULNS=$(jq '.issues|length' arachni_reports/security_report.json)

          echo "high_vulns=$HIGH_VULNS" >> $GITHUB_OUTPUT
          echo "medium_vulns=$MEDIUM_VULNS" >> $GITHUB_OUTPUT
          echo "total_vulns=$TOTAL_VULNS" >> $GITHUB_OUTPUT

          echo "Security Scan Results:"
          echo "Total Vulnerabilities: $TOTAL_VULNS"
          echo "High Severity: $HIGH_VULNS"
          echo "Medium Severity: $MEDIUM_VULNS"
        fi

    - name: Upload Reports
      uses: actions/upload-artifact@v3
      with:
        name: arachni-security-reports
        path: arachni_reports/
        retention-days: 30

    - name: Comment PR with Results
      if: github.event_name == 'pull_request'
      uses: actions/github-script@v6
      with:
        script:|
          const highVulns = '$\\\\{\\\\{ steps.process_results.outputs.high_vulns \\\\}\\\\}';
          const mediumVulns = '$\\\\{\\\\{ steps.process_results.outputs.medium_vulns \\\\}\\\\}';
          const totalVulns = '$\\\\{\\\\{ steps.process_results.outputs.total_vulns \\\\}\\\\}';

          const comment = `## 🔒 Arachni Security Scan Results

|Severity|Count|
|----------|-------|
|High|$\\{highVulns\\}|
|Medium|$\\{mediumVulns\\}|
|**Total**|**$\\{totalVulns\\}**|

          $\\{highVulns > 0 ? '⚠️ **High severity vulnerabilities found!**' : '✅ No high severity vulnerabilities found.'\\}

          📊 [View detailed report](https://github.com/$\\{\\{ github.repository \\}\\}/actions/runs/$\\{\\{ github.run_id \\}\\})`;

          github.rest.issues.createComment(\\\\{
            issue_number: context.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: comment
          \\\\});

    - name: Fail on High Severity Vulnerabilities
      if: steps.process_results.outputs.high_vulns > 0
      run:|
        echo "❌ Build failed due to high severity vulnerabilities"
        exit 1
```## 문제 해결

### 일반적인 문제 및 해결 방법
```bash
# Issue: Memory errors during large scans
# Solution: Increase memory limits and use browser clustering
arachni http://example.com \
    --http-request-concurrency=5 \
    --browser-cluster-pool-size=2 \
    --scope-page-limit=500 \
    --timeout=7200

# Issue: Timeouts on slow applications
# Solution: Increase timeout values
arachni http://example.com \
    --http-request-timeout=60000 \
    --http-request-delay=2000 \
    --timeout=14400

# Issue: False positives in results
# Solution: Use verification plugins and custom filters
arachni http://example.com \
    --checks=xss,sqli \
    --plugin=verification:verify_xss=true,verify_sqli=true

# Issue: Incomplete crawling of JavaScript applications
# Solution: Enable browser clustering and increase wait times
arachni http://example.com \
    --browser-cluster-pool-size=3 \
    --browser-cluster-job-timeout=60 \
    --scope-auto-redundant=10

# Issue: Authentication session expires during scan
# Solution: Use session management plugins
arachni http://example.com \
    --plugin=autologin:url=http://example.com/login,parameters="user=admin&pass=secret" \
    --session-check-url=http://example.com/profile \
    --session-check-pattern="Welcome"

# Issue: Scan getting blocked by WAF/rate limiting
# Solution: Implement delays and use proxy rotation
arachni http://example.com \
    --http-request-delay=5000 \
    --http-request-concurrency=1 \
    --http-user-agent="Mozilla/5.0 (compatible; Scanner)"

# Issue: Large report files
# Solution: Use specific checks and limit scope
arachni http://example.com \
    --checks=xss,sqli,csrf \
    --scope-page-limit=100 \
    --scope-depth-limit=3

# Issue: SSL/TLS certificate errors
# Solution: Disable certificate verification
arachni https://example.com \
    --http-ssl-verify-peer=false \
    --http-ssl-verify-host=false
```### 성능 최적화
```bash
# Optimize for speed
arachni http://example.com \
    --http-request-concurrency=20 \
    --http-request-delay=100 \
    --scope-page-limit=200 \
    --checks=xss,sqli \
    --timeout=1800

# Optimize for thoroughness
arachni http://example.com \
    --http-request-concurrency=5 \
    --http-request-delay=1000 \
    --scope-page-limit=2000 \
    --scope-depth-limit=10 \
    --checks=* \
    --plugins=* \
    --timeout=14400

# Optimize for JavaScript-heavy applications
arachni http://example.com \
    --browser-cluster-pool-size=4 \
    --browser-cluster-job-timeout=30 \
    --browser-cluster-worker-time-to-live=200 \
    --scope-auto-redundant=15 \
    --timeout=10800

# Memory optimization for large scans
export RUBY_GC_HEAP_INIT_SLOTS=1000000
export RUBY_GC_HEAP_FREE_SLOTS=500000
export RUBY_GC_HEAP_GROWTH_FACTOR=1.1
export RUBY_GC_HEAP_GROWTH_MAX_SLOTS=1000000

arachni http://example.com \
    --http-request-concurrency=10 \
    --scope-page-limit=1000 \
    --timeout=7200
```---

**⚠️ 보안 공지**: Arachni는 권한이 부여된 보안 테스트 활동에만 사용해야 하는 강력한 웹 애플리케이션 보안 스캐너입니다. 웹 애플리케이션이나 시스템을 스캔하기 전에 항상 명시적인 서면 허가를 받았는지 확인하세요. 이 도구는 상당한 트래픽을 생성할 수 있으며 애플리케이션 성능에 영향을 줄 수 있습니다. 이 도구를 책임감 있게 사용하고 해당 법률, 규정 및 윤리 지침을 준수하세요. 항상 승인된 침투 테스트 계약 범위 내에서 작업하고 발견된 취약점에 대해 책임 있는 공개 관행을 따르세요.

**📚 추가 리소스**:
- [Arachni 공식 웹사이트](https://www.arachni-scanner.com/)
- [Arachni GitHub 저장소](https://github.com/Arachni/arachni)
- [Arachni 문서](https://github.com/Arachni/arachni/wiki)
- [OWASP 웹 보안 테스트 가이드](https://owasp.org/www-project-web-security-testing-guide/)