RedAmon - httpx HTTP Prober + Banner Grabbing

August 10, 2026 · View on GitHub

Complete Technical Documentation

Module: recon/httpx_scan.py
Purpose: HTTP probing, technology detection, and non-HTTP service detection
Author: RedAmon Security Suite


Table of Contents

  1. Overview
  2. Features
  3. Installation
  4. Configuration Parameters
  5. Banner Grabbing
  6. Architecture & Flow
  7. Output Data Structure
  8. Usage Examples
  9. Troubleshooting

Overview

The httpx_scan.py module integrates ProjectDiscovery's httpx toolkit into RedAmon's reconnaissance pipeline. httpx is a multi-purpose HTTP toolkit designed for probing, technology detection, and web service analysis.

This module also includes integrated banner grabbing for non-HTTP services (SSH, FTP, SMTP, MySQL, etc.) to provide complete service detection across all open ports.

⚠️ Important: httpx runs exclusively via Docker. No native installation is supported.

Why httpx + Banner Grabbing?

FeatureTraditional Toolshttpx + Banner Grab
HTTP Technology DetectionLimitedWappalyzer-based
Non-HTTP Service DetectionNoneSSH, FTP, SMTP, etc.
TLS AnalysisBasicComprehensive
SpeedSlowHighly concurrent
Output FormatVariableRich JSON
FingerprintingNoneFavicon, JARM, hash

How It Works

┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
│  Naabu Results  │────▶│  httpx_scan.py   │────▶│  Enriched JSON  │
│  (open ports,   │     │                  │     │  with live URLs,│
│   hostnames)    │     │  1. Build URLs   │     │  technologies,  │
└─────────────────┘     │  2. HTTP probe   │     │  TLS info,      │
        │               │  3. Tech detect  │     │  banners, etc.  │
        │               │  4. Banner grab  │     └─────────────────┘
        │               │  5. Parse JSON   │
        ▼               └──────────────────┘
┌─────────────────┐
│  DNS Data       │  (Fallback if no Naabu)
│  (hostnames)    │
└─────────────────┘

Features

FeatureDescription
HTTP ProbingIdentifies live HTTP/HTTPS endpoints
Technology DetectionWappalyzer-based tech fingerprinting
TLS AnalysisCertificate info, cipher suites, JARM
CDN DetectionIdentifies CDN providers
ASN LookupAutonomous System Number detection
Response AnalysisStatus codes, headers, body hashing
Favicon HashingFingerprint via favicon hash
Banner GrabbingService detection for non-HTTP ports (SSH, FTP, SMTP, etc.)
Docker ExecutionNo local installation required

Installation

Requirements

  • Docker installed and running

Setup

# Make sure Docker is running
sudo systemctl start docker

# Run the scan - image will be pulled automatically
python3 recon/main.py

Verify Docker is Ready

# Check Docker is running
docker info

# Optionally pre-pull the image
docker pull projectdiscovery/httpx:latest

Configuration Parameters

All parameters are configured via the webapp project settings (stored in PostgreSQL) or as defaults in project_settings.py. This section provides detailed explanations including performance impact for each option.


1. Core Configuration

ParameterTypeDefaulthttpx FlagDescription
HTTPX_DOCKER_IMAGEstr"projectdiscovery/httpx:latest"-Docker image to use. Only change for custom builds or specific versions.
HTTPX_THREADSint50-tNumber of concurrent HTTP requests. Higher = faster but uses more CPU/memory.
HTTPX_TIMEOUTint10-timeoutSeconds to wait for each HTTP response before giving up.
HTTPX_RETRIESint2-retriesNumber of retry attempts for failed/timeout requests.
HTTPX_RATE_LIMITint150-rlMaximum requests per second. Set to 0 for unlimited. Lower = more stealthy.

Thread Tuning Guide:

ThreadsUse CaseCPU UsageMemory
10-25Stealth scanning, limited bandwidthLow~100MB
50Default - balanced performanceMedium~200MB
100-200Fast scanning, good hardwareHigh~500MB
300+Maximum speed, powerful servers onlyVery High1GB+

Timeout Considerations:

  • 5s - Fast networks, modern servers
  • 10s - Default - handles most scenarios
  • 15-30s - Slow servers, high latency networks

2. Redirect Handling

