apullo 0.1.2 → 0.1.3
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/apullo.gemspec +0 -1
- data/lib/apullo/cli.rb +7 -4
- data/lib/apullo/fingerprints/favicon.rb +1 -1
- data/lib/apullo/fingerprints/http.rb +27 -4
- data/lib/apullo/version.rb +1 -1
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0827cde956b63c66bd88b8c6a37597626f355cd677a701e6590ab5996011c21
|
4
|
+
data.tar.gz: bb53dfba7e8297f85b3992a54efa8546e2d815247443430134bfbd1b15963acd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53469022402714f62e9561da863f35e0bf5032b29d7ec2754224d04b5dc44e40615d4f3fee980d23c8e60a3a27b84388561f3f00e7b14ab816e79aec63ec7acb
|
7
|
+
data.tar.gz: c67723532f368589ee043c700fa4fb3cc5a6dd500bdbbe29244f5a3f2c992a64181c08d7531c2ef2315c0b4854fa109052485ab81b64c9de09e845f369945f88
|
data/apullo.gemspec
CHANGED
@@ -36,7 +36,6 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_dependency "mem", "~> 0.1"
|
37
37
|
spec.add_dependency "murmurhash3", "~> 0.1"
|
38
38
|
spec.add_dependency "oga", "~> 2.15"
|
39
|
-
spec.add_dependency "parallel", "~> 1.18"
|
40
39
|
spec.add_dependency "public_suffix", "~> 4.0"
|
41
40
|
spec.add_dependency "ssh_scan", "~> 0.0"
|
42
41
|
spec.add_dependency "thor", "~> 0.20"
|
data/lib/apullo/cli.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "json"
|
4
|
-
require "parallel"
|
5
4
|
require "thor"
|
6
5
|
|
7
6
|
module Apullo
|
8
7
|
class CLI < Thor
|
9
8
|
desc "check [Target]", "Take fingerprints from a target(IP, domain or URL)"
|
9
|
+
method_option :headers, type: :hash, default: {}
|
10
10
|
def check(target)
|
11
11
|
target = Target.new(target)
|
12
|
+
headers = options["headers"]
|
12
13
|
|
13
|
-
results = build_results(target)
|
14
|
+
results = build_results(target, headers: headers)
|
14
15
|
meta = { target: target.id }
|
15
16
|
results = results.merge(meta: meta)
|
16
17
|
|
@@ -18,15 +19,17 @@ module Apullo
|
|
18
19
|
end
|
19
20
|
|
20
21
|
no_commands do
|
21
|
-
def build_results(target)
|
22
|
+
def build_results(target, headers: {})
|
22
23
|
unless target.valid?
|
23
24
|
return {
|
24
25
|
error: "Invalid target is given. Target should be an IP, domain or URL."
|
25
26
|
}
|
26
27
|
end
|
27
28
|
|
28
|
-
|
29
|
+
Apullo.fingerprints.map do |klass|
|
29
30
|
fingerprint = klass.new(target)
|
31
|
+
fingerprint.headers = headers if fingerprint.respond_to?(:headers=)
|
32
|
+
|
30
33
|
[fingerprint.name, fingerprint.results]
|
31
34
|
end.to_h
|
32
35
|
end
|
@@ -48,7 +48,7 @@ module Apullo
|
|
48
48
|
response = http.request(request)
|
49
49
|
|
50
50
|
response.code.to_i == 200 ? response.body : nil
|
51
|
-
rescue Errno::ECONNREFUSED, Net::HTTPError, OpenSSL::OpenSSLError => _e
|
51
|
+
rescue Errno::ECONNREFUSED, Net::HTTPError, OpenSSL::OpenSSLError, Timeout::Error => _e
|
52
52
|
nil
|
53
53
|
end
|
54
54
|
|
@@ -7,6 +7,13 @@ require "openssl"
|
|
7
7
|
module Apullo
|
8
8
|
module Fingerprint
|
9
9
|
class HTTP < Base
|
10
|
+
attr_writer :headers
|
11
|
+
|
12
|
+
def initialize(target)
|
13
|
+
@target = target
|
14
|
+
@headers = {}
|
15
|
+
end
|
16
|
+
|
10
17
|
def results
|
11
18
|
@results ||= [].tap do |out|
|
12
19
|
get(target.uri.path)
|
@@ -14,7 +21,10 @@ module Apullo
|
|
14
21
|
out << {
|
15
22
|
body: body,
|
16
23
|
cert: cert,
|
17
|
-
favicon: favicon
|
24
|
+
favicon: favicon,
|
25
|
+
meta: {
|
26
|
+
url: target.url
|
27
|
+
}
|
18
28
|
}
|
19
29
|
end.first
|
20
30
|
end
|
@@ -53,6 +63,10 @@ module Apullo
|
|
53
63
|
|
54
64
|
private
|
55
65
|
|
66
|
+
def headers
|
67
|
+
@headers.compact
|
68
|
+
end
|
69
|
+
|
56
70
|
def default_favicon_url
|
57
71
|
"#{target.uri.scheme}://#{target.uri.host}:#{target.uri.port}/favicon.ico"
|
58
72
|
end
|
@@ -73,18 +87,23 @@ module Apullo
|
|
73
87
|
def get(path, limit: 3)
|
74
88
|
http = build_http
|
75
89
|
path = path.empty? ? "/" : path
|
76
|
-
request = Net::HTTP::Get.new(path)
|
90
|
+
request = Net::HTTP::Get.new(path, headers)
|
77
91
|
response = http.request request
|
78
92
|
|
79
93
|
location = response["Location"]
|
80
94
|
if location && limit.positive?
|
81
|
-
|
95
|
+
if location.start_with?("http://", "https://")
|
96
|
+
rebuild_target location
|
97
|
+
get(target.uri.path)
|
98
|
+
else
|
99
|
+
get(location, limit: limit - 1)
|
100
|
+
end
|
82
101
|
else
|
83
102
|
@peer_cert = http.peer_cert
|
84
103
|
@body = response.body
|
85
104
|
@path = path
|
86
105
|
end
|
87
|
-
rescue Errno::ECONNREFUSED, Net::HTTPError, OpenSSL::OpenSSLError => _e
|
106
|
+
rescue Errno::ECONNREFUSED, Net::HTTPError, OpenSSL::OpenSSLError, Timeout::Error => _e
|
88
107
|
nil
|
89
108
|
end
|
90
109
|
|
@@ -95,6 +114,10 @@ module Apullo
|
|
95
114
|
Net::HTTP.start(target.uri.host, target.uri.port, use_ssl: true)
|
96
115
|
end
|
97
116
|
end
|
117
|
+
|
118
|
+
def rebuild_target(url)
|
119
|
+
@target = Target.new(url)
|
120
|
+
end
|
98
121
|
end
|
99
122
|
end
|
100
123
|
end
|
data/lib/apullo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apullo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manabu Niseki
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-11-
|
11
|
+
date: 2019-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -164,20 +164,6 @@ dependencies:
|
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '2.15'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: parallel
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - "~>"
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '1.18'
|
174
|
-
type: :runtime
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - "~>"
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: '1.18'
|
181
167
|
- !ruby/object:Gem::Dependency
|
182
168
|
name: public_suffix
|
183
169
|
requirement: !ruby/object:Gem::Requirement
|