Skill

Automate Shodan Reconnaissance for Pentesting

Authorized Shodan reconnaissance for pentesting: CLI search filters, on-demand scanning, and vulnerability discovery.

Works with shodanpython

Maintainer of this project? Claim this page to edit the listing.


88
Spark score
out of 100
Updated 21 days ago
Version 13.11.0

Add to Favorites

Why it matters

Leverage Shodan's extensive internet-wide scanning data to systematically discover exposed services, identify vulnerabilities, and map network assets during penetration testing engagements.

Outcomes

What it gets done

01

Configure Shodan CLI and API key for authenticated access.

02

Execute targeted searches using advanced filters for specific products, versions, and vulnerabilities.

03

Automate the collection and parsing of Shodan scan results into actionable inventory and vulnerability reports.

04

Utilize on-demand scanning and network monitoring features for real-time threat detection.

Install

Add it to your toolbox

Run in your project directory:

curl -fsSL https://spark.entire.vc/get/ag-shodan-reconnaissance | bash

Overview

Shodan Reconnaissance and Pentesting

Provides authorized Shodan reconnaissance methodology for pentesting: CLI search filters, on-demand scanning, and vulnerability discovery. Use for authorized penetration testing reconnaissance with written permission - never against unauthorized targets.

What it does

Provides systematic methodologies for leveraging Shodan as a reconnaissance tool during authorized penetration testing engagements, covering the Shodan web interface, CLI, REST API, search filters, on-demand scanning, and network monitoring for discovering exposed services, vulnerable systems, and IoT devices.

When to use - and when NOT to

Use this skill for authorized reconnaissance engagements where written permission for the target network exists - discovering exposed hosts and services, identifying vulnerable systems by CVE, mapping an organization's internet-facing infrastructure, or monitoring a network for newly exposed services. Not for reconnaissance against any target without written authorization; active scanning specifically requires authorization even where passive lookup might be permissible, and all activity should be documented.

Inputs and outputs

Setup covers installing the Shodan CLI (pip, easy_install, or pacman), initializing an API key with shodan init, and checking account credits with shodan info. Basic host reconnaissance covers shodan host IP for full host details and shodan honeyscore IP for honeypot probability. Search queries range from free basic keyword search to 1-credit filtered searches (product:mongodb, combined with country/city), credit-free result counting, and downloading/parsing results to JSON or CSV.

Documents the full search filter reference: network filters (ip, net CIDR, hostname, port, asn), geographic filters (country, city, state, geo coordinates), organization filters (org, isp), service/product filters (product, version, os, http.title, ssl.cert.subject.cn), vulnerability filters (vuln:CVE-xxxx, has_vuln:true), and screenshot filters. Covers on-demand scanning (shodan scan submit, monitoring scan status, downloading results by scan ID), search statistics with custom facets, network monitoring alerts via the web dashboard, and both REST API curl calls and the Python shodan library for programmatic search and host lookup.

Provides a quick-reference table of CLI commands with credit costs, a table of common search queries (webcams, MongoDB, Redis, vulnerable RDP via CVE-2019-0708, industrial Modbus systems, exposed Jenkins/Docker APIs), and six worked examples covering organization reconnaissance, vulnerable service discovery (BlueKeep, unauthenticated Elasticsearch, Log4j), IoT device discovery, SSL/TLS certificate analysis, a full Python automation script, and network range assessment. Operational constraints include a 1-request-per-second rate limit, a 24-hour re-scan restriction on non-Enterprise accounts, and data freshness caveats (continuous crawl but data may be days or weeks old).

Integrations

Uses the Shodan CLI, REST API (via curl or the Python shodan library), and web-based Monitor Dashboard for alerting, with scan and query actions metered against a Shodan account's credit system.

Who it's for

Penetration testers and security researchers performing authorized reconnaissance who need concrete Shodan filter syntax, CLI commands, and credit-cost awareness rather than guessing at query syntax from the web UI alone.

shodan search 'vuln:CVE-2021-44228 country:US'
Source README

Shodan Reconnaissance and Pentesting

Purpose

