pwn 0.4.456 → 0.4.460

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