bqm 1.2.0 → 1.4.0
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/bin/bqm +50 -4
- data/data/query-sets.json +2 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a7ea69f913278933cdcbae6a764b166d7990931ce1f68c1264f3c0127f548ad
|
4
|
+
data.tar.gz: 65a2b6a2aa1e78864e48671a2f8b5e4ce395fa0eaead13ce3098806cc6391ce9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be95aaeccf71fb47aac6179e3be127d5d456fc88e4f67b1798b46dfafcf24cba0220cc6c5569fba98acbd24b9ca2f6bde71adb2604e9b0d9e2e4afeb56bb743f
|
7
|
+
data.tar.gz: c752dc0e0d790b2b9e5337d5622cf05fd5d553558d7c3cb6654829ad54d8fb88157849e4d70c5a55589327c136dd2d442a857089d244923062953ba6b3a06f83
|
data/bin/bqm
CHANGED
@@ -14,7 +14,8 @@ def find_dataset
|
|
14
14
|
raise IOError, "The dataset file #{source_file} does not exist or is unreadable."
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
# Merge remote sets defined in data/query-sets.json
|
18
|
+
def merge_remote(source)
|
18
19
|
sets = get_datasets(source)
|
19
20
|
queries = []
|
20
21
|
sets.each do |s|
|
@@ -25,6 +26,24 @@ def merge(source)
|
|
25
26
|
queries
|
26
27
|
end
|
27
28
|
|
29
|
+
# Merge local sets provided by the user
|
30
|
+
def merge_local(sources)
|
31
|
+
queries = []
|
32
|
+
sources.each do |source|
|
33
|
+
if File.file?(source) && File.readable?(source)
|
34
|
+
begin
|
35
|
+
data = JSON.load_file(source)
|
36
|
+
rescue NoMethodError # ruby 2.7 retro-compatibility
|
37
|
+
data = JSON.parse(File.read(source))
|
38
|
+
end
|
39
|
+
queries += data['queries']
|
40
|
+
else
|
41
|
+
raise IOError, "The dataset file #{source} does not exist or is unreadable."
|
42
|
+
end
|
43
|
+
end
|
44
|
+
queries
|
45
|
+
end
|
46
|
+
|
28
47
|
# Query class just for the sake of having custom comparison
|
29
48
|
class BQMquery
|
30
49
|
attr_accessor :data
|
@@ -59,7 +78,8 @@ def pretty_link(lst)
|
|
59
78
|
end
|
60
79
|
|
61
80
|
def get_datasets(source)
|
62
|
-
|
81
|
+
# ruby 3.0+
|
82
|
+
begin
|
63
83
|
src = JSON.load_file(source)
|
64
84
|
rescue NoMethodError # ruby 2.7 retro-compatibility
|
65
85
|
src = JSON.parse(File.read(source))
|
@@ -71,14 +91,20 @@ if __FILE__ == $PROGRAM_NAME
|
|
71
91
|
source = find_dataset
|
72
92
|
|
73
93
|
require 'optparse'
|
74
|
-
options = {
|
94
|
+
options = {
|
95
|
+
:'local-sets' => []
|
96
|
+
}
|
75
97
|
OptionParser.new do |parser|
|
76
98
|
parser.banner = 'Usage: bqm [options]'
|
77
99
|
|
78
100
|
parser.on('-o', '--output-path PATH', 'Path where to store the query file')
|
79
101
|
parser.on('-l', '--list', 'List available datasets')
|
102
|
+
parser.on('-i', '--local-sets FILE,...', Array, 'Local custom queries files') do |f|
|
103
|
+
options[:'local-sets'] += f
|
104
|
+
end
|
80
105
|
parser.separator ''
|
81
106
|
parser.separator 'Example: bqm -o ~/.config/bloodhound/customqueries.json'
|
107
|
+
parser.separator 'Example: bqm -o /tmp/customqueries.json -i /tmp/a.json,/tmp/b.json'
|
82
108
|
end.parse!(into: options)
|
83
109
|
|
84
110
|
out = options[:'output-path']
|
@@ -89,8 +115,28 @@ if __FILE__ == $PROGRAM_NAME
|
|
89
115
|
puts l
|
90
116
|
end
|
91
117
|
elsif out
|
118
|
+
flags = {}
|
119
|
+
flags[:merge_actual] = false
|
120
|
+
if File.file?(out) && File.readable?(out)
|
121
|
+
puts "[+] The output path #{out} already exists"
|
122
|
+
puts '[?] Do you want to overwrite it? [y/n]'
|
123
|
+
if STDIN.gets.chomp == 'y'
|
124
|
+
puts '[?] What to do with the existing queries? (merge / discard) [m/d]'
|
125
|
+
flags[:merge_actual] = true if STDIN.gets.chomp == 'm'
|
126
|
+
else
|
127
|
+
exit
|
128
|
+
end
|
129
|
+
end
|
92
130
|
puts '[+] Fetching and merging datasets'
|
93
|
-
data =
|
131
|
+
data = merge_remote(source)
|
132
|
+
local_set = options[:'local-sets']
|
133
|
+
if local_set
|
134
|
+
data += merge_local(local_set)
|
135
|
+
end
|
136
|
+
if flags[:'merge_actual']
|
137
|
+
puts '[+] Merging your existing queries'
|
138
|
+
data += JSON.parse(File.read(out))['queries']
|
139
|
+
end
|
94
140
|
puts '[+] Removing duplicates'
|
95
141
|
queries = deduplicate(data).map(&:data)
|
96
142
|
|
data/data/query-sets.json
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
"https://raw.githubusercontent.com/zeronetworks/BloodHound-Tools/main/CustomQueries/customqueries.json",
|
12
12
|
"https://raw.githubusercontent.com/egypt/customqueries/master/customqueries.json",
|
13
13
|
"https://raw.githubusercontent.com/trustedsec/CrackHound/main/customqueries.json",
|
14
|
-
"https://raw.githubusercontent.com/aress31/bloodhound-utils/main/customqueries.json"
|
14
|
+
"https://raw.githubusercontent.com/aress31/bloodhound-utils/main/customqueries.json",
|
15
|
+
"https://raw.githubusercontent.com/ThePorgs/Exegol-images/main/sources/bloodhound/customqueries.json"
|
15
16
|
]
|
16
17
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bqm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexandre ZANNI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Deduplicate custom BloudHound queries from different datasets and merge
|
14
14
|
them in one customqueries.json file.
|
@@ -26,6 +26,8 @@ licenses:
|
|
26
26
|
- MIT
|
27
27
|
metadata:
|
28
28
|
bug_tracker_uri: https://github.com/Acceis/bqm/issues
|
29
|
+
changelog_uri: https://github.com/Acceis/bqm/releases
|
30
|
+
documentation_uri: https://acceis.github.io/bqm/
|
29
31
|
homepage_uri: https://github.com/Acceis/bqm
|
30
32
|
source_code_uri: https://github.com/Acceis/bqm/
|
31
33
|
rubygems_mfa_required: 'true'
|
@@ -40,7 +42,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
40
42
|
version: 2.6.0
|
41
43
|
- - "<"
|
42
44
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
45
|
+
version: '4.0'
|
44
46
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
47
|
requirements:
|
46
48
|
- - ">="
|