Shodan Ingester#

The Shodan Ingester collects data the Shodan Streaming API. It supports both the “full firehose” banners API, which includes all data that Shodan collects, and the “alerts” API, which is a filtered form of the banners API.

More information on the structure of the Shodan Streaming API can be found here.

A Shodan entry is a JSON-formatted record containing the elements for a single Shodan collection event. For example (taken from the Shodan API website):

{
    "_shodan": {
        "id": "7383056c-d513-4b43-8734-b82d897888e6",
        "options": {},
        "ptr": true,
        "module": "dns-udp",
        "crawler": "9d8ac08f91f51fa9017965712c8fdabb4211dee4"
    },
    "hash": -553166942,
    "os": null,
    "opts": {
        "raw": "34ef818200010000000000000776657273696f6e0462696e640000100003"
    },
    "ip": 134744072,
    "isp": "Google",
    "port": 53,
    "hostnames": [
        "dns.google"
    ],
    "location": {
        "city": null,
        "region_code": null,
        "area_code": null,
        "longitude": -97.822,
        "country_code3": null,
        "country_name": "United States",
        "postal_code": null,
        "dma_code": null,
        "country_code": "US",
        "latitude": 37.751
    },
    "dns": {
        "resolver_hostname": null,
        "recursive": true,
        "resolver_id": null,
        "software": null
    },
    "timestamp": "2021-01-28T07:21:33.444507",
    "domains": [
        "dns.google"
    ],
    "org": "Google",
    "data": "\nRecursion: enabled",
    "asn": "AS15169",
    "transport": "udp",
    "ip_str": "8.8.8.8"
}

More information about the Shodan Record format is available at the Shodan datapedia site.

Installation#

To install the Debian package, make sure the Gravwell Debian repository is configured as described in the quickstart. Then run the following command as root:

apt update && apt install gravwell-shodan

To install via the standalone shell installer, download the installer from the downloads page, then run the following command as root, replacing X.X.X with the appropriate version:

bash gravwell_shodan_installer_X.X.X.sh

Basic Configuration#

The Shodan ingester uses the unified global configuration block described in the ingester section. Like most other Gravwell ingesters, the Shodan ingester supports multiple upstream indexers, TLS, cleartext, and named pipe connections, a local cache, and local logging.

The configuration file is at /opt/gravwell/etc/shodan_ingest.conf. The ingester will also read configuration snippets from its configuration overlay directory (/opt/gravwell/etc/shodan_ingest.conf.d).

The Shodan Ingester requires a Shodan API key. Using the API key, you can configure one or more Shodan readers. For example:

[ShodanAccount "shodan"]
	API-Key=YOUR-KEY-HERE
	Tag-Name=shodan
	Module-Tags-Prefix=shodan-	# modules extracted separately will be tagged `shodan-<module>`
	Extracted-Modules=http
	Extracted-Modules=https
	Extracted-Modules=ssh
	Extract-All-Modules=false
	Full-Firehose=true		# consume the banners API instead of the alerts API.

The ShodanAccount stanza requires the API-Key and either (or both) the Tag-Name and Module-Tags-Prefix fields. All others are optional. The Module-Tags-Prefix field sets the prefix for tags to be created for each type of Shodan module (for example shodan-http, shodan-dns). Additionally, you can specify which modules to extract into separate tags with one or more Extracted-Modules fields, or extract all modules with the Extract-All-Modules field.

By default, the Shodan ingester reads from the “alerts” API, which must first be setup using your API key to provide a filtered set of events to ingest. If you instead want to ingest the full firehose of Shodan events, set the Full-Firehose field to true. This will cause the Shodan Ingester to instead read from the “banners” API.