ParameterTypeDefaulthttpx FlagDescription
HTTPX_FOLLOW_REDIRECTSboolTrue-frFollow HTTP 301/302/307/308 redirects. Essential for modern web apps.
HTTPX_MAX_REDIRECTSint10-maxrMaximum redirect chain length. Prevents infinite redirect loops.

Why Follow Redirects?

  • Many sites redirect http://https://
  • www → non-www redirects are common
  • Login pages often redirect after authentication
  • Without following, you might miss the actual content

3. HTTP Response Probing (Fast Options)

These options extract basic HTTP response information with minimal performance impact:

ParameterTypeDefaulthttpx FlagWhat It ExtractsSpeed Impact
HTTPX_PROBE_STATUS_CODEboolTrue-scHTTP status code (200, 301, 404, 500, etc.)None
HTTPX_PROBE_CONTENT_LENGTHboolTrue-clResponse body size in bytesNone
HTTPX_PROBE_CONTENT_TYPEboolTrue-ctMIME type (text/html, application/json, etc.)None
HTTPX_PROBE_TITLEboolTrue-titleHTML <title> tag contentMinimal
HTTPX_PROBE_SERVERboolTrue-serverServer header value (nginx, Apache, IIS, etc.)None
HTTPX_PROBE_RESPONSE_TIMEboolTrue-rtTime to first byte in millisecondsNone
HTTPX_PROBE_WORD_COUNTboolTrue-wcNumber of words in response bodyMinimal
HTTPX_PROBE_LINE_COUNTboolTrue-lcNumber of lines in response bodyMinimal

Example Output:

{
  "status_code": 200,
  "content_length": 15234,
  "content_type": "text/html; charset=UTF-8",
  "title": "Example Domain",
  "server": "nginx/1.19.0",
  "response_time_ms": 145,
  "word_count": 892,
  "line_count": 156
}

4. Technology Detection

ParameterTypeDefaulthttpx FlagDescriptionSpeed Impact
HTTPX_PROBE_TECH_DETECTboolTrue-tdDetects technologies using Wappalyzer-like fingerprintingMedium

How It Works:

  • Analyzes response headers, body content, and JavaScript
  • Matches against signature database
  • Identifies frameworks, CMS, libraries

Detected Technologies Include:

CategoryExamples
Web Serversnginx, Apache, IIS, LiteSpeed, Caddy
LanguagesPHP, Python, Java, Node.js, Ruby, Go
FrameworksLaravel, Django, Spring, Express, Rails
CMSWordPress, Drupal, Joomla, Magento
FrontendReact, Angular, Vue.js, jQuery
CDN/WAFCloudflare, Akamai, AWS CloudFront, Sucuri
AnalyticsGoogle Analytics, Matomo, Hotjar
CachingVarnish, Redis, Memcached

5. Network Information

ParameterTypeDefaulthttpx FlagWhat It DoesSpeed Impact
HTTPX_PROBE_IPboolTrue-ipResolves and returns the target's IP addressMinimal (DNS lookup)
HTTPX_PROBE_CNAMEboolTrue-cnameExtracts CNAME DNS records - reveals CDN/hostingMinimal (DNS lookup)
HTTPX_PROBE_ASNboolTrue-asnAutonomous System Number - identifies network providerMedium (external lookup)
HTTPX_PROBE_CDNboolTrue-cdnDetects CDN provider (Cloudflare, Akamai, etc.)Minimal

ASN Information Reveals:

  • Hosting provider (AWS, Google Cloud, Azure, DigitalOcean)
  • ISP information
  • Geographic region hints
  • Useful for identifying shared hosting

6. SSL/TLS Information

ParameterTypeDefaulthttpx FlagWhat It DoesSpeed Impact
HTTPX_PROBE_TLS_INFOboolTrue-tls-probeBasic TLS info: version, cipher suiteMedium
HTTPX_PROBE_TLS_GRABboolTrue-tls-grabFull certificate extraction⚠️ SLOW

TLS_INFO extracts:

  • TLS version (TLS 1.0, 1.1, 1.2, 1.3)
  • Cipher suite in use

TLS_GRAB extracts (additional):

  • Certificate subject (CN, O, OU)
  • Certificate issuer (CA)
  • Validity period (not_before, not_after)
  • Subject Alternative Names (all domains on cert)
  • Serial number

Example TLS Output:

{
  "tls": {
    "version": "TLS 1.3",
    "cipher": "TLS_AES_256_GCM_SHA384",
    "certificate": {
      "subject_cn": "*.example.com",
      "issuer": "Let's Encrypt Authority X3",
      "not_before": "2024-01-01T00:00:00Z",
      "not_after": "2024-04-01T00:00:00Z",
      "san": ["example.com", "*.example.com", "www.example.com"]
    }
  }
}

⚠️ Performance Note: TLS_GRAB requires a full TLS handshake and certificate parsing. Disable for faster scans.


7. Fingerprinting (Advanced)

ParameterTypeDefaulthttpx FlagWhat It DoesSpeed Impact
HTTPX_PROBE_FAVICONboolTrue-faviconCalculates MMH3 hash of favicon.icoMedium (extra HTTP request)
HTTPX_PROBE_JARMboolTrue-jarmJARM TLS fingerprint⚠️ VERY SLOW
HTTPX_PROBE_HASHstr"sha256"-hashHash of response bodyMedium

Favicon Hashing

What It Is:

  • Downloads /favicon.ico and calculates MMH3 hash
  • Same favicon = same application/framework

Use Cases:

  • Identify Cobalt Strike C2 servers (known hashes)
  • Find admin panels (phpMyAdmin, cPanel)
  • Detect specific applications
  • Cross-reference with Shodan favicon database

Example:

{
  "favicon_hash": "-1396576824"
}

JARM Fingerprinting

What It Is:

  • JARM = JA3 + RDP fingerprint for servers
  • Creates unique fingerprint based on TLS server configuration
  • Requires 10 separate TLS handshakes per target

Why It's Slow:

Each JARM fingerprint requires:
- 10 different TLS ClientHello messages
- 10 separate connections
- Parsing 10 ServerHello responses
- Total: ~5-10 seconds per target

Use Cases:

  • Identify C2 (Command & Control) servers
  • Detect malware infrastructure
  • Fingerprint load balancers
  • Track threat actors

⚠️ Recommendation: Disable JARM (HTTPX_PROBE_JARM = False) for regular scans. Enable only for targeted threat hunting.

Body Hash

Options: "md5", "sha256", "sha512", "" (disabled)

Use Cases:

  • Detect identical pages across different URLs
  • Find mirror sites
  • Identify default/template pages

8. Response Content Inclusion

ParameterTypeDefaulthttpx FlagWhat It DoesSpeed Impact
HTTPX_INCLUDE_RESPONSEboolTrue-irrInclude full HTTP response (headers + body)⚠️ SLOW + Large Output
HTTPX_INCLUDE_RESPONSE_HEADERSboolTrue-irhInclude only response headersMedium

Output Size Comparison:

SettingTypical Size per URL
Headers only1-5 KB
Headers + Body50-500 KB
Full response100+ KB

When to Enable Full Response:

  • ✅ Detailed analysis of response content
  • ✅ Looking for sensitive data exposure
  • ✅ Custom pattern matching needed
  • ❌ Large-scale scanning (creates huge files)
  • ❌ Speed is priority

9. Advanced Options

ParameterTypeDefaultDescription
HTTPX_PATHSlist[]Additional paths to probe beyond root
HTTPX_CUSTOM_HEADERSlist[]Custom HTTP headers to send
HTTPX_MATCH_CODESlist[]Only keep responses with these status codes
HTTPX_FILTER_CODESlist[]Exclude responses with these status codes

Path Probing

# Probe common sensitive paths
HTTPX_PATHS = [
    "/robots.txt",           # Discover hidden paths
    "/.well-known/security.txt",  # Security contact info
    "/sitemap.xml",          # Site structure
    "/.git/config",          # Git exposure
    "/wp-admin/",            # WordPress admin
    "/phpmyadmin/",          # Database admin
]

⚠️ Each path multiplies your scan time!

Custom Headers

HTTPX_CUSTOM_HEADERS = [
    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0",
    "Accept-Language: en-US,en;q=0.9",
    "X-Forwarded-For: 127.0.0.1",  # Bypass some WAFs
]

Status Code Filtering

# Only successful responses
HTTPX_MATCH_CODES = ["200", "301", "302"]

# Exclude noise
HTTPX_FILTER_CODES = ["404", "403", "500", "502", "503"]

Speed Profiles

🏎️ Fast Mode (Reconnaissance)

# Minimal features, maximum speed
HTTPX_THREADS = 100
HTTPX_TIMEOUT = 5
HTTPX_RETRIES = 0
HTTPX_RATE_LIMIT = 0

