pwn 0.4.456 → 0.4.460

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: b3b1843c0855572815309240a50172a80b69cb45ac5deb69680209ad1a8c7d67
4
- data.tar.gz: 943a67a010803ace7adc4aac78c18b43c168dfb5014a29058a7245a84ae07424
3
+ metadata.gz: 4aff2b2297397beff4fba5e51932807f004fc20a7887e841f86a108e2c172963
4
+ data.tar.gz: fd217091245e04376f6355e9ae95f7e78a6611b01446f855291843631cb89891
5
5
  SHA512:
6
- metadata.gz: 4f46dc1fa6e26ddab03a457400456670b6ce163669ed26b89932d27f22e597535f0b4e92d95035df91bb0eec7b2650e3a2e8d8a05eef01b71716433cc83a10b5
7
- data.tar.gz: 1732ba89f610c2a50c20f932bee5fb9707e292ca3cb667f4bd937b7aa7fd27e80a8a431bc0a5032866c41d215d0f8e95b55a6407e3daacf32962a3d3ccadebca
6
+ metadata.gz: 3818021d9ceac8a67ecd67d59c71a483cdfff3048f44897f41f7ffb383ce46df038af62a9cebc0e19715fe465839c1dd95a0d6ffe2234ba63fd684cbc21aa6c9
7
+ data.tar.gz: 6c3c935cf2d5bc4590a28b6f8da486db377a16e3880af813835540a0adbdfe54f6e959aea8a9c1083feab9eb4e405e42b38ee3919b7b89f098a0b2bbc6333d39
data/Gemfile CHANGED
@@ -59,7 +59,7 @@ gem 'rex', '2.0.13'
59
59
  gem 'rmagick', '4.2.5'
60
60
  gem 'rspec', '3.11.0'
61
61
  gem 'rtesseract', '3.1.2'
62
- gem 'rubocop', '1.29.1'
62
+ gem 'rubocop', '1.30.0'
63
63
  gem 'rubocop-rake', '0.6.0'
64
64
  gem 'rubocop-rspec', '2.11.1'
65
65
  gem 'ruby-audio', '1.6.1'
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ rvm use ruby-3.1.2@pwn
37
37
  $ rvm list gemsets
38
38
  $ gem install --verbose pwn
39
39
  $ pwn
40
- pwn[v0.4.456]:001 >>> PWN.help
40
+ pwn[v0.4.460]: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.1.2@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.4.456]:001 >>> PWN.help
55
+ pwn[v0.4.460]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
@@ -35,7 +35,7 @@ serial_obj = PWN::Plugins::Serial.connect
35
35
 
36
36
  PWN::Plugins::Serial.request(
37
37
  serial_obj: serial_obj,
38
- request: "ATDT#{voicemail_num};\r\n"
38
+ payload: "ATDT#{voicemail_num};\r\n"
39
39
  )
40
40
 
41
41
  # TODO: Loop until data received indicates call picked up instead of sleep
@@ -44,18 +44,18 @@ sleep 13
44
44
  voicemail_pin.each_char do |pin_char|
45
45
  PWN::Plugins::Serial.request(
46
46
  serial_obj: serial_obj,
47
- request: "AT+VTS=#{pin_char}\r\n"
47
+ payload: "AT+VTS=#{pin_char}\r\n"
48
48
  )
49
49
  end
50
50
 
51
51
  PWN::Plugins::Serial.request(
52
52
  serial_obj: serial_obj,
53
- request: "AT+VTS=#\r\n"
53
+ payload: "AT+VTS=#\r\n"
54
54
  )
55
55
 
56
56
  PWN::Plugins::Serial.request(
57
57
  serial_obj: serial_obj,
58
- request: "AT+CHUP;\r\n"
58
+ payload: "AT+CHUP;\r\n"
59
59
  )
60
60
 
61
61
  session_data = PWN::Plugins::Serial.dump_session_data
@@ -7,7 +7,7 @@ serial_obj = PWN::Plugins::Serial.connect
7
7
 
8
8
  PWN::Plugins::Serial.request(
9
9
  serial_obj: serial_obj,
10
- request: "AT+CLAC\r\n"
10
+ payload: "AT+CLAC\r\n"
11
11
  )
12
12
 
13
13
  session_data = PWN::Plugins::Serial.dump_session_data
@@ -63,28 +63,28 @@ module PWN
63
63
  case mode
64
64
  when 'BBI01'
65
65
  # Enter reset binary mode
66
- PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x00')
66
+ PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, byte_arr: [0x00])
67
67
  when 'SPI1'
