pwn 0.4.477 → 0.4.480

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: 12b3517ec1a98f073c21f689d8f0812da237bd0d2715956afe5de02e69a1c9f9
4
- data.tar.gz: e7a84eaaee6639f4241bd08a0ceee50745f55f89cd348744fb2daa7e5881017a
3
+ metadata.gz: 1745701a8f5d6aaca6159fc1a05fbc82fe547bc7e410215af1b69ca013d4e98d
4
+ data.tar.gz: de67baa326728cbf3add2ef72498263fbf8d813e079e42e0c0af166a27b2a492
5
5
  SHA512:
6
- metadata.gz: 25c56b798321a8fdf4c840b99ccf3c09819eb9493fea94305d5dd7a3425284b423155e741e7c5329a9af1f0c0b14831779a8e1238fcde5503514b7dcbd130d91
7
- data.tar.gz: 830e16467f649042771d4ebe0fb8318af2abdc4ed8ab7cf7771c110c020569ebe2ff6c4be28d719e3ab00a0ffe834b004836b723e11ad0acaf17df7c87aef32c
6
+ metadata.gz: e06d7f528cdadd19f7941bae1682dff378a39388425caa5d29cabe0a3e297b1ce89678a31d1c5a0917c8af194e9bc0eaa0164e6c2fbea167f47d6f6911d1e893
7
+ data.tar.gz: 64385168c97cada272ce1e3049367901952090070513a6d0e6196d6b9be0a2e2b4aeacfc58833c47a62653b1b9e5f4a1cdee33fcbf25890435010a962ace48fc
data/Gemfile CHANGED
@@ -33,12 +33,12 @@ gem 'ipaddress', '0.8.3'
33
33
  gem 'js-beautify', '0.1.8'
34
34
  gem 'json', '2.6.2'
35
35
  gem 'jsonpath', '1.1.2'
36
- gem 'jwt', '2.3.0'
36
+ gem 'jwt', '2.4.0'
37
37
  gem 'luhn', '1.0.2'
38
38
  gem 'mail', '2.7.1'
39
39
  gem 'mongo', '2.17.1'
40
40
  gem 'msfrpc-client', '1.1.2'
41
- gem 'net-ldap', '0.17.0'
41
+ gem 'net-ldap', '0.17.1'
42
42
  gem 'net-openvpn', '0.8.7'
43
43
  gem 'net-smtp', '0.3.1'
44
44
  gem 'nexpose', '7.3.0'
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.477]:001 >>> PWN.help
40
+ pwn[v0.4.480]: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.477]:001 >>> PWN.help
55
+ pwn[v0.4.480]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
@@ -130,7 +130,7 @@ def invoke_burp(opts = {})
130
130
  )
131
131
 
132
132
  File.open(json_results, 'w') do |f|
133
- f.puts scan_issues_hash.to_json
133
+ f.puts JSON.pretty_generate(scan_issues_hash)
134
134
  end
135
135
  puts "#{@green}complete.#{@end_of_color}\n\n\n"
136
136
 
@@ -190,7 +190,7 @@ unless ipinfo.nil?
190
190
 
191
191
  ipinfo_struc = PWN::Plugins::IPInfo.get(ip_or_host: ipinfo_target)
192
192
  File.open(ipinfo_json_results, 'w') do |f|
193
- f.puts ipinfo_struc.to_json
193
+ f.puts JSON.pretty_generate(ipinfo_struc)
194
194
  end
195
195
  end
196
196
  end
@@ -75,26 +75,10 @@ begin
75
75
  # )
76
76
  # puts exec_resp.inspect
77
77
 
