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 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