68
68
  # Enter binary SPI mode
69
- PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x01')
69
+ PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, byte_arr: [0x01])
70
70
  when 'I2C1'
71
71
  # Enter I2C mode
72
- PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x02')
72
+ PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, byte_arr: [0x02])
73
73
  when 'ART1'
74
74
  # Enter UART mode
75
- PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x03')
75
+ PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, byte_arr: [0x03])
76
76
  when '1W01'
77
77
  # Enter 1-Wire mode
78
- PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x04')
78
+ PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, byte_arr: [0x04])
79
79
  when 'RAW1'
80
80
  # Enter raw-wire mode
81
- PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x05')
81
+ PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, byte_arr: [0x05])
82
82
  when 'RESET'
83
83
  # Reset Bus Pirate
84
- PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x0F')
84
+ PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, byte_arr: [0x0F])
85
85
  when 'STEST'
86
86
  # Bus Pirate self-tests
87
- PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, request: '\x10')
87
+ PWN::Plugins::Serial.request(serial_obj: bus_pirate_obj, byte_arr: [0x10])
88
88
  else
89
89
  raise "Invalid mode: #{mode}"
90
90
  end
@@ -9,21 +9,276 @@ module PWN
9
9
  # msr206_obj = PWN::Plugins::MSR206.connect(
10
10
  # block_dev: 'optional - serial block device path (defaults to /dev/ttyUSB0)',
11
11
  # baud: 'optional - (defaults to 9600)',
12
- # data_bits: 'optional - (defaults to 8)',
12
+ # data_bits: 'optional - (defaults to 7)',
13
13
  # stop_bits: 'optional - (defaults to 1)',
14
- # parity: 'optional - (defaults to SerialPort::NONE)',
14
+ # parity: 'optional - (defaults to SerialPort::ODD)',
15
15
  # flow_control: 'optional - (defaults to SerialPort::HARD) SerialPort::NONE|SerialPort::SOFT|SerialPort::HARD'
16
16
  # )
17
17
 
18
18
  public_class_method def self.connect(opts = {})
19
19
  # Default Baud Rate for this Device is 19200
20
- opts[:baud] = 19_200 if opts[:baud].nil?
20
+ opts[:baud] = 9_600 unless opts[:baud]
21
+ opts[:data_bits] = 7 unless opts[:data_bits]
22
+ opts[:stop_bits] = 1 unless opts[:stop_bits]
23
+ opts[:parity] = :odd unless opts[:parity]
21
24
  msr206_obj = PWN::Plugins::Serial.connect(opts)
22
25
  rescue StandardError => e
23
26
  disconnect(msr206_obj: msr206_obj) unless msr206_obj.nil?
24
27
  raise e
25
28
  end
26
29
 
