diff --git a/Gemfile b/Gemfile index ea4e80fda..c251337a5 100644 --- a/Gemfile +++ b/Gemfile @@ -8,6 +8,7 @@ gem 'faker' gem 'forgery' gem 'redcarpet' gem 'rqrcode' +gem 'mini_exiftool_vendored' #development only gems go here group :test, :development do diff --git a/Gemfile.lock b/Gemfile.lock index e5e2ec2ee..caed09fbc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -23,6 +23,9 @@ GEM rsync librarianp (0.6.3) thor (~> 0.15) + mini_exiftool (2.8.0) + mini_exiftool_vendored (9.2.7.v1) + mini_exiftool (>= 1.6.0) mini_portile2 (2.1.0) minitar (0.5.4) minitest (5.9.0) @@ -63,6 +66,7 @@ DEPENDENCIES faker forgery librarian-puppet + mini_exiftool_vendored minitest nokogiri puppet diff --git a/modules/generators/challenges/exif/exif.pp b/modules/generators/challenges/exif/exif.pp new file mode 100644 index 000000000..e69de29bb diff --git a/modules/generators/challenges/exif/manifests/.no_puppet b/modules/generators/challenges/exif/manifests/.no_puppet new file mode 100644 index 000000000..e69de29bb diff --git a/modules/generators/challenges/exif/secgen_local/local.rb b/modules/generators/challenges/exif/secgen_local/local.rb new file mode 100644 index 000000000..f64d2e733 --- /dev/null +++ b/modules/generators/challenges/exif/secgen_local/local.rb @@ -0,0 +1,76 @@ +#!/usr/bin/ruby +require_relative '../../../../../lib/objects/local_string_encoder.rb' +require 'mini_exiftool_vendored' + +class ExifModifiedGenerator < StringEncoder + attr_accessor :base64_image + attr_accessor :strings_to_leak + attr_accessor :exif_field + + def initialize + super + self.module_name = 'Modified Exif Image Generator' + self.base64_image = '' + self.strings_to_leak = [] + self.exif_field = '' + end + + def encode_all + + + fields = %w(ProcessingSoftware DocumentName ImageDescription Make Model PageName Software ModifyDate Artist + ImageHistory UserComment UniqueCameraModel LocalizedCameraModel CameraSerialNumber OriginalRawFileName + ReelName CameraLabel OwnerName SerialNumber Lens) + + # selected_field = fields.sample.chomp + + + + + + # Decode the base64 image data into raw contents + raw_image_contents = Base64.strict_decode64(self.base64_image) + + # Store the raw_image_contents as a temporary image file called 'tmp.png' + tmp_file_path = GENERATORS_DIR + 'challenges/exif/secgen_local/tmp/tmp.png' + File.open(tmp_file_path, 'wb') { |f| f.write(raw_image_contents) } + + image = MiniExiftool.new(tmp_file_path) + + fields.each { |field| + image[field] = self.strings_to_leak + } + image.save + + # Get a list of string-writable exif tags + create a generator + + + # self.outputs << Base64.strict_encode64(contents_with_data) + end + + def get_options_array + super + [['--base64_image', GetoptLong::REQUIRED_ARGUMENT], + ['--strings_to_leak', GetoptLong::REQUIRED_ARGUMENT], + ['--exif_field', GetoptLong::REQUIRED_ARGUMENT]] + end + + def process_options(opt, arg) + super + case opt + when '--base64_image' + self.base64_image << arg; + when '--strings_to_leak' + self.strings_to_leak << arg; + when '--exif_field' + self.exif_field << arg; + end + end + + def encoding_print_string + 'base64_image: + strings_to_leak: ' + self.strings_to_leak.to_s + ' + exif_field: ' + self.exif_field.to_s + end +end + +ExifModifiedGenerator.new.run \ No newline at end of file diff --git a/modules/generators/challenges/exif/secgen_metadata.xml b/modules/generators/challenges/exif/secgen_metadata.xml new file mode 100644 index 000000000..155bb1261 --- /dev/null +++ b/modules/generators/challenges/exif/secgen_metadata.xml @@ -0,0 +1,34 @@ + + + + Exif + Thomas Shaw + MIT + TODO + + modified_exif + string_generator + local_calculation + linux + windows + + base64_image + strings_to_leak + exif_field + + + + + + + + + + + + + + generated_image + \ No newline at end of file diff --git a/modules/generators/random/random_exif_string_field/manifests/.no_puppet b/modules/generators/random/random_exif_string_field/manifests/.no_puppet new file mode 100644 index 000000000..e69de29bb diff --git a/modules/generators/random/random_exif_string_field/random_exif_string_field.pp b/modules/generators/random/random_exif_string_field/random_exif_string_field.pp new file mode 100644 index 000000000..e69de29bb diff --git a/modules/generators/random/random_exif_string_field/secgen_local/local.rb b/modules/generators/random/random_exif_string_field/secgen_local/local.rb new file mode 100644 index 000000000..631804c46 --- /dev/null +++ b/modules/generators/random/random_exif_string_field/secgen_local/local.rb @@ -0,0 +1,20 @@ +#!/usr/bin/ruby +require_relative '../../../../../lib/objects/local_string_generator.rb' + +class RandomExifStringField < StringGenerator + def initialize + super + self.module_name = 'Random Exif Field Generator' + end + + def generate + + fields = %w(ProcessingSoftware DocumentName ImageDescription Make Model PageName Software ModifyDate Artist + ImageHistory UserComment UniqueCameraModel LocalizedCameraModel CameraSerialNumber OriginalRawFileName + ReelName CameraLabel OwnerName SerialNumber Lens) + + self.outputs << fields.sample.chomp + end +end + +RandomExifStringField.new.run \ No newline at end of file diff --git a/modules/generators/random/random_exif_string_field/secgen_metadata.xml b/modules/generators/random/random_exif_string_field/secgen_metadata.xml new file mode 100644 index 000000000..b9446ac29 --- /dev/null +++ b/modules/generators/random/random_exif_string_field/secgen_metadata.xml @@ -0,0 +1,20 @@ + + + + Random Exif String Field Generator + Thomas Shaw + MIT + Selects the name of a random EXIF string type field. + + exif_string_field + string_generator + local_calculation + linux + windows + + http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html + + generated_strings +