pwn 0.5.84 → 0.5.86

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 140bec69aaf1bd6d7c4cdaa6eea7e065de1ba99d1bc19af79d647fc04c50a5f1
4
- data.tar.gz: 22fa36d33db3cedbfbae8125357fc5c4385ab1d83098537ce8a454474d5456ee
3
+ metadata.gz: 4c115357ddd23aa5957cffd1b858e332b4b90086826ae7f2d04e5b57c25fd982
4
+ data.tar.gz: 99cbd0e279109e5d8524c26751ff238a5fe42bdb69c7af478a0aee8f10891535
5
5
  SHA512:
6
- metadata.gz: 534ef6b2be5bbda8b98384464b16744e2a8b69a70a2e5eb3d475b513543a047a0830f9d0cb2bd9f4b2619b4b9a5d3579570721f3c46820964904c9970e8c940b
7
- data.tar.gz: bafb717f2cab353ab3d9e3515bfde975d7bbab1f10769e8e54d602d0d92718ea909bebec8b1afda3b793814551287bf924df9348b252b45f9af9ac73340119d9
6
+ metadata.gz: 81f4bffb62a4f4982256c5616f2624dffa1c5b39ea2e9976d7dfaedbdd6f17dc254b265ebf89e7901dc1f62a420891f7558dbde6e464c15c4eb9b15afaf3878b
7
+ data.tar.gz: a17960dd7bd9550c4f46dcea164ba3c1c57c5d8341acfba3a3b5c88d9c78f729b23da50d06d3003509f17cf5cebf1f50926cd4c39b89b664a4e277fa79290019
data/Gemfile CHANGED
@@ -46,9 +46,9 @@ gem 'jwt', '2.8.1'
46
46
  gem 'libusb', '0.7.1'
47
47
  gem 'luhn', '1.0.2'
48
48
  gem 'mail', '2.8.1'
49
+ gem 'meshtastic', '0.0.1'
49
50
  gem 'metasm', '1.0.5'
50
- gem 'mqtt', '0.6.0'
51
- # gem 'mongo', '2.19.3'
51
+ gem 'mongo', '2.20.0'
52
52
  gem 'msfrpc-client', '1.1.2'
53
53
  gem 'netaddr', '2.0.6'
54
54
  gem 'net-ldap', '0.19.0'
@@ -84,7 +84,7 @@ gem 'ruby-nmap', '1.0.3'
84
84
  gem 'ruby-saml', '1.16.0'
85
85
  gem 'rvm', '1.11.3.9'
86
86
  gem 'savon', '2.15.0'
87
- gem 'selenium-devtools', '0.123.0'
87
+ gem 'selenium-devtools', '0.124.0'
88
88
  gem 'serialport', '1.3.2'
89
89
  # gem 'sinatra', '4.0.0'
90
90
  gem 'slack-ruby-client', '2.3.0'
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ cd /opt/pwn
37
37
  $ ./install.sh
38
38
  $ ./install.sh ruby-gem
39
39
  $ pwn
40
- pwn[v0.5.84]:001 >>> PWN.help
40
+ pwn[v0.5.86]:001 >>> PWN.help
41
41
  ```
42
42
 
43
43
  [![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
@@ -52,7 +52,7 @@ $ rvm use ruby-3.3.0@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.5.84]:001 >>> PWN.help
55
+ pwn[v0.5.86]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
  If you're using a multi-user install of RVM do:
@@ -62,7 +62,7 @@ $ rvm use ruby-3.3.0@pwn
62
62
  $ rvmsudo gem uninstall --all --executables pwn
63
63
  $ rvmsudo gem install --verbose pwn
64
64
  $ pwn
65
- pwn[v0.5.84]:001 >>> PWN.help
65
+ pwn[v0.5.86]:001 >>> PWN.help
66
66
  ```
67
67
 
68
68
  PWN periodically upgrades to the latest version of Ruby which is reflected in `/opt/pwn/.ruby-version`. The easiest way to upgrade to the latest version of Ruby from a previous PWN installation is to run the following script:
data/lib/pwn/aws.rb CHANGED
@@ -96,7 +96,7 @@ module PWN
96
96
  autoload :Workspaces, 'pwn/aws/workspaces'
97
97
  autoload :XRay, 'pwn/aws/x_ray'
98
98
 
99
- # Display a List of Every PWN Plugin
99
+ # Display a List of Every PWN::AWS Module
100
100
 
