pwn 0.5.83 → 0.5.84

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69446d2989efc5f4bcca3ceffde6bdf663067b128cd7cccf4050051752e6b1c5
4
- data.tar.gz: e9ad99571be1561a94dbe7e1775300607bb8635fddd3b648ca4b7e7eaf6abb08
3
+ metadata.gz: 140bec69aaf1bd6d7c4cdaa6eea7e065de1ba99d1bc19af79d647fc04c50a5f1
4
+ data.tar.gz: 22fa36d33db3cedbfbae8125357fc5c4385ab1d83098537ce8a454474d5456ee
5
5
  SHA512:
6
- metadata.gz: a4a6c70717d34bf933326815bf454dbc7732798f766061a053ade2c9cd5dd25a991c5d6aea11520c8f8533914d3b0813f01b756e4794e6b814df68760163a243
7
- data.tar.gz: afaa0614e87d9c4969e1cb3b6a4649db3c65b8086005e66c5b3f84e8ef83d37a30413202b80ae794eb3ffad65cf92facaa253edcf6cf0910334858abc11071f9
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.6.4'
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 'rbvmomi', '3.0.0'
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.2'
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', '1.7.3'
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.83]:001 >>> PWN.help
40
+ pwn[v0.5.84]: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.83]:001 >>> PWN.help
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.83]:001 >>> PWN.help
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
@@ -135,6 +135,7 @@ module PWN
135
135
 
136
136
  def process
137
137
  pi = pry_instance
138
+ pi.config.color = true
138
139
  pi.config.pwn_asm = false if pi.config.pwn_asm
139
140
  pi.config.pwn_ai = false if pi.config.pwn_ai
140
141
  pi.config.pwn_ai_debug = false if pi.config.pwn_ai_debug
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.5.83'
4
+ VERSION = '0.5.84'
5
5
  end
@@ -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.83
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-16 00:00:00.000000000 Z
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.6.4
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.6.4
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: rbvmomi
770
+ name: rbvmomi2
743
771
  requirement: !ruby/object:Gem::Requirement
744
772
  requirements:
745
773
  - - '='
746
774
  - !ruby/object:Gem::Version
747
- version: 3.0.0
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.0.0
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.2
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.2
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: 1.7.3
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: 1.7.3
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