dstruct 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/README.markdown +23 -0
- data/examples/smb_example.rb +35 -0
- data/lib/rex.rb +108 -0
- data/lib/rex/LICENSE +29 -0
- data/lib/rex/arch.rb +104 -0
- data/lib/rex/arch/sparc.rb +75 -0
- data/lib/rex/arch/x86.rb +524 -0
- data/lib/rex/assembly/nasm.rb +104 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +389 -0
- data/lib/rex/constants.rb +124 -0
- data/lib/rex/elfparsey.rb +9 -0
- data/lib/rex/elfparsey/elf.rb +121 -0
- data/lib/rex/elfparsey/elfbase.rb +256 -0
- data/lib/rex/elfparsey/exceptions.rb +25 -0
- data/lib/rex/elfscan.rb +10 -0
- data/lib/rex/elfscan/scanner.rb +226 -0
- data/lib/rex/elfscan/search.rb +44 -0
- data/lib/rex/encoder/alpha2.rb +31 -0
- data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
- data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
- data/lib/rex/encoder/alpha2/generic.rb +90 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
- data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
- data/lib/rex/encoder/ndr.rb +90 -0
- data/lib/rex/encoder/nonalpha.rb +61 -0
- data/lib/rex/encoder/nonupper.rb +64 -0
- data/lib/rex/encoder/xdr.rb +107 -0
- data/lib/rex/encoder/xor.rb +69 -0
- data/lib/rex/encoder/xor/dword.rb +13 -0
- data/lib/rex/encoder/xor/dword_additive.rb +13 -0
- data/lib/rex/encoders/xor_dword.rb +35 -0
- data/lib/rex/encoders/xor_dword_additive.rb +53 -0
- data/lib/rex/encoding/xor.rb +20 -0
- data/lib/rex/encoding/xor/byte.rb +15 -0
- data/lib/rex/encoding/xor/dword.rb +21 -0
- data/lib/rex/encoding/xor/dword_additive.rb +92 -0
- data/lib/rex/encoding/xor/exceptions.rb +17 -0
- data/lib/rex/encoding/xor/generic.rb +146 -0
- data/lib/rex/encoding/xor/qword.rb +15 -0
- data/lib/rex/encoding/xor/word.rb +21 -0
- data/lib/rex/exceptions.rb +275 -0
- data/lib/rex/exploitation/cmdstager.rb +10 -0
- data/lib/rex/exploitation/cmdstager/base.rb +190 -0
- data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
- data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
- data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
- data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
- data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
- data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
- data/lib/rex/exploitation/egghunter.rb +425 -0
- data/lib/rex/exploitation/encryptjs.rb +78 -0
- data/lib/rex/exploitation/heaplib.js.b64 +331 -0
- data/lib/rex/exploitation/heaplib.rb +107 -0
- data/lib/rex/exploitation/js.rb +6 -0
- data/lib/rex/exploitation/js/detect.rb +69 -0
- data/lib/rex/exploitation/js/memory.rb +81 -0
- data/lib/rex/exploitation/js/network.rb +84 -0
- data/lib/rex/exploitation/js/utils.rb +33 -0
- data/lib/rex/exploitation/jsobfu.rb +513 -0
- data/lib/rex/exploitation/obfuscatejs.rb +336 -0
- data/lib/rex/exploitation/omelet.rb +321 -0
- data/lib/rex/exploitation/opcodedb.rb +819 -0
- data/lib/rex/exploitation/powershell.rb +62 -0
- data/lib/rex/exploitation/powershell/function.rb +63 -0
- data/lib/rex/exploitation/powershell/obfu.rb +98 -0
- data/lib/rex/exploitation/powershell/output.rb +151 -0
- data/lib/rex/exploitation/powershell/param.rb +23 -0
- data/lib/rex/exploitation/powershell/parser.rb +183 -0
- data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
- data/lib/rex/exploitation/powershell/script.rb +99 -0
- data/lib/rex/exploitation/ropdb.rb +190 -0
- data/lib/rex/exploitation/seh.rb +93 -0
- data/lib/rex/file.rb +160 -0
- data/lib/rex/image_source.rb +10 -0
- data/lib/rex/image_source/disk.rb +58 -0
- data/lib/rex/image_source/image_source.rb +44 -0
- data/lib/rex/image_source/memory.rb +35 -0
- data/lib/rex/io/bidirectional_pipe.rb +161 -0
- data/lib/rex/io/datagram_abstraction.rb +35 -0
- data/lib/rex/io/ring_buffer.rb +369 -0
- data/lib/rex/io/stream.rb +312 -0
- data/lib/rex/io/stream_abstraction.rb +209 -0
- data/lib/rex/io/stream_server.rb +221 -0
- data/lib/rex/job_container.rb +200 -0
- data/lib/rex/logging.rb +4 -0
- data/lib/rex/logging/log_dispatcher.rb +180 -0
- data/lib/rex/logging/log_sink.rb +43 -0
- data/lib/rex/logging/sinks/flatfile.rb +56 -0
- data/lib/rex/logging/sinks/stderr.rb +44 -0
- data/lib/rex/mac_oui.rb +16581 -0
- data/lib/rex/machparsey.rb +9 -0
- data/lib/rex/machparsey/exceptions.rb +34 -0
- data/lib/rex/machparsey/mach.rb +209 -0
- data/lib/rex/machparsey/machbase.rb +408 -0
- data/lib/rex/machscan.rb +9 -0
- data/lib/rex/machscan/scanner.rb +217 -0
- data/lib/rex/mime.rb +10 -0
- data/lib/rex/mime/encoding.rb +17 -0
- data/lib/rex/mime/header.rb +78 -0
- data/lib/rex/mime/message.rb +150 -0
- data/lib/rex/mime/part.rb +50 -0
- data/lib/rex/nop/opty2.rb +109 -0
- data/lib/rex/nop/opty2_tables.rb +301 -0
- data/lib/rex/ole.rb +202 -0
- data/lib/rex/ole/clsid.rb +44 -0
- data/lib/rex/ole/difat.rb +138 -0
- data/lib/rex/ole/directory.rb +228 -0
- data/lib/rex/ole/direntry.rb +237 -0
- data/lib/rex/ole/docs/dependencies.txt +8 -0
- data/lib/rex/ole/docs/references.txt +1 -0
- data/lib/rex/ole/fat.rb +96 -0
- data/lib/rex/ole/header.rb +201 -0
- data/lib/rex/ole/minifat.rb +74 -0
- data/lib/rex/ole/propset.rb +141 -0
- data/lib/rex/ole/samples/create_ole.rb +27 -0
- data/lib/rex/ole/samples/dir.rb +35 -0
- data/lib/rex/ole/samples/dump_stream.rb +34 -0
- data/lib/rex/ole/samples/ole_info.rb +23 -0
- data/lib/rex/ole/storage.rb +392 -0
- data/lib/rex/ole/stream.rb +50 -0
- data/lib/rex/ole/substorage.rb +46 -0
- data/lib/rex/ole/util.rb +154 -0
- data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
- data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
- data/lib/rex/parser/appscan_nokogiri.rb +367 -0
- data/lib/rex/parser/arguments.rb +108 -0
- data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
- data/lib/rex/parser/ci_nokogiri.rb +193 -0
- data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
- data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
- data/lib/rex/parser/group_policy_preferences.rb +185 -0
- data/lib/rex/parser/ini.rb +186 -0
- data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
- data/lib/rex/parser/ip360_xml.rb +98 -0
- data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
- data/lib/rex/parser/nessus_xml.rb +121 -0
- data/lib/rex/parser/netsparker_xml.rb +109 -0
- data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
- data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
- data/lib/rex/parser/nexpose_xml.rb +172 -0
- data/lib/rex/parser/nmap_nokogiri.rb +394 -0
- data/lib/rex/parser/nmap_xml.rb +166 -0
- data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
- data/lib/rex/parser/openvas_nokogiri.rb +172 -0
- data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
- data/lib/rex/parser/retina_xml.rb +110 -0
- data/lib/rex/parser/unattend.rb +171 -0
- data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
- data/lib/rex/payloads.rb +2 -0
- data/lib/rex/payloads/win32.rb +3 -0
- data/lib/rex/payloads/win32/common.rb +27 -0
- data/lib/rex/payloads/win32/kernel.rb +54 -0
- data/lib/rex/payloads/win32/kernel/common.rb +55 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
- data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
- data/lib/rex/peparsey.rb +10 -0
- data/lib/rex/peparsey/exceptions.rb +30 -0
- data/lib/rex/peparsey/pe.rb +210 -0
- data/lib/rex/peparsey/pe_memdump.rb +61 -0
- data/lib/rex/peparsey/pebase.rb +1662 -0
- data/lib/rex/peparsey/section.rb +128 -0
- data/lib/rex/pescan.rb +11 -0
- data/lib/rex/pescan/analyze.rb +366 -0
- data/lib/rex/pescan/scanner.rb +230 -0
- data/lib/rex/pescan/search.rb +68 -0
- data/lib/rex/platforms.rb +2 -0
- data/lib/rex/platforms/windows.rb +52 -0
- data/lib/rex/poly.rb +134 -0
- data/lib/rex/poly/block.rb +480 -0
- data/lib/rex/poly/machine.rb +13 -0
- data/lib/rex/poly/machine/machine.rb +830 -0
- data/lib/rex/poly/machine/x86.rb +509 -0
- data/lib/rex/poly/register.rb +101 -0
- data/lib/rex/poly/register/x86.rb +41 -0
- data/lib/rex/post.rb +7 -0
- data/lib/rex/post/dir.rb +51 -0
- data/lib/rex/post/file.rb +172 -0
- data/lib/rex/post/file_stat.rb +220 -0
- data/lib/rex/post/gen.pl +13 -0
- data/lib/rex/post/io.rb +182 -0
- data/lib/rex/post/meterpreter.rb +5 -0
- data/lib/rex/post/meterpreter/channel.rb +446 -0
- data/lib/rex/post/meterpreter/channel_container.rb +54 -0
- data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
- data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
- data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
- data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
- data/lib/rex/post/meterpreter/client.rb +483 -0
- data/lib/rex/post/meterpreter/client_core.rb +352 -0
- data/lib/rex/post/meterpreter/dependencies.rb +3 -0
- data/lib/rex/post/meterpreter/extension.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
- data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
- data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
- data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
- data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
- data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
- data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
- data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
- data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
- data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
- data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
- data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
- data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
- data/lib/rex/post/meterpreter/packet.rb +709 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
- data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
- data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
- data/lib/rex/post/meterpreter/ui/console.rb +142 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
- data/lib/rex/post/permission.rb +26 -0
- data/lib/rex/post/process.rb +57 -0
- data/lib/rex/post/thread.rb +57 -0
- data/lib/rex/post/ui.rb +52 -0
- data/lib/rex/proto.rb +15 -0
- data/lib/rex/proto/addp.rb +218 -0
- data/lib/rex/proto/dcerpc.rb +7 -0
- data/lib/rex/proto/dcerpc/client.rb +362 -0
- data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
- data/lib/rex/proto/dcerpc/handle.rb +48 -0
- data/lib/rex/proto/dcerpc/ndr.rb +73 -0
- data/lib/rex/proto/dcerpc/packet.rb +264 -0
- data/lib/rex/proto/dcerpc/response.rb +188 -0
- data/lib/rex/proto/dcerpc/uuid.rb +85 -0
- data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
- data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
- data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
- data/lib/rex/proto/dhcp.rb +7 -0
- data/lib/rex/proto/dhcp/constants.rb +34 -0
- data/lib/rex/proto/dhcp/server.rb +334 -0
- data/lib/rex/proto/drda.rb +6 -0
- data/lib/rex/proto/drda/constants.rb +50 -0
- data/lib/rex/proto/drda/packet.rb +253 -0
- data/lib/rex/proto/drda/utils.rb +124 -0
- data/lib/rex/proto/http.rb +7 -0
- data/lib/rex/proto/http/client.rb +722 -0
- data/lib/rex/proto/http/client_request.rb +472 -0
- data/lib/rex/proto/http/handler.rb +47 -0
- data/lib/rex/proto/http/handler/erb.rb +129 -0
- data/lib/rex/proto/http/handler/proc.rb +61 -0
- data/lib/rex/proto/http/header.rb +173 -0
- data/lib/rex/proto/http/packet.rb +414 -0
- data/lib/rex/proto/http/request.rb +354 -0
- data/lib/rex/proto/http/response.rb +151 -0
- data/lib/rex/proto/http/server.rb +385 -0
- data/lib/rex/proto/iax2.rb +2 -0
- data/lib/rex/proto/iax2/call.rb +326 -0
- data/lib/rex/proto/iax2/client.rb +218 -0
- data/lib/rex/proto/iax2/codecs.rb +5 -0
- data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
- data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
- data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
- data/lib/rex/proto/iax2/constants.rb +262 -0
- data/lib/rex/proto/ipmi.rb +57 -0
- data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
- data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
- data/lib/rex/proto/ipmi/rakp2.rb +36 -0
- data/lib/rex/proto/ipmi/utils.rb +125 -0
- data/lib/rex/proto/natpmp.rb +7 -0
- data/lib/rex/proto/natpmp/constants.rb +19 -0
- data/lib/rex/proto/natpmp/packet.rb +45 -0
- data/lib/rex/proto/ntlm.rb +8 -0
- data/lib/rex/proto/ntlm/base.rb +327 -0
- data/lib/rex/proto/ntlm/constants.rb +75 -0
- data/lib/rex/proto/ntlm/crypt.rb +412 -0
- data/lib/rex/proto/ntlm/exceptions.rb +17 -0
- data/lib/rex/proto/ntlm/message.rb +534 -0
- data/lib/rex/proto/ntlm/utils.rb +765 -0
- data/lib/rex/proto/ntp.rb +3 -0
- data/lib/rex/proto/ntp/constants.rb +12 -0
- data/lib/rex/proto/ntp/modes.rb +130 -0
- data/lib/rex/proto/pjl.rb +31 -0
- data/lib/rex/proto/pjl/client.rb +163 -0
- data/lib/rex/proto/proxy/socks4a.rb +441 -0
- data/lib/rex/proto/rfb.rb +13 -0
- data/lib/rex/proto/rfb/cipher.rb +82 -0
- data/lib/rex/proto/rfb/client.rb +205 -0
- data/lib/rex/proto/rfb/constants.rb +50 -0
- data/lib/rex/proto/sip.rb +4 -0
- data/lib/rex/proto/sip/response.rb +61 -0
- data/lib/rex/proto/smb.rb +8 -0
- data/lib/rex/proto/smb/client.rb +2064 -0
- data/lib/rex/proto/smb/constants.rb +1064 -0
- data/lib/rex/proto/smb/crypt.rb +37 -0
- data/lib/rex/proto/smb/evasions.rb +67 -0
- data/lib/rex/proto/smb/exceptions.rb +867 -0
- data/lib/rex/proto/smb/simpleclient.rb +173 -0
- data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
- data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
- data/lib/rex/proto/smb/utils.rb +104 -0
- data/lib/rex/proto/sunrpc.rb +2 -0
- data/lib/rex/proto/sunrpc/client.rb +196 -0
- data/lib/rex/proto/tftp.rb +13 -0
- data/lib/rex/proto/tftp/client.rb +344 -0
- data/lib/rex/proto/tftp/constants.rb +39 -0
- data/lib/rex/proto/tftp/server.rb +497 -0
- data/lib/rex/random_identifier_generator.rb +177 -0
- data/lib/rex/registry.rb +14 -0
- data/lib/rex/registry/hive.rb +132 -0
- data/lib/rex/registry/lfkey.rb +51 -0
- data/lib/rex/registry/nodekey.rb +54 -0
- data/lib/rex/registry/regf.rb +25 -0
- data/lib/rex/registry/valuekey.rb +67 -0
- data/lib/rex/registry/valuelist.rb +29 -0
- data/lib/rex/ropbuilder.rb +8 -0
- data/lib/rex/ropbuilder/rop.rb +271 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +61 -0
- data/lib/rex/script/meterpreter.rb +16 -0
- data/lib/rex/script/shell.rb +10 -0
- data/lib/rex/service.rb +49 -0
- data/lib/rex/service_manager.rb +154 -0
- data/lib/rex/services/local_relay.rb +424 -0
- data/lib/rex/socket.rb +788 -0
- data/lib/rex/socket/comm.rb +120 -0
- data/lib/rex/socket/comm/local.rb +526 -0
- data/lib/rex/socket/ip.rb +132 -0
- data/lib/rex/socket/parameters.rb +363 -0
- data/lib/rex/socket/range_walker.rb +470 -0
- data/lib/rex/socket/ssl_tcp.rb +345 -0
- data/lib/rex/socket/ssl_tcp_server.rb +188 -0
- data/lib/rex/socket/subnet_walker.rb +76 -0
- data/lib/rex/socket/switch_board.rb +289 -0
- data/lib/rex/socket/tcp.rb +79 -0
- data/lib/rex/socket/tcp_server.rb +67 -0
- data/lib/rex/socket/udp.rb +165 -0
- data/lib/rex/sslscan/result.rb +201 -0
- data/lib/rex/sslscan/scanner.rb +206 -0
- data/lib/rex/struct2.rb +5 -0
- data/lib/rex/struct2/c_struct.rb +181 -0
- data/lib/rex/struct2/c_struct_template.rb +39 -0
- data/lib/rex/struct2/constant.rb +26 -0
- data/lib/rex/struct2/element.rb +44 -0
- data/lib/rex/struct2/generic.rb +73 -0
- data/lib/rex/struct2/restraint.rb +54 -0
- data/lib/rex/struct2/s_string.rb +72 -0
- data/lib/rex/struct2/s_struct.rb +111 -0
- data/lib/rex/sync.rb +6 -0
- data/lib/rex/sync/event.rb +85 -0
- data/lib/rex/sync/read_write_lock.rb +177 -0
- data/lib/rex/sync/ref.rb +58 -0
- data/lib/rex/sync/thread_safe.rb +83 -0
- data/lib/rex/text.rb +1813 -0
- data/lib/rex/thread_factory.rb +43 -0
- data/lib/rex/time.rb +66 -0
- data/lib/rex/transformer.rb +116 -0
- data/lib/rex/ui.rb +22 -0
- data/lib/rex/ui/interactive.rb +304 -0
- data/lib/rex/ui/output.rb +85 -0
- data/lib/rex/ui/output/none.rb +19 -0
- data/lib/rex/ui/progress_tracker.rb +97 -0
- data/lib/rex/ui/subscriber.rb +160 -0
- data/lib/rex/ui/text/color.rb +98 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
- data/lib/rex/ui/text/input.rb +119 -0
- data/lib/rex/ui/text/input/buffer.rb +79 -0
- data/lib/rex/ui/text/input/readline.rb +129 -0
- data/lib/rex/ui/text/input/socket.rb +96 -0
- data/lib/rex/ui/text/input/stdio.rb +46 -0
- data/lib/rex/ui/text/irb_shell.rb +62 -0
- data/lib/rex/ui/text/output.rb +86 -0
- data/lib/rex/ui/text/output/buffer.rb +62 -0
- data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
- data/lib/rex/ui/text/output/file.rb +44 -0
- data/lib/rex/ui/text/output/socket.rb +44 -0
- data/lib/rex/ui/text/output/stdio.rb +53 -0
- data/lib/rex/ui/text/output/tee.rb +56 -0
- data/lib/rex/ui/text/progress_tracker.rb +57 -0
- data/lib/rex/ui/text/shell.rb +403 -0
- data/lib/rex/ui/text/table.rb +346 -0
- data/lib/rex/zip.rb +96 -0
- data/lib/rex/zip/archive.rb +130 -0
- data/lib/rex/zip/blocks.rb +184 -0
- data/lib/rex/zip/entry.rb +122 -0
- data/lib/rex/zip/jar.rb +283 -0
- data/lib/rex/zip/samples/comment.rb +32 -0
- data/lib/rex/zip/samples/mkwar.rb +138 -0
- data/lib/rex/zip/samples/mkzip.rb +19 -0
- data/lib/rex/zip/samples/recursive.rb +58 -0
- metadata +536 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
require 'msf/core'
|
|
4
|
+
|
|
5
|
+
module Rex
|
|
6
|
+
module Exploitation
|
|
7
|
+
module Js
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Provides meomry manipulative functions in JavaScript
|
|
11
|
+
#
|
|
12
|
+
class Memory
|
|
13
|
+
|
|
14
|
+
def self.mstime_malloc
|
|
15
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "mstime_malloc.js"))
|
|
16
|
+
js = js.gsub(/W00TA/, Rex::Text.rand_text_hex(6))
|
|
17
|
+
js = js.gsub(/W00TB/, Rex::Text.rand_text_hex(5))
|
|
18
|
+
|
|
19
|
+
::Rex::Exploitation::ObfuscateJS.new(js,
|
|
20
|
+
{
|
|
21
|
+
'Symbols' => {
|
|
22
|
+
'Variables' => %w{ buf eleId acTag }
|
|
23
|
+
}
|
|
24
|
+
}).obfuscate
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.heaplib2(custom_js='', opts={})
|
|
28
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "heaplib2.js"))
|
|
29
|
+
|
|
30
|
+
unless custom_js.blank?
|
|
31
|
+
js << custom_js
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
js = ::Rex::Exploitation::JSObfu.new js
|
|
35
|
+
js.obfuscate
|
|
36
|
+
return js
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.property_spray
|
|
40
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "property_spray.js"))
|
|
41
|
+
|
|
42
|
+
::Rex::Exploitation::ObfuscateJS.new(js,
|
|
43
|
+
{
|
|
44
|
+
'Symbols' => {
|
|
45
|
+
'Variables' => %w{ sym_div_container data junk obj }
|
|
46
|
+
}
|
|
47
|
+
}).obfuscate
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def self.heap_spray
|
|
51
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "heap_spray.js"))
|
|
52
|
+
|
|
53
|
+
::Rex::Exploitation::ObfuscateJS.new(js,
|
|
54
|
+
{
|
|
55
|
+
'Symbols' => {
|
|
56
|
+
'Variables' => %w{ index heapSprayAddr_hi heapSprayAddr_lo retSlide heapBlockCnt }
|
|
57
|
+
}
|
|
58
|
+
}).obfuscate
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def self.explib2
|
|
62
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "explib2", "lib", "explib2.js"))
|
|
63
|
+
|
|
64
|
+
::Rex::Exploitation::ObfuscateJS.obfuscate(js)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def self.explib2_payload(payload="exec")
|
|
68
|
+
case payload
|
|
69
|
+
when "drop_exec"
|
|
70
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "explib2", "payload", "drop_exec.js"))
|
|
71
|
+
else # "exec"
|
|
72
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "explib2", "payload", "exec.js"))
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
::Rex::Exploitation::ObfuscateJS.obfuscate(js)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
require 'msf/core'
|
|
4
|
+
|
|
5
|
+
module Rex
|
|
6
|
+
module Exploitation
|
|
7
|
+
module Js
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Provides networking functions in JavaScript
|
|
11
|
+
#
|
|
12
|
+
class Network
|
|
13
|
+
|
|
14
|
+
# @param [Hash] opts the options hash
|
|
15
|
+
# @option opts [Boolean] :obfuscate toggles js obfuscation. defaults to true.
|
|
16
|
+
# @option opts [Boolean] :inject_xhr_shim automatically stubs XHR to use ActiveXObject when needed.
|
|
17
|
+
# defaults to true.
|
|
18
|
+
# @return [String] javascript code to perform a synchronous ajax request to the remote
|
|
19
|
+
# and returns the response
|
|
20
|
+
def self.ajax_download(opts={})
|
|
21
|
+
should_obfuscate = opts.fetch(:obfuscate, true)
|
|
22
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "network", "ajax_download.js"))
|
|
23
|
+
|
|
24
|
+
if should_obfuscate
|
|
25
|
+
js = ::Rex::Exploitation::ObfuscateJS.new(js,
|
|
26
|
+
{
|
|
27
|
+
'Symbols' => {
|
|
28
|
+
'Variables' => %w{ xmlHttp oArg }
|
|
29
|
+
}
|
|
30
|
+
}).obfuscate
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
xhr_shim(opts) + js
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @param [Hash] opts the options hash
|
|
37
|
+
# @option opts [Boolean] :obfuscate toggles js obfuscation. defaults to true.
|
|
38
|
+
# @option opts [Boolean] :inject_xhr_shim automatically stubs XHR to use ActiveXObject when needed.
|
|
39
|
+
# defaults to true.
|
|
40
|
+
# @return [String] javascript code to perform a synchronous or asynchronous ajax request to
|
|
41
|
+
# the remote with the data specified.
|
|
42
|
+
def self.ajax_post(opts={})
|
|
43
|
+
should_obfuscate = opts.fetch(:obfuscate, true)
|
|
44
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "network", "ajax_post.js"))
|
|
45
|
+
|
|
46
|
+
if should_obfuscate
|
|
47
|
+
js = ::Rex::Exploitation::ObfuscateJS.new(js,
|
|
48
|
+
{
|
|
49
|
+
'Symbols' => {
|
|
50
|
+
'Variables' => %w{ xmlHttp cb path data }
|
|
51
|
+
}
|
|
52
|
+
}).obfuscate
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
xhr_shim(opts) + js
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @param [Hash] opts the options hash
|
|
59
|
+
# @option opts [Boolean] :obfuscate toggles js obfuscation. defaults to true.
|
|
60
|
+
# @option opts [Boolean] :inject_xhr_shim false causes this method to return ''. defaults to true.
|
|
61
|
+
# @return [String] javascript code that adds XMLHttpRequest to the global scope if it
|
|
62
|
+
# does not exist (e.g. on IE6, where you have to use the ActiveXObject constructor)
|
|
63
|
+
def self.xhr_shim(opts={})
|
|
64
|
+
return '' unless opts.fetch(:inject_xhr_shim, true)
|
|
65
|
+
|
|
66
|
+
should_obfuscate = opts.fetch(:obfuscate, true)
|
|
67
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "network", "xhr_shim.js"))
|
|
68
|
+
|
|
69
|
+
if should_obfuscate
|
|
70
|
+
js = ::Rex::Exploitation::ObfuscateJS.new(js,
|
|
71
|
+
{
|
|
72
|
+
'Symbols' => {
|
|
73
|
+
'Variables' => %w{ activeObjs idx }
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
).obfuscate
|
|
77
|
+
end
|
|
78
|
+
js
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
require 'msf/core'
|
|
4
|
+
require 'rex/text'
|
|
5
|
+
require 'rex/exploitation/jsobfu'
|
|
6
|
+
|
|
7
|
+
module Rex
|
|
8
|
+
module Exploitation
|
|
9
|
+
module Js
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# Javascript utilities
|
|
13
|
+
#
|
|
14
|
+
class Utils
|
|
15
|
+
|
|
16
|
+
def self.base64
|
|
17
|
+
js = ::File.read(::File.join(Msf::Config.data_directory, "js", "utils", "base64.js"))
|
|
18
|
+
|
|
19
|
+
opts = {
|
|
20
|
+
'Symbols' => {
|
|
21
|
+
'Variables' => %w{ Base64 encoding result _keyStr encoded_data utftext input_idx
|
|
22
|
+
input output chr chr1 chr2 chr3 enc1 enc2 enc3 enc4 },
|
|
23
|
+
'Methods' => %w{ _utf8_encode _utf8_decode encode decode }
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
::Rex::Exploitation::ObfuscateJS.new(js, opts).to_s
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
require 'rex/text'
|
|
4
|
+
require 'rex/random_identifier_generator'
|
|
5
|
+
require 'rkelly'
|
|
6
|
+
|
|
7
|
+
module Rex
|
|
8
|
+
module Exploitation
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# Obfuscate JavaScript by randomizing as much as possible and removing
|
|
13
|
+
# easily-signaturable string constants.
|
|
14
|
+
#
|
|
15
|
+
# Example:
|
|
16
|
+
# js = ::Rex::Exploitation::JSObfu.new %Q|
|
|
17
|
+
# var a = "0\\612\\063\\x34\\x35\\x36\\x37\\x38\\u0039";
|
|
18
|
+
# var b = { foo : "foo", bar : "bar" }
|
|
19
|
+
# alert(a);
|
|
20
|
+
# alert(b.foo);
|
|
21
|
+
# |
|
|
22
|
+
# js.obfuscate
|
|
23
|
+
# puts js
|
|
24
|
+
# Example Output:
|
|
25
|
+
# var VwxvESbCgv = String.fromCharCode(0x30,0x31,062,063,064,53,0x36,067,070,0x39);
|
|
26
|
+
# var ToWZPn = {
|
|
27
|
+
# "\146\157\x6f": (function () { var yDyv="o",YnCL="o",Qcsa="f"; return Qcsa+YnCL+yDyv })(),
|
|
28
|
+
# "\142ar": String.fromCharCode(0142,97,0162)
|
|
29
|
+
# };
|
|
30
|
+
# alert(VwxvESbCgv);
|
|
31
|
+
# alert(ToWZPn.foo);
|
|
32
|
+
#
|
|
33
|
+
# NOTE: Variables MUST be declared with a 'var' statement BEFORE first use (or
|
|
34
|
+
# not at all) for this to generate correct code! If variables are not declared
|
|
35
|
+
# they will not be randomized but the generated code will be correct.
|
|
36
|
+
#
|
|
37
|
+
# Bad Example Javascript:
|
|
38
|
+
# a = "asdf"; // this variable hasn't been declared and will not be randomized
|
|
39
|
+
# var a;
|
|
40
|
+
# alert(a); // real js engines will alert "asdf" here
|
|
41
|
+
# Bad Example Obfuscated:
|
|
42
|
+
# a = (function () { var hpHu="f",oyTm="asd"; return oyTm+hpHu })();
|
|
43
|
+
# var zSrnHpEfJZtg;
|
|
44
|
+
# alert(zSrnHpEfJZtg);
|
|
45
|
+
# Notice that the first usage of +a+ (before it was declared) is not
|
|
46
|
+
# randomized. Thus, the obfuscated version will alert 'undefined' instead of
|
|
47
|
+
# "asdf".
|
|
48
|
+
#
|
|
49
|
+
class JSObfu
|
|
50
|
+
|
|
51
|
+
# these keywords should never be used as a random var name
|
|
52
|
+
# source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Reserved_Words
|
|
53
|
+
RESERVED_KEYWORDS = %w(
|
|
54
|
+
break case catch continue debugger default delete do else finally
|
|
55
|
+
for function if in instanceof new return switch this throw try
|
|
56
|
+
typeof var void while with class enum export extends import super
|
|
57
|
+
implements interface let package private protected public static yield
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
#
|
|
61
|
+
# Abstract Syntax Tree generated by RKelly::Parser#parse
|
|
62
|
+
#
|
|
63
|
+
attr_reader :ast
|
|
64
|
+
|
|
65
|
+
#
|
|
66
|
+
# Saves +code+ for later obfuscation with #obfuscate
|
|
67
|
+
#
|
|
68
|
+
def initialize(code)
|
|
69
|
+
@code = code
|
|
70
|
+
@funcs = {}
|
|
71
|
+
@vars = {}
|
|
72
|
+
@debug = false
|
|
73
|
+
@rand_gen = Rex::RandomIdentifierGenerator.new(
|
|
74
|
+
:max_length => 15,
|
|
75
|
+
:first_char_set => Rex::Text::Alpha+"_$",
|
|
76
|
+
:char_set => Rex::Text::AlphaNumeric+"_$"
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
#
|
|
81
|
+
# Add +str+ to the un-obfuscated code.
|
|
82
|
+
#
|
|
83
|
+
# Calling this method after #obfuscate is undefined
|
|
84
|
+
#
|
|
85
|
+
def <<(str)
|
|
86
|
+
@code << str
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
#
|
|
90
|
+
# Return the (possibly obfuscated) code as a string.
|
|
91
|
+
#
|
|
92
|
+
# If #obfuscate has not been called before this, returns the parsed,
|
|
93
|
+
# unobfuscated code. This can be useful for example to remove comments and
|
|
94
|
+
# standardize spacing.
|
|
95
|
+
#
|
|
96
|
+
def to_s
|
|
97
|
+
parse if not @ast
|
|
98
|
+
@ast.to_ecma
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
#
|
|
102
|
+
# Return the obfuscated name of a symbol
|
|
103
|
+
#
|
|
104
|
+
# You MUST call #obfuscate before this method!
|
|
105
|
+
#
|
|
106
|
+
def sym(lookup)
|
|
107
|
+
if @vars[lookup]
|
|
108
|
+
ret = @vars[lookup]
|
|
109
|
+
elsif @funcs[lookup]
|
|
110
|
+
ret = @funcs[lookup]
|
|
111
|
+
else
|
|
112
|
+
ret = lookup
|
|
113
|
+
end
|
|
114
|
+
ret
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
#
|
|
118
|
+
# Parse and obfuscate
|
|
119
|
+
#
|
|
120
|
+
def obfuscate
|
|
121
|
+
parse
|
|
122
|
+
obfuscate_r(@ast)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# @return [String] a unique random var name that is not a reserved keyword
|
|
126
|
+
def random_var_name
|
|
127
|
+
loop do
|
|
128
|
+
text = random_string
|
|
129
|
+
unless @vars.has_value?(text) or RESERVED_KEYWORDS.include?(text)
|
|
130
|
+
return text
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
protected
|
|
136
|
+
|
|
137
|
+
# @return [String] a random string
|
|
138
|
+
def random_string
|
|
139
|
+
@rand_gen.generate
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#
|
|
143
|
+
# Recursive method to obfuscate the given +ast+.
|
|
144
|
+
#
|
|
145
|
+
# +ast+ should be the result of RKelly::Parser#parse
|
|
146
|
+
#
|
|
147
|
+
def obfuscate_r(ast)
|
|
148
|
+
ast.each do |node|
|
|
149
|
+
#if node.respond_to? :value and node.value.kind_of? String and node.value =~ /bodyOnLoad/i
|
|
150
|
+
# $stdout.puts("bodyOnLoad: #{node.class}: #{node.value}")
|
|
151
|
+
#end
|
|
152
|
+
|
|
153
|
+
case node
|
|
154
|
+
when nil
|
|
155
|
+
nil
|
|
156
|
+
|
|
157
|
+
when ::RKelly::Nodes::SourceElementsNode
|
|
158
|
+
# Recurse
|
|
159
|
+
obfuscate_r(node.value)
|
|
160
|
+
|
|
161
|
+
#when ::RKelly::Nodes::ObjectLiteralNode
|
|
162
|
+
# TODO
|
|
163
|
+
#$stdout.puts(node.methods - Object.new.methods)
|
|
164
|
+
#$stdout.puts(node.value.inspect)
|
|
165
|
+
|
|
166
|
+
when ::RKelly::Nodes::PropertyNode
|
|
167
|
+
# Property names must be bare words or string literals NOT
|
|
168
|
+
# expressions! Can't use transform_string() here
|
|
169
|
+
if node.name =~ /^[a-zA-Z_][a-zA-Z0-9_]*$/
|
|
170
|
+
n = '"'
|
|
171
|
+
node.name.unpack("C*") { |c|
|
|
172
|
+
case rand(3)
|
|
173
|
+
when 0; n << "\\x%02x"%(c)
|
|
174
|
+
when 1; n << "\\#{c.to_s 8}"
|
|
175
|
+
when 2; n << [c].pack("C")
|
|
176
|
+
end
|
|
177
|
+
}
|
|
178
|
+
n << '"'
|
|
179
|
+
node.instance_variable_set(:@name, n)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Variables
|
|
183
|
+
when ::RKelly::Nodes::VarDeclNode
|
|
184
|
+
if @vars[node.name].nil?
|
|
185
|
+
@vars[node.name] = random_var_name
|
|
186
|
+
end
|
|
187
|
+
node.name = @vars[node.name]
|
|
188
|
+
when ::RKelly::Nodes::ParameterNode
|
|
189
|
+
if @vars[node.value].nil?
|
|
190
|
+
@vars[node.value] = random_var_name
|
|
191
|
+
end
|
|
192
|
+
node.value = @vars[node.value]
|
|
193
|
+
when ::RKelly::Nodes::ResolveNode
|
|
194
|
+
#$stdout.puts("Resolve bodyOnload: #{@vars[node.value]}") if "bodyOnLoad" == node.value
|
|
195
|
+
node.value = @vars[node.value] if @vars[node.value]
|
|
196
|
+
when ::RKelly::Nodes::DotAccessorNode
|
|
197
|
+
case node.value
|
|
198
|
+
when ::RKelly::Nodes::ResolveNode
|
|
199
|
+
if @vars[node.value.value]
|
|
200
|
+
node.value.value = @vars[node.value.value]
|
|
201
|
+
end
|
|
202
|
+
#else
|
|
203
|
+
# $stderr.puts("Non-resolve node as target of dotaccessor: #{node.value.class}")
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# Functions
|
|
207
|
+
when ::RKelly::Nodes::FunctionDeclNode
|
|
208
|
+
#$stdout.puts("FunctionDecl: #{node.value}")
|
|
209
|
+
# Functions can also act as objects, so store them in the vars
|
|
210
|
+
# and the functions list so we can replace them in both places
|
|
211
|
+
if @funcs[node.value].nil? and not @funcs.values.include?(node.value)
|
|
212
|
+
@funcs[node.value] = random_var_name
|
|
213
|
+
if @vars[node.value].nil?
|
|
214
|
+
@vars[node.value] = @funcs[node.value]
|
|
215
|
+
end
|
|
216
|
+
node.value = @funcs[node.value]
|
|
217
|
+
end
|
|
218
|
+
when ::RKelly::Nodes::FunctionCallNode
|
|
219
|
+
# The value of a FunctionCallNode is some sort of accessor node or a ResolveNode
|
|
220
|
+
# so this is basically useless
|
|
221
|
+
#$stdout.puts("Function call: #{node.name} => #{@funcs[node.name]}")
|
|
222
|
+
#node.value = @funcs[node.value] if @funcs[node.value]
|
|
223
|
+
|
|
224
|
+
# Transformers
|
|
225
|
+
when ::RKelly::Nodes::NumberNode
|
|
226
|
+
node.value = transform_number(node.value)
|
|
227
|
+
when ::RKelly::Nodes::StringNode
|
|
228
|
+
node.value = transform_string(node.value)
|
|
229
|
+
else
|
|
230
|
+
#$stderr.puts "#{node.class}: #{node.value}"
|
|
231
|
+
#$stderr.puts "#{node.class}"
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
#unless node.kind_of? ::RKelly::Nodes::SourceElementsNode
|
|
235
|
+
# $stderr.puts "#{node.class}: #{node.value}"
|
|
236
|
+
#end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
nil
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
#
|
|
243
|
+
# Generate an Abstract Syntax Tree (#ast) for later obfuscation
|
|
244
|
+
#
|
|
245
|
+
def parse
|
|
246
|
+
parser = RKelly::Parser.new
|
|
247
|
+
@ast = parser.parse(@code)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
#
|
|
251
|
+
# Convert a number to a random base (decimal, octal, or hexedecimal).
|
|
252
|
+
#
|
|
253
|
+
# Given 10 as input, the possible return values are:
|
|
254
|
+
# "10"
|
|
255
|
+
# "0xa"
|
|
256
|
+
# "012"
|
|
257
|
+
#
|
|
258
|
+
def rand_base(num)
|
|
259
|
+
case rand(3)
|
|
260
|
+
when 0; num.to_s
|
|
261
|
+
when 1; "0%o" % num
|
|
262
|
+
when 2; "0x%x" % num
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
#
|
|
267
|
+
# Return a mathematical expression that will evaluate to the given number
|
|
268
|
+
# +num+.
|
|
269
|
+
#
|
|
270
|
+
# +num+ can be a float or an int, but should never be negative.
|
|
271
|
+
#
|
|
272
|
+
def transform_number(num)
|
|
273
|
+
case num
|
|
274
|
+
when Fixnum
|
|
275
|
+
if num == 0
|
|
276
|
+
r = rand(10) + 1
|
|
277
|
+
transformed = "('#{Rex::Text.rand_text_alpha(r)}'.length - #{r})"
|
|
278
|
+
elsif num > 0 and num < 10
|
|
279
|
+
# use a random string.length for small numbers
|
|
280
|
+
transformed = "'#{Rex::Text.rand_text_alpha(num)}'.length"
|
|
281
|
+
else
|
|
282
|
+
transformed = "("
|
|
283
|
+
divisor = rand(num) + 1
|
|
284
|
+
a = num / divisor.to_i
|
|
285
|
+
b = num - (a * divisor)
|
|
286
|
+
# recurse half the time for a
|
|
287
|
+
a = (rand(2) == 0) ? transform_number(a) : rand_base(a)
|
|
288
|
+
# recurse half the time for divisor
|
|
289
|
+
divisor = (rand(2) == 0) ? transform_number(divisor) : rand_base(divisor)
|
|
290
|
+
transformed << "#{a}*#{divisor}"
|
|
291
|
+
transformed << "+#{b}"
|
|
292
|
+
transformed << ")"
|
|
293
|
+
end
|
|
294
|
+
when Float
|
|
295
|
+
transformed = "(#{num - num.floor} + #{rand_base(num.floor)})"
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
#puts("#{num} == #{transformed}")
|
|
299
|
+
|
|
300
|
+
transformed
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
#
|
|
304
|
+
# Convert a javascript string into something that will generate that string.
|
|
305
|
+
#
|
|
306
|
+
# Randomly calls one of the +transform_string_*+ methods
|
|
307
|
+
#
|
|
308
|
+
def transform_string(str)
|
|
309
|
+
quote = str[0,1]
|
|
310
|
+
# pull off the quotes
|
|
311
|
+
str = str[1,str.length - 2]
|
|
312
|
+
return quote*2 if str.length == 0
|
|
313
|
+
|
|
314
|
+
case rand(2)
|
|
315
|
+
when 0
|
|
316
|
+
transformed = transform_string_split_concat(str, quote)
|
|
317
|
+
when 1
|
|
318
|
+
transformed = transform_string_fromCharCode(str)
|
|
319
|
+
#when 2
|
|
320
|
+
# # Currently no-op
|
|
321
|
+
# transformed = transform_string_unescape(str)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
#$stderr.puts "Obfuscating str: #{str.ljust 30} #{transformed}"
|
|
325
|
+
transformed
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
#
|
|
329
|
+
# Split a javascript string, +str+, without breaking escape sequences.
|
|
330
|
+
#
|
|
331
|
+
# The maximum length of each piece of the string is half the total length
|
|
332
|
+
# of the string, ensuring we (almost) always split into at least two
|
|
333
|
+
# pieces. This won't always be true when given a string like "AA\x41",
|
|
334
|
+
# where escape sequences artificially increase the total length (escape
|
|
335
|
+
# sequences are considered a single character).
|
|
336
|
+
#
|
|
337
|
+
# Returns an array of two-element arrays. The zeroeth element is a
|
|
338
|
+
# randomly generated variable name, the first is a piece of the string
|
|
339
|
+
# contained in +quote+s.
|
|
340
|
+
#
|
|
341
|
+
# See #escape_length
|
|
342
|
+
#
|
|
343
|
+
def safe_split(str, quote)
|
|
344
|
+
parts = []
|
|
345
|
+
max_len = str.length / 2
|
|
346
|
+
while str.length > 0
|
|
347
|
+
len = 0
|
|
348
|
+
loop do
|
|
349
|
+
e_len = escape_length(str[len..-1])
|
|
350
|
+
e_len = 1 if e_len.nil?
|
|
351
|
+
len += e_len
|
|
352
|
+
# if we've reached the end of the string, bail
|
|
353
|
+
break unless str[len]
|
|
354
|
+
break if len > max_len
|
|
355
|
+
# randomize the length of each part
|
|
356
|
+
break if (rand(4) == 0)
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
part = str.slice!(0, len)
|
|
360
|
+
|
|
361
|
+
var = Rex::Text.rand_text_alpha(4)
|
|
362
|
+
parts.push( [ var, "#{quote}#{part}#{quote}" ] )
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
parts
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
#
|
|
369
|
+
# Stolen from obfuscatejs.rb
|
|
370
|
+
#
|
|
371
|
+
# Determines the length of an escape sequence
|
|
372
|
+
#
|
|
373
|
+
def escape_length(str)
|
|
374
|
+
esc_len = nil
|
|
375
|
+
if str[0,1] == "\\"
|
|
376
|
+
case str[1,1]
|
|
377
|
+
when "u"; esc_len = 6 # unicode \u1234
|
|
378
|
+
when "x"; esc_len = 4 # hex, \x41
|
|
379
|
+
when /[0-7]/ # octal, \123, \0
|
|
380
|
+
str[1,3] =~ /([0-7]{1,3})/
|
|
381
|
+
if $1.to_i(8) > 255
|
|
382
|
+
str[1,3] =~ /([0-7]{1,2})/
|
|
383
|
+
end
|
|
384
|
+
esc_len = 1 + $1.length
|
|
385
|
+
else; esc_len = 2 # \" \n, etc.
|
|
386
|
+
end
|
|
387
|
+
end
|
|
388
|
+
esc_len
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
#
|
|
392
|
+
# Split a javascript string, +str+, into multiple randomly-ordered parts
|
|
393
|
+
# and return an anonymous javascript function that joins them in the
|
|
394
|
+
# correct order. This method can be called safely on strings containing
|
|
395
|
+
# escape sequences. See #safe_split.
|
|
396
|
+
#
|
|
397
|
+
def transform_string_split_concat(str, quote)
|
|
398
|
+
parts = safe_split(str, quote)
|
|
399
|
+
func = "(function () { var "
|
|
400
|
+
ret = "; return "
|
|
401
|
+
parts.sort { |a,b| rand }.each do |part|
|
|
402
|
+
func << "#{part[0]}=#{part[1]},"
|
|
403
|
+
end
|
|
404
|
+
func.chop!
|
|
405
|
+
|
|
406
|
+
ret << parts.map{|part| part[0]}.join("+")
|
|
407
|
+
final = func + ret + " })()"
|
|
408
|
+
|
|
409
|
+
final
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
# TODO
|
|
414
|
+
#def transform_string_unescape(str)
|
|
415
|
+
# str
|
|
416
|
+
#end
|
|
417
|
+
|
|
418
|
+
#
|
|
419
|
+
# Return a call to String.fromCharCode() with each char of the input as arguments
|
|
420
|
+
#
|
|
421
|
+
# Example:
|
|
422
|
+
# input : "A\n"
|
|
423
|
+
# output: String.fromCharCode(0x41, 10)
|
|
424
|
+
#
|
|
425
|
+
def transform_string_fromCharCode(str)
|
|
426
|
+
buf = "String.fromCharCode("
|
|
427
|
+
bytes = str.unpack("C*")
|
|
428
|
+
len = 0
|
|
429
|
+
while str.length > 0
|
|
430
|
+
if str[0,1] == "\\"
|
|
431
|
+
str.slice!(0,1)
|
|
432
|
+
# then this is an escape sequence and we need to deal with all
|
|
433
|
+
# the special cases
|
|
434
|
+
case str[0,1]
|
|
435
|
+
# For chars that contain their non-escaped selves, step past
|
|
436
|
+
# the backslash and let the rand_base() below decide how to
|
|
437
|
+
# represent the character.
|
|
438
|
+
when '"', "'", "\\", " "
|
|
439
|
+
char = str.slice!(0,1).unpack("C").first
|
|
440
|
+
# For symbolic escapes, use the known value
|
|
441
|
+
when "n"; char = 0x0a; str.slice!(0,1)
|
|
442
|
+
when "t"; char = 0x09; str.slice!(0,1)
|
|
443
|
+
# Lastly, if it's a hex, unicode, or octal escape, pull out the
|
|
444
|
+
# real value and use that
|
|
445
|
+
when "x"
|
|
446
|
+
# Strip the x
|
|
447
|
+
str.slice!(0,1)
|
|
448
|
+
char = str.slice!(0,2).to_i 16
|
|
449
|
+
when "u"
|
|
450
|
+
# This can potentially lose information in the case of
|
|
451
|
+
# characters like \u0041, but since regular ascii is stored
|
|
452
|
+
# as unicode internally, String.fromCharCode(0x41) will be
|
|
453
|
+
# represented as 00 41 in memory anyway, so it shouldn't
|
|
454
|
+
# matter.
|
|
455
|
+
str.slice!(0,1)
|
|
456
|
+
char = str.slice!(0,4).to_i 16
|
|
457
|
+
when /[0-7]/
|
|
458
|
+
# Octals are a bit harder since they are variable width and
|
|
459
|
+
# don't necessarily mean what you might think. For example,
|
|
460
|
+
# "\61" == "1" and "\610" == "10". 610 is a valid octal
|
|
461
|
+
# number, but not a valid ascii character. Javascript will
|
|
462
|
+
# interpreter as much as it can as a char and use the rest
|
|
463
|
+
# as a literal. Boo.
|
|
464
|
+
str =~ /([0-7]{1,3})/
|
|
465
|
+
char = $1.to_i 8
|
|
466
|
+
if char > 255
|
|
467
|
+
str =~ /([0-7]{1,2})/
|
|
468
|
+
char = $1.to_i 8
|
|
469
|
+
end
|
|
470
|
+
str.slice!(0,$1.length)
|
|
471
|
+
end
|
|
472
|
+
else
|
|
473
|
+
char = str.slice!(0,1).unpack("C").first
|
|
474
|
+
end
|
|
475
|
+
buf << "#{rand_base(char)},"
|
|
476
|
+
end
|
|
477
|
+
# Strip off the last comma
|
|
478
|
+
buf = buf[0,buf.length-1] + ")"
|
|
479
|
+
transformed = buf
|
|
480
|
+
|
|
481
|
+
transformed
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
end
|
|
486
|
+
end
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
=begin
|
|
491
|
+
if __FILE__ == $0
|
|
492
|
+
if ARGV[0]
|
|
493
|
+
code = File.read(ARGV[0])
|
|
494
|
+
else
|
|
495
|
+
#require 'rex/exploitation/javascriptosdetect'
|
|
496
|
+
#code = Rex::Exploitation::JavascriptOSDetect.new.to_s
|
|
497
|
+
code = <<-EOS
|
|
498
|
+
// Should alert "0123456789"
|
|
499
|
+
var a = "0\\612\\063\\x34\\x35\\x36\\x37\\x38\\u0039";
|
|
500
|
+
var a,b=2,c=3;
|
|
501
|
+
alert(a);
|
|
502
|
+
// should alert "asdfjkl;"
|
|
503
|
+
var d = (function() { var foo = "jkl;", blah = "asdf"; return blah + foo; })();
|
|
504
|
+
alert(d);
|
|
505
|
+
EOS
|
|
506
|
+
end
|
|
507
|
+
js = Rex::Exploitation::JSObfu.new(code)
|
|
508
|
+
js.obfuscate
|
|
509
|
+
puts js.to_s
|
|
510
|
+
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
=end
|