30
+ # Supported Method Parameters::
31
+ # cmds = PWN::Plugins::MSR206.list_cmds
32
+ public_class_method def self.list_cmds
33
+ # Returns an Array of Symbols
34
+ cmds = %i[
35
+ version_report
36
+ simulate_power_cycle_warm_reset
37
+ configuration_request
38
+ reproduce_last_command
39
+ resume_transmission_to_host
40
+ pause_transmission_to_host
41
+ abort_command
42
+ red_on
43
+ red_off
44
+ red_flash
45
+ green_on
46
+ green_off
47
+ green_flash
48
+ yellow_on
49
+ yellow_off
50
+ yellow_flash
51
+ arm_to_read
52
+ arm_to_read_w_speed_prompts
53
+ tx_iso_std_data_track1
54
+ tx_iso_std_data_track2
55
+ tx_iso_std_data_track3
56
+ alt_tx_iso_std_data_track1
57
+ alt_tx_iso_std_data_track2
58
+ alt_tx_iso_std_data_track3
59
+ tx_error_data
60
+ tx_custom_data_forward_track1
61
+ tx_custom_data_forward_track2
62
+ tx_custom_data_forward_track3
63
+ tx_passbook_data
64
+ alt_tx_passbook_data
65
+ write_verify
66
+ card_edge_detect
67
+ load_iso_std_data_for_writing_track1
68
+ load_iso_std_data_for_writing_track2
69
+ load_iso_std_data_for_writing_track3
70
+ alt_load_iso_std_data_for_writing_track1
71
+ alt_load_iso_std_data_for_writing_track2
72
+ alt_load_iso_std_data_for_writing_track3
73
+ load_passbook_data_for_writing
74
+ load_custom_data_for_writing_track1
75
+ load_custom_data_for_writing_track2
76
+ load_custom_data_for_writing_track3
77
+ set_write_density
78
+ set_write_density_210_bpi_tracks13
79
+ set_write_density_75_bpi_tracks13
80
+ set_write_density_210_bpi_tracks2
81
+ set_write_density_75_bpi_tracks2
82
+ set_default_write_current
83
+ view_default_write_current
84
+ set_temp_write_current
85
+ view_temp_write_current
86
+ arm_to_write_with_raw
87
+ arm_to_write_no_raw
88
+ arm_to_write_with_raw_speed_prompts
89
+ ]
90
+ rescue StandardError => e
91
+ raise e
92
+ end
93
+
94
+ # Supported Method Parameters::
95
+ # parsed_cmd_resp_arr = parse_responses(
96
+ # cmd_resp: 'required - command response string'
97
+ # )
98
+
99
+ private_class_method def self.parse_responses(opts = {})
100
+ msr206_obj = opts[:msr206_obj]
101
+ cmd = opts[:cmd].to_s.scrub.strip.chomp
102
+
103
+ keep_parsing_responses = true
104
+ next_response_detected = false
105
+ all_cmd_responses = []
106
+ a_cmd_r_len = 0
107
+ last_a_cmd_r_len = 0
108
+
109
+ parsed_cmd_resp_arr = []
110
+ bytes_in_cmd_resp = 0
111
+ cmd_resp = ''
112
+
113
+ while keep_parsing_responses
114
+ until next_response_detected
115
+ all_cmd_responses = PWN::Plugins::Serial.response(serial_obj: msr206_obj)
116
+ cmd_resp = all_cmd_responses.last
117
+ bytes_in_cmd_resp = cmd_resp.split.length if cmd_resp
118
+ a_cmd_r_len = all_cmd_responses.length
119
+
120
+ next_response_detected = true if a_cmd_r_len > last_a_cmd_r_len
121
+ end
122
+
123
+ # cmd_resp = all_cmd_responses.last
124
+ # case cmd_resp
125
+ # when '21', '28', '29', '2A', '2B', '2D', '2F', '3A', '31', '32', '33', '3E', '3F', '5E', '7E', '98 FE'
126
+ # next_response_detected = true
127
+ # end
128
+ next_response_detected = false
129
+ last_a_cmd_r_len = a_cmd_r_len
130
+ print "\n"
131
+ keep_parsing_responses = false
132
+ end
133
+
134
+ all_cmd_responses
135
+ rescue StandardError => e
136
+ raise e
137
+ ensure
138
+ # Flush Responses for Next Request
139
+ PWN::Plugins::Serial.flush_session_data
140
+ end
141
+
142
+ # Supported Method Parameters::
143
+ # PWN::Plugins::MSR206.exec(
144
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
145
+ # cmd: 'required - cmd returned from #list_cmds method',
146
+ # params: 'optional - parameters for specific command returned from #list_params method'
147
+ # )
148
+ public_class_method def self.exec(opts = {})
149
+ msr206_obj = opts[:msr206_obj]
150
+ cmd = opts[:cmd].to_s.scrub.strip.chomp
151
+ params = opts[:params].to_s.scrub.strip.chomp
152
+
153
+ params_bytes = []
154
+ case cmd.to_sym
155
+ when :resume_transmission_to_host
156
+ cmd_bytes = [0x11]
157
+ when :pause_transmission_to_host
158
+ cmd_bytes = [0x13]
159
+ when :abort_command
160
+ cmd_bytes = [0x1B]
161
+ when :configuration_request
162
+ cmd_bytes = [0x23]
163
+ when :reproduce_last_command
164
+ cmd_bytes = [0x25]
165
+ when :card_edge_detect
166
+ cmd_bytes = [0x26]
167
+ when :green_flash
168
+ cmd_bytes = [0x28]
169
+ when :red_flash
170
+ cmd_bytes = [0x29]
171
+ when :version_report
172
+ cmd_bytes = [0x39]
173
+ when :set_write_density
174
+ cmd_bytes = [0x3B]
175
+ when :set_temp_write_current
176
+ cmd_bytes = [0x3C]
177
+ when :view_temp_write_current
178
+ cmd_bytes = [0x3E]
179
+ when :write_verify
180
+ cmd_bytes = [0x3F]
181
+ when :arm_to_write_with_raw
182
+ cmd_bytes = [0x40]
183
+ when :load_iso_std_data_for_writing_track1
184
+ cmd_bytes = [0x41]
185
+ when :load_iso_std_data_for_writing_track2
186
+ cmd_bytes = [0x42]
187
+ when :load_iso_std_data_for_writing_track3
188
+ cmd_bytes = [0x43]
189
+ when :tx_custom_data_forward_track1, :load_custom_data_for_writing_track1
190
+ cmd_bytes = [0x45]
191
+ when :tx_custom_data_forward_track2, :load_custom_data_for_writing_track2
192
+ cmd_bytes = [0x46]
193
+ when :tx_custom_data_forward_track3, :load_custom_data_for_writing_track3
194
+ cmd_bytes = [0x47]
195
+ when :tx_error_data
196
+ cmd_bytes = [0x49]
197
+ when :yellow_on
198
+ cmd_bytes = [0x4B]
199
+ when :green_on
200
+ cmd_bytes = [0x4C]
201
+ when :red_on
202
+ cmd_bytes = [0x4D]
203
+ when :set_write_density_210_bpi_tracks2
204
+ cmd_bytes = [0x4E]
205
+ when :set_write_density_210_bpi_tracks13
206
+ cmd_bytes = [0x4F]
207
+ when :arm_to_read
208
+ cmd_bytes = [0x50]
209
+ when :tx_iso_std_data_track1
210
+ cmd_bytes = [0x51]
211
+ when :tx_iso_std_data_track2
212
+ cmd_bytes = [0x52]
213
+ when :tx_iso_std_data_track3
214
+ cmd_bytes = [0x53]
215
+ when :tx_passbook_data
216
+ cmd_bytes = [0x58]
217
+ when :arm_to_write_no_raw
218
+ cmd_bytes = [0x5A]
219
+ when :set_default_write_current
220
+ cmd_bytes = [0x5B]
221
+ when :view_default_write_current
222
+ cmd_bytes = [0x5D]
223
+ when :alt_load_iso_std_data_for_writing_track1
224
+ cmd_bytes = [0x61]
225
+ when :alt_load_iso_std_data_for_writing_track2
226
+ cmd_bytes = [0x62]
227
+ when :alt_load_iso_std_data_for_writing_track3
228
+ cmd_bytes = [0x63]
229
+ when :load_passbook_data_for_writing
230
+ cmd_bytes = [0x6A]
231
+ when :yellow_off
232
+ cmd_bytes = [0x6B]
233
+ when :green_off
234
+ cmd_bytes = [0x6C]
235
+ when :red_off
236
+ cmd_bytes = [0x6D]
237
+ when :set_write_density_75_bpi_tracks2
238
+ cmd_bytes = [0x6E]
239
+ when :set_write_density_75_bpi_tracks13
240
+ cmd_bytes = [0x6F]
241
+ when :arm_to_read_w_speed_prompts
242
+ cmd_bytes = [0x70]
243
+ when :alt_tx_iso_std_data_track1
244
+ cmd_bytes = [0x71]
245
+ when :alt_tx_iso_std_data_track2
246
+ cmd_bytes = [0x72]
247
+ when :alt_tx_iso_std_data_track3
248
+ cmd_bytes = [0x73]
249
+ when :alt_tx_passbook_data
250
+ cmd_bytes = [0x78]
251
+ when :arm_to_write_with_raw_speed_prompts
252
+ cmd_bytes = [0x7A]
253
+ when :yellow_flash
254
+ cmd_bytes = [0x7C]
255
+ when :simulate_power_cycle_warm_reset
256
+ cmd_bytes = [0x7F]
257
+ else
258
+ raise "Unsupported Command: #{cmd}. Supported commands are:\n#{list_cmds}\n\n\n"
259
+ end
260
+
261
+ # If parameters to a command are set, append them.
262
+ cmd_bytes += params_bytes unless params_bytes.empty?
263
+ # Execute the command.
264
+ PWN::Plugins::Serial.request(
265
+ serial_obj: msr206_obj,
266
+ payload: cmd_bytes
267
+ )
268
+
269
+ # Parse commands response(s).
270
+ # Return an array of hashes.
271
+ parse_responses(
272
+ msr206_obj: msr206_obj,
273
+ cmd: cmd.to_sym
274
+ )
275
+ rescue StandardError => e
276
+ raise e
277
+ ensure
278
+ # Flush Responses for Next Request
279
+ PWN::Plugins::Serial.flush_session_data
280
+ end
281
+
27
282
  # Supported Method Parameters::
