pwn 0.5.453 → 0.5.454

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +4 -3
  3. data/Gemfile +2 -2
  4. data/README.md +3 -3
  5. data/bin/pwn +4 -15
  6. data/bin/pwn_android_war_dialer +1 -10
  7. data/bin/pwn_aws_describe_resources +1 -10
  8. data/bin/pwn_bdba_groups +1 -10
  9. data/bin/pwn_bdba_scan +1 -10
  10. data/bin/pwn_burp_suite_pro_active_rest_api_scan +1 -10
  11. data/bin/pwn_burp_suite_pro_active_scan +1 -10
  12. data/bin/pwn_char_base64_encoding +1 -10
  13. data/bin/pwn_char_dec_encoding +1 -10
  14. data/bin/pwn_char_hex_escaped_encoding +1 -10
  15. data/bin/pwn_char_html_entity_encoding +1 -10
  16. data/bin/pwn_char_unicode_escaped_encoding +1 -10
  17. data/bin/pwn_char_url_encoding +1 -10
  18. data/bin/pwn_crt_sh +1 -10
  19. data/bin/pwn_defectdojo_engagement_create +1 -10
  20. data/bin/pwn_defectdojo_importscan +1 -10
  21. data/bin/pwn_defectdojo_reimportscan +1 -10
  22. data/bin/pwn_diff_csv_files_w_column_exclude +1 -6
  23. data/bin/pwn_domain_reversewhois +1 -10
  24. data/bin/pwn_fuzz_net_app_proto +1 -10
  25. data/bin/pwn_gqrx_scanner +1 -10
  26. data/bin/pwn_jenkins_create_job +1 -10
  27. data/bin/pwn_jenkins_create_view +1 -10
  28. data/bin/pwn_jenkins_install_plugin +1 -10
  29. data/bin/pwn_jenkins_thinBackup_aws_s3 +1 -10
  30. data/bin/pwn_jenkins_update_plugins +1 -10
  31. data/bin/pwn_jenkins_useradd +1 -10
  32. data/bin/pwn_mail_agent +1 -10
  33. data/bin/pwn_nessus_cloud_scan_crud +1 -10
  34. data/bin/pwn_nessus_cloud_vulnscan +1 -10
  35. data/bin/pwn_nexpose +1 -10
  36. data/bin/pwn_nmap_discover_tcp_udp +1 -10
  37. data/bin/pwn_openvas_vulnscan +1 -10
  38. data/bin/pwn_pastebin_sample_filter +1 -10
  39. data/bin/pwn_phone +1 -10
  40. data/bin/pwn_rdoc_to_jsonl +5 -7
  41. data/bin/pwn_sast +1 -25
  42. data/bin/pwn_serial_check_voicemail +1 -10
  43. data/bin/pwn_serial_msr206 +4 -6
  44. data/bin/pwn_serial_son_micro_sm132_rfid +4 -6
  45. data/bin/pwn_shodan_graphql_introspection +1 -6
  46. data/bin/pwn_shodan_search +1 -10
  47. data/bin/pwn_simple_http_server +4 -5
  48. data/bin/pwn_web_cache_deception +1 -10
  49. data/bin/pwn_www_checkip +7 -5
  50. data/bin/pwn_www_uri_buster +1 -10
  51. data/bin/pwn_xss_dom_vectors +1 -10
  52. data/bin/pwn_zaproxy_active_rest_api_scan +1 -10
  53. data/bin/pwn_zaproxy_active_scan +1 -10
  54. data/lib/pwn/ai/introspection.rb +3 -1
  55. data/lib/pwn/config.rb +70 -25
  56. data/lib/pwn/driver.rb +85 -0
  57. data/lib/pwn/plugins/repl.rb +7 -10
  58. data/lib/pwn/version.rb +1 -1
  59. data/lib/pwn.rb +5 -4
  60. data/spec/lib/pwn/driver_spec.rb +15 -0
  61. metadata +7 -7
  62. data/etc/pwn.decryptor.yaml.EXAMPLE +0 -5
  63. data/etc/pwn.yaml.EXAMPLE +0 -71
