pwn 0.4.465 → 0.4.468

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: 0ce80ecfe98017552fc1b5da930b332b64284fa51ae55465fd8774bcdc354a77
4
- data.tar.gz: 70880e0ec3b2c750e0c2ac60cd41deaea5aada6bfd191cd9ce21d7a1dd7e7bbf
3
+ metadata.gz: 98c7c96215e79c7af756b24a758d15c55ee42fddc0822d90350c5476059f5573
4
+ data.tar.gz: 75ecc6b0534b384612dae50bb7d23143e4e11a5c3a2bddda8fc6f14ea1f8c44e
5
5
  SHA512:
6
- metadata.gz: 3abe9759400c7cc906788386eb0efe23f0411a93f6ae299ad0f365ba9358c9440fd550d710eec59eba01fc7947e6403f44ce78b408a9a54e4e365fbff76a6140
7
- data.tar.gz: a25c91a96cf55c80ba0ba8b3e080ddc1a6a712082a00c3b8fb16869d621f97a693b3220c105e942c1b9b36cc3453cd94fd7d6747f9517a6a0d8bd1244fb9eeee
6
+ metadata.gz: ee8208c011822cee15ef9d92a564ce3e3027c61dd2f975acb7d154e398b763a1bb820a56d6c56fe6ec63b9c0fbd6bf80528f0a05db6081d2327b831bde5f5bd1
7
+ data.tar.gz: 747b0b22555e4f75be1b25455bbe07e903e82184bbbd68d67a6981e41c7f8f82173003cd6986e6953b5d3cc3e6fbf70aff3aaacd5f24b33881709c90494e007e
data/Gemfile CHANGED
@@ -13,12 +13,12 @@ gemspec
13
13
  # to review these custom flags (e.g. pg, serialport, etc).
14
14
  gem 'activesupport', '7.0.3'
15
15
  gem 'anemone', '0.7.2'
16
- gem 'authy', '3.0.0'
16
+ gem 'authy', '3.0.1'
17
17
  gem 'aws-sdk', '3.1.0'
18
18
  gem 'bettercap', '1.6.2'
19
19
  gem 'brakeman', '5.2.3'
20
20
  gem 'bson', '4.15.0'
21
- gem 'bundler', '>=2.3.14'
21
+ gem 'bundler', '>=2.3.15'
22
22
  gem 'bundler-audit', '0.9.1'
23
23
  gem 'bunny', '2.19.0'
24
24
  gem 'colorize', '0.8.1'
@@ -80,4 +80,4 @@ gem 'watir', '7.1.0'
80
80
  gem 'waveform', '0.1.2'
81
81
  gem 'webrick', '1.7.0'
82
82
  gem 'wicked_pdf', '2.6.3'
83
- gem 'yard', '0.9.27'
83
+ gem 'yard', '0.9.28'
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.465]:001 >>> PWN.help
40
+ pwn[v0.4.468]: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.465]:001 >>> PWN.help
55
+ pwn[v0.4.468]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
@@ -3,6 +3,7 @@
3
3
 
4
4
  require 'pwn'
5
5
  require 'optparse'
6
+ require 'json'
6
7
 
7
8
  opts = {}
8
9
  OptionParser.new do |options|
@@ -67,6 +68,27 @@ begin
67
68
  cmd: :simulate_power_cycle_warm_reset
68
69
  )
69
70
 