Provide systematic methodologies for leveraging Shodan as a reconnaissance tool during penetration testing engagements. This skill covers the Shodan web interface, command-line interface (CLI), REST API, search filters, on-demand scanning, and network monitoring capabilities for discovering exposed services, vulnerable systems, and IoT devices.

Inputs / Prerequisites

  • Shodan Account: Free or paid account at shodan.io
  • API Key: Obtained from Shodan account dashboard
  • Target Information: IP addresses, domains, or network ranges to investigate
  • Shodan CLI: Python-based command-line tool installed
  • Authorization: Written permission for reconnaissance on target networks

Outputs / Deliverables

  • Asset Inventory: List of discovered hosts, ports, and services
  • Vulnerability Report: Identified CVEs and exposed vulnerable services
  • Banner Data: Service banners revealing software versions
  • Network Mapping: Geographic and organizational distribution of assets
  • Screenshot Gallery: Visual reconnaissance of exposed interfaces
  • Exported Data: JSON/CSV files for further analysis

Core Workflow

1. Setup and Configuration

Install Shodan CLI
# Using pip
pip install shodan

# Or easy_install
easy_install shodan

# On BlackArch/Arch Linux
sudo pacman -S python-shodan
Initialize API Key
# Set your API key
shodan init YOUR_API_KEY

# Verify setup
shodan info
# Output: Query credits available: 100
#         Scan credits available: 100
Check Account Status
# View credits and plan info
shodan info

# Check your external IP
shodan myip

# Check CLI version
shodan version

2. Basic Host Reconnaissance

Query Single Host
# Get all information about an IP
shodan host 1.1.1.1

# Example output:
# 1.1.1.1
# Hostnames: one.one.one.one
# Country: Australia
# Organization: Mountain View Communications
# Number of open ports: 3
# Ports:
#   53/udp
#   80/tcp
#   443/tcp
Check if Host is Honeypot
# Get honeypot probability score
shodan honeyscore 192.168.1.100

# Output: Not a honeypot
#         Score: 0.3

3. Search Queries

Basic Search (Free)
# Simple keyword search (no credits consumed)
shodan search apache

# Specify output fields
shodan search --fields ip_str,port,os smb
Filtered Search (1 Credit)
# Product-specific search
shodan search product:mongodb

# Search with multiple filters
shodan search product:nginx country:US city:"New York"
Count Results
# Get result count without consuming credits
shodan count openssh
# Output: 23128

shodan count openssh 7
# Output: 219
Download Results
# Download 1000 results (default)
shodan download results.json.gz "apache country:US"

# Download specific number of results
shodan download --limit 5000 results.json.gz "nginx"

# Download all available results
shodan download --limit -1 all_results.json.gz "query"
Parse Downloaded Data
# Extract specific fields from downloaded data
shodan parse --fields ip_str,port,hostnames results.json.gz

# Filter by specific criteria
shodan parse --fields location.country_code3,ip_str -f port:22 results.json.gz

# Export to CSV format
shodan parse --fields ip_str,port,org --separator , results.json.gz > results.csv

4. Search Filters Reference

Network Filters
ip:1.2.3.4                  # Specific IP address
net:192.168.0.0/24          # Network range (CIDR)
hostname:example.com        # Hostname contains
port:22                     # Specific port
asn:AS15169                 # Autonomous System Number
Geographic Filters
country:US                  # Two-letter country code
country:"United States"     # Full country name
city:"San Francisco"        # City name
state:CA                    # State/region
postal:94102                # Postal/ZIP code
geo:37.7,-122.4             # Lat/long coordinates
Organization Filters
org:"Google"                # Organization name
isp:"Comcast"               # ISP name
Service/Product Filters
product:nginx               # Software product
version:1.14.0              # Software version
os:"Windows Server 2019"    # Operating system
http.title:"Dashboard"      # HTTP page title
http.html:"login"           # HTML content
http.status:200             # HTTP status code
ssl.cert.subject.cn:*.example.com  # SSL certificate
ssl:true                    # Has SSL enabled
Vulnerability Filters
vuln:CVE-2019-0708          # Specific CVE
has_vuln:true               # Has any vulnerability
Screenshot Filters
has_screenshot:true         # Has screenshot available
screenshot.label:webcam     # Screenshot type