101
101
  public_class_method def self.help
102
102
  constants.sort
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ffi'
4
+
5
+ module PWN
6
+ module FFI
7
+ # This plugin is a wrapper for the standard I/O functions in libc.
8
+ module Stdio
9
+ extend FFI::Library
10
+
11
+ ffi_lib FFI::Library::LIBC
12
+
13
+ attach_function(:puts, [:string], :int)
14
+ attach_function(:printf, %i[string varargs], :int, convention: :default)
15
+ attach_function(:scanf, %i[string varargs], :int)
16
+
17
+ # Author(s):: 0day Inc. <request.pentest@0dayinc.com>
18
+
19
+ public_class_method def self.authors
20
+ "AUTHOR(S):
21
+ 0day Inc. <request.pentest@0dayinc.com>
22
+ "
23
+ end
24
+
25
+ # Display Usage for this Module
26
+
27
+ public_class_method def self.help
28
+ puts "USAGE:
29
+ #{self}.puts string
30
+ #{self}.printf(\"format string\", str, int, etc)
31
+
32
+ scanf_buffer = FFI::MemoryPointer.new(:char, 100)
33
+ #{self}.scanf(\"format string\", scanf_buffer)
34
+
35
+ #{self}.authors
36
+ "
37
+ end
38
+ end
39
+ end
40
+ end
data/lib/pwn/ffi.rb CHANGED
@@ -5,9 +5,9 @@ module PWN
5
5
  # into memory only when they're needed. For more information, see:
6
6
  # http://www.rubyinside.com/ruby-techniques-revealed-autoload-1652.html
7
7
  module FFI
8
- # autoload :Sock, 'pwn/ffi/sock'
8
+ autoload :Stdio, 'pwn/ffi/stdio'
9
9
 
10
- # Display a List of Every PWN Report
10
+ # Display a List of Every PWN::FFI Module
11
11
 
12
12
  public_class_method def self.help
13
13
  constants.sort
data/lib/pwn/plugins.rb CHANGED
@@ -37,7 +37,6 @@ module PWN
37
37
  autoload :JSONPathify, 'pwn/plugins/json_pathify'
38
38
  autoload :Log, 'pwn/plugins/log'
39
39
  autoload :MailAgent, 'pwn/plugins/mail_agent'
40
- autoload :Meshtastic, 'pwn/plugins/meshtastic'
41
40
  autoload :Metasploit, 'pwn/plugins/metasploit'
42
41
  autoload :MonkeyPatch, 'pwn/plugins/monkey_patch'
43
42
  autoload :MSR206, 'pwn/plugins/msr206'
@@ -75,7 +74,7 @@ module PWN
75
74
  autoload :Vsphere, 'pwn/plugins/vsphere'
76
75
  autoload :XXD, 'pwn/plugins/xxd'
77
76
 
78
- # Display a List of Every PWN Plugin
77
+ # Display a List of Every PWN::Plugins Module
79
78
 
80
79
  public_class_method def self.help
81
80
  constants.sort
data/lib/pwn/reports.rb CHANGED
@@ -14,7 +14,7 @@ module PWN
14
14
  autoload :URIBuster, 'pwn/reports/uri_buster'
15
15
  # autoload :XML, 'pwn/reports/xml'
16
16
 
17
- # Display a List of Every PWN Report
17
+ # Display a List of Every PWN::Reports Module
18
18
 
19
19
  public_class_method def self.help
20
20
  constants.sort
data/lib/pwn/sast.rb CHANGED
@@ -50,7 +50,7 @@ module PWN
50
50
  autoload :Version, 'pwn/sast/version'
51
51
  autoload :WindowLocationHash, 'pwn/sast/window_location_hash'
52
52
 
53
- # Display a List of Each Static Code Anti-Pattern Matching Module
53
+ # Display a List of Every PWN::SAST Module
54
54
 
55
55
  public_class_method def self.help
56
56
  constants.sort
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.84'
4
+ VERSION = '0.5.86'
5
5
  end
data/lib/pwn/www.rb CHANGED
@@ -26,7 +26,7 @@ module PWN
26
26
  autoload :Upwork, 'pwn/www/upwork'
27
27
  autoload :Youtube, 'pwn/www/youtube'
28
28
 
29
- # Display a List of Every PWN WWW module
29
+ # Display a List of Every PWN::WWW Module
30
30
 