HTTPX_PROBE_JARM = False           # DISABLE - very slow
HTTPX_PROBE_TLS_GRAB = False       # DISABLE - slow
HTTPX_PROBE_FAVICON = False        # DISABLE - extra request
HTTPX_PROBE_HASH = ""              # DISABLE
HTTPX_INCLUDE_RESPONSE = False     # DISABLE - large output

Expected: ~5-10 seconds for 10 URLs

⚖️ Balanced Mode (Default)

# Good balance of speed and information
HTTPX_THREADS = 50
HTTPX_TIMEOUT = 10
HTTPX_RETRIES = 1
HTTPX_RATE_LIMIT = 150

HTTPX_PROBE_JARM = False           # DISABLE for balance
HTTPX_PROBE_TLS_GRAB = True
HTTPX_PROBE_FAVICON = True
HTTPX_INCLUDE_RESPONSE = False

Expected: ~20-40 seconds for 10 URLs

🔬 Deep Analysis Mode

# Maximum information gathering
HTTPX_THREADS = 25
HTTPX_TIMEOUT = 15
HTTPX_RETRIES = 2
HTTPX_RATE_LIMIT = 50

HTTPX_PROBE_JARM = True            # Enable for threat hunting
HTTPX_PROBE_TLS_GRAB = True
HTTPX_PROBE_FAVICON = True
HTTPX_PROBE_HASH = "sha256"
HTTPX_INCLUDE_RESPONSE = True      # Full response capture

Expected: ~2-5 minutes for 10 URLs


Banner grabbing is integrated into httpx_scan.py and runs automatically after HTTP probing. It detects service versions on non-HTTP ports that httpx cannot probe.

Configuration

# Banner Grabbing Configuration (project_settings.py)

# Enable/disable banner grabbing for non-HTTP ports
BANNER_GRAB_ENABLED = True

# Connection timeout per port (seconds)
BANNER_GRAB_TIMEOUT = 5

# Number of concurrent threads
BANNER_GRAB_THREADS = 20

# Maximum banner length to store (characters)
BANNER_GRAB_MAX_LENGTH = 500

Supported Services

ServicePort(s)Detection Method
SSH22Banner: SSH-2.0-OpenSSH_8.2p1
FTP21Banner: 220 vsFTPd 3.0.3
SMTP25, 465, 587Banner: 220 mail.example.com ESMTP Postfix
POP3110, 995Banner: +OK Dovecot ready
IMAP143, 993Banner: * OK Dovecot IMAP
MySQL3306Connection handshake
PostgreSQL5432Cancel request response
Redis6379INFO command response
VNC5900RFB protocol banner
Memcached11211VERSION command
Telnet23Login prompt

Skipped Ports (Handled by httpx)

HTTP ports are automatically skipped since httpx provides better detection:

80, 443, 8080, 8443, 8000, 8888, 8008, 3000, 5000, 9000, 9090, 8800

Output Structure

{
  "banner_grab": {
    "scan_metadata": {
      "scan_timestamp": "2024-01-15T10:30:00",
      "scan_duration_seconds": 5.2,
      "total_ports_scanned": 3,
      "banners_retrieved": 2
    },
    "by_host": {
      "example.com": {
        "host": "example.com",
        "ports": {
          "22": {
            "port": 22,
            "banner": "SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5",
            "service": "ssh",
            "version": "OpenSSH 8.2p1",
            "confidence": "high"
          },
          "21": {
            "port": 21,
            "banner": "220 (vsFTPd 3.0.3)",
            "service": "ftp",
            "version": "vsFTPd 3.0.3",
            "confidence": "high"
          }
        }
      }
    },
    "services_found": {
      "ssh": [{"host": "example.com", "port": 22, "version": "OpenSSH 8.2p1"}],
      "ftp": [{"host": "example.com", "port": 21, "version": "vsFTPd 3.0.3"}]
    }
  }
}

Limitations

LimitationDescription
Binary protocolsRDP, LDAP, DNS don't send text banners
Authentication requiredSome services won't respond without auth
Custom servicesUnknown port/protocol combinations
Firewall blockingMay timeout on filtered ports

For comprehensive service detection (1000+ services), consider using nmap with -sV flag separately.


Wappalyzer Technology Enhancement

Wappalyzer enhancement is integrated into httpx_scan.py and runs automatically after httpx parsing. It uses existing HTML from httpx (no additional HTTP requests) to detect 1000+ technologies, including CMS plugins, analytics tools, security tools, and frameworks that httpx might miss.

