Class: Rex::Exploitation::EncryptJS
- Inherits:
-
Object
- Object
- Rex::Exploitation::EncryptJS
- Defined in:
- lib/rex/exploitation/encryptjs.rb
Overview
Encrypts javascript code
Class Method Summary collapse
-
.encrypt(js, key) ⇒ Object
Encrypts a javascript string.
Class Method Details
.encrypt(js, key) ⇒ Object
Encrypts a javascript string.
Encrypts a javascript string via XOR using a given key. The key must be passed to the executed javascript so that it can decrypt itself. The provided loader gets the key from "location.search.substring(1)"
This should bypass any detection of the file itself as information not part of the file is needed to decrypt the original javascript code.
Example:
js = <<ENDJS
function say_hi() {
var foo = "Hello, world";
document.writeln(foo);
}
ENDJS
key = 'secret'
js_encrypted = EncryptJS.encrypt(js, key)
You might use something like this in exploit
modules to pass the key to the javascript
if (!request.uri.match(/?\w+/))
send_local_redirect(cli, "?#{@key}")
return
end
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/rex/exploitation/encryptjs.rb', line 44 def self.encrypt(js, key) js.gsub!(/[\r\n]/, '') encoded = Rex::Encoding::Xor::Generic.encode(js, key)[0].unpack("H*")[0] # obfuscate the eval call to circumvent generic detection eval = 'eval'.split(//).join(Rex::Text.rand_text_alpha(rand(5)).upcase) eval_call = 'window["' + eval + '".replace(/[A-Z]/g,"")]' js_loader = Rex::Exploitation::ObfuscateJS.new <<-ENDJS var exploit = '#{encoded}'; var encoded = ''; for (i = 0;i<exploit.length;i+=2) { encoded += String.fromCharCode(parseInt(exploit.substring(i, i+2), 16)); } var pass = location.search.substring(1); var decoded = ''; for (i=0;i<encoded.length;i++) { decoded += String.fromCharCode(encoded.charCodeAt(i) ^ pass.charCodeAt(i%pass.length)); } #{eval_call}(decoded); ENDJS js_loader.obfuscate( 'Symbols' => { 'Variables' => [ 'exploit', 'encoded', 'pass', 'decoded' ], }, 'Strings' => false ) end |