31
31
  public_class_method def self.help
32
32
  constants.sort
data/lib/pwn.rb CHANGED
@@ -17,7 +17,7 @@ module PWN
17
17
  autoload :SAST, 'pwn/sast'
18
18
  autoload :WWW, 'pwn/www'
19
19
 
20
- # Display Usage for the PWN Framework ~
20
+ # Display a List of Every PWN Module
21
21
 
22
22
  public_class_method def self.help
23
23
  constants.sort
@@ -2,14 +2,14 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe PWN::Plugins::Meshtastic do
5
+ describe PWN::FFI::Stdio do
6
6
  it 'should display information for authors' do
7
- authors_response = PWN::Plugins::Meshtastic
7
+ authors_response = PWN::FFI::Stdio
8
8
  expect(authors_response).to respond_to :authors
9
9
  end
10
10
 
11
11
  it 'should display information for existing help method' do
12
- help_response = PWN::Plugins::Meshtastic
12
+ help_response = PWN::FFI::Stdio
13
13
  expect(help_response).to respond_to :help
14
14
  end
15
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.84
4
+ version: 0.5.86
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-23 00:00:00.000000000 Z
11
+ date: 2024-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -472,6 +472,20 @@ dependencies:
472
472
  - - '='
473
473
  - !ruby/object:Gem::Version
474
474
  version: 2.8.1
475
+ - !ruby/object:Gem::Dependency
476
+ name: meshtastic
477
+ requirement: !ruby/object:Gem::Requirement
478
+ requirements:
479
+ - - '='
480
+ - !ruby/object:Gem::Version
481
+ version: 0.0.1
482
+ type: :runtime
483
+ prerelease: false
484
+ version_requirements: !ruby/object:Gem::Requirement
485
+ requirements:
486
+ - - '='
487
+ - !ruby/object:Gem::Version
488
+ version: 0.0.1
475
489
  - !ruby/object:Gem::Dependency
476
490
  name: metasm
477
491
  requirement: !ruby/object:Gem::Requirement
@@ -487,19 +501,19 @@ dependencies:
487
501
  - !ruby/object:Gem::Version
488
502
  version: 1.0.5
489
503
  - !ruby/object:Gem::Dependency
490
- name: mqtt
504
+ name: mongo
491
505
  requirement: !ruby/object:Gem::Requirement
492
506
  requirements:
493
507
  - - '='
494
508
  - !ruby/object:Gem::Version
495
- version: 0.6.0
509
+ version: 2.20.0
496
510
  type: :runtime
497
511
  prerelease: false
498
512
  version_requirements: !ruby/object:Gem::Requirement
499
513
  requirements:
500
514
  - - '='
501
515
  - !ruby/object:Gem::Version
502
- version: 0.6.0
516
+ version: 2.20.0
503
517
  - !ruby/object:Gem::Dependency
504
518
  name: msfrpc-client
505
519
  requirement: !ruby/object:Gem::Requirement
@@ -996,14 +1010,14 @@ dependencies:
996
1010
  requirements:
997
1011
  - - '='
998
1012
  - !ruby/object:Gem::Version
999
- version: 0.123.0
1013
+ version: 0.124.0
1000
1014
  type: :runtime
1001
1015
  prerelease: false
1002
1016
  version_requirements: !ruby/object:Gem::Requirement
1003
1017
  requirements:
1004
1018
  - - '='
1005
1019
  - !ruby/object:Gem::Version
1006
- version: 0.123.0
1020
+ version: 0.124.0
1007
1021
  - !ruby/object:Gem::Dependency
1008
1022
  name: serialport
1009
1023
  requirement: !ruby/object:Gem::Requirement
@@ -1763,6 +1777,7 @@ files:
1763
1777
  - lib/pwn/banner/radare2.rb
1764
1778
  - lib/pwn/banner/white_rabbit.rb
1765
1779
  - lib/pwn/ffi.rb
1780
+ - lib/pwn/ffi/stdio.rb
1766
1781
  - lib/pwn/plugins.rb
1767
1782
  - lib/pwn/plugins/android.rb
1768
1783
  - lib/pwn/plugins/assembly.rb
@@ -1795,7 +1810,6 @@ files:
1795
1810
  - lib/pwn/plugins/json_pathify.rb
1796
1811
  - lib/pwn/plugins/log.rb
1797
1812
  - lib/pwn/plugins/mail_agent.rb