How It Works

┌──────────────────┐     ┌──────────────────┐     ┌──────────────────┐
│  httpx Output    │────▶│  Wappalyzer      │────▶│  Enhanced JSON   │
│  (HTML bodies,   │     │  Enhancement     │     │  with additional │
│   technologies)   │     │                  │     │  technologies    │
└──────────────────┘     │  1. Parse HTML   │     └──────────────────┘
                          │  2. Match 1000+  │
                          │     patterns     │
                          │  3. Detect       │
                          │     plugins,     │
                          │     analytics    │
                          │  4. Merge with   │
                          │     httpx techs  │
                          └──────────────────┘

Configuration

# Wappalyzer Configuration (project_settings.py)

# Enable/disable Wappalyzer technology enhancement
WAPPALYZER_ENABLED = True

# Minimum confidence level (0-100) to include a technology
# Lower = more detections but potentially more false positives
WAPPALYZER_MIN_CONFIDENCE = 50

# Analyze only URLs with HTML body (recommended: True)
# When False, attempts to analyze URLs without body (limited detection)
WAPPALYZER_REQUIRE_HTML = True

Installation

Wappalyzer requires the python-Wappalyzer library:

pip install python-Wappalyzer

Note: If Wappalyzer is not installed, the enhancement will be skipped with a warning message.

What Wappalyzer Detects

CategoryExamplesWhy It Matters
CMS PluginsYoast SEO, WooCommerce, Contact Form 7, Advanced Custom FieldsPlugin vulnerabilities, outdated plugins
Analytics ToolsGoogle Analytics, Facebook Pixel, Hotjar, MixpanelPrivacy concerns, tracking detection
Security ToolsCloudflare, Sucuri, reCAPTCHA, WordfenceWAF detection, security posture
JavaScript FrameworksReact, Vue.js, Angular, jQueryFramework-specific vulnerabilities
E-commerce PlatformsShopify, WooCommerce, MagentoPayment processing, PCI compliance
CDN ProvidersCloudflare, Fastly, AkamaiCDN-specific features, bypass techniques
Database ToolsphpMyAdmin, AdminerDatabase exposure risks
Version InformationWordPress 6.0, jQuery 3.6.0Version-based CVE lookup

Comparison: httpx vs Wappalyzer

Featurehttpx Built-inWappalyzer Enhancement
Pattern Database~50-100 patterns1000+ patterns
CMS Plugins❌ LimitedExcellent
Analytics Tools❌ FewComprehensive
Security Tools⚠️ BasicDetailed
Version Detection⚠️ BasicEnhanced with confidence
Category Classification❌ NoneFull categorization
Confidence Scores❌ NonePer-technology

Output Structure

Wappalyzer results are added under the wappalyzer key within the httpx section:

{
  "httpx": {
    "by_url": {
      "https://example.com": {
        "technologies": ["Nginx:1.19.0", "PHP:5.6.40", "WordPress:6.0", "jQuery:3.6.0", "Yoast SEO"]
      }
    },
    "wappalyzer": {
      "scan_metadata": {
        "scan_timestamp": "2025-12-31T12:34:56.789012",
        "urls_analyzed": 1,
        "new_technologies_found": 3,
        "plugins_detected": 1,
        "analytics_detected": 1,
        "security_tools_detected": 1
      },
      "by_url": {
        "https://example.com": [
          {
            "name": "jQuery",
            "version": "3.6.0",
            "categories": ["JavaScript frameworks"],
            "confidence": 100
          },
          {
            "name": "Yoast SEO",
            "version": "20.0",
            "categories": ["CMS"],
            "confidence": 95
          },
          {
            "name": "Google Analytics",
            "version": null,
            "categories": ["Analytics"],
            "confidence": 100
          }
        ]
      },
      "new_technologies": {
        "jQuery:3.6.0": ["https://example.com"],
        "Yoast SEO": ["https://example.com"],
        "Google Analytics": ["https://example.com"]
      },
      "all_technologies": {
        "WordPress": {
          "name": "WordPress",
          "versions_found": ["6.0"],
          "categories": ["CMS"],
          "urls": ["https://example.com"]
        },
        "jQuery": {
          "name": "jQuery",
          "versions_found": ["3.6.0"],
          "categories": ["JavaScript frameworks"],
          "urls": ["https://example.com"]
        }
      },
      "plugins": [
        {
          "name": "Yoast SEO",
          "version": "20.0",
          "url": "https://example.com"
        }
      ],
      "analytics": [
        {
          "name": "Google Analytics",
          "url": "https://example.com"
        }
      ],
      "security_tools": [
        {
          "name": "Cloudflare",
          "url": "https://example.com"
        }
      ],
      "frameworks": [
        {
          "name": "jQuery",
          "version": "3.6.0",
          "url": "https://example.com"
        }
      ],
      "summary": {
        "urls_analyzed": 1,
        "total_technologies": 5,
        "new_technologies": 3,
        "httpx_missed": ["jQuery:3.6.0", "Yoast SEO", "Google Analytics"],
        "plugins_count": 1,
        "analytics_count": 1,
        "security_tools_count": 1,
        "frameworks_count": 1
      }
    },
    "summary": {
      "technology_count": 5,
      "unique_technologies": ["Nginx:1.19.0", "PHP:5.6.40", "WordPress:6.0", "jQuery:3.6.0", "Yoast SEO"],
      "wappalyzer_additions": 3
    }
  }
}