28
283
  # PWN::Plugins::MSR206.disconnect(
29
284
  # msr206_obj: 'required - msr206_obj returned from #connect method'
@@ -52,12 +307,20 @@ module PWN
52
307
  msr206_obj = #{self}.connect(
53
308
  block_dev: 'optional serial block device path (defaults to /dev/ttyUSB0)',
54
309
  baud: 'optional (defaults to 9600)',
55
- data_bits: 'optional (defaults to 8)',
310
+ data_bits: 'optional (defaults to 7)',
56
311
  stop_bits: 'optional (defaults to 1)',
57
- parity: 'optional (defaults to SerialPort::NONE)',
312
+ parity: 'optional (defaults to SerialPort::ODD)',
58
313
  flow_control: 'optional (defaults to SerialPort::NONE)'
59
314
  )
60
315
 
316
+ cmds = #{self}.list_cmds
317
+
318
+ parsed_cmd_resp_arr = #{self}.exec(
319
+ msr206_obj: 'required msr206_obj returned from #connect method',
320
+ cmd: 'required - cmd returned from #list_cmds method',
321
+ params: 'optional - parameters for specific command returned from #list_params method'
322
+ )
323
+
61
324
  #{self}.disconnect(
62
325
  msr206_obj: 'required msr206_obj returned from #connect method'