1798
- - lib/pwn/plugins/meshtastic.rb
1799
1813
  - lib/pwn/plugins/metasploit.rb
1800
1814
  - lib/pwn/plugins/monkey_patch.rb
1801
1815
  - lib/pwn/plugins/msr206.rb
@@ -2094,6 +2108,7 @@ files:
2094
2108
  - spec/lib/pwn/banner/radare2_spec.rb
2095
2109
  - spec/lib/pwn/banner/white_rabbit_spec.rb
2096
2110
  - spec/lib/pwn/banner_spec.rb
2111
+ - spec/lib/pwn/ffi/stdio_spec.rb
2097
2112
  - spec/lib/pwn/ffi_spec.rb
2098
2113
  - spec/lib/pwn/plugins/android_spec.rb
2099
2114
  - spec/lib/pwn/plugins/assembly_spec.rb
@@ -2126,7 +2141,6 @@ files:
2126
2141
  - spec/lib/pwn/plugins/json_pathify_spec.rb
2127
2142
  - spec/lib/pwn/plugins/log_spec.rb
2128
2143
  - spec/lib/pwn/plugins/mail_agent_spec.rb
2129
- - spec/lib/pwn/plugins/meshtastic_spec.rb
2130
2144
  - spec/lib/pwn/plugins/metasploit_spec.rb
2131
2145
  - spec/lib/pwn/plugins/monkey_patch_spec.rb
2132
2146
  - spec/lib/pwn/plugins/msr206_spec.rb