Benefits for CVE Lookup

Wappalyzer enhancement significantly improves CVE lookup results:

  1. More Technologies Detected: More technologies = more CVEs found
  2. Version Information: Better version detection enables accurate CVE matching
  3. Plugin Vulnerabilities: CMS plugins often have their own CVEs
  4. Framework CVEs: JavaScript frameworks (jQuery, React) have known vulnerabilities

Example:

  • httpx only: Detects WordPress:6.0 → 5 CVEs found
  • httpx + Wappalyzer: Detects WordPress:6.0, jQuery:3.6.0, Yoast SEO:20.0 → 15 CVEs found

Performance Impact

URLsWappalyzer TimeTotal Scan Time
1 URL~1-2 seconds+1-2 seconds
10 URLs~5-10 seconds+5-10 seconds
100 URLs~30-60 seconds+30-60 seconds

Note: Wappalyzer uses existing HTML from httpx, so there are no additional HTTP requests. The time is purely for HTML parsing and pattern matching.

Troubleshooting

"Wappalyzer not installed"

pip install python-Wappalyzer

"No new technologies found"

Possible causes:

  1. httpx already detected all technologies
  2. HTML body not included (HTTPX_INCLUDE_RESPONSE = False)
  3. Technologies don't match Wappalyzer patterns
  4. Confidence threshold too high (WAPPALYZER_MIN_CONFIDENCE)

Solutions:

# Ensure HTML is included
HTTPX_INCLUDE_RESPONSE = True

# Lower confidence threshold
WAPPALYZER_MIN_CONFIDENCE = 30

"Wappalyzer errors for some URLs"

Wappalyzer may fail on:

  • Malformed HTML
  • Non-HTML responses (JSON, XML)
  • Empty responses

This is normal - the enhancement continues for other URLs.

Integration with CVE Lookup

Wappalyzer-detected technologies are automatically included in CVE lookup:

{
  "technology_cves": {
    "by_technology": {
      "WordPress:6.0": {"cve_count": 5, "cves": [...]},
      "jQuery:3.6.0": {"cve_count": 3, "cves": [...]},  // From Wappalyzer
      "Yoast SEO:20.0": {"cve_count": 2, "cves": [...]}  // From Wappalyzer
    }
  }
}

Architecture & Flow

Pipeline context: HTTP probing runs in GROUP 4 of the parallelized recon pipeline, sequentially after GROUP 3 (Shodan + Port Scan). It depends on port scan results to build probe targets. While the module itself runs sequentially in the pipeline, httpx internally uses parallel threads for probing multiple targets.

Execution Flow

1. INITIALIZATION
   └── Check Docker availability
   └── Pull httpx image if needed

2. TARGET BUILDING
   └── Priority 1: Build URLs from Naabu port data
   └── Priority 2: Build URLs from DNS data (fallback)
   └── Determine HTTP/HTTPS based on port numbers

3. PROBE EXECUTION
   └── Create targets file with URLs
   └── Build httpx Docker command
   └── Execute with JSON Lines output
   └── Monitor progress

4. RESULT PROCESSING
   └── Parse JSONL output line by line
   └── Extract technologies per URL
   └── Aggregate data by host
   └── Track unique technologies and servers