63
326
  )
@@ -8,7 +8,6 @@ module PWN
8
8
  # This plugin is used for interacting with serial devices including, but not limited to,
9
9
  # modems (including cellphone radios), legacy equipment, arduinos, & other misc ftdi devices
10
10
  module Serial
11
- # @session_data = ""
12
11
  @session_data = []
13
12
 
14
13
  # Supported Method Parameters::
@@ -45,17 +44,27 @@ module PWN
45
44
  opts[:stop_bits].to_i
46
45
  end
47
46
 
48
- parity = if opts[:parity].nil?
49
- SerialPort::NONE
50
- else
51
- opts[:parity]
52
- end
47
+ case opts[:parity]
48
+ when :even
49
+ parity = SerialPort::EVEN
50
+ when :mark
51
+ parity = SerialPort::MARK
52
+ when :odd
53
+ parity = SerialPort::ODD
54
+ when :space
55
+ parity = SerialPort::SPACE
56
+ else
57
+ parity = SerialPort::NONE
58
+ end
53
59
 
54
- flow_control = if opts[:flow_control].nil?
55
- SerialPort::HARD
56
- else
57
- opts[:flow_control]
58
- end
60
+ case opts[:flow_control]
61
+ when :hard
62
+ flow_control = SerialPort::HARD
63
+ when :soft
64
+ flow_control = SerialPort::SOFT
65
+ else
66
+ flow_control = SerialPort::NONE
67
+ end
59
68
 