78
- # TODO: Parse Binary Bits to Derive Readable Configuration
79
- # e.g. 'Read & Write All Three Tracks' if binary_resp == '11101111'
80
- # Probably better to split each bit and then evaluate
81
- # binary_resp_arr = binary_resp.chars
82
- # --------------------------------------------------
83
- # Bit|Bit = 0 |Bit = 1
84
- # --------------------------------------------------
85
- # 0 |Track 1 Read not present |Track 1 Read present
86
- # 1 |Track 2 Read not present |Track 2 Read present
87
- # 2 |Track 3 Read not present |Track 3 Read present
88
- # 3 |not used – should be 0 |not used
89
- # 4 |Track 3 Write not present|Track 3 Write present
90
- # 5 |Track 2 Write not present|Track 2 Write present
91
- # 6 |Track 1 Write not present|Track 1 Write present
92
- # 7 |parity bit** |parity bit**
93
- exec_resp = PWN::Plugins::MSR206.exec(
94
- msr206_obj: msr206_obj,
95
- cmd: :configuration_request
78
+ config_hash = PWN::Plugins::MSR206.get_config(
79
+ msr206_obj: msr206_obj
96
80
  )
97
- puts "Configuration Bits: #{exec_resp[:binary].first.reverse}"
81
+ puts "Configuration: #{config_hash.inspect}"
98
82
 
99
83
  exec_resp = PWN::Plugins::MSR206.exec(
100
84
  msr206_obj: msr206_obj,
@@ -114,9 +98,10 @@ begin
114
98
 
115
99
  puts "\n>> MAIN MENU OPTIONS:"
116
100
  puts '[(R)ead Card]'
101
+ puts '[(B)ackup Card]'
117
102
  puts '[(C)opy Card]'
103
+ puts '[(L)oad Card from File]'
118
104
  puts '[(E)dit Card]'
119
- puts '[(B)ackup Card]'
120
105
  puts '[(W)arm Reset]'
121
106
  puts '[(Q)uit]'
122
107
  puts menu_msg
@@ -126,77 +111,41 @@ begin
126
111
 
127
112
  case option
128
113
  when :R
129
- menu_msg = 'READY TO READ - PLEASE SWIPE CARD'
114
+ menu_msg = 'READ CARD'
130
115
  # Read Card
131
116
  track_data = PWN::Plugins::MSR206.read_card(
132
- msr206_obj: msr206_obj,
133
- type: :arm_to_read
117
+ msr206_obj: msr206_obj
118
+ )
119
+ when :B
120
+ menu_msg = 'BACKUP CARD TO FILE'
121
+ # Read Card to Backup
122
+ track_data = PWN::Plugins::MSR206.backup_card(
123
+ msr206_obj: msr206_obj
134
124
  )
135
125
  when :C
136
- menu_msg = 'READY TO COPY - PLEASE SWIPE ORIGINAL CARD'
137
- # Read Original Card
138
- track_data = PWN::Plugins::MSR206.read_card(
139
- msr206_obj: msr206_obj,
140
- type: :arm_to_read
126
+ menu_msg = 'COPY CARD'
127
+ # Copy Card
128
+ track_data = PWN::Plugins::MSR206.copy_card(
129
+ msr206_obj: msr206_obj
130
+ )
131
+ when :L
132
+ menu_msg = 'LOAD FROM FILE'
133
+ # Read Card to Backup
134
+ track_data = PWN::Plugins::MSR206.load_card_from_file(
135
+ msr206_obj: msr206_obj
141
136
  )
142
-
143
- # TODO: Save Original Card Contents
144
- # arm_to_write card to clone
145
- # read cloned card to verify successful write
146
137
  when :E
147
- menu_msg = 'READY TO EDIT - PLEASE SWIPE TARGET CARD'
138
+ menu_msg = 'EDIT'
148
139
  # Read Target Card
149
- track_data = PWN::Plugins::MSR206.read_card(
150
- msr206_obj: msr206_obj,
151
- type: :arm_to_read
140
+ track_data = PWN::Plugins::MSR206.edit_card(
141
+ msr206_obj: msr206_obj
152
142
  )
153
143
 
154
144
  # TODO: Save Original Card Contents
155
145
  # arm_to_write card to edit
156
146
  # read edited card to verify successful write
157
- when :B
158
- menu_msg = 'READY TO BACKUP - PLEASE SWIPE CARD'
159
- # Read Card to Backup
160
- track_data = PWN::Plugins::MSR206.read_card(
161
- msr206_obj: msr206_obj,
162
- type: :arm_to_read
163
- )
164
-
165
- file = ''
166
- backup_msg = ''
167
- loop do
168
- if backup_msg.empty?
169
- exec_resp = PWN::Plugins::MSR206.exec(
170
- msr206_obj: msr206_obj,
171
- cmd: :green_flash
172
- )
173
- end
174
-
175
- print 'Enter File Name to Save Backup: '
176
- file = gets.scrub.chomp.strip
177
- file_dir = File.dirname(file)
178
- break if Dir.exist?(file_dir)
179
-
180
- backup_msg = "\n****** ERROR: Directory #{file_dir} for #{file} does not exist ******"
181
- puts backup_msg
182
- exec_resp = PWN::Plugins::MSR206.exec(
183
- msr206_obj: msr206_obj,
184
- cmd: :green_off
185
- )
186
- exec_resp = PWN::Plugins::MSR206.exec(
187
- msr206_obj: msr206_obj,
188
- cmd: :yellow_flash
189
- )
190
- end
191
-
192
- File.write(file, "#{track_data.to_json}\n")
193
- exec_resp = PWN::Plugins::MSR206.exec(
194
- msr206_obj: msr206_obj,
195
- cmd: :yellow_off
196
- )
197
-
198
- puts 'complete.'
199
147
  when :W
148
+ menu_msg = 'WARM RESET'
200
149
  exec_resp = PWN::Plugins::MSR206.exec(
201
150
  msr206_obj: msr206_obj,
202
151
  cmd: :simulate_power_cycle_warm_reset
@@ -73,7 +73,7 @@ begin
73
73
  end
74
74
  end
75
75
  end
76
- File.write(raw_query_results_file, raw_results_arr.to_json)
76
+ File.write(raw_query_results_file, JSON.pretty_generate(raw_results_arr))
77
77
  rescue SystemExit, Interrupt
78
78
  puts "\nGoodbye."
79
79
  end
@@ -106,6 +106,7 @@ module PWN
106
106
  decoded_data_str = ''
107
107
  if raw_byte_arr
108
108
  raw_byte_arr.first.split.each do |byte_str|
109
+ # TODO: Different case statements for each parity
109
110
  case byte_str
110
111
  when '1B'
111
112
  decoded_data_str += ''
@@ -402,7 +403,7 @@ module PWN
402
403
  when '7E'
403
404
  response[:msg] = :command_not_supported_by_hardware
404
405
  else
405
- response[:msg] = :data
406
+ response[:msg] = :response
406
407
  end
407
408
 
408
409
  next_response_detected = false
@@ -410,7 +411,7 @@ module PWN
410
411
  keep_parsing_responses = false
411
412
  end
412
413
 
413
- response[:raw] = raw_byte_arr
414
+ response[:hex] = raw_byte_arr
414
415
  response[:binary] = binary(raw_byte_arr: raw_byte_arr)
415
416
  response[:decoded] = decode(raw_byte_arr: raw_byte_arr)
416
417
  response
@@ -574,16 +575,18 @@ module PWN
574
575
  end
575
576
 
576
577
  # Supported Method Parameters::
577
- # wait_for_swipe(
578
+ # MSR206.wait_for_swipe(
578
579
  # msr206_obj: 'required - msr206_obj returned from #connect method'
579
580
  # type: 'required - swipe type :arm_to_read || :arm_to_read_w_speed_prompts || :arm_to_write_no_raw || :arm_to_write_with_raw || :arm_to_write_with_raw_speed_prompts',
580
- # encoding: required - :iso || :iso_alt || :raw'
581
+ # encoding: 'required - :iso || :iso_alt || :raw',
582
+ # track_data: 'optional - track_data to write'
581
583
  # )
582
584
 
583
585
  private_class_method def self.wait_for_swipe(opts = {})
584
586
  msr206_obj = opts[:msr206_obj]
585
587
  type = opts[:type].to_s.scrub.strip.chomp.to_sym
586
588
  encoding = opts[:encoding].to_s.scrub.strip.chomp.to_sym
589
+ track_data = opts[:track_data]
587
590
 
588
591
  exec_resp = exec(
589
592
  msr206_obj: msr206_obj,
@@ -600,26 +603,28 @@ module PWN
600
603
  cmd: :green_on
601
604
  )
602
605
 
603
- exec_resp = PWN::Plugins::MSR206.exec(
604
- msr206_obj: msr206_obj,
605
- cmd: type
606
- )
606
+ track_data_arr = []
607
607
 
608
- print 'Ready. Please Swipe Card Now:'
609
- loop do
610
- exec_resp = parse_responses(
608
+ case type
609
+ when :arm_to_read,
610
+ :arm_to_read_w_speed_prompts
611
+
612
+ exec_resp = PWN::Plugins::MSR206.exec(
611
613
  msr206_obj: msr206_obj,
612
614
  cmd: type
613
615
  )
616
+ puts exec_resp.inspect
614
617
 
615
- break if exec_resp[:msg] == :ack_command_completed
616
- end
617
-
618
- track_data_arr = []
618
+ print 'Ready to Read. Please Swipe Card Now:'
619
+ loop do
620
+ exec_resp = parse_responses(
621
+ msr206_obj: msr206_obj,
622
+ cmd: type
623
+ )
619
624
 
620
- case type
621
- when :arm_to_read,
622
- :arm_to_read_w_speed_prompts
625
+ puts exec_resp[:msg]
626
+ break if exec_resp[:msg] == :ack_command_completed
627
+ end
623
628
 
624
629
  if encoding == :iso
625
630
  cmds_arr = %i[
@@ -633,6 +638,7 @@ module PWN
633
638
  msr206_obj: msr206_obj,
634
639
  cmd: cmd
635
640
  )
641
+ exec_resp[:encoding] = encoding
636
642
  puts exec_resp[:decoded]
637
643
  puts exec_resp.inspect
638
644
  track_data_arr.push(exec_resp)
@@ -655,6 +661,7 @@ module PWN
655
661
  cmd: cmd,
656
662
  params: [param]
657
663
  )
664
+ exec_resp[:encoding] = encoding
658
665
  puts exec_resp[:decoded]
659
666
  puts exec_resp.inspect
660
667
  track_data_arr.push(exec_resp)
@@ -679,6 +686,7 @@ module PWN
679
686
  cmd: cmd,
680
687
  params: [param]
681
688
  )
689
+ exec_resp[:encoding] = encoding
682
690
  puts exec_resp[:decoded]
683
691
  puts exec_resp.inspect
684
692
  track_data_arr.push(exec_resp)
@@ -689,6 +697,7 @@ module PWN
689
697
  cmd: cmd,
690
698
  params: [0x5f] + [param]
691
699
  )
700
+ exec_resp[:encoding] = encoding
692
701
  puts exec_resp[:decoded]
693
702
  puts exec_resp.inspect
694
703
  track_data_arr.push(exec_resp)
@@ -699,8 +708,89 @@ module PWN
699
708
  :arm_to_write_with_raw,
700
709
  :arm_to_write_with_raw_speed_prompts
701
710
 
702
- cmds_arr = %i[
703
- ]
711
+ if encoding == :iso
712
+ cmds_arr = %i[
713
+ load_iso_std_data_for_writing_track1
714
+ load_iso_std_data_for_writing_track2
715
+ load_iso_std_data_for_writing_track3
716
+ ]
717
+
718
+ cmds_arr.each_with_index do |cmd, track|
719
+ puts "\n*** #{cmd.to_s.gsub('_', ' ').upcase} #{'*' * 17}"
720
+ puts track_data[track][:decoded]
721
+ next if track_data[track][:decoded] == '+'
722
+
723
+ this_track = track_data[track][:decoded].chars.map do |c|
724
+ c.unpack1('H*').to_i(16)
725
+ end
726
+ this_track_w_eot = this_track + [0x04]
727
+ puts this_track_w_eot.inspect
728
+ exec_resp = exec(
729
+ msr206_obj: msr206_obj,
730
+ cmd: cmd,
731
+ params: this_track_w_eot
732
+ )
733
+ exec_resp[:encoding] = encoding
734
+ puts exec_resp.inspect
735
+ track_data_arr.push(exec_resp)
736
+ end
737
+ end
738
+
739
+ # if encoding == :iso_alt
740
+ # cmds_arr = %i[
741
+ # alt_load_iso_std_data_for_writing_track1
742
+ # alt_load_iso_std_data_for_writing_track2
743
+ # alt_load_iso_std_data_for_writing_track3
744
+ # ]
745
+
746
+ # cmds_arr.each do |cmd|
747
+ # puts "\n*** #{cmd.to_s.gsub('_', ' ').upcase} #{'*' * 17}"
748
+ # exec_resp = exec(
749
+ # msr206_obj: msr206_obj,
750
+ # cmd: cmd
751
+ # )
752
+ # exec_resp[:encoding] = encoding
753
+ # puts exec_resp[:decoded]
754
+ # puts exec_resp.inspect
755
+ # track_data_arr.push(exec_resp)
756
+ # end
757
+ # end
758
+
759
+ # if encoding == :raw
760
+ # cmds_arr = %i[
761
+ # load_custom_data_for_writing_track1
762
+ # load_custom_data_for_writing_track2
763
+ # load_custom_data_for_writing_track3
764
+ # ]
765
+
766
+ # cmds_arr.each do |cmd|
767
+ # puts "\n*** #{cmd.to_s.gsub('_', ' ').upcase} #{'*' * 17}"
768
+ # exec_resp = exec(
769
+ # msr206_obj: msr206_obj,
770
+ # cmd: cmd
771
+ # )
772
+ # exec_resp[:encoding] = encoding
773
+ # puts exec_resp[:decoded]
774
+ # puts exec_resp.inspect
775
+ # track_data_arr.push(exec_resp)
776
+ # end
777
+ # end
778
+
779
+ exec_resp = PWN::Plugins::MSR206.exec(
780
+ msr206_obj: msr206_obj,
781
+ cmd: type
782
+ )
783
+ puts exec_resp.inspect
784
+
785
+ print 'Ready to Write. Please Swipe Card Now:'
786
+ loop do
787
+ exec_resp = parse_responses(
788
+ msr206_obj: msr206_obj,
789
+ cmd: type
790
+ )
791
+
792
+ break if exec_resp[:msg] == :ack_command_completed
793
+ end
704
794
  else
705
795
  raise "ERROR Unsupported type in #wait_for_swipe - #{type}"
706
796
  end
@@ -718,7 +808,6 @@ module PWN
718
808
  # Supported Method Parameters::
719
809
  # PWN::Plugins::MSR206.read_card(
720
810
  # msr206_obj: 'required - msr206_obj returned from #connect method'
721
- # type: 'required - swipe type :arm_to_read || :arm_to_read_w_speed_prompts || :arm_to_write_no_raw || :arm_to_write_with_raw || :arm_to_write_with_raw_speed_prompts',
722
811
  # )
723
812
 
724
813
  public_class_method def self.read_card(opts = {})
@@ -749,13 +838,303 @@ module PWN
749
838
 
750
839
  wait_for_swipe(
751
840
  msr206_obj: msr206_obj,
752
- type: type,
841
+ type: :arm_to_read,
753
842
  encoding: encoding
754
843
  )
755
844
  rescue StandardError => e
756
845
  raise e
757
846
  end
758
847
 
848
+ # Supported Method Parameters::
849
+ # PWN::Plugins::MSR206.backup_card(
850
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
851
+ # )
852
+
853
+ public_class_method def self.backup_card(opts = {})
854
+ msr206_obj = opts[:msr206_obj]
855
+ type = opts[:type].to_s.scrub.strip.chomp.to_sym
856
+
857
+ # Read Card to Backup
858
+ track_data = read_card(
859
+ msr206_obj: msr206_obj
860
+ )
861
+
862
+ file = ''
863
+ backup_msg = ''
864
+ loop do
865
+ if backup_msg.empty?
866
+ exec_resp = exec(
867
+ msr206_obj: msr206_obj,
868
+ cmd: :green_flash
869
+ )
870
+ end
871
+
872
+ print 'Enter File Name to Save Backup: '
873
+ file = gets.scrub.chomp.strip
874
+ file_dir = File.dirname(file)
875
+ break if Dir.exist?(file_dir)
876
+
877
+ backup_msg = "\n****** ERROR: Directory #{file_dir} for #{file} does not exist ******"
878
+ puts backup_msg
879
+ exec_resp = exec(
880
+ msr206_obj: msr206_obj,
881
+ cmd: :green_off
882
+ )
883
+ exec_resp = exec(
884
+ msr206_obj: msr206_obj,
885
+ cmd: :yellow_flash
886
+ )
887
+ end
888
+
889
+ File.write(file, "#{JSON.pretty_generate(track_data)}\n")
890
+ exec_resp = exec(
891
+ msr206_obj: msr206_obj,
892
+ cmd: :yellow_off
893
+ )
894
+
895
+ track_data
896
+ rescue StandardError => e
897
+ raise e
898
+ end
899
+
900
+ # Supported Method Parameters::
901
+ # PWN::Plugins::MSR206.write_card(
902
+ # msr206_obj: 'required - msr206_obj returned from #connect method',
903
+ # encoding: 'required - :iso || :alt_iso || :raw',
904
+ # track_data: 'requred - track data to write (see #backup_card for structure)'
905
+ # )
906
+
907
+ public_class_method def self.write_card(opts = {})
908
+ msr206_obj = opts[:msr206_obj]
909
+ encoding = opts[:encoding].to_s.scrub.strip.chomp.to_sym
910
+ track_data = opts[:track_data]
911
+
912
+ puts 'IN ORDER TO GET BLANK TRACKS, A STRONG MAGNETIC FIELD MUST BE PRESENT TO FIRST WIPE THE CARD TARGETED FOR WRITING.'
913
+ # puts 'Default Write Current:'
914
+ # exec_resp = exec(
915
+ # msr206_obj: msr206_obj,
916
+ # cmd: :view_default_write_current
917
+ # )
918
+ # puts exec_resp.inspect
919
+
920
+ # puts 'Temporary Write Current:'
921
+ # exec_resp = exec(
922
+ # msr206_obj: msr206_obj,
923
+ # cmd: :view_temp_write_current
924
+ # )
925
+ # puts exec_resp.inspect
926
+
927
+ coercivity = :waiting_for_selection
928
+ loop do
929
+ puts "\nCOERCIVITY OPTIONS:"
930
+ puts '[(H)igh (Black Stripe)]'
931
+ puts '[(L)ow (Brown Stripe)]'
932
+ print 'COERCIVITY LEVEL >>> '
933
+ coercivity_choice = gets.scrub.chomp.strip.upcase.to_sym
934
+
935
+ # Write Current Settings vs. Media Coercivties
936
+ # Media Coercivity (Oersteds)|Write Current Setting*|Typical Usage
937
+ # 300 |36 |Low coercivity
938
+ # 600 | |
939
+ # 1800 | |
940
+ # 3600+ |255 |Typical high corcivity
941
+
942
+ case coercivity_choice
943
+ when :H
944
+ coercivity = [0x32, 0x35, 0x35]
945
+ break
946
+ when :L
947
+ coercivity = [0x30, 0x33, 0x36]
948
+ break
949
+ end
950
+ end
951
+
952
+ exec_resp = exec(
953
+ msr206_obj: msr206_obj,
954
+ cmd: :set_temp_write_current,
955
+ params: coercivity
956
+ )
957
+
958
+ track_data = wait_for_swipe(
959
+ msr206_obj: msr206_obj,
960
+ type: :arm_to_write_no_raw,
961
+ encoding: encoding,
962
+ track_data: track_data
963
+ )
964
+
965
+ exec_resp = PWN::Plugins::MSR206.exec(
966
+ msr206_obj: msr206_obj,
967
+ cmd: :simulate_power_cycle_warm_reset
968
+ )
969
+
970
+ track_data
971
+ rescue StandardError => e
972
+ raise e
973
+ end
974
+
975
+ # Supported Method Parameters::
976
+ # PWN::Plugins::MSR206.copy_card(
977
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
978
+ # )
979
+
980
+ public_class_method def self.copy_card(opts = {})
981
+ msr206_obj = opts[:msr206_obj]
982
+
983
+ # Read Card to Backup
984
+ track_data = backup_card(
985
+ msr206_obj: msr206_obj
986
+ )
987
+
988
+ encoding = track_data.first[:encoding] if track_data.length == 3
989
+ # TODO: Save Original Card Contents
990
+ write_card(
991
+ msr206_obj: msr206_obj,
992
+ encoding: encoding,
993
+ track_data: track_data
994
+ )
995
+ rescue StandardError => e
996
+ raise e
997
+ end
998
+
999
+ # Supported Method Parameters::
1000
+ # PWN::Plugins::MSR206.load_card_from_file(
1001
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
1002
+ # )
1003
+
1004
+ public_class_method def self.load_card_from_file(opts = {})
1005
+ msr206_obj = opts[:msr206_obj]
1006
+
1007
+ file = ''
1008
+ restore_msg = ''
1009
+ loop do
1010
+ if restore_msg.empty?
1011
+ exec_resp = exec(
1012
+ msr206_obj: msr206_obj,
1013
+ cmd: :green_flash
1014
+ )
1015
+ end
1016
+
1017
+ print 'Enter File Name to Restore to Card: '
1018
+ file = gets.scrub.chomp.strip
1019
+ break if File.exist?(file)
1020
+
1021
+ restore_msg = "\n****** ERROR: #{file} does not exist ******"
1022
+ puts restore_msg
1023
+ exec_resp = exec(
1024
+ msr206_obj: msr206_obj,
1025
+ cmd: :green_off
1026
+ )
1027
+ exec_resp = exec(
1028
+ msr206_obj: msr206_obj,
1029
+ cmd: :yellow_flash
1030
+ )
1031
+ end
1032
+
1033
+ track_data = JSON.parse(
1034
+ File.read(file),
1035
+ symbolize_names: true
1036
+ )
1037
+
1038
+ exec_resp = exec(
1039
+ msr206_obj: msr206_obj,
1040
+ cmd: :yellow_off
1041
+ )
1042
+
1043
+ # Read Card from Backup
1044
+ encoding = track_data.first[:encoding] if track_data.length == 3
1045
+
1046
+ # TODO: Save Original Card Contents
1047
+ write_card(
1048
+ msr206_obj: msr206_obj,
1049
+ encoding: encoding,
1050
+ track_data: track_data
1051
+ )
1052
+ rescue StandardError => e
1053
+ raise e
1054
+ end
1055
+
1056
+ # Supported Method Parameters::
1057
+ # PWN::Plugins::MSR206.edit_card(
1058
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
1059
+ # )
1060
+
1061
+ public_class_method def self.edit_card(opts = {})
1062
+ msr206_obj = opts[:msr206_obj]
1063
+
1064
+ # Read Card to Backup
1065
+ track_data = backup_card(
1066
+ msr206_obj: msr206_obj
1067
+ )
1068
+
1069
+ # TODO: Inline Editing
1070
+
1071
+ encoding = track_data.first[:encoding] if track_data.length == 3
1072
+ # TODO: Save Original Card Contents
1073
+ write_card(
1074
+ msr206_obj: msr206_obj,
1075
+ encoding: encoding,
1076
+ track_data: track_data
1077
+ )
1078
+ rescue StandardError => e
1079
+ raise e
1080
+ end
1081
+
1082
+ # Supported Method Parameters::
1083
+ # PWN::Plugins::MSR206.get_config(
1084
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
1085
+ # )
1086
+
1087
+ public_class_method def self.get_config(opts = {})
1088
+ msr206_obj = opts[:msr206_obj]
1089
+
1090
+ # --------------------------------------------------
1091
+ # Bit|Bit = 0 |Bit = 1
1092
+ # --------------------------------------------------
1093
+ # 0 |Track 1 Read not present |Track 1 Read present
1094
+ # 1 |Track 2 Read not present |Track 2 Read present
1095
+ # 2 |Track 3 Read not present |Track 3 Read present
1096
+ # 3 |not used – should be 0 |not used
1097
+ # 4 |Track 3 Write not present|Track 3 Write present
1098
+ # 5 |Track 2 Write not present|Track 2 Write present
1099
+ # 6 |Track 1 Write not present|Track 1 Write present
1100
+ # 7 |parity bit** |parity bit**
1101
+ exec_resp = PWN::Plugins::MSR206.exec(
1102
+ msr206_obj: msr206_obj,
1103
+ cmd: :configuration_request
1104
+ )
1105
+
1106
+ config_arr = exec_resp[:binary].first.reverse.chars
1107
+ config_hash = {}
1108
+ config_arr.each_with_index do |bit_str, i|
1109
+ bit = bit_str.to_i
1110
+ config_hash[:track1_read] = false if bit.zero? && i.zero?
1111
+ config_hash[:track1_read] = true if bit == 1 && i.zero?
1112
+
1113
+ config_hash[:track2_read] = false if bit.zero? && i == 1
1114
+ config_hash[:track2_read] = true if bit == 1 && i == 1
1115
+
1116
+ config_hash[:track3_read] = false if bit.zero? && i == 2
1117
+ config_hash[:track3_read] = true if bit == 1 && i == 2
1118
+
1119
+ config_hash[:not_used] if i == 3
1120
+
1121
+ config_hash[:track1_write] = false if bit.zero? && i == 4
1122
+ config_hash[:track1_write] = true if bit == 1 && i == 4
1123
+
1124
+ config_hash[:track2_write] = false if bit.zero? && i == 5
1125
+ config_hash[:track2_write] = true if bit == 1 && i == 5
1126
+
1127
+ config_hash[:track3_write] = false if bit.zero? && i == 6
1128
+ config_hash[:track3_write] = true if bit == 1 && i == 6
1129
+
1130
+ config_hash[:parity] = true if bit == 1 && i == 7
1131
+ end
1132
+
1133
+ config_hash
1134
+ rescue StandardError => e
1135
+ raise e
1136
+ end
1137
+
759
1138
  # Supported Method Parameters::
760
1139
  # PWN::Plugins::MSR206.disconnect(
761
1140
  # msr206_obj: 'required - msr206_obj returned from #connect method'
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.477'
4
+ VERSION = '0.4.480'
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.477
4
+ version: 0.4.480
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-06-06 00:00:00.000000000 Z
11
+ date: 2022-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -310,14 +310,14 @@ dependencies:
310
310
  requirements:
311
311
  - - '='
312
312
  - !ruby/object:Gem::Version
313
- version: 2.3.0
313
+ version: 2.4.0
314
314
  type: :runtime
315
315
  prerelease: false
316
316
  version_requirements: !ruby/object:Gem::Requirement
317
317
  requirements:
318
318
  - - '='
319
319
  - !ruby/object:Gem::Version
320
- version: 2.3.0
320
+ version: 2.4.0
321
321
  - !ruby/object:Gem::Dependency
322
322
  name: luhn
323
323
  requirement: !ruby/object:Gem::Requirement
@@ -380,14 +380,14 @@ dependencies:
380
380
  requirements:
381
381
  - - '='
382
382
  - !ruby/object:Gem::Version
383
- version: 0.17.0
383
+ version: 0.17.1
384
384
  type: :runtime
385
385
  prerelease: false
386
386
  version_requirements: !ruby/object:Gem::Requirement
387
387
  requirements:
388
388
  - - '='
389
389
  - !ruby/object:Gem::Version
390
- version: 0.17.0
390
+ version: 0.17.1
391
391
  - !ruby/object:Gem::Dependency
392
392
  name: net-openvpn
393
393
  requirement: !ruby/object:Gem::Requirement