data/lib/pwn/config.rb CHANGED
@@ -7,8 +7,44 @@ module PWN
7
7
  # Used to manage PWN configuration settings within PWN drivers.
8
8
  module Config
9
9
  # Supported Method Parameters::
10
- # env = PWN::Config.minimal_env
11
- public_class_method def self.minimal_env(opts = {})
10
+ # PWN::Config.redact_sensitive_artifacts(
11
+ # config: 'optional - Hash to redact sensitive artifacts from. Defaults to PWN::Env'
12
+ # )
13
+ public_class_method def self.redact_sensitive_artifacts(opts = {})
14
+ config = opts[:config] ||= PWN::Env
15
+
16
+ sensitive_keys = %i[api_key key paswword psks token]
17
+
18
+ # Transform values at the current level: redact sensitive keys
19
+ config.transform_values.with_index do |v, k|
20
+ if sensitive_keys.include?(config.keys[k])
21
+ '>>> REDACTED >>> USE `pwn-vault` FOR ADMINISTRATION <<< REDACTED <<<'
22
+ else
23
+ v.is_a?(Hash) ? redact_sensitive_artifacts(config: v) : v
24
+ end
25
+ end
26
+ rescue StandardError => e
27
+ raise e
28
+ end
29
+
30
+ # Supported Method Parameters::
31
+ # env = PWN::Config.init_driver_options
32
+ public_class_method def self.init_driver_options
33
+ env = {
34
+ driver_opts: {
35
+ pwn_env_path: nil,
36
+ pwn_dec_path: nil
37
+ }
38
+ }
39
+ PWN.const_set(:Env, env)
40
+ # puts '[*] Loaded driver options.'
41
+ rescue StandardError => e
42
+ raise e
43
+ end
44
+
45
+ # Supported Method Parameters::
46
+ # env = PWN::Config.default_env
47
+ public_class_method def self.default_env(opts = {})
12
48
  pwn_env_path = opts[:pwn_env_path]
13
49
  pwn_dec_path = "#{File.dirname(pwn_env_path)}/pwn.decryptor.yaml"
14
50
 
@@ -26,38 +62,38 @@ module PWN
26
62
  "
