• Stars
    star
    209
  • Rank 182,669 (Top 4 %)
  • Language
    Go
  • License
    MIT License
  • Created over 8 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Shodan API client

go-shodan

msisdn CI GoDoc MIT License Go Report Card

To start working with Shodan you have to get your token first. You can do this at https://www.shodan.io.

Usage

The import path depends on whether you use go modules:

import "github.com/ns3777k/go-shodan/v4/shodan"	// with go modules enabled (GO111MODULE=on or outside GOPATH)
import "github.com/ns3777k/go-shodan/shodan" // with go modules disabled

Simple example of resolving hostnames:

package main

import (
	"log"
	"context"

	"github.com/ns3777k/go-shodan/v4/shodan" // go modules required
)

func main() {
	client := shodan.NewEnvClient(nil)
	dns, err := client.GetDNSResolve(context.Background(), []string{"google.com", "ya.ru"})

	if err != nil {
		log.Panic(err)
	} else {
		log.Println(dns["google.com"])
	}
}

Output for above:

2015/09/05 18:50:52 173.194.115.35

Streaming example:

package main

import (
	"log"
	"context"

	"github.com/ns3777k/go-shodan/v4/shodan" // go modules required
)

func main() {
	client := shodan.NewEnvClient(nil)
	ch := make(chan *shodan.HostData)
	err := client.GetBannersByASN(context.Background(), []string{"3303", "32475"}, ch)
	if err != nil {
		panic(err)
	}

	for {
		banner, ok := <-ch

		if !ok {
			log.Println("channel was closed")
			break
		}

		log.Println(banner.Product)
	}
}

Tips and tricks

Every method accepts context in the first argument so you can easily cancel any request.

You can also use SetDebug(true) to see the actual request data (method, url, body).

Implemented REST API

Search Methods

  • /shodan/host/{ip}
  • /shodan/host/count
  • /shodan/host/search
  • /shodan/host/search/facets
  • /shodan/host/search/filters
  • /shodan/host/search/tokens
  • /shodan/ports

On-Demand Scanning

  • /shodan/protocols
  • /shodan/scan
  • /shodan/scan/internet
  • /shodan/scan/{id}

Network Alerts

  • /shodan/alert
  • /shodan/alert/{id}/info
  • /shodan/alert/{id}
  • /shodan/alert/info
  • /shodan/alert/triggers
  • /shodan/alert/{id}/notifier/{notifier_id}
  • /shodan/alert/{id}/trigger/{trigger}
  • /shodan/alert/{id}/trigger/{trigger}/ignore/{service}

Notifiers

  • /notifier
  • /notifier/provider
  • /notifier/{id}

Directory Methods

  • /shodan/query
  • /shodan/query/search
  • /shodan/query/tags

Account Methods

  • /account/profile

DNS Methods

  • /dns/resolve
  • /dns/reverse
  • /dns/domain/{domain}

Bulk Data

  • /shodan/data
  • /shodan/data/{dataset}

Manage Organization

  • /org
  • /org/member/{user}

Utility Methods

  • /tools/httpheaders
  • /tools/myip

API Status Methods

  • /api-info

Experimental Methods

  • /labs/honeyscore/{ip}

Exploits

  • /search
  • /count

Implemented Streaming API

Data Streams

  • /shodan/banners
  • /shodan/asn/{asn}
  • /shodan/countries/{countries}
  • /shodan/ports/{ports}

Network Alerts

  • /shodan/alert
  • /shodan/alert/{id}

Implemented GeoNet API

  • /api/ping/{ip}
  • /api/geoping/{ip}
  • /api/dns/{hostname}
  • /api/geodns/{hostname}

If a method is absent or something doesn't work properly don't hesitate to create an issue.

Links