Production-ready, ultra-fast reverse proxy backend IP scanner for discovering backend servers behind CDNs and reverse proxies like Cloudflare.
By Octolus from OctoVPN team
- π Blazing Fast - 2000-10000+ concurrent connections with dynamic CPU scaling
- π File Input - Load IP ranges from text files (CIDR notation)
- π Multiple HTTP Methods - Support for HEAD, GET, and POST requests
- π Content Matching - Search for specific patterns in HTML responses (regex supported)
- π― Flexible Status Codes - Match any HTTP status code (default: 202)
- π Progress Tracking - Real-time progress bars with speed and ETA
- π¨ Beautiful Output - Colored terminal UI with detailed results
- βοΈ Auto-Optimization - Automatically detects CPU cores and RAM for optimal performance
- π§ Custom Headers - Add custom HTTP headers to requests
- π Cross-Platform - Works on Windows, Linux, and macOS
- Rust 1.70+ (for building from source)
- Windows 10/11, Linux, or macOS
- At least 4GB RAM (8GB+ recommended for large scans)
# Clone the repository
git clone https://github.com/Octolus/OctoIntel.git
cd OctoIntel
# Build release binary
cargo build --release
# Binary will be at: target/release/octointel.exe (Windows)
# or: target/release/octointel (Linux/macOS)When a website is behind Cloudflare (or similar CDN), you know the domain but need to find the actual backend server IP.
Your Domain: example.com
Current Status: Behind Cloudflare (proxy enabled)
Goal: Find the real backend IP address
Use HEAD when you know the backend returns a specific status code (like 202 Accepted):
# Quick scan looking for 202 status
octointel example.com \
--ranges 35.207.0.0/16 \
--method HEAD \
--status-code 202When to use HEAD:
- β Fast scanning (doesn't download content)
- β Backend returns unique status code
- β You don't need to check page content
- β Limited to HTTP status line only
Use GET when you need to verify content matches your site:
# Find backend by checking for your site's title
octointel example.com \
--method GET \
--content-match "<title>My Site Title</title>" \
--ranges 35.207.0.0/16When to use GET:
- β Need to verify page content
- β Can check for unique identifiers
- β More accurate (reduces false positives)
- β Slower (downloads full response)
Search for flexible patterns in the HTML:
# Match title with regex (case-insensitive, flexible)
octointel example.com \
--method GET \
--content-match "<title>.*example.*</title>" \
--ranges 35.207.0.0/16Common patterns to search for:
# Look for specific server headers
--content-match "Server: nginx/1.18.0"
# Find WordPress sites
--content-match "wp-content|wp-includes"
# Search for unique app identifiers
--content-match "data-app-id=\"abc123\""
# Match copyright text
--content-match "Copyright.*YourCompany"Create ips.txt with CIDR ranges to scan:
# ips.txt - IP ranges to scan
# Lines starting with # are comments
# Google Cloud Platform - Common regions
35.207.0.0/16
35.208.0.0/16
35.209.0.0/16
# AWS - US East
3.208.0.0/12
52.0.0.0/14
# Digital Ocean
159.65.0.0/16
167.99.0.0/16
# Cloudflare (if backend is also on CF)
104.16.0.0/12
172.64.0.0/13
Then scan using the file:
octointel example.com --ip-file ips.txtSee ips.txt.example for comprehensive cloud provider ranges.
# Uses built-in Google Cloud ranges
octointel example.com# You know your backend is on Google Cloud US-West
octointel example.com \
--ranges 35.207.0.0/16,35.208.0.0/16,35.209.0.0/16# Your site has unique title, use GET to verify
octointel example.com \
--method GET \
--content-match "<title>Welcome to Example Corp</title>" \
--ip-file ips.txt# Backend returns custom header
octointel example.com \
--method HEAD \
--content-match "X-Custom-Backend: production" \
--ranges 10.0.0.0/16# Look for specific nginx version
octointel example.com \
--method GET \
--content-match "Server:.*nginx/1\\.18" \
--ranges 35.207.0.0/20# Backend always returns 202 for your domain
octointel example.com \
--method HEAD \
--status-code 202 \
--workers 10000 \
--timeout 300 \
--ip-file google-cloud.txtoctointel example.com --method HEAD --status-code 202β Advantages:
- Extremely fast (no content download)
- Low bandwidth usage
- Efficient for large IP ranges
- Good when backend has unique status code
β Limitations:
- Only checks HTTP status line and headers
- Cannot verify page content
- More false positives
octointel example.com --method GET --content-match "<title>Your Site</title>"β Advantages:
- Can verify actual page content
- More accurate results
- Can use regex for flexible matching
- Reduces false positives
β Limitations:
- Slower (downloads full response)
- Higher bandwidth usage
- May need larger buffer for big pages
| Option | Description | Example |
|---|---|---|
DOMAIN |
Target domain (required) | example.com |
-r, --ranges |
IP ranges to scan (CIDR) | -r 35.207.0.0/16,35.208.0.0/16 |
-f, --ip-file |
Load ranges from file | -f ips.txt |
-m, --method |
HTTP method (HEAD/GET/POST) | -m GET |
--status-code |
Status code to match | --status-code 200 |
-c, --content-match |
Search pattern (regex) | -c "<title>.*</title>" |
-p, --port |
Target port | -p 8080 |
-v, --verbose |
Debug output | -v |
| Option | Description | Default |
|---|---|---|
-w, --workers |
Concurrent connections | Auto (2000-10000) |
-t, --timeout |
Timeout in milliseconds | Auto (300-1000) |
--stop-on-find |
Stop after first match | true |
| Option | Description | Example |
|---|---|---|
--header |
Custom HTTP header | --header "User-Agent: Custom" |
--post-body |
POST request body | --post-body '{"key":"value"}' |
--single-ip |
Test single IP | --single-ip 35.207.76.249 |
--https |
Use HTTPS (TLS) | --https |
# Test with /24 first (256 IPs)
octointel example.com --ranges 35.207.76.0/24
# Then expand to /20 (4096 IPs)
octointel example.com --ranges 35.207.0.0/20
# Finally scan /16 if needed (65536 IPs)
octointel example.com --ranges 35.207.0.0/16# Instead of just status code...
octointel example.com --status-code 200
# Add content verification to reduce false positives
octointel example.com \
--method GET \
--status-code 200 \
--content-match "<title>Your Unique Title</title>"# Find backend with specific characteristics
octointel example.com \
--method GET \
--status-code 200 \
--content-match "nginx.*Your-App-Name" \
--header "Host: example.com"If you know your hosting provider:
# Google Cloud only
octointel example.com --ip-file google-cloud.txt
# AWS only
octointel example.com --ip-file aws.txt
# Mix of providers
cat google-cloud.txt aws.txt digitalocean.txt > mixed.txt
octointel example.com --ip-file mixed.txt# See every connection attempt
octointel example.com --ranges 35.207.76.0/24 --verboseOutput shows:
- Connection attempts
- Failures and reasons
- Response details
- Timing information
# Verify your pattern works on known IP
octointel example.com --single-ip 35.207.76.249 --verboseTest regex before scanning large ranges:
# Test on small range first
octointel example.com \
--ranges 35.207.76.0/28 \
--content-match "your-pattern" \
--verbose============================================================
π OctoIntel v1.0.0
β‘ Ultra-fast reverse proxy backend scanner
============================================================
βΉ Auto-detected system capabilities:
β CPU Cores: 8
β RAM: 16 GB
β Concurrent Workers: 5000
β Connection Timeout: 500ms
============================================================
β Scan Configuration:
============================================================
β Target domain: example.com
β HTTP method: GET
β Port: 80
β Target status: 200
β Content match: <title>Example</title>
β IP ranges: 3
β Concurrent workers: 5000
β Timeout: 500ms
============================================================
β€ Scanning 65536 IPs in range 35.207.0.0/16
============================================================
[00:00:15] [ββββββββββββββββ] 65536/65536 (100%) | 4369 IPs/sec
β FOUND: 35.207.76.249 - Status: 200, Content matched
β Backend IP found! Stopping scan immediately...
============================================================
β Scan completed in 15.23s
============================================================
β Found 1 backend IP(s):
β 35.207.76.249 - Status: 200, Content matched
-
Try GET instead of HEAD
--method GET
-
Change status code
--status-code 200 # Try 200 instead of 202 -
Remove content matching temporarily
# Test without pattern first octointel example.com --ranges 35.207.76.0/24 -
Use verbose mode
-v
# Reduce workers
--workers 2000
# Increase timeout
--timeout 1000
# Use HEAD instead of GET
--method HEADulimit -n 65536# North America
35.207.0.0/16
35.208.0.0/16
35.209.0.0/16
35.210.0.0/16
# Europe
35.212.0.0/16
35.213.0.0/16
# Asia
35.215.0.0/16
35.216.0.0/16
# US East
3.208.0.0/12
52.0.0.0/14
# US West
13.56.0.0/16
54.176.0.0/12
# New York
159.65.0.0/16
167.99.0.0/16
# San Francisco
159.89.0.0/16
165.227.0.0/16
This tool is provided for educational and authorized testing purposes only.
- β Use on your own infrastructure
- β Use with explicit written permission
- β Use for authorized security assessments
- β Do NOT use for unauthorized access
- β Do NOT use for malicious purposes
Users are responsible for complying with all applicable laws and regulations.
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
This project is licensed under the MIT License - see the LICENSE file for details.
Made with β€οΈ and β‘ Rust by Octolus from OctoVPN team