27
63
  env = {
28
64
  ai: {
29
- active: "'grok'",
65
+ active: 'grok',
30
66
  introspection: false,
31
67
  grok: {
32
- base_uri: "'optional - Base URI for Grok - Use private base OR defaults to https://api.x.ai/v1'",
33
- key: "'required - OpenAI API Key'",
34
- model: "'optional - Grok model to use'",
35
- system_role_content: "'You are an ethically hacking OpenAI agent.'",
36
- temp: "'optional - OpenAI temperature'"
68
+ base_uri: 'optional - Base URI for Grok - Use private base OR defaults to https://api.x.ai/v1',
69
+ key: 'required - OpenAI API Key',
70
+ model: 'optional - Grok model to use',
71
+ system_role_content: 'You are an ethically hacking OpenAI agent.',
72
+ temp: 'optional - OpenAI temperature'
37
73
  },
38
74
  openai: {
39
- base_uri: "'optional - Base URI for OpenAI - Use private base OR defaults to https://api.openai.com/v1'",
40
- key: "'required - OpenAI API Key'",
41
- model: "'optional - OpenAI model to use'",
42
- system_role_content: "'You are an ethically hacking OpenAI agent.'",
43
- temp: "'optional - OpenAI temperature'"
75
+ base_uri: 'optional - Base URI for OpenAI - Use private base OR defaults to https://api.openai.com/v1',
76
+ key: 'required - OpenAI API Key',
77
+ model: 'optional - OpenAI model to use',
78
+ system_role_content: 'You are an ethically hacking OpenAI agent.',
79
+ temp: 'optional - OpenAI temperature'
44
80
  },
45
81
  ollama: {
46
- base_uri: "'required - Base URI for Open WebUI - e.g. https://ollama.local'",
47
- key: "'required - Open WebUI API Key Under Settings >> Account >> JWT Token'",
48
- model: "'required - Ollama model to use'",
49
- system_role_content: "'You are an ethically hacking Ollama agent.'",
50
- temp: "'optional - Ollama temperature'"
82
+ base_uri: 'required - Base URI for Open WebUI - e.g. https://ollama.local',
83
+ key: 'required - Open WebUI API Key Under Settings >> Account >> JWT Token',
84
+ model: 'required - Ollama model to use',
85
+ system_role_content: 'You are an ethically hacking Ollama agent.',
86
+ temp: 'optional - Ollama temperature'
51
87
  }
52
88
  },
53
89
  plugins: {
54
- asm: { arch: "'#{PWN::Plugins::DetectOS.arch}'", endian: "'#{PWN::Plugins::DetectOS.endian}'" },
90
+ asm: { arch: PWN::Plugins::DetectOS.arch, endian: PWN::Plugins::DetectOS.endian },
55
91
  blockchain: {
56
92
  bitcoin: {
57
- rpc_host: "'localhost'",
93
+ rpc_host: 'localhost',
58
94
  rpc_port: 8332,
59
- rpc_user: "'bitcoin RPC Username'",
60
- rpc_pass: "'bitcoin RPC Password'"
95
+ rpc_user: 'bitcoin RPC Username',
96
+ rpc_pass: 'bitcoin RPC Password'
61
97
  }
62
98
  },
63
99
  irc: {
@@ -124,7 +160,7 @@ module PWN
124
160
  FileUtils.mkdir_p(pwn_env_root)
125
161
 
126
162
  pwn_env_path = opts[:pwn_env_path] ||= "#{pwn_env_root}/pwn.yaml"
127
- return minimal_env(pwn_env_path: pwn_env_path) unless File.exist?(pwn_env_path)
163
+ return default_env(pwn_env_path: pwn_env_path) unless File.exist?(pwn_env_path)
128
164
 
129
165
  is_encrypted = PWN::Plugins::Vault.file_encrypted?(file: pwn_env_path)
130
166
 
@@ -185,9 +221,18 @@ module PWN
185
221
  pwn_dec_path: pwn_dec_path
186
222
  }
187
223
 
188
- Pry.config.refresh_pwn_env = false if defined?(Pry)
224
+ # Assign the refreshed env to PWN::Env
189
225
  PWN.send(:remove_const, :Env) if PWN.const_defined?(:Env)
190
226
  PWN.const_set(:Env, env.freeze)
227
+
228
+ # Redact sensitive artifacts from PWN::Env and store in PWN::EnvRedacted
229
+ env_redacted = redact_sensitive_artifacts(config: env)
230
+ PWN.send(:remove_const, :EnvRedacted) if PWN.const_defined?(:EnvRedacted)
231
+ PWN.const_set(:EnvRedacted, env_redacted.freeze)
232
+
233
+ Pry.config.refresh_pwn_env = false if defined?(Pry)
234
+
235
+ puts "[*] PWN::Env loaded via: #{pwn_env_path}\n"
191
236
  rescue StandardError => e
192
237
  raise e
193
238
  end
@@ -204,7 +249,7 @@ module PWN
204
249
 
205
250
  public_class_method def self.help
206
251
  puts "USAGE:
207
- #{self}.minimal_env(
252
+ #{self}.default_env(
208
253
  pwn_env_path: 'optional - Path to pwn.yaml file. Defaults to ~/.pwn/pwn.yaml'
209
254
  )
210
255
 
data/lib/pwn/driver.rb ADDED
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'optparse'
4
+
5
+ module PWN
6
+ # Used to consume options passed into PWN drivers and load PWN::Env
7
+ class Driver
8
+ # Add OptionParser options to PWN::Env
9
+ class Parser < OptionParser
10
+ attr_accessor :auto_opts_help,
11
+ :opts
12
+
13
+ def initialize
14
+ super
15
+ @opts = PWN::Env[:driver_opts]
16
+ @auto_opts_help = true
17
+
18
+ banner = "USAGE: #{File.basename($PROGRAM_NAME)} [opts]\n"
19
+ on(
20
+ '-YPATH',
21
+ '--pwn_env=PATH',
22
+ '<Optional - PWN::Env YAML file path (Default: ~/.pwn/pwn.yaml)>'
23
+ ) do |o|
24
+ @opts[:pwn_env_path] = o
25
+ end
26
+ on(
27
+ '-ZPATH',
28
+ '--pwn_dec=PATH',
29
+ '<Optional - Out-of-Band YAML file path (Default: ~/.pwn/pwn.decryptor.yaml)>'
30
+ ) do |o|
31
+ @opts[:pwn_dec_path] = o
32
+ end
33
+ end
34
+
35
+ def parse!
36
+ super(ARGV, into: @opts)
37
+ # puts @opts
38
+
39
+ PWN::Config.refresh_env(
40
+ pwn_env_path: @opts[:pwn_env_path],
41
+ pwn_dec_path: @opts[:pwn_dec_path]
42
+ )
43
+
44
+ if @auto_opts_help && @opts.keys.join(' ') == 'pwn_env_path pwn_dec_path'
45
+ puts `#{File.basename($PROGRAM_NAME)} --help`
46
+ exit 1
47
+ end
48
+ end
49
+ end
50
+
51
+ # Author(s):: 0day Inc. <support@0dayinc.com>
52
+
53
+ public_class_method def self.authors
54
+ "AUTHOR(S):
55
+ 0day Inc. <support@0dayinc.com>
56
+ "
57
+ end
58
+
59
+ # Display Usage for this Module
60
+
61
+ public_class_method def self.help
62
+ puts "USAGE:
63
+ # Load default driver options into PWN::Env
64
+ opts = PWN::Env[:driver_opts]
65
+ #{self}::Parser.new.parse(&:on).parse!
66
+
67
+ # Add more options by passing a block to the parser
68
+ opts = PWN::Env[:driver_opts]
69
+ #{self}::Parser.new do |options|
70
+ # Boolean option
71
+ options.on('-b', '--boolean') do |o|
72
+ opts[:boolean] = o
73
+ end
74
+
75
+ # String option
76
+ options.on('-sSTRING', '--string=STRING') do |o|
77
+ opts[:string] = o
78
+ end
79
+ end.parse!
80
+
81
+ #{self}.authors
82
+ "
83
+ end
84
+ end
85
+ end
@@ -489,6 +489,7 @@ module PWN
489
489
  # Define REPL Hooks
490
490
  # Welcome Banner Hook
491
491
  Pry.config.hooks.add_hook(:before_session, :welcome) do |output, _binding, _pi|
492
+ Pry.config.refresh_pwn_env = false
492
493
  output.puts PWN::Banner.welcome
493
494
  end
494
495
 
@@ -597,11 +598,11 @@ module PWN
597
598
  end
598
599
 
599
600
  # Supported Method Parameters::
600
- # PWN::Plugins::REPL.start(
601
- # opts: 'required - Hash object passed in via pwn OptParser'
602
- # )
601
+ # PWN::Plugins::REPL.start
602
+
603
+ public_class_method def self.start
604
+ opts = PWN::Env[:driver_opts]
603
605
 
604
- public_class_method def self.start(opts = {})
605
606
  # Monkey Patch Pry, add commands, && hooks
606
607
  PWN::Plugins::MonkeyPatch.pry
607
608
  pwn_env_root = "#{Dir.home}/.pwn"
@@ -646,13 +647,9 @@ module PWN
646
647
 
647
648
  #{self}.add_commands
648
649
 
649
- #{self}.add_hooks(
650
- opts: 'required - Hash object passed in via pwn OptParser'
651
- )
650
+ #{self}.add_hooks
652
651
 
