shodanx

Gem Version Build Status Coverage Status

Yet another Shodan API wrapper for Ruby.

Note: This is a fork version of shodanz.

Why I forked

I need a Shodan API wrapper which:

  • works on Ruby 2.6.
  • only needs minimum dependencies. (This gem needs no dependencies to run)
  • is well tested.

Installation

gem install shodanx

Usage

require "shodan"

# when given nothing, it tries to load your API key from ENV["SHODAN_API_KEY"]
api = Shodan::API.new
# or you can set it manually
api = Shodan::API.new(key: "YOUR_API_KEY")

# Shodan Search Methods
api.host.get_by_ip("104.25.89.97")
api.host.count("nginx")
api.host.count("nginx", facets: { country: 10 })
api.host.search("nginx")
api.host.search("ftp", port: 21, facets: { country: 10 })
api.host.tokens("nginx")
api.ports

# Shodan On-Demand Scanning
api.protocols
api.scan.crawl("1.1.1.1")
api.scan.get_by_id("SCAN_ID")

# Shodan Network Alerts
api.alert.get_by_id("ALERT_ID")
api.alert.info
api.alert.triggers
api.alert.create(name: "Test alert", ip: "198.20.88.0/24")
api.alert.delete_by_id("ALERT_ID")

# Shodan Directory Methods
api.query.list
api.query.search("nginx")
api.query.tags

# Account Methods
api..profile

# DNS Methods
api.dns.resolve("google.com")
api.dns.reverse("1.1.1.1")

# Utility Methods
api.tools.http_headers
api.tools.my_ip

# API Status Methods
api.info

# Experimental Methods
api.labs.honeyscore("1.1.1.1")

# Shodan Exploits Methods
api.exploits.search("python")
api.exploits.count("python")

See /spec for more.

Supported API endpoints

REST API

Method URI API method
GET /shodan/host/ip api.host.get_by_ip(ip, **params)
GET /shodan/host/count api.host.count(query = "", facets: {}, **params)
GET /shodan/host/search api.host.search(query = "", facets: {}, page: 1, minify: true, **params)
GET /shodan/host/search/tokens api.host.tokens(query = "", **params)
GET /shodan/ports api.ports
GET /shodan/protocols api.protocols
POST /shodan/scan api.scan.crawl(*ips)
POST /shodan/scan/internet api.scan.crawl_for(**params)
GET /shodan/scan/id api.scan.get_by_id(id)
POST /shodan/alert api.alert.create(name:, ip:)
GET /shodan/alert/id/info api.alert.get_by_id(id)
DELETE /shodan/alert/id api.alert.delete_by_id(id)
GET /shodan/alert/info api.alert.info
GET /shodan/alert/triggers api.alert.triggers
PUT /shodan/alert/id/trigger/trigger N/A
DELETE /shodan/alert/id/trigger/trigger N/A
PUT /shodan/alert/id/trigger/trigger/ignore/service N/A
DELETE /shodan/alert/id/trigger/trigger/ignore/service N/A
GET /shodan/query api.query.list(**params)
GET /shodan/query/search api.query.search(query, **params)
GET /shodan/query/tags api.query.tags(size = 10)
GET /shodan/data N/A
GET /shodan/data/dataset N/A
GET /org N/A
PUT /org/member/user N/A
DELETE /org/member/user N/A
GET /account/profile api.account.profile
GET /dns/domain/domain api.dns.domain(domain)
GET /dns/resolve api.dns.resolve(**hostnames)
GET /dns/reverse api.dns.reverse(**ips)
GET /tools/httpheaders api.tools.http_headers
GET /tools/myip api.tools.my_ip
GET /api-info api.info
GET /labs/honeyscore/ip api.labs.honeyscore(ip)

Exploits API

Method URI API method
GET /search api.exploits.search(query = "", facets: {}, page: 1, **params)
GET /count api.exploits.count(query = "", facets: {}, page: 1, **params)

Streaming API

N/A

License

The gem is available as open source under the terms of the MIT License.