5. DATA ENRICHMENT
   └── Add "httpx" section to recon_data
   └── Save incrementally to JSON file
   └── Generate summary statistics

URL Building from Naabu

# Port-based protocol detection
https_ports = {443, 8443, 4443, 9443}
http_ports = {80, 8080, 8000, 8888}

# Example transformations:
# Port 443 -> https://example.com
# Port 80 -> http://example.com
# Port 8443 -> https://example.com:8443
# Port 8080 -> http://example.com:8080
# Unknown port -> try both http:// and https://

Docker Command Structure

docker run --rm -i \
  -v /targets:/targets:ro \
  -v /output:/output \
  projectdiscovery/httpx:latest \
  -l /targets/targets.txt \
  -o /output/httpx_output.json \
  -json \
  -silent \
  -nc \
  -t 50 \                    # Threads
  -timeout 10 \
  -retries 2 \
  -rl 150 \                  # Rate limit
  -fr \                      # Follow redirects
  -maxr 10 \                 # Max redirects
  -sc \                      # Status code
  -cl \                      # Content length
  -ct \                      # Content type
  -title \                   # Page title
  -server \                  # Server header
  -rt \                      # Response time
  -wc \                      # Word count
  -lc \                      # Line count
  -td \                      # Tech detect
  -ip \                      # IP address
  -cname \                   # CNAME records
  -tls-probe \               # TLS info
  -tls-grab \                # TLS certificate
  -favicon \                 # Favicon hash
  -jarm \                    # JARM fingerprint
  -hash sha256 \             # Body hash
  -irr \                     # Include response (headers + body)
  -irh \                     # Include headers only
  -asn \                     # ASN info
  -cdn                       # CDN detection

Output Data Structure

Complete JSON Schema

{
  "httpx": {
    "scan_metadata": {
      "scan_timestamp": "2024-01-15T12:00:00.000000",
      "scan_duration_seconds": 120.5,
      "docker_image": "projectdiscovery/httpx:latest",
      "threads": 50,
      "timeout": 10,
      "rate_limit": 150,
      "follow_redirects": true,
      "tech_detection": true,
      "tls_probing": true,
      "response_included": true,
      "proxy_used": false,
      "total_urls_probed": 150
    },
    
    "by_url": {
      "https://example.com": {
        "url": "https://example.com",
        "host": "example.com",
        "status_code": 200,
        "content_length": 45678,
        "content_type": "text/html; charset=UTF-8",
        "title": "Example Domain",
        "server": "nginx/1.18.0",
        "response_time_ms": 245,
        "word_count": 1234,
        "line_count": 89,
        "technologies": ["nginx", "PHP", "WordPress"],
        "ip": "93.184.216.34",
        "cname": null,
        "cdn": null,
        "is_cdn": false,
        "asn": {
          "as_number": "AS15133",
          "as_name": "Edgecast Inc.",
          "as_country": "US"
        },
        "tls": {
          "version": "TLS 1.3",
          "cipher": "TLS_AES_256_GCM_SHA384",
          "certificate": {
            "subject_cn": "example.com",
            "issuer": "Let's Encrypt Authority X3",
            "not_before": "2024-01-01T00:00:00Z",
            "not_after": "2024-04-01T00:00:00Z",
            "san": ["example.com", "www.example.com"]
          }
        },
        "favicon_hash": "116323821",
        "jarm": "29d29d15d29d29d00029d29d29d29d...",
        "body_hash": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        "headers": {
          "Content-Type": "text/html; charset=UTF-8",
          "X-Powered-By": "PHP/7.4.3"
        },
        "body": "<!DOCTYPE html>..."
      }
    },
    
    "by_host": {
      "example.com": {
        "hostname": "example.com",
        "urls": ["http://example.com", "https://example.com"],
        "live_urls": ["https://example.com"],
        "technologies": ["nginx", "PHP", "WordPress"],
        "servers": ["nginx/1.18.0"],
        "status_codes": [200, 301]
      }
    },
    
    "technologies_found": {
      "nginx": ["https://example.com", "https://api.example.com"],
      "PHP": ["https://example.com"],
      "WordPress": ["https://example.com"],
      "React": ["https://app.example.com"]
    },
    
    "servers_found": {
      "nginx/1.18.0": ["https://example.com"],
      "Apache/2.4.41": ["https://legacy.example.com"]
    },
    
    "summary": {
      "total_urls_probed": 150,
      "live_urls": 45,
      "total_hosts": 25,
      "by_status_code": {
        "200": 35,
        "301": 8,
        "404": 2
      },
      "unique_technologies": ["nginx", "PHP", "WordPress", "React"],
      "technology_count": 4,
      "unique_servers": ["nginx/1.18.0", "Apache/2.4.41"],
      "server_count": 2,
      "cdn_hosts": 3
    }
  }
}