653
- #{self}.start(
654
- opts: 'required - Hash object passed in via pwn OptParser'
655
- )
652
+ #{self}.start
656
653
 
657
654
  #{self}.authors
658
655
  "
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.5.453'
4
+ VERSION = '0.5.454'
5
5
  end
data/lib/pwn.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'json'
4
- require 'optparse'
5
4
  require 'pwn/version'
6
5
  require 'yaml'
7
6
 
@@ -16,21 +15,23 @@ module PWN
16
15
  autoload :Banner, 'pwn/banner'
17
16
  autoload :Blockchain, 'pwn/blockchain'
18
17
  autoload :Config, 'pwn/config'
18
+ autoload :Driver, 'pwn/driver'
19
19
  autoload :FFI, 'pwn/ffi'
20
20
  autoload :Plugins, 'pwn/plugins'
21
21
  autoload :Reports, 'pwn/reports'
22
22
  autoload :SAST, 'pwn/sast'
23
23
  autoload :WWW, 'pwn/www'
24
24
 
25
+ # Initialize Options for Drivers
26
+
27
+ PWN::Config.init_driver_options
28
+
25
29
  # Display a List of Every PWN Module
26
30
 
27
31
  public_class_method def self.help
28
32
  constants.sort
29
33
  end
30
34
 
