shodanz 2.0.6 → 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +0 -7
- data/.github/workflows/{ci.yml → test.yml} +8 -11
- data/README.md +6 -25
- data/lib/shodanz/apis/rest.rb +1 -1
- data/lib/shodanz/apis/utils.rb +10 -5
- data/lib/shodanz/version.rb +1 -1
- data/lib/shodanz.rb +2 -2
- data/shodanz.gemspec +6 -6
- metadata +19 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fce5bf7504f3db8b8457bc02bde8637ab2a2cf0ec7a39f69eba84655f11cdd59
|
|
4
|
+
data.tar.gz: 5afc67f0229d50dfbd0fa0b491595e3c104e068ffdcd994c54b3f11c08ec75a3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7e5db70e545fc72c0c3f31345cfdcaef3557440fc315a2bc04e5eb48a34cd548b7ad9b728d6f7024293b851fd2053ec7cf33d76ecb09f885e240ab65beb3a6a7
|
|
7
|
+
data.tar.gz: 82be13e3b3cc62d3f406b10fff566d6e7596065d041c93efb8542a52d202267ed75673a200c6883bb5686779c978bcb89bd372b1aea19cc80d18de3a17402a1f
|
data/.github/dependabot.yml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name:
|
|
1
|
+
name: Test
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
@@ -11,23 +11,20 @@ on:
|
|
|
11
11
|
- cron: "0 9 * * *"
|
|
12
12
|
|
|
13
13
|
jobs:
|
|
14
|
-
|
|
14
|
+
rspec:
|
|
15
15
|
if: |
|
|
16
16
|
github.actor == 'picatz' ||
|
|
17
17
|
github.actor == 'dependabot[bot]' ||
|
|
18
18
|
github.actor == 'dependabot-preview[bot]'
|
|
19
19
|
runs-on: ubuntu-latest
|
|
20
20
|
steps:
|
|
21
|
-
- uses: actions/checkout@
|
|
22
|
-
-
|
|
23
|
-
uses: actions/setup-ruby@v1
|
|
21
|
+
- uses: actions/checkout@v3
|
|
22
|
+
- uses: ruby/setup-ruby@v1
|
|
24
23
|
with:
|
|
25
|
-
ruby-version: 2
|
|
26
|
-
|
|
24
|
+
ruby-version: '3.2'
|
|
25
|
+
bundler-cache: true
|
|
26
|
+
- name: RSpec
|
|
27
27
|
env:
|
|
28
28
|
SHODAN_API_KEY: ${{secrets.SHODAN_API_KEY}}
|
|
29
29
|
run: |
|
|
30
|
-
|
|
31
|
-
bundle _2.2.33_ install --jobs 4 --retry 3
|
|
32
|
-
bundle exec rspec
|
|
33
|
-
|
|
30
|
+
bundle exec rake
|
data/README.md
CHANGED
|
@@ -9,6 +9,7 @@ A modern, async Ruby [gem](https://rubygems.org/) for [Shodan](https://www.shoda
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
11
11
|
$ gem install shodanz
|
|
12
|
+
|
|
12
13
|
## Usage
|
|
13
14
|
|
|
14
15
|
```ruby
|
|
@@ -16,36 +17,16 @@ require "shodanz"
|
|
|
16
17
|
|
|
17
18
|
client = Shodanz.client.new(key: "YOUR_API_KEY")
|
|
18
19
|
```
|
|
19
|
-
|
|
20
|
+
|
|
21
|
+
> **Note**
|
|
22
|
+
> You can also set the `SHODAN_API_KEY` environment variable instead of passing the API key as an argument when creating a client.
|
|
20
23
|
|
|
21
24
|
### Optional Async Support
|
|
22
25
|
|
|
23
26
|
Shodanz utilizes [async](https://github.com/socketry/async) to provide asyncronous IO. This doesn't break any existing scripts using Shodanz, but now offers even more flexibility to write more awesome things, like this asyncronous honeypot detector:
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
require 'shodanz'
|
|
28
|
-
|
|
29
|
-
client = Shodanz.client.new
|
|
30
|
-
|
|
31
|
-
# Asynchronously stream banner info from shodan and check any
|
|
32
|
-
# IP addresses against the experimental honeypot scoring service.
|
|
33
|
-
client.streaming_api.banners do |banner|
|
|
34
|
-
if ip = banner['ip_str']
|
|
35
|
-
Async do
|
|
36
|
-
score = client.rest_api.honeypot_score(ip).wait
|
|
37
|
-
puts "#{ip} has a #{score * 100}% chance of being a honeypot"
|
|
38
|
-
rescue Shodanz::Errors::RateLimited
|
|
39
|
-
sleep rand
|
|
40
|
-
retry
|
|
41
|
-
rescue # any other errors
|
|
42
|
-
next
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
> **Note:** To run any Shodanz method asyncronously, simply wrap it in a `Async { ... }` block. To wait for any other async operation to finnish in the block, call `.wait` on it.
|
|
28
|
+
> **Note**
|
|
29
|
+
> To run any Shodanz method asyncronously, simply wrap it in a `Async { ... }` block. To wait for any other async operation to finnish in the block, call `.wait` on it.
|
|
49
30
|
|
|
50
31
|
## REST API
|
|
51
32
|
|
data/lib/shodanz/apis/rest.rb
CHANGED
|
@@ -108,7 +108,7 @@ module Shodanz
|
|
|
108
108
|
#
|
|
109
109
|
# IP, IPs or netblocks (in CIDR notation) that should get crawled.
|
|
110
110
|
def scan(*ips)
|
|
111
|
-
post('shodan/scan', ips: ips.join(','))
|
|
111
|
+
post('shodan/scan', body: {ips: ips.join(',')})
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
# Use this method to request Shodan to crawl the Internet for a specific port.
|
data/lib/shodanz/apis/utils.rb
CHANGED
|
@@ -107,20 +107,25 @@ module Shodanz
|
|
|
107
107
|
resp&.close
|
|
108
108
|
end
|
|
109
109
|
|
|
110
|
-
def poster(path,
|
|
110
|
+
def poster(path, params: nil, body: nil)
|
|
111
111
|
# param keys should all be strings
|
|
112
112
|
params = params.transform_keys(&:to_s)
|
|
113
113
|
# and the key param is constant
|
|
114
114
|
params["key"] = @key
|
|
115
115
|
# encode as a URL string
|
|
116
116
|
params = URI.encode_www_form(params)
|
|
117
|
-
# optional JSON body string
|
|
118
|
-
json_body = body.nil? ? nil : JSON.dump(body)
|
|
119
117
|
# build URL path
|
|
120
|
-
path = "/#{path}?#{params}"
|
|
118
|
+
path = "/#{path}?#{params}"
|
|
119
|
+
|
|
120
|
+
headers = nil
|
|
121
|
+
|
|
122
|
+
if body
|
|
123
|
+
body = URI.encode_www_form(body)
|
|
124
|
+
headers = [['Content-Type', 'application/x-www-form-urlencoded']]
|
|
125
|
+
end
|
|
121
126
|
|
|
122
127
|
# make POST request to server
|
|
123
|
-
resp = @client.post(path,
|
|
128
|
+
resp = @client.post(path, headers, body)
|
|
124
129
|
|
|
125
130
|
if resp.success?
|
|
126
131
|
json = JSON.parse(resp.body.join)
|
data/lib/shodanz/version.rb
CHANGED
data/lib/shodanz.rb
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
require 'json'
|
|
4
4
|
require 'async'
|
|
5
|
+
require 'console'
|
|
5
6
|
require 'async/http/internet'
|
|
6
7
|
require 'shodanz/version'
|
|
7
8
|
require 'shodanz/errors'
|
|
8
9
|
require 'shodanz/api'
|
|
9
10
|
require 'shodanz/client'
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
Async.logger.level = 4
|
|
12
|
+
Console.logger.level = 4
|
|
13
13
|
|
|
14
14
|
# Shodanz is a modern Ruby gem for Shodan, the world's
|
|
15
15
|
# first search engine for Internet-connected devices.
|
data/shodanz.gemspec
CHANGED
|
@@ -20,13 +20,13 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
end
|
|
21
21
|
spec.require_paths = ['lib']
|
|
22
22
|
|
|
23
|
-
spec.add_dependency 'async-http', '>= 0.38.1', '< 0.
|
|
24
|
-
spec.add_dependency 'async', '>= 1.17.1', '< 2.
|
|
23
|
+
spec.add_dependency 'async-http', '>= 0.38.1', '< 0.62.0'
|
|
24
|
+
spec.add_dependency 'async', '>= 1.17.1', '< 2.7.0'
|
|
25
25
|
|
|
26
|
-
spec.add_development_dependency 'async-rspec', '~> 1.
|
|
27
|
-
spec.add_development_dependency 'bundler', '~> 2.
|
|
26
|
+
spec.add_development_dependency 'async-rspec', '~> 1.17.0'
|
|
27
|
+
spec.add_development_dependency 'bundler', '~> 2.4.0'
|
|
28
28
|
spec.add_development_dependency 'pry', '~> 0.14.1'
|
|
29
|
-
spec.add_development_dependency 'rake', '~> 13.
|
|
29
|
+
spec.add_development_dependency 'rake', '~> 13.1.0'
|
|
30
30
|
spec.add_development_dependency 'rb-readline', '~> 0.5.5'
|
|
31
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
|
31
|
+
spec.add_development_dependency 'rspec', '~> 3.12.0'
|
|
32
32
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: shodanz
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kent 'picatz' Gruber
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-12-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: async-http
|
|
@@ -19,7 +19,7 @@ dependencies:
|
|
|
19
19
|
version: 0.38.1
|
|
20
20
|
- - "<"
|
|
21
21
|
- !ruby/object:Gem::Version
|
|
22
|
-
version: 0.
|
|
22
|
+
version: 0.62.0
|
|
23
23
|
type: :runtime
|
|
24
24
|
prerelease: false
|
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -29,7 +29,7 @@ dependencies:
|
|
|
29
29
|
version: 0.38.1
|
|
30
30
|
- - "<"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 0.
|
|
32
|
+
version: 0.62.0
|
|
33
33
|
- !ruby/object:Gem::Dependency
|
|
34
34
|
name: async
|
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -39,7 +39,7 @@ dependencies:
|
|
|
39
39
|
version: 1.17.1
|
|
40
40
|
- - "<"
|
|
41
41
|
- !ruby/object:Gem::Version
|
|
42
|
-
version: 2.
|
|
42
|
+
version: 2.7.0
|
|
43
43
|
type: :runtime
|
|
44
44
|
prerelease: false
|
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -49,35 +49,35 @@ dependencies:
|
|
|
49
49
|
version: 1.17.1
|
|
50
50
|
- - "<"
|
|
51
51
|
- !ruby/object:Gem::Version
|
|
52
|
-
version: 2.
|
|
52
|
+
version: 2.7.0
|
|
53
53
|
- !ruby/object:Gem::Dependency
|
|
54
54
|
name: async-rspec
|
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
|
56
56
|
requirements:
|
|
57
57
|
- - "~>"
|
|
58
58
|
- !ruby/object:Gem::Version
|
|
59
|
-
version: 1.
|
|
59
|
+
version: 1.17.0
|
|
60
60
|
type: :development
|
|
61
61
|
prerelease: false
|
|
62
62
|
version_requirements: !ruby/object:Gem::Requirement
|
|
63
63
|
requirements:
|
|
64
64
|
- - "~>"
|
|
65
65
|
- !ruby/object:Gem::Version
|
|
66
|
-
version: 1.
|
|
66
|
+
version: 1.17.0
|
|
67
67
|
- !ruby/object:Gem::Dependency
|
|
68
68
|
name: bundler
|
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
|
70
70
|
requirements:
|
|
71
71
|
- - "~>"
|
|
72
72
|
- !ruby/object:Gem::Version
|
|
73
|
-
version: 2.
|
|
73
|
+
version: 2.4.0
|
|
74
74
|
type: :development
|
|
75
75
|
prerelease: false
|
|
76
76
|
version_requirements: !ruby/object:Gem::Requirement
|
|
77
77
|
requirements:
|
|
78
78
|
- - "~>"
|
|
79
79
|
- !ruby/object:Gem::Version
|
|
80
|
-
version: 2.
|
|
80
|
+
version: 2.4.0
|
|
81
81
|
- !ruby/object:Gem::Dependency
|
|
82
82
|
name: pry
|
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -98,14 +98,14 @@ dependencies:
|
|
|
98
98
|
requirements:
|
|
99
99
|
- - "~>"
|
|
100
100
|
- !ruby/object:Gem::Version
|
|
101
|
-
version: 13.
|
|
101
|
+
version: 13.1.0
|
|
102
102
|
type: :development
|
|
103
103
|
prerelease: false
|
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
|
105
105
|
requirements:
|
|
106
106
|
- - "~>"
|
|
107
107
|
- !ruby/object:Gem::Version
|
|
108
|
-
version: 13.
|
|
108
|
+
version: 13.1.0
|
|
109
109
|
- !ruby/object:Gem::Dependency
|
|
110
110
|
name: rb-readline
|
|
111
111
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -126,14 +126,14 @@ dependencies:
|
|
|
126
126
|
requirements:
|
|
127
127
|
- - "~>"
|
|
128
128
|
- !ruby/object:Gem::Version
|
|
129
|
-
version: 3.
|
|
129
|
+
version: 3.12.0
|
|
130
130
|
type: :development
|
|
131
131
|
prerelease: false
|
|
132
132
|
version_requirements: !ruby/object:Gem::Requirement
|
|
133
133
|
requirements:
|
|
134
134
|
- - "~>"
|
|
135
135
|
- !ruby/object:Gem::Version
|
|
136
|
-
version: 3.
|
|
136
|
+
version: 3.12.0
|
|
137
137
|
description: Featuring full support for the REST, Streaming and Exploits API
|
|
138
138
|
email:
|
|
139
139
|
- kgruber1@emich.edu
|
|
@@ -142,7 +142,7 @@ extensions: []
|
|
|
142
142
|
extra_rdoc_files: []
|
|
143
143
|
files:
|
|
144
144
|
- ".github/dependabot.yml"
|
|
145
|
-
- ".github/workflows/
|
|
145
|
+
- ".github/workflows/test.yml"
|
|
146
146
|
- ".gitignore"
|
|
147
147
|
- ".rspec"
|
|
148
148
|
- CODE_OF_CONDUCT.md
|
|
@@ -171,7 +171,7 @@ homepage: https://github.com/picatz/shodanz
|
|
|
171
171
|
licenses:
|
|
172
172
|
- MIT
|
|
173
173
|
metadata: {}
|
|
174
|
-
post_install_message:
|
|
174
|
+
post_install_message:
|
|
175
175
|
rdoc_options: []
|
|
176
176
|
require_paths:
|
|
177
177
|
- lib
|
|
@@ -186,8 +186,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
186
186
|
- !ruby/object:Gem::Version
|
|
187
187
|
version: '0'
|
|
188
188
|
requirements: []
|
|
189
|
-
rubygems_version: 3.
|
|
190
|
-
signing_key:
|
|
189
|
+
rubygems_version: 3.4.10
|
|
190
|
+
signing_key:
|
|
191
191
|
specification_version: 4
|
|
192
192
|
summary: A modern, async Ruby gem for Shodan, the world's first search engine for
|
|
193
193
|
Internet-connected devices.
|