5. On-Demand Scanning

Submit Scan
# Scan single IP (1 credit per IP)
shodan scan submit 192.168.1.100

# Scan with verbose output (shows scan ID)
shodan scan submit --verbose 192.168.1.100

# Scan and save results
shodan scan submit --filename scan_results.json.gz 192.168.1.100
Monitor Scan Status
# List recent scans
shodan scan list

# Check specific scan status
shodan scan status SCAN_ID

# Download scan results later
shodan download --limit -1 results.json.gz scan:SCAN_ID
Available Scan Protocols
# List available protocols/modules
shodan scan protocols

6. Statistics and Analysis

Get Search Statistics
# Default statistics (top 10 countries, orgs)
shodan stats nginx

# Custom facets
shodan stats --facets domain,port,asn --limit 5 nginx

# Save to CSV
shodan stats --facets country,org -O stats.csv apache

7. Network Monitoring

Setup Alerts (Web Interface)
1. Navigate to Monitor Dashboard
2. Add IP, range, or domain to monitor
3. Configure notification service (email, Slack, webhook)
4. Select trigger events (new service, vulnerability, etc.)
5. View dashboard for exposed services

8. REST API Usage

Direct API Calls
# Get API info
curl -s "https://api.shodan.io/api-info?key=YOUR_KEY" | jq

# Host lookup
curl -s "https://api.shodan.io/shodan/host/1.1.1.1?key=YOUR_KEY" | jq

# Search query
curl -s "https://api.shodan.io/shodan/host/search?key=YOUR_KEY&query=apache" | jq
Python Library
import shodan

api = shodan.Shodan('YOUR_API_KEY')

# Search
results = api.search('apache')
print(f'Results found: {results["total"]}')
for result in results['matches']:
    print(f'IP: {result["ip_str"]}')

# Host lookup
host = api.host('1.1.1.1')
print(f'IP: {host["ip_str"]}')
print(f'Organization: {host.get("org", "n/a")}')
for item in host['data']:
    print(f'Port: {item["port"]}')

Quick Reference

Essential CLI Commands

Command Description Credits
shodan init KEY Initialize API key 0
shodan info Show account info 0
shodan myip Show your IP 0
shodan host IP Host details 0
shodan count QUERY Result count 0
shodan search QUERY Basic search 0*
shodan download FILE QUERY Save results 1/100 results
shodan parse FILE Extract data 0
shodan stats QUERY Statistics 1
shodan scan submit IP On-demand scan 1/IP
shodan honeyscore IP Honeypot check 0

*Filters consume 1 credit per query

Common Search Queries

Purpose Query
Find webcams webcam has_screenshot:true
MongoDB databases product:mongodb
Redis servers product:redis
Elasticsearch product:elastic port:9200
Default passwords "default password"
Vulnerable RDP port:3389 vuln:CVE-2019-0708
Industrial systems port:502 modbus
Cisco devices product:cisco
Open VNC port:5900 authentication disabled
Exposed FTP port:21 anonymous
WordPress sites http.component:wordpress
Printers "HP-ChaiSOE" port:80
Cameras (RTSP) port:554 has_screenshot:true
Jenkins servers X-Jenkins port:8080
Docker APIs port:2375 product:docker

Useful Filter Combinations

Scenario Query
Target org recon org:"Company Name"
Domain enumeration hostname:example.com
Network range scan net:192.168.0.0/24
SSL cert search ssl.cert.subject.cn:*.target.com
Vulnerable servers vuln:CVE-2021-44228 country:US
Exposed admin panels http.title:"admin" port:443
Database exposure port:3306,5432,27017,6379

Credit System

Action Credit Type Cost
Basic search Query 0 (no filters)
Filtered search Query 1
Download 100 results Query 1
Generate report Query 1
Scan 1 IP Scan 1
Network monitoring Monitored IPs Depends on plan

Constraints and Limitations