31
- # Initialize PWN configuration file
32
- # PWN::Env is the constant that stores the configuration data
33
- PWN::Config.refresh_env
34
35
  rescue StandardError => e
35
36
  puts e.backtrace
36
37
  raise e
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Driver do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Driver
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::Driver
13
+ expect(help_response).to respond_to :help
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.453
4
+ version: 0.5.454
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -127,14 +127,14 @@ dependencies:
127
127
  requirements:
128
128
  - - '='
129
129
  - !ruby/object:Gem::Version
130
- version: 5.1.1
130
+ version: 5.2.0
131
131
  type: :runtime
132
132
  prerelease: false
133
133
  version_requirements: !ruby/object:Gem::Requirement
134
134
  requirements:
135
135
  - - '='
136
136
  - !ruby/object:Gem::Version
137
- version: 5.1.1
137
+ version: 5.2.0
138
138
  - !ruby/object:Gem::Dependency
139
139
  name: bundler
140
140
  requirement: !ruby/object:Gem::Requirement
@@ -1261,14 +1261,14 @@ dependencies:
1261
1261
  requirements:
1262
1262
  - - '='
1263
1263
  - !ruby/object:Gem::Version
1264
- version: 6.0.2
1264
+ version: 6.0.3
1265
1265
  type: :runtime
1266
1266
  prerelease: false
1267
1267
  version_requirements: !ruby/object:Gem::Requirement
1268
1268
  requirements:
1269
1269
  - - '='
1270
1270
  - !ruby/object:Gem::Version
1271
- version: 6.0.2
1271
+ version: 6.0.3
1272
1272
  - !ruby/object:Gem::Dependency
1273
1273
  name: whois-parser
1274
1274
  requirement: !ruby/object:Gem::Requirement
@@ -1449,8 +1449,6 @@ files:
1449
1449
  - documentation/pwn_wallpaper.jpg
1450
1450
  - documentation/ringing-spectrogram.png
1451
1451
  - documentation/ringing-waveform.png
1452
- - etc/pwn.decryptor.yaml.EXAMPLE
1453
- - etc/pwn.yaml.EXAMPLE
1454
1452
  - etc/systemd/msfrpcd.service
1455
1453
  - etc/systemd/openvas.service
1456
1454
  - etc/userland/aws/apache2/jenkins_443.conf
@@ -1876,6 +1874,7 @@ files:
1876
1874
  - lib/pwn/blockchain/btc.rb
1877
1875
  - lib/pwn/blockchain/eth.rb
1878
1876
  - lib/pwn/config.rb
1877
+ - lib/pwn/driver.rb
1879
1878
  - lib/pwn/ffi.rb
1880
1879
  - lib/pwn/ffi/stdio.rb
1881
1880
  - lib/pwn/plugins.rb
@@ -2229,6 +2228,7 @@ files:
2229
2228
  - spec/lib/pwn/blockchain/eth_spec.rb
2230
2229
  - spec/lib/pwn/blockchain_spec.rb
2231
2230
  - spec/lib/pwn/config_spec.rb
2231
+ - spec/lib/pwn/driver_spec.rb
2232
2232
  - spec/lib/pwn/ffi/stdio_spec.rb
2233
2233
  - spec/lib/pwn/ffi_spec.rb
2234
2234
  - spec/lib/pwn/plugins/android_spec.rb