60
69
  serial_conn = SerialPort.new(
61
70
  block_dev,
@@ -138,21 +147,39 @@ module PWN
138
147
  # Supported Method Parameters::
139
148
  # PWN::Plugins::Serial.request(
140
149
  # serial_obj: 'required serial_obj returned from #connect method',
141
- # request: 'required - string to write to serial device'
150
+ # payload: 'required - array of bytes OR string to write to serial device (e.g. [0x00, 0x41, 0x90, 0x00] OR "ATDT+15555555\r\n"'
142
151
  # )
143
152
 
144
153
  public_class_method def self.request(opts = {})
145
154
  serial_obj = opts[:serial_obj]
146
- request = opts[:request].to_s.scrub
155
+ payload = opts[:payload]
147
156
  serial_conn = serial_obj[:serial_conn]
148
- chars_written = serial_conn.write(request)
157
+
158
+ byte_arr = payload
159
+ byte_arr = payload.chars if payload.instance_of?(String)
160
+
161
+ byte_arr.each do |byte|
162
+ serial_conn.putc(byte)
163
+ end
164
+
149
165
  serial_conn.flush
150
- chars_written
151
166
  rescue StandardError => e
152
167
  disconnect(serial_obj: serial_obj) unless serial_obj.nil?
153
168
  raise e
154
169
  end
155
170
 
171
+ # public_class_method def self.request(opts = {})
172
+ # serial_obj = opts[:serial_obj]
173
+ # request = opts[:request].to_s.scrub
174
+ # serial_conn = serial_obj[:serial_conn]
175
+ # chars_written = serial_conn.write(request)
176
+ # serial_conn.flush
177
+ # chars_written
178
+ # rescue StandardError => e
179
+ # disconnect(serial_obj: serial_obj) unless serial_obj.nil?
180
+ # raise e
181
+ # end
182
+
156
183
  # Supported Method Parameters::
157
184
  # PWN::Plugins::Serial.response(
158
185
  # serial_obj: 'required - serial_obj returned from #connect method'
@@ -160,37 +187,60 @@ module PWN
160
187
 
161
188
  public_class_method def self.response(opts = {})
162
189
  serial_obj = opts[:serial_obj]
163
- @session_data.last
190
+
191
+ raw_byte_arr = dump_session_data
192
+
193
+ hex_esc_raw_resp = ''
194
+ raw_byte_arr.each do |byte|
195
+ # this_byte = "\s#{byte.unpack1('H*')}"
196
+ this_byte = byte.unpack1('H*')
197
+ # Needed when #unpack1 returns 2 bytes instead of one
198
+ # e.g."ް" translates to deb0 (that's not a double quote ")
199
+ # instead of de b0
200
+ # this condition is ghetto-hacker-ish.
201
+ if this_byte.length == 4
202
+ byte_one = this_byte[1..2]
203
+ byte_two = this_byte[-2..-1]
204
+ hex_esc_raw_resp = "#{hex_esc_raw_resp}\s#{byte_one}"
205
+ hex_esc_raw_resp = "#{hex_esc_raw_resp}\s#{byte_two}"
206
+ else
207
+ hex_esc_raw_resp = "#{hex_esc_raw_resp}\s#{this_byte}"
208
+ end
209
+ end
210
+
211
+ # Return command response array in space-delimited hex
212
+ cmd_response_arr = hex_esc_raw_resp.upcase.strip.split(/(?=FF)/)
213
+ cmd_response_arr.map(&:strip)
164
214
  rescue StandardError => e
165
- disconnect(serial_obj: serial_obj) unless serial_obj.nil?
215
+ # Flush Responses for Next Request
216
+ flush_session_data(serial_obj: serial_obj)
217
+
166
218
  raise e
167
219
  end
168
220
 
169
- # Supported Method Parameters::
170
- # session_data = PWN::Plugins::Serial.dump_session_data(
171
- # serial_obj: 'required - serial_obj returned from #connect method'
172
- # )
221
+ # public_class_method def self.response(opts = {})
222
+ # serial_obj = opts[:serial_obj]
223
+ # @session_data.last
224
+ # rescue StandardError => e
225
+ # disconnect(serial_obj: serial_obj) unless serial_obj.nil?
226
+ # raise e
227
+ # end
173
228
 
174
- public_class_method def self.dump_session_data(opts = {})
175
- serial_obj = opts[:serial_obj]
229
+ # Supported Method Parameters::
230
+ # session_data = PWN::Plugins::Serial.dump_session_data
176
231
 
232
+ public_class_method def self.dump_session_data
177
233
  @session_data
178
234
  rescue StandardError => e
179
- disconnect(serial_obj: serial_obj) unless serial_obj.nil?
180
235
  raise e
181
236
  end
182
237
 
183
238
  # Supported Method Parameters::
184
- # session_data = PWN::Plugins::Serial.flush_session_data(
185
- # serial_obj: 'required - serial_obj returned from #connect method'
186
- # )
187
-
188
- public_class_method def self.flush_session_data(opts = {})
189
- serial_obj = opts[:serial_obj]
239
+ # session_data = PWN::Plugins::Serial.flush_session_data
190
240
 
241
+ public_class_method def self.flush_session_data
191
242
  @session_data.clear
192
243
  rescue StandardError => e
193
- disconnect(serial_obj: serial_obj) unless serial_obj.nil?
194
244
  raise e
195
245
  end
196
246
 
@@ -203,7 +253,7 @@ module PWN
203
253
  serial_obj = opts[:serial_obj]
204
254
  serial_conn = serial_obj[:serial_conn]
205
255
  session_thread = serial_obj[:session_thread]
206
- flush_session_data(serial_obj: serial_obj)
256
+ flush_session_data
207
257
  session_thread.terminate
208
258
  serial_conn.close
209
259
  serial_conn = nil
@@ -242,20 +292,16 @@ module PWN
242
292
 
243
293
  #{self}.request(
244
294
  serial_obj: 'required serial_obj returned from #connect method',
245
- request: 'required string to write to serial device'
295
+ payload: 'required - array of bytes OR string to write to serial device (e.g. [0x00, 0x41, 0x90, 0x00] OR \"ATDT+15555555\r\n\"'
246
296
  )
247
297
 
248
298
  #{self}.response(
249
299
  serial_obj: 'required serial_obj returned from #connect method'
250
300
  )