Usage Examples

Basic Usage (via main.py)

# Include "http_probe" in SCAN_MODULES in project settings
SCAN_MODULES = ["initial_recon", "naabu", "httpx", "nuclei"]

# Run the full pipeline
python3 recon/main.py

Standalone Enrichment

from httpx_scan import enrich_recon_file
from pathlib import Path

enriched = enrich_recon_file(Path("output/recon_example.com.json"))

Command Line

# Enrich an existing recon file
python3 recon/httpx_scan.py output/recon_example.com.json

Configuration Profiles

Quick Probe (Fast):

HTTPX_THREADS = 100
HTTPX_RATE_LIMIT = 300
HTTPX_TIMEOUT = 5
HTTPX_PROBE_TECH_DETECT = True
HTTPX_INCLUDE_RESPONSE = False  # Smaller output

Comprehensive Analysis:

HTTPX_THREADS = 50
HTTPX_RATE_LIMIT = 100
HTTPX_TIMEOUT = 15
HTTPX_PROBE_TECH_DETECT = True
HTTPX_PROBE_TLS_INFO = True
HTTPX_PROBE_TLS_GRAB = True
HTTPX_PROBE_FAVICON = True
HTTPX_PROBE_JARM = True
HTTPX_INCLUDE_RESPONSE = True
HTTPX_INCLUDE_RESPONSE_HEADERS = True

Stealth Probe:

HTTPX_THREADS = 10
HTTPX_RATE_LIMIT = 20
HTTPX_TIMEOUT = 20
HTTPX_CUSTOM_HEADERS = [
    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
]

Technology-Focused:

HTTPX_PROBE_TECH_DETECT = True
HTTPX_PROBE_SERVER = True
HTTPX_PROBE_FAVICON = True
HTTPX_PROBE_HASH = "sha256"
HTTPX_INCLUDE_RESPONSE_HEADERS = True

Troubleshooting

Common Issues

"Docker not found"

# Install Docker
sudo apt install docker.io

# Start Docker daemon
sudo systemctl start docker

"No live URLs found"

Possible causes:

  1. Hosts are down
  2. Firewall blocking requests
  3. Wrong ports probed

Solutions:

# Increase timeout
HTTPX_TIMEOUT = 20

# Increase retries
HTTPX_RETRIES = 3

# Try without Naabu (probe default ports)
SCAN_MODULES = ["initial_recon", "httpx"]

Scan too slow

# Increase performance
HTTPX_THREADS = 100
HTTPX_RATE_LIMIT = 300
HTTPX_TIMEOUT = 5
HTTPX_RETRIES = 1

# Disable expensive probes
HTTPX_PROBE_JARM = False
HTTPX_INCLUDE_RESPONSE = False

Too much output data

# Disable response body inclusion
HTTPX_INCLUDE_RESPONSE = False
HTTPX_INCLUDE_RESPONSE_HEADERS = False

# Filter status codes
HTTPX_MATCH_CODES = ["200"]

Debug Mode

Run httpx manually via Docker:

docker run --rm \
  projectdiscovery/httpx:latest \
  -u https://example.com \
  -sc -td -server -title \
  -v -debug

Security Considerations

⚠️ Legal Warning: Only scan systems you have explicit permission to test.

RiskMitigation
Rate limiting/bansReduce HTTPX_RATE_LIMIT
WAF blockingUse custom User-Agent, reduce rate
DetectionReduce threads
FingerprintingYour requests are identifiable

Safe Defaults

HTTPX_THREADS = 25
HTTPX_RATE_LIMIT = 50
HTTPX_TIMEOUT = 15
HTTPX_CUSTOM_HEADERS = [
    "User-Agent: Mozilla/5.0 (compatible; SecurityScanner/1.0)"
]

Dependencies

PackagePurpose
DockerContainer runtime for httpx
projectdiscovery/httpx:latesthttpx Docker image (auto-pulled)
Python 3.8+Script runtime

References


Documentation generated for RedAmon v1.0 - httpx HTTP Prober Module