---
name: shodan
description: "Shodan lookups: internet-connected devices, ports, services"
category: security
version: 1.0.0
license: Apache-2.0
origin: aiden
tags: security, shodan, osint, recon, ports, services, iot, asset-discovery, cve, infosec
env_required:
  - SHODAN_API_KEY
---

# Shodan — Internet Device Search

Shodan indexes internet-connected devices and exposes metadata: open ports, running services, banners, TLS certificates, and known CVEs. Use it for security audits, reconnaissance, and asset discovery.

**Requires:** `SHODAN_API_KEY` — free tier at https://account.shodan.io (1 req/sec, 100 queries/month).

## When to Use

- User wants to know what ports/services are exposed on a specific IP
- User wants to find vulnerable systems of a specific type (e.g. exposed databases)
- User is doing a security audit and needs external exposure info
- User asks "what does Shodan show for IP X" or "find exposed Redis servers"
- Asset discovery: find all internet-exposed assets for a company/ASN

## How to Use

### Look up a specific IP address

```powershell
$ip  = "8.8.8.8"
$key = $env:SHODAN_API_KEY
$url = "https://api.shodan.io/shodan/host/${ip}?key=${key}"

$host = Invoke-RestMethod -Uri $url
Write-Host "IP:           $($host.ip_str)"
Write-Host "Organization: $($host.org)"
Write-Host "OS:           $($host.os)"
Write-Host "Country:      $($host.country_name)"
Write-Host "Open ports:   $($host.ports -join ', ')"
Write-Host ""
Write-Host "Services:"
$host.data | ForEach-Object {
    Write-Host "  Port $($_.port)/$($_.transport) — $($_.product) $($_.version)"
}
```

### Search for exposed services by query

```powershell
$query = [Uri]::EscapeDataString("port:27017 product:MongoDB")
$key   = $env:SHODAN_API_KEY
$url   = "https://api.shodan.io/shodan/host/search?query=${query}&key=${key}"

$results = Invoke-RestMethod -Uri $url
Write-Host "Total results: $($results.total)"
$results.matches | Select-Object -First 10 | ForEach-Object {
    Write-Host "  $($_.ip_str):$($_.port) — $($_.org) ($($_.location.country_name))"
}
```

### Find CVEs on a host

```powershell
$ip   = "TARGET_IP"
$key  = $env:SHODAN_API_KEY
$host = Invoke-RestMethod -Uri "https://api.shodan.io/shodan/host/${ip}?key=${key}"

if ($host.vulns) {
    Write-Host "CVEs found on ${ip}:"
    $host.vulns.PSObject.Properties | ForEach-Object { Write-Host "  $($_.Name)" }
} else {
    Write-Host "No known CVEs found for ${ip}"
}
```

### Useful Shodan search filters

```
port:22 country:IN                  SSH servers in India
product:nginx version:1.14          Specific nginx version
org:"Amazon"                        Amazon-owned IPs
ssl.cert.subject.cn:*.example.com   Certs for a domain
http.title:"Dashboard" port:80      Web dashboards on port 80
vuln:CVE-2021-44228                 Log4Shell vulnerable hosts
```

## Examples

**"What is exposed on IP 1.2.3.4?"**
→ Use the host lookup. Shows open ports, services, OS.

**"Find all MongoDB servers with no auth"**
→ Query: `port:27017 product:MongoDB -authentication`

**"Search for Apache servers in India"**
→ Query: `product:Apache country:IN`

**"Does this IP have any known CVEs?"**
→ Use the CVE snippet above on the target IP.

## Cautions

- Free tier: 100 queries/month and 1 request/second — add `Start-Sleep -Milliseconds 1100` between bulk calls
- Shodan data is cached — it reflects the last scan date, not necessarily the current state
- Host lookups and scans data about publicly reachable services only — no active scanning is performed by this skill
- Never use Shodan results to attempt unauthorized access; this skill is for reconnaissance and awareness only
- The `vulns` field only appears when Shodan has matched CVE data to the service banner

## Requirements

- `SHODAN_API_KEY` — free account at https://account.shodan.io