251
301
 
252
- session_data_arr = #{self}.dump_session_data(
253
- serial_obj: 'required serial_obj returned from #connect method'
254
- )
302
+ session_data_arr = #{self}.dump_session_data
255
303
 
256
304
  #{self}.flush_session_data
257
- serial_obj: 'required serial_obj returned from #connect method'
258
- )
259
305
 
260
306
  #{self}.disconnect(
261
307
  serial_obj: 'required serial_obj returned from #connect method'
@@ -8,7 +8,7 @@ module PWN
8
8
  # Supported Method Parameters::
9
9
  # son_micro_rfid_obj = PWN::Plugins::SonMicroRFID.connect(
10
10
  # block_dev: 'optional - serial block device path (defaults to /dev/ttyUSB0)',
11
- # baud: 'optional - (defaults to 9600)',
11
+ # baud: 'optional - (defaults to 19_200)',
12
12
  # data_bits: 'optional - (defaults to 8)',
13
13
  # stop_bits: 'optional - (defaults to 1)',
14
14
  # parity: 'optional - (defaults to SerialPort::NONE)',
@@ -17,7 +17,10 @@ module PWN
17
17
 
18
18
  public_class_method def self.connect(opts = {})
19
19
  # Default Baud Rate for this Device is 19200
20
- opts[:baud] = 19_200 if opts[:baud].nil?
20
+ opts[:baud] = 19_200 unless opts[:baud]
21
+ opts[:data_bits] = 8 unless opts[:data_bits]
22
+ opts[:stop_bits] = 1 unless opts[:stop_bits]
23
+ opts[:parity] = :none unless opts[:parity]
21
24
  son_micro_rfid_obj = PWN::Plugins::Serial.connect(opts)
22
25
  rescue StandardError => e
23
26
  disconnect(son_micro_rfid_obj: son_micro_rfid_obj) unless son_micro_rfid_obj.nil?
@@ -109,49 +112,8 @@ module PWN
109
112
  end
110
113
 
111
114
  # Supported Method Parameters::
112
- # cmd_response_arr = get_cmd_responses(
115
+ # parsed_cmd_resp_arr = parse_responses(
113
116
  # son_micro_rfid_obj: 'required - son_micro_rfid_obj returned from #connect method'
114
- # )
115
-
116
- public_class_method def self.get_cmd_responses(opts = {})
117
- son_micro_rfid_obj = opts[:son_micro_rfid_obj]
118
-
119
- raw_byte_arr = PWN::Plugins::Serial.dump_session_data(
120
- serial_obj: son_micro_rfid_obj
121
- )
122
-
123
- hex_esc_raw_resp = ''
124
- raw_byte_arr.each do |byte|
125
- # this_byte = "\s#{byte.unpack1('H*')}"
126
- this_byte = byte.unpack1('H*')
127
- # Needed when #unpack1 returns 2 bytes instead of one
128
- # e.g."ް" translates to deb0 (that's not a double quote ")
129
- # instead of de b0
130
- # this condition is ghetto-hacker-ish.
131
- if this_byte.length == 4
132
- byte_one = this_byte[1..2]
133
- byte_two = this_byte[-2..-1]
134
- hex_esc_raw_resp = "#{hex_esc_raw_resp}\s#{byte_one}"
135
- hex_esc_raw_resp = "#{hex_esc_raw_resp}\s#{byte_two}"
136
- else
137
- hex_esc_raw_resp = "#{hex_esc_raw_resp}\s#{this_byte}"
138
- end
139
- end
140
-
141
- # Return command response array in space-delimited hex
142
- cmd_response_arr = hex_esc_raw_resp.upcase.strip.split(/(?=FF)/)
143
- cmd_response_arr.map(&:strip)
144
- rescue StandardError => e
145
- # Flush Responses for Next Request
146
- PWN::Plugins::Serial.flush_session_data(
147
- serial_obj: son_micro_rfid_obj
148
- )
149
-
150
- raise e
151
- end
152
-
153
- # Supported Method Parameters::
154
- # parsed_cmd_resp_arr = parse_cmd_resp(
155
117
  # cmd_resp: 'required - command response string'
156
118
  # )
157
119
 
@@ -173,13 +135,14 @@ module PWN
173
135
  while keep_parsing_responses
174
136
  until next_response_detected
175
137
  print '.'