@@ -1,265 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'base64'
4
- require 'geocoder'
5
- require 'json'
6
- require 'mqtt'
7
- require 'openssl'
8
- require 'securerandom'
9
-
10
- module PWN
11
- module Plugins
12
- # Plugin used to interact with Meshtastic nodes
13
- module Meshtastic
14
- # Supported Method Parameters::
15
- # mqtt_obj = PWN::Plugins::Meshtastic.connect(
16
- # host: 'optional - mqtt host (default: mqtt.meshtastic.org)',
17
- # port: 'optional - mqtt port (defaults: 1883)',
18
- # username: 'optional - mqtt username (default: meshdev)',
19
- # password: 'optional - (default: large4cats)'
20
- # )
21
-
22
- public_class_method def self.connect(opts = {})
23
- # Publicly available MQTT server / credentials by default
24
- host = opts[:host] ||= 'mqtt.meshtastic.org'
25
- port = opts[:port] ||= 1883
26
- username = opts[:username] ||= 'meshdev'
27
- password = opts[:password] ||= 'large4cats'
28
-
29
- mqtt_obj = MQTT::Client.connect(
30
- host: host,
31
- port: port,
32
- username: username,
33
- password: password
34
- )
35
-
36
- mqtt_obj.client_id = SecureRandom.random_bytes(8).unpack1('H*')
37
-
38
- mqtt_obj
39
- rescue StandardError => e
40
- raise e
41
- end
42
-
43
- # Supported Method Parameters::
44
- # PWN::Plugins::Meshtastic.subscribe(
45
- # mqtt_obj: 'required - mqtt_obj returned from #connect method'
46
- # region: 'optional - region (default: US)',
47
- # channel: 'optional - channel name (default: LongFast)',
48
- # psk: 'optional - channel pre-shared key (default: AQ==)',
49
- # qos: 'optional - quality of service (default: 0)',
50
- # json: 'optional - JSON output (default: false)'
51
- # )
52
-
53
- public_class_method def self.subscribe(opts = {})
54
- mqtt_obj = opts[:mqtt_obj]
55
- region = opts[:region] ||= 'US'
56
- channel = opts[:channel] ||= 'LongFast'
57
- psk = opts[:psk] ||= 'AQ=='
58
- qos = opts[:qos] ||= 0
59
- json = opts[:json] ||= false
60
-
61
- # TODO: Find JSON URI for this
62
- root_topic = "msh/#{region}/2/json" if json
63
- # root_topic = "msh/#{region}/2/e" unless json
64
- root_topic = "msh/#{region}/2/c" unless json
65
- mqtt_obj.subscribe("#{root_topic}/#{channel}/#", qos)
66
-
67
- # Decrypt the message
68
- # Our AES key is 128 or 256 bits, shared as part of the 'Channel' specification.
69
-
70
- # Actual pre-shared key for LongFast channel
71
- psk = '1PG7OiApB1nwvP+rz05pAQ==' if channel == 'LongFast'
72
- padded_psk = psk.ljust(psk.length + ((4 - (psk.length % 4)) % 4), '=')
73
- replaced_psk = padded_psk.gsub('-', '+').gsub('_', '/')
74
- psk = replaced_psk
75
- dec_psk = Base64.strict_decode64(psk)
76
-
77
- # cipher = OpenSSL::Cipher.new('AES-256-CTR')
78
- cipher = OpenSSL::Cipher.new('AES-128-CTR')
79
-
80
- if json
81
- mqtt_obj.get_packet do |json_packet|
82
- puts '-' * 80
83
- packet = JSON.parse(json_packet.payload, symbolize_names: true)
84
- puts JSON.pretty_generate(packet)
85
- puts '-' * 80
86
- puts "\n\n\n"
87
- end
88
- else
89
- mqtt_obj.get_packet do |packet|
90
- puts '-' * 80
91
-
92
- payload = packet.payload.to_s
93
-
94
- # Convert raw packet to hex-escaped bytes
95
- # puts "PSK: #{psk.inspect} | Length: #{psk.length}"
96
- # puts "Dec PSK: #{dec_psk.inspect} | Length: #{dec_psk.length}"
97
- packet_from_backwards = payload[3..6]
98
- if packet_from_backwards
99
- packet_from_str = packet_from_backwards.reverse
100
- packet_from_hex = packet_from_str.bytes.map { |byte| byte.to_s(16).rjust(2, '0') }.join
101
- packet_from = packet_from_hex.to_i(16)
102
- puts "\nFrom: #{packet_from_str.inspect} >> #{packet_from_hex} >> #{packet_from}"
103
- end
104
-
105
- packet_to_backwards = payload[8..11]
106
- if packet_to_backwards
107
- packet_to_str = packet_to_backwards.reverse
108
- packet_to_hex = packet_to_str.bytes.map { |byte| byte.to_s(16).rjust(2, '0') }.join
109
- packet_to = packet_to_hex.to_i(16)
110
- puts "To: #{packet_to_str.inspect} >> #{packet_to_hex} >> #{packet_to}"
111
- end
112
-
113
- mystery_byte = payload[12]
114
- if mystery_byte
115
- mystery_hex = mystery_byte.bytes.map { |byte| byte.to_s(16).rjust(2, '0') }.join
116
- mystery = mystery_hex.to_i(16)
117
- puts "Mystery 1: #{mystery_byte.inspect} >> #{mystery_hex} >> #{mystery}"
118
- end
119
-
120
- msg_len = 0
121
- msg_len_byte = payload[13]
122
- if msg_len_byte
123
- msg_len_hex = msg_len_byte.bytes.map { |byte| byte.to_s(16).rjust(2, '0') }.join
124
- msg_len = msg_len_hex.to_i(16)
125
- end
126
- puts "Message Length: #{msg_len_byte.inspect} >> #{msg_len}"
127
-
128
- channel_byte = payload[14]
129
- if channel_byte
130
- channel_hex = channel_byte.bytes.map { |byte| byte.to_s(16).rjust(2, '0') }.join
131
- channel = channel_hex.to_i(16)
132
- puts "Channel: #{channel_byte.inspect} >> #{channel_hex} >> #{channel}"
133
- end
134
-
135
- mystery_byte = payload[15]
136
- if mystery_byte
137
- mystery_hex = mystery_byte.bytes.map { |byte| byte.to_s(16).rjust(2, '0') }.join
138
- mystery = mystery_hex.to_i(16)
139
- puts "Mystery 2: #{mystery_byte.inspect} >> #{mystery_hex} >> #{mystery}"
140
- end
141
-
142
- pid_id_backwards = payload.b[-34..-31]
143
- if pid_id_backwards
144
- pid_str = pid_id_backwards.reverse
145
- pid_hex = pid_str.bytes.map { |byte| byte.to_s(16).rjust(2, '0') }.join
146
- packet_id = pid_hex.to_i(16)
147
- puts "ID: #{pid_str.inspect} >> #{pid_hex} >> #{packet_id}"
148
- end
149
-
150
- topic = packet.topic
151
- puts "\nTopic: #{topic}"
152
-
153
- if msg_len.positive?
154
- begin
155
- puts "Payload: #{payload.inspect}"
156
- puts "Payload Length: #{payload.length}"
157
-
158
- nonce_packet_id = [packet_id].pack('V').ljust(8, "\x00")
159
- nonce_from_node = [packet_from].pack('V').ljust(8, "\x00")
160
- # puts "Nonce from Node: #{nonce_from_node.inspect} | Length: #{nonce_from_node.length}"
161
- nonce = "#{nonce_packet_id}#{nonce_from_node}".b
162
- puts "Nonce: #{nonce.inspect} | Length: #{nonce.length}"
163
-
164
- # Decrypt the message
165
- # Key must be 32 bytes
166
- # IV mustr be 16 bytes
167
- cipher.decrypt
168
- cipher.key = dec_psk
169
- cipher.iv = nonce
170
- first_byte = 16
171
- last_byte = first_byte + msg_len - 1
172
- encrypted_payload = payload[first_byte..last_byte]
173
- puts "\nEncrypted Payload:\n#{encrypted_payload.inspect}"
174
- puts "Length: #{encrypted_payload.length}" if encrypted_payload
175
-
176
- decrypted = cipher.update(encrypted_payload) + cipher.final
177
- puts "\nDecrypted Payload:\n#{decrypted.inspect}"
178
- puts "Length: #{decrypted.length}" if decrypted
179
- rescue StandardError => e
180
- puts "Error decrypting message: #{e}"
181
- end
182
- end
183
- raw_packet = packet.to_s.b
184
- puts "\nRaw Packet: #{raw_packet.inspect}"
185
- puts "Length: #{packet.to_s.length}"
186
- puts '-' * 80
187
- puts "\n\n\n"
188
- end
189
- end
190
- rescue Interrupt
191
- puts "\nCTRL+C detected. Exiting..."
192
- rescue StandardError => e
193
- raise e
194
- ensure
195
- mqtt_obj.disconnect if mqtt_obj
196
- end
197
-
198
- # Supported Method Parameters::
199
- # mqtt_obj = PWN::Plugins::Meshtastic.gps_search(
200
- # lat: 'required - latitude float (e.g. 37.7749)',
201
- # lon: 'required - longitude float (e.g. -122.4194)',
202
- # )
203
- public_class_method def self.gps_search(opts = {})
204
- lat = opts[:lat]
205
- lon = opts[:lon]
206
-
207
- raise 'ERROR: Latitude and Longitude are required' unless lat && lon
208
-
209
- gps_arr = [lat.to_f, lon.to_f]
210
-
211
- Geocoder.search(gps_arr)
212
- rescue StandardError => e
213
- raise e
214
- end
215
-
216
- # Supported Method Parameters::
217
- # mqtt_obj = PWN::Plugins::Meshtastic.disconnect(
218
- # mqtt_obj: 'required - mqtt_obj returned from #connect method'
219
- # )
220
- public_class_method def self.disconnect(opts = {})
221
- mqtt_obj = opts[:mqtt_obj]
222
-
223
- mqtt_obj.disconnect if mqtt_obj
224
- nil
225
- rescue StandardError => e
226
- raise e
227
- end
228
-
229
- # Author(s):: 0day Inc. <request.pentest@0dayinc.com>
230
-
231
- public_class_method def self.authors
232
- "AUTHOR(S):
233
- 0day Inc. <request.pentest@0dayinc.com>
234
- "
235
- end
236
-
237
- # Display Usage for this Module
238
-
239
- public_class_method def self.help
240
- puts "USAGE:
241
- mqtt_obj = #{self}.connect(
242
- host: 'optional - mqtt host (default: mqtt.meshtastic.org)',
243
- port: 'optional - mqtt port (defaults: 1883)',
244
- username: 'optional - mqtt username (default: meshdev)',
245
- password: 'optional - (default: large4cats)'
246
- )
247
-
248
- #{self}.subscribe(
249
- mqtt_obj: 'required - mqtt_obj object returned from #connect method',
250
- region: 'optional - region (default: US)',
251
- channel: 'optional - channel name (default: LongFast)',
252
- psk: 'optional - channel pre-shared key (default: AQ==)',
253
- qos: 'optional - quality of service (default: 0)'
254
- )
255
-
256
- mqtt_obj = #{self}.disconnect(
257
- mqtt_obj: 'required - mqtt_obj object returned from #connect method'
258
- )
259
-
260
- #{self}.authors
261
- "
262
- end
263
- end
264
- end
265
- end