pwn 0.5.83 → 0.5.84
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/Gemfile +6 -4
- data/README.md +3 -3
- data/lib/pwn/plugins/meshtastic.rb +265 -0
- data/lib/pwn/plugins/repl.rb +1 -0
- data/lib/pwn/plugins.rb +1 -0
- data/lib/pwn/version.rb +1 -1
- data/spec/lib/pwn/plugins/meshtastic_spec.rb +15 -0
- metadata +41 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 140bec69aaf1bd6d7c4cdaa6eea7e065de1ba99d1bc19af79d647fc04c50a5f1
|
4
|
+
data.tar.gz: 22fa36d33db3cedbfbae8125357fc5c4385ab1d83098537ce8a454474d5456ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 534ef6b2be5bbda8b98384464b16744e2a8b69a70a2e5eb3d475b513543a047a0830f9d0cb2bd9f4b2619b4b9a5d3579570721f3c46820964904c9970e8c940b
|
7
|
+
data.tar.gz: bafb717f2cab353ab3d9e3515bfde975d7bbab1f10769e8e54d602d0d92718ea909bebec8b1afda3b793814551287bf924df9348b252b45f9af9ac73340119d9
|
data/Gemfile
CHANGED
@@ -32,6 +32,7 @@ gem 'ffi', '1.16.3'
|
|
32
32
|
gem 'fftw3', '0.3'
|
33
33
|
gem 'gdb', '1.0.0'
|
34
34
|
gem 'gem-wrappers', '1.4.0'
|
35
|
+
gem 'geocoder', '1.8.2'
|
35
36
|
gem 'gist', '6.0.0'
|
36
37
|
gem 'gruff', '0.24.0'
|
37
38
|
# gem 'hidapi', '0.1.9'
|
@@ -42,10 +43,11 @@ gem 'js-beautify', '0.1.8'
|
|
42
43
|
gem 'json', '2.7.2'
|
43
44
|
gem 'jsonpath', '1.1.5'
|
44
45
|
gem 'jwt', '2.8.1'
|
45
|
-
gem 'libusb', '0.
|
46
|
+
gem 'libusb', '0.7.1'
|
46
47
|
gem 'luhn', '1.0.2'
|
47
48
|
gem 'mail', '2.8.1'
|
48
49
|
gem 'metasm', '1.0.5'
|
50
|
+
gem 'mqtt', '0.6.0'
|
49
51
|
# gem 'mongo', '2.19.3'
|
50
52
|
gem 'msfrpc-client', '1.1.2'
|
51
53
|
gem 'netaddr', '2.0.6'
|
@@ -66,7 +68,7 @@ gem 'pry', '0.14.2'
|
|
66
68
|
gem 'pry-doc', '1.5.0'
|
67
69
|
gem 'rake', '13.2.1'
|
68
70
|
gem 'rb-readline', '0.5.5'
|
69
|
-
gem '
|
71
|
+
gem 'rbvmomi2', '3.7.1'
|
70
72
|
gem 'rdoc', '6.6.3.1'
|
71
73
|
gem 'rest-client', '2.1.0'
|
72
74
|
gem 'rex', '2.0.13'
|
@@ -74,7 +76,7 @@ gem 'rmagick', '5.5.0'
|
|
74
76
|
gem 'rqrcode', '2.2.0'
|
75
77
|
gem 'rspec', '3.13.0'
|
76
78
|
gem 'rtesseract', '3.1.3'
|
77
|
-
gem 'rubocop', '1.63.
|
79
|
+
gem 'rubocop', '1.63.3'
|
78
80
|
gem 'rubocop-rake', '0.6.0'
|
79
81
|
gem 'rubocop-rspec', '2.29.1'
|
80
82
|
gem 'ruby-audio', '1.6.1'
|
@@ -88,7 +90,7 @@ gem 'serialport', '1.3.2'
|
|
88
90
|
gem 'slack-ruby-client', '2.3.0'
|
89
91
|
gem 'socksify', '1.7.1'
|
90
92
|
gem 'spreadsheet', '1.3.1'
|
91
|
-
gem 'sqlite3', '
|
93
|
+
gem 'sqlite3', '2.0.1'
|
92
94
|
gem 'thin', '1.8.2'
|
93
95
|
gem 'tty-prompt', '0.23.1'
|
94
96
|
gem 'tty-spinner', '0.9.3'
|
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.
|
40
|
+
pwn[v0.5.84]:001 >>> PWN.help
|
41
41
|
```
|
42
42
|
|
43
43
|
[](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.
|
55
|
+
pwn[v0.5.84]: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.
|
65
|
+
pwn[v0.5.84]: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:
|
@@ -0,0 +1,265 @@
|
|
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
|
data/lib/pwn/plugins/repl.rb
CHANGED
data/lib/pwn/plugins.rb
CHANGED
@@ -37,6 +37,7 @@ 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'
|
40
41
|
autoload :Metasploit, 'pwn/plugins/metasploit'
|
41
42
|
autoload :MonkeyPatch, 'pwn/plugins/monkey_patch'
|
42
43
|
autoload :MSR206, 'pwn/plugins/msr206'
|
data/lib/pwn/version.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe PWN::Plugins::Meshtastic do
|
6
|
+
it 'should display information for authors' do
|
7
|
+
authors_response = PWN::Plugins::Meshtastic
|
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::Plugins::Meshtastic
|
13
|
+
expect(help_response).to respond_to :help
|
14
|
+
end
|
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.
|
4
|
+
version: 0.5.84
|
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-
|
11
|
+
date: 2024-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -290,6 +290,20 @@ dependencies:
|
|
290
290
|
- - '='
|
291
291
|
- !ruby/object:Gem::Version
|
292
292
|
version: 1.4.0
|
293
|
+
- !ruby/object:Gem::Dependency
|
294
|
+
name: geocoder
|
295
|
+
requirement: !ruby/object:Gem::Requirement
|
296
|
+
requirements:
|
297
|
+
- - '='
|
298
|
+
- !ruby/object:Gem::Version
|
299
|
+
version: 1.8.2
|
300
|
+
type: :runtime
|
301
|
+
prerelease: false
|
302
|
+
version_requirements: !ruby/object:Gem::Requirement
|
303
|
+
requirements:
|
304
|
+
- - '='
|
305
|
+
- !ruby/object:Gem::Version
|
306
|
+
version: 1.8.2
|
293
307
|
- !ruby/object:Gem::Dependency
|
294
308
|
name: gist
|
295
309
|
requirement: !ruby/object:Gem::Requirement
|
@@ -422,14 +436,14 @@ dependencies:
|
|
422
436
|
requirements:
|
423
437
|
- - '='
|
424
438
|
- !ruby/object:Gem::Version
|
425
|
-
version: 0.
|
439
|
+
version: 0.7.1
|
426
440
|
type: :runtime
|
427
441
|
prerelease: false
|
428
442
|
version_requirements: !ruby/object:Gem::Requirement
|
429
443
|
requirements:
|
430
444
|
- - '='
|
431
445
|
- !ruby/object:Gem::Version
|
432
|
-
version: 0.
|
446
|
+
version: 0.7.1
|
433
447
|
- !ruby/object:Gem::Dependency
|
434
448
|
name: luhn
|
435
449
|
requirement: !ruby/object:Gem::Requirement
|
@@ -472,6 +486,20 @@ dependencies:
|
|
472
486
|
- - '='
|
473
487
|
- !ruby/object:Gem::Version
|
474
488
|
version: 1.0.5
|
489
|
+
- !ruby/object:Gem::Dependency
|
490
|
+
name: mqtt
|
491
|
+
requirement: !ruby/object:Gem::Requirement
|
492
|
+
requirements:
|
493
|
+
- - '='
|
494
|
+
- !ruby/object:Gem::Version
|
495
|
+
version: 0.6.0
|
496
|
+
type: :runtime
|
497
|
+
prerelease: false
|
498
|
+
version_requirements: !ruby/object:Gem::Requirement
|
499
|
+
requirements:
|
500
|
+
- - '='
|
501
|
+
- !ruby/object:Gem::Version
|
502
|
+
version: 0.6.0
|
475
503
|
- !ruby/object:Gem::Dependency
|
476
504
|
name: msfrpc-client
|
477
505
|
requirement: !ruby/object:Gem::Requirement
|
@@ -739,19 +767,19 @@ dependencies:
|
|
739
767
|
- !ruby/object:Gem::Version
|
740
768
|
version: 0.5.5
|
741
769
|
- !ruby/object:Gem::Dependency
|
742
|
-
name:
|
770
|
+
name: rbvmomi2
|
743
771
|
requirement: !ruby/object:Gem::Requirement
|
744
772
|
requirements:
|
745
773
|
- - '='
|
746
774
|
- !ruby/object:Gem::Version
|
747
|
-
version: 3.
|
775
|
+
version: 3.7.1
|
748
776
|
type: :runtime
|
749
777
|
prerelease: false
|
750
778
|
version_requirements: !ruby/object:Gem::Requirement
|
751
779
|
requirements:
|
752
780
|
- - '='
|
753
781
|
- !ruby/object:Gem::Version
|
754
|
-
version: 3.
|
782
|
+
version: 3.7.1
|
755
783
|
- !ruby/object:Gem::Dependency
|
756
784
|
name: rdoc
|
757
785
|
requirement: !ruby/object:Gem::Requirement
|
@@ -856,14 +884,14 @@ dependencies:
|
|
856
884
|
requirements:
|
857
885
|
- - '='
|
858
886
|
- !ruby/object:Gem::Version
|
859
|
-
version: 1.63.
|
887
|
+
version: 1.63.3
|
860
888
|
type: :runtime
|
861
889
|
prerelease: false
|
862
890
|
version_requirements: !ruby/object:Gem::Requirement
|
863
891
|
requirements:
|
864
892
|
- - '='
|
865
893
|
- !ruby/object:Gem::Version
|
866
|
-
version: 1.63.
|
894
|
+
version: 1.63.3
|
867
895
|
- !ruby/object:Gem::Dependency
|
868
896
|
name: rubocop-rake
|
869
897
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1038,14 +1066,14 @@ dependencies:
|
|
1038
1066
|
requirements:
|
1039
1067
|
- - '='
|
1040
1068
|
- !ruby/object:Gem::Version
|
1041
|
-
version:
|
1069
|
+
version: 2.0.1
|
1042
1070
|
type: :runtime
|
1043
1071
|
prerelease: false
|
1044
1072
|
version_requirements: !ruby/object:Gem::Requirement
|
1045
1073
|
requirements:
|
1046
1074
|
- - '='
|
1047
1075
|
- !ruby/object:Gem::Version
|
1048
|
-
version:
|
1076
|
+
version: 2.0.1
|
1049
1077
|
- !ruby/object:Gem::Dependency
|
1050
1078
|
name: thin
|
1051
1079
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1767,6 +1795,7 @@ files:
|
|
1767
1795
|
- lib/pwn/plugins/json_pathify.rb
|
1768
1796
|
- lib/pwn/plugins/log.rb
|
1769
1797
|
- lib/pwn/plugins/mail_agent.rb
|
1798
|
+
- lib/pwn/plugins/meshtastic.rb
|
1770
1799
|
- lib/pwn/plugins/metasploit.rb
|
1771
1800
|
- lib/pwn/plugins/monkey_patch.rb
|
1772
1801
|
- lib/pwn/plugins/msr206.rb
|
@@ -2097,6 +2126,7 @@ files:
|
|
2097
2126
|
- spec/lib/pwn/plugins/json_pathify_spec.rb
|
2098
2127
|
- spec/lib/pwn/plugins/log_spec.rb
|
2099
2128
|
- spec/lib/pwn/plugins/mail_agent_spec.rb
|
2129
|
+
- spec/lib/pwn/plugins/meshtastic_spec.rb
|
2100
2130
|
- spec/lib/pwn/plugins/metasploit_spec.rb
|
2101
2131
|
- spec/lib/pwn/plugins/monkey_patch_spec.rb
|
2102
2132
|
- spec/lib/pwn/plugins/msr206_spec.rb
|