@@ -1,5 +0,0 @@
1
- # Drop this file in $HOME/.pwn/pwn.decryptor.yaml
2
- # If you rely upon this file, it should be out-of-band for optimal security
3
- # (e.g. not available in code repos, permission protected, limited access, etc.)
4
- key: 'KEY PROVIDED WHEN USING PWN::Plugins::Vault.create(file: "pwn.yaml") TO ENCRYPT pwn.yaml'
5
- iv: 'KEY PROVIDED WHEN USING PWN::Plugins::Vault.create(file: "pwn.yaml") TO ENCRYPT pwn.yaml'
data/etc/pwn.yaml.EXAMPLE DELETED
@@ -1,71 +0,0 @@
1
- # Drop this file in $HOME/.pwn/pwn.yaml
2
- # Use PWN::Plugins::Vault.create(file: 'pwn.yaml') to encrypt this file
3
-
4
- # ai_engine: 'openai' || 'ollama'
5
- # WARNING::
6
- # If PWN::CONFIG[:ai][:instrospection] = true, the active ai agent will be used
7
- # wherever possible throughout pwn. Proceeds with caution, as this may incur additional costs
8
- ai:
9
- active: 'grok'
10
- introspection: false
11
- grok:
12
- base_uri: 'optional - Base URI for Grok - Use private base OR defaults to https://api.x.ai/v1'
13
- key: 'required - OpenAI API Key'
14
- model: 'optional - Grok model to use'
15
- system_role_content: 'You are an ethically hacking Grok agent.'
16
- temp: 'optional - OpenAI temperature'
17
-
18
- openai:
19
- base_uri: 'optional - Base URI for OpenAI - Use private base OR defaults to https://api.openai.com/v1'
20
- key: 'required - OpenAI API Key'
21
- model: 'optional - OpenAI model to use'
22
- system_role_content: 'You are an ethically hacking OpenAI agent.'
23
- temp: 'optional - OpenAI temperature'
24
-
25
- ollama:
26
- base_uri: 'required - Base URI for Open WebUI - e.g. https://ollama.local'
27
- key: 'required - Open WebUI API Key Under Settings >> Account >> JWT Token'
28
- model: 'required - Ollama model to use'
29
- system_role_content: 'You are an ethically hacking Ollama agent.'
30
- temp: 'optional - Ollama temperature'
31
-
32
- # Use PWN::Plugins::Assembly.list_supported_archs to list supported architectures
33
- plugins:
34
- asm:
35
- arch: 'x86_64'
36
- endian: 'little'
37
-
38
- blockchain:
39
- bitcoin:
40
- rpc_host: '127.0.0.1'
41
- rpc_port: 8332
42
- rpc_user: 'bitcoin rpc user'
43
- rpc_pass: 'bitcoin rpc password'
44
-
45
- irc:
46
- ui_nick: '_human_'
47
- shared_chan: '#pwn'
48
- ai_agent_nicks:
49
- browser:
50
- pwn_rb: '/opt/pwn/lib/pwn/plugins/transparent_browser.rb'
51
- system_role_content: 'You are a browser. You are a web browser that can be controlled by a human or AI agent'
52
- nimjeh:
53
- pwn_rb: ''
54
- system_role_content: 'You are a sarcastic hacker. You find software zero day vulnerabilities. This involves analyzing source code, race conditions, application binaries, and network protocols from an offensive security perspective.'
55
- nmap:
56
- pwn_rb: '/opt/pwn/lib/pwn/plugins/nmap_it.rb'
57
- system_role_content: 'You are a network scanner. You are a network scanner that can be controlled by a human or AI agent'
58
- shodan:
59
- pwn_rb: '/opt/pwn/lib/pwn/plugins/shodan.rb'
60
- system_role_content: 'You are a passive reconnaissance agent. You are a passive reconnaissance agent that can be controlled by a human or AI agent'
61
-
62
- hunter:
63
- api_key: 'hunter.how API Key'
64
-
65
- meshtastic:
66
- psks:
67
- LongFast: 'required - PSK for LongFast channel'
68
- PWN: 'required - PSK for pwn channel'
69
-
70
- shodan:
71
- api_key: 'SHODAN API Key'