176
- all_cmd_responses = get_cmd_responses(
177
- son_micro_rfid_obj: son_micro_rfid_obj
138
+ all_cmd_responses = PWN::Plugins::Serial.response(
139
+ serial_obj: son_micro_rfid_obj
178
140
  )
179
141
  cmd_resp = all_cmd_responses.last
180
142
  bytes_in_cmd_resp = cmd_resp.split.length if cmd_resp
181
143
  a_cmd_r_len = all_cmd_responses.length
182
144
 
145
+ # Dont proceed until the expected_cmd_resp_byte_len byte appears
183
146
  next_response_detected = true if bytes_in_cmd_resp > 3 &&
184
147
  a_cmd_r_len > last_a_cmd_r_len
185
148
  end
@@ -194,8 +157,8 @@ module PWN
194
157
  cmd_hex = cmd_resp.split[3]
195
158
 
196
159
  while bytes_in_cmd_resp < expected_cmd_resp_byte_len
197
- all_cmd_responses = get_cmd_responses(
198
- son_micro_rfid_obj: son_micro_rfid_obj
160
+ all_cmd_responses = PWN::Plugins::Serial.response(
161
+ serial_obj: son_micro_rfid_obj
199
162
  )
200
163
 
201
164
  cmd_resp = all_cmd_responses.last
@@ -210,6 +173,7 @@ module PWN
210
173
  puts "#{all_cmd_responses}\n\n\n"
211
174
 
212
175
  parsed_cmd_resp_hash = {}
176
+ parsed_cmd_resp_hash[:raw_resp] = PWN::Plugins::Serial.dump_session_data.inspect
213
177
  parsed_cmd_resp_hash[:hex_resp] = cmd_resp
214
178
  parsed_cmd_resp_hash[:cmd_hex] = cmd_hex
215
179
  parsed_cmd_resp_hash[:cmd_desc] = cmd.to_sym
@@ -268,9 +232,7 @@ module PWN
268
232
  raise e
269
233
  ensure
270
234
  # Flush Responses for Next Request
271
- PWN::Plugins::Serial.flush_session_data(
272
- serial_obj: son_micro_rfid_obj
273
- )
235
+ PWN::Plugins::Serial.flush_session_data
274
236
  end
275
237
 
276
238
  # Supported Method Parameters::
@@ -355,9 +317,10 @@ module PWN
355
317
  # If parameters to a command are set, append them.
356
318
  cmd_bytes += params_bytes unless params_bytes.empty?
357
319
  # Execute the command.
358
- cmd_bytes.each do |byte|
359
- son_micro_rfid_obj[:serial_conn].putc(byte)
360
- end
320
+ PWN::Plugins::Serial.request(
321
+ serial_obj: son_micro_rfid_obj,
322
+ payload: cmd_bytes
323
+ )
361
324
 
362
325
  # Parse commands response(s).
363
326
  # Return an array of hashes.
@@ -369,9 +332,7 @@ module PWN
369
332
  raise e
370
333
  ensure
371
334
  # Flush Responses for Next Request
372
- PWN::Plugins::Serial.flush_session_data(
373
- serial_obj: son_micro_rfid_obj
374
- )
335
+ PWN::Plugins::Serial.flush_session_data
375
336
  end
376
337
 
377
338
  # Supported Method Parameters::
@@ -401,7 +362,7 @@ module PWN
401
362
  puts "USAGE:
402
363
  son_micro_rfid_obj = #{self}.connect(
403
364
  block_dev: 'optional serial block device path (defaults to /dev/ttyUSB0)',
404
- baud: 'optional (defaults to 9600)',
365
+ baud: 'optional (defaults to 19_200)',
405
366
  data_bits: 'optional (defaults to 8)',
406
367
  stop_bits: 'optional (defaults to 1)',
407
368
  parity: 'optional (defaults to SerialPort::NONE)',
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.4.456'
4
+ VERSION = '0.4.460'
5
5
  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.4.456
4
+ version: 0.4.460
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-25 00:00:00.000000000 Z
11
+ date: 2022-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -674,14 +674,14 @@ dependencies:
674
674
  requirements:
675
675
  - - '='
676
676
  - !ruby/object:Gem::Version
677
- version: 1.29.1
677
+ version: 1.30.0
678
678
  type: :runtime
679
679
  prerelease: false
680
680
  version_requirements: !ruby/object:Gem::Requirement
681
681
  requirements:
682
682
  - - '='
683
683
  - !ruby/object:Gem::Version
684
- version: 1.29.1
684
+ version: 1.30.0
685
685
  - !ruby/object:Gem::Dependency
686
686
  name: rubocop-rake
687
687
  requirement: !ruby/object:Gem::Requirement