71
+ # TODO: Parse Binary Bits to Derive Readable Configuration
72
+ # e.g. 'Read & Write All Three Tracks' if binary_resp == '11101111'
73
+ # Probably better to split each bit and then evaluate
74
+ # binary_resp_arr = binary_resp.chars
75
+ # --------------------------------------------------
76
+ # Bit|Bit = 0 |Bit = 1
77
+ # --------------------------------------------------
78
+ # 0 |Track 1 Read not present |Track 1 Read present
79
+ # 1 |Track 2 Read not present |Track 2 Read present
80
+ # 2 |Track 3 Read not present |Track 3 Read present
81
+ # 3 |not used – should be 0 |not used
82
+ # 4 |Track 3 Write not present|Track 3 Write present
83
+ # 5 |Track 2 Write not present|Track 2 Write present
84
+ # 6 |Track 1 Write not present|Track 1 Write present
85
+ # 7 |parity bit** |parity bit**
86
+ exec_resp = PWN::Plugins::MSR206.exec(
87
+ msr206_obj: msr206_obj,
88
+ cmd: :configuration_request
89
+ )
90
+ puts "Configuration Bits: #{exec_resp[:binary].first}"
91
+
70
92
  exec_resp = PWN::Plugins::MSR206.exec(
71
93
  msr206_obj: msr206_obj,
72
94
  cmd: :version_report
@@ -79,7 +101,7 @@ begin
79
101
  unless menu_msg.include?('ERROR')
80
102
  exec_resp = PWN::Plugins::MSR206.exec(
81
103
  msr206_obj: msr206_obj,
82
- cmd: :yellow_on
104
+ cmd: :green_flash
83
105
  )
84
106
  end
85
107
 
@@ -99,14 +121,14 @@ begin
99
121
  when :R
100
122
  menu_msg = 'READY TO READ - PLEASE SWIPE CARD'
101
123
  # Read Card
102
- PWN::Plugins::MSR206.wait_for_swipe(
124
+ track_data = PWN::Plugins::MSR206.wait_for_swipe(
103
125
  msr206_obj: msr206_obj,
104
126
  type: :arm_to_read
105
127
  )
106
128
  when :C
107
129
  menu_msg = 'READY TO COPY - PLEASE SWIPE ORIGINAL CARD'
108
130
  # Read Original Card
109
- PWN::Plugins::MSR206.wait_for_swipe(
131
+ track_data = PWN::Plugins::MSR206.wait_for_swipe(
110
132
  msr206_obj: msr206_obj,
111
133
  type: :arm_to_read
112
134
  )
@@ -117,7 +139,7 @@ begin
117
139
  when :E
118
140
  menu_msg = 'READY TO EDIT - PLEASE SWIPE TARGET CARD'
119
141
  # Read Target Card
120
- PWN::Plugins::MSR206.wait_for_swipe(
142
+ track_data = PWN::Plugins::MSR206.wait_for_swipe(
121
143
  msr206_obj: msr206_obj,
122
144
  type: :arm_to_read
123
145
  )
@@ -128,10 +150,40 @@ begin
128
150
  when :B
129
151
  menu_msg = 'READY TO BACKUP - PLEASE SWIPE CARD'
130
152
  # Read Card
131
- PWN::Plugins::MSR206.wait_for_swipe(
153
+ track_data = PWN::Plugins::MSR206.wait_for_swipe(
132
154
  msr206_obj: msr206_obj,
133
155
  type: :arm_to_read
134
156
  )
157
+ file = ''
158
+ loop do
159
+ exec_resp = PWN::Plugins::MSR206.exec(
160
+ msr206_obj: msr206_obj,
161
+ cmd: :green_flash
162
+ )
163
+
164
+ print 'Enter File Name to Save Backup: '
165
+ file = gets.scrub.chomp.strip
166
+ file_dir = File.dirname(file)
167
+ break if Dir.exist?(file_dir)
168
+
169
+ puts "\nDirectory #{file_dir} for #{file} does not exist."
170
+ exec_resp = PWN::Plugins::MSR206.exec(
171
+ msr206_obj: msr206_obj,
172
+ cmd: :green_off
173
+ )
174
+ exec_resp = PWN::Plugins::MSR206.exec(
175
+ msr206_obj: msr206_obj,
176
+ cmd: :yellow_flash
177
+ )
178
+ end
179
+
180
+ File.write(file, "#{track_data.to_json}\n")
181
+ exec_resp = PWN::Plugins::MSR206.exec(
182
+ msr206_obj: msr206_obj,
183
+ cmd: :yellow_off
184
+ )
185
+
186
+ puts 'complete.'
135
187
  when :W
136
188
  exec_resp = PWN::Plugins::MSR206.exec(
137
189
  msr206_obj: msr206_obj,
@@ -144,12 +196,12 @@ begin
144
196
  menu_msg = '****** ERROR: Invalid Menu Option Selected ******'
145
197
  exec_resp = PWN::Plugins::MSR206.exec(
146
198
  msr206_obj: msr206_obj,
147
- cmd: :yellow_off
199
+ cmd: :green_off
148
200
  )
149
201
 
150
202
  exec_resp = PWN::Plugins::MSR206.exec(
151
203
  msr206_obj: msr206_obj,
152
- cmd: :red_flash
204
+ cmd: :yellow_flash
153
205
  )
154
206
  end
155
207
  end
@@ -308,6 +308,26 @@ module PWN
308
308
  raise e
309
309
  end
310
310
 
311
+ # Supported Method Parameters::
312
+ # parsed_cmd_resp_arr = binary(
313
+ # raw_byte_arr: 'required - raw_byte_arr produced in #parse_responses'
314
+ # )
315
+
316
+ private_class_method def self.binary(opts = {})
317
+ raw_byte_arr = opts[:raw_byte_arr]
318
+
319
+ binary_byte_arr = []
320
+ if raw_byte_arr
321
+ raw_byte_arr.first.split.each do |byte_str|
322
+ binary_byte_arr.push([byte_str].pack('H*').unpack1('B*').reverse)
323
+ end
324
+ end
325
+
326
+ binary_byte_arr
327
+ rescue StandardError => e
328
+ raise e
329
+ end
330
+
311
331
  # Supported Method Parameters::
312
332
  # parsed_cmd_resp_arr = parse_responses(
313
333
  # cmd_resp: 'required - command response string'
@@ -342,31 +362,31 @@ module PWN
342
362
  end
343
363
 
344
364
  case cmd_resp
345
- when '21'
365
+ when '21', 'A1'
346
366
  response[:msg] = :invalid_command
347
- when '28'
367
+ when '28', 'A8'
348
368
  response[:msg] = :card_speed_measurement_start
349
- when '29'
369
+ when '29', 'A9'
350
370
  response[:msg] = :card_speed_measurement_end
351
- when '2A'
371
+ when '2A', 'AA'
352
372
  response[:msg] = :error
353
- when '2B'
373
+ when '2B', 'AB'
354
374
  response[:msg] = :no_data_found
355
- when '2D'
375
+ when '2D', 'AD'
356
376
  response[:msg] = :insufficient_leading_zeros_for_custom_writing
357
- when '2F'
377
+ when '2F', 'AF'
358
378
  response[:msg] = :first_lsb_char_not_one_for_custom_writing
359
- when '3A'
360
- response[:msg] = :power_on_report
361
- when '31'
379
+ when '31', 'B1'
362
380
  response[:msg] = :unsuccessful_read_after_write_track1
363
- when '32'
381
+ when '32', 'B2'
364
382
  response[:msg] = :unsuccessful_read_after_write_track2
365
- when '33'
383
+ when '33', 'B3'
366
384
  response[:msg] = :unsuccessful_read_after_write_track3
367
- when '3E'
385
+ when '3A', 'BA'
386
+ response[:msg] = :power_on_report
387
+ when '3E', 'BE'
368
388
  response[:msg] = :card_edge_detected
369
- when '3F'
389
+ when '3F', 'BF'
370
390
  response[:msg] = :communications_error
371
391
  when '5E'
372
392
  response[:msg] = :ack_command_completed
@@ -382,6 +402,7 @@ module PWN
382
402
  end
383
403
 
384
404
  response[:raw] = raw_byte_arr
405
+ response[:binary] = binary(raw_byte_arr: raw_byte_arr)
385
406
  response[:decoded] = decode(raw_byte_arr: raw_byte_arr)
386
407
  response
387
408
  rescue StandardError => e
@@ -534,6 +555,7 @@ module PWN
534
555
  # Supported Method Parameters::
535
556
  # PWN::Plugins::MSR206.wait_for_swipe(
536
557
  # msr206_obj: 'required - msr206_obj returned from #connect method'
558
+ # type: 'required - swipe type'
537
559
  # )
538
560
 
539
561
  public_class_method def self.wait_for_swipe(opts = {})
@@ -549,6 +571,8 @@ module PWN
549
571
 
550
572
  raise "ERROR Unsupported type in #wait_for_swipe - #{type}. Valid types:\n#{types_arr}" unless types_arr.include?(type)
551
573
 
574
+ track_data = {}
575
+
552
576
  exec_resp = exec(
553
577
  msr206_obj: msr206_obj,
554
578
  cmd: :red_off
@@ -584,57 +608,64 @@ module PWN
584
608
  break if exec_resp[:msg] == :ack_command_completed
585
609
  end
586
610
 
587
- puts "*** ISO Track Format: Standard #{'*' * 17}"
611
+ puts "\n*** ISO Track Format: Standard #{'*' * 17}"
588
612
  print 'TRACK 1 >>> '
589
613
  exec_resp = exec(
590
614
  msr206_obj: msr206_obj,
591
- cmd: :tx_iso_std_data_track1,
592
- params: [0x31]
615
+ cmd: :tx_iso_std_data_track1
593
616
  )
594
617
  puts exec_resp[:decoded]
595
618
  puts exec_resp.inspect
596
-
597
- # print ">> Track 1 (ALT DATA)\n"
598
- # exec_resp = exec(
599
- # msr206_obj: msr206_obj,
600
- # cmd: :alt_tx_iso_std_data_track1,
601
- # params: [0x31]
602
- # )
603
- # puts exec_resp.inspect
619
+ track_data[:track1] = exec_resp
620
+
621
+ # (1..3).each do |n|
622
+ # print ">> Track 1 (ALT DATA) ISO Track Format: #{n}\n"
623
+ # exec_resp = exec(
624
+ # msr206_obj: msr206_obj,
625
+ # cmd: :alt_tx_iso_std_data_track1,
626
+ # params: [n.to_s]
627
+ # )
628
+ # puts exec_resp.inspect
629
+ # end
604
630
 
605
631
  print "\nTRACK 2 >>> "
606
632
  exec_resp = exec(
607
633
  msr206_obj: msr206_obj,
608
- cmd: :tx_iso_std_data_track2,
609
- params: [0x32]
634
+ cmd: :tx_iso_std_data_track2
610
635
  )
611
636
  puts exec_resp[:decoded]
612
637
  puts exec_resp.inspect
613
-
614
- # print ">> Track 2 (ALT DATA)\n"
615
- # exec_resp = exec(
616
- # msr206_obj: msr206_obj,
617
- # cmd: :alt_tx_iso_std_data_track2,
618
- # params: [0x32]
619
- # )
620
- # puts exec_resp.inspect
638
+ track_data[:track2] = exec_resp
639
+
640
+ # (1..3).each do |n|
641
+ # print ">> Track 2 (ALT DATA) ISO Track Format: #{n}\n"
642
+ # exec_resp = exec(
643
+ # msr206_obj: msr206_obj,
644
+ # cmd: :alt_tx_iso_std_data_track2,
645
+ # params: [n.to_s]
646
+ # )
647
+ # puts exec_resp.inspect
648
+ # end
621
649
 
622
650
  print "\nTRACK 3 >>> "
623
651
  exec_resp = exec(
624
652
  msr206_obj: msr206_obj,
625
- cmd: :tx_iso_std_data_track3,
626
- params: [0x33]
653
+ cmd: :tx_iso_std_data_track3
627
654
  )
628
655
  puts exec_resp[:decoded]
629
656
  puts exec_resp.inspect
630
-
631
- # print ">> Track 3 (ALT DATA)\n"
632
- # exec_resp = exec(
633
- # msr206_obj: msr206_obj,
634
- # cmd: :alt_tx_iso_std_data_track3,
635
- # params: [0x33]
636
- # )
637
- # puts exec_resp.inspect
657
+ track_data[:track3] = exec_resp
658
+
659
+ # (1..3).each do |n|
660
+ # print ">> Track 3 (ALT DATA) ISO Track Format: #{n}\n"
661
+ # exec_resp = exec(
662
+ # msr206_obj: msr206_obj,
663
+ # cmd: :alt_tx_iso_std_data_track3,
664
+ # params: [n.to_s]
665
+ # )
666
+ # puts exec_resp.inspect
667
+ # end
668
+ track_data
638
669
  rescue StandardError => e
639
670
  raise e
640
671
  ensure
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.465'
4
+ VERSION = '0.4.468'
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.465
4
+ version: 0.4.468
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-27 00:00:00.000000000 Z
11
+ date: 2022-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 3.0.0
47
+ version: 3.0.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 3.0.0
54
+ version: 3.0.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: aws-sdk
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 2.3.14
117
+ version: 2.3.15
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: 2.3.14
124
+ version: 2.3.15
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: bundler-audit
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -968,14 +968,14 @@ dependencies:
968
968
  requirements:
969
969
  - - '='
970
970
  - !ruby/object:Gem::Version
971
- version: 0.9.27
971
+ version: 0.9.28
972
972
  type: :runtime
973
973
  prerelease: false
974
974
  version_requirements: !ruby/object:Gem::Requirement
975
975
  requirements:
976
976
  - - '='
977
977
  - !ruby/object:Gem::Version
978
- version: 0.9.27
978
+ version: 0.9.28
979
979
  description: https://github.com/0dayinc/pwn/README.md
980
980
  email:
981
981
  - request.pentest@0dayinc.com
@@ -1972,7 +1972,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1972
1972
  - !ruby/object:Gem::Version
1973
1973
  version: '0'
1974
1974
  requirements: []
1975
- rubygems_version: 3.3.14
1975
+ rubygems_version: 3.3.15
1976
1976
  signing_key:
1977
1977
  specification_version: 4
1978
1978
  summary: Automated Security Testing for CI/CD Pipelines & Beyond