Operational Boundaries

  • Rate limited to 1 request per second
  • Scan results not immediate (asynchronous)
  • Cannot re-scan same IP within 24 hours (non-Enterprise)
  • Free accounts have limited credits
  • Some data requires paid subscription

Data Freshness

  • Shodan crawls continuously but data may be days/weeks old
  • On-demand scans provide current data but cost credits
  • Historical data available with paid plans

Examples

Example 1: Organization Reconnaissance

# Find all hosts belonging to target organization
shodan search 'org:"Target Company"'

# Get statistics on their infrastructure
shodan stats --facets port,product,country 'org:"Target Company"'

# Download detailed data
shodan download target_data.json.gz 'org:"Target Company"'

# Parse for specific info
shodan parse --fields ip_str,port,product target_data.json.gz

Example 2: Vulnerable Service Discovery

# Find hosts vulnerable to BlueKeep (RDP CVE)
shodan search 'vuln:CVE-2019-0708 country:US'

# Find exposed Elasticsearch with no auth
shodan search 'product:elastic port:9200 -authentication'

# Find Log4j vulnerable systems
shodan search 'vuln:CVE-2021-44228'

Example 3: IoT Device Discovery

# Find exposed webcams
shodan search 'webcam has_screenshot:true country:US'

# Find industrial control systems
shodan search 'port:502 product:modbus'

# Find exposed printers
shodan search '"HP-ChaiSOE" port:80'

# Find smart home devices
shodan search 'product:nest'

Example 4: SSL/TLS Certificate Analysis

# Find hosts with specific SSL cert
shodan search 'ssl.cert.subject.cn:*.example.com'

# Find expired certificates
shodan search 'ssl.cert.expired:true org:"Company"'

# Find self-signed certificates
shodan search 'ssl.cert.issuer.cn:self-signed'

Example 5: Python Automation Script

#!/usr/bin/env python3
import shodan
import json
import os

API_KEY = os.environ["SHODAN_API_KEY"]
api = shodan.Shodan(API_KEY)

def recon_organization(org_name):
    """Perform reconnaissance on an organization"""
    try:
        # Search for organization
        query = f'org:"{org_name}"'
        results = api.search(query)
        
        print(f"[*] Found {results['total']} hosts for {org_name}")
        
        # Collect unique IPs and ports
        hosts = {}
        for result in results['matches']:
            ip = result['ip_str']
            port = result['port']
            product = result.get('product', 'unknown')
            
            if ip not in hosts:
                hosts[ip] = []
            hosts[ip].append({'port': port, 'product': product})
        
        # Output findings
        for ip, services in hosts.items():
            print(f"\n[+] {ip}")
            for svc in services:
                print(f"    - {svc['port']}/tcp ({svc['product']})")
        
        return hosts
        
    except shodan.APIError as e:
        print(f"Error: {e}")
        return None

if __name__ == '__main__':
    recon_organization("Target Company")

Example 6: Network Range Assessment

# Scan a /24 network range
shodan search 'net:192.168.1.0/24'

# Get port distribution
shodan stats --facets port 'net:192.168.1.0/24'

# Find specific vulnerabilities in range
shodan search 'net:192.168.1.0/24 vuln:CVE-2021-44228'

# Export all data for range
shodan download network_scan.json.gz 'net:192.168.1.0/24'

Troubleshooting

Issue Cause Solution
No API Key Configured Key not initialized Run shodan init YOUR_API_KEY then verify with shodan info
Query Credits Exhausted Monthly credits consumed Use credit-free queries (no filters), wait for reset, or upgrade
Host Recently Crawled Cannot re-scan IP within 24h Use shodan host IP for existing data, or wait 24 hours
Rate Limit Exceeded >1 request/second Add time.sleep(1) between API requests
Empty Search Results Too specific or syntax error Use quotes for phrases: 'org:"Company Name"'; broaden criteria
Downloaded File Won't Parse Corrupted or wrong format Verify with gunzip -t file.gz, re-download with --limit

When to Use

This skill is applicable to execute the workflow or actions described in the overview.

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.