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,62 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
require 'rex/exploitation/powershell/output'
|
4
|
+
require 'rex/exploitation/powershell/parser'
|
5
|
+
require 'rex/exploitation/powershell/obfu'
|
6
|
+
require 'rex/exploitation/powershell/param'
|
7
|
+
require 'rex/exploitation/powershell/function'
|
8
|
+
require 'rex/exploitation/powershell/script'
|
9
|
+
require 'rex/exploitation/powershell/psh_methods'
|
10
|
+
|
11
|
+
module Rex
|
12
|
+
module Exploitation
|
13
|
+
module Powershell
|
14
|
+
#
|
15
|
+
# Reads script into a PowershellScript
|
16
|
+
#
|
17
|
+
# @param script_path [String] Path to the Script File
|
18
|
+
#
|
19
|
+
# @return [Script] Powershell Script object
|
20
|
+
def self.read_script(script_path)
|
21
|
+
Rex::Exploitation::Powershell::Script.new(script_path)
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Insert substitutions into the powershell script
|
26
|
+
# If script is a path to a file then read the file
|
27
|
+
# otherwise treat it as the contents of a file
|
28
|
+
#
|
29
|
+
# @param script [String] Script file or path to script
|
30
|
+
# @param subs [Array] Substitutions to insert
|
31
|
+
#
|
32
|
+
# @return [String] Modified script file
|
33
|
+
def self.make_subs(script, subs)
|
34
|
+
if ::File.file?(script)
|
35
|
+
script = ::File.read(script)
|
36
|
+
end
|
37
|
+
|
38
|
+
subs.each do |set|
|
39
|
+
script.gsub!(set[0], set[1])
|
40
|
+
end
|
41
|
+
|
42
|
+
script
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Return an array of substitutions for use in make_subs
|
47
|
+
#
|
48
|
+
# @param subs [String] A ; seperated list of substitutions
|
49
|
+
#
|
50
|
+
# @return [Array] An array of substitutions
|
51
|
+
def self.process_subs(subs)
|
52
|
+
return [] if subs.nil? or subs.empty?
|
53
|
+
new_subs = []
|
54
|
+
subs.split(';').each do |set|
|
55
|
+
new_subs << set.split(',', 2)
|
56
|
+
end
|
57
|
+
|
58
|
+
new_subs
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
module Rex
|
4
|
+
module Exploitation
|
5
|
+
module Powershell
|
6
|
+
class Function
|
7
|
+
FUNCTION_REGEX = Regexp.new(/\[(\w+\[\])\]\$(\w+)\s?=|\[(\w+)\]\$(\w+)\s?=|\[(\w+\[\])\]\s+?\$(\w+)\s+=|\[(\w+)\]\s+\$(\w+)\s?=/i)
|
8
|
+
PARAMETER_REGEX = Regexp.new(/param\s+\(|param\(/im)
|
9
|
+
attr_accessor :code, :name, :params
|
10
|
+
|
11
|
+
include Output
|
12
|
+
include Parser
|
13
|
+
include Obfu
|
14
|
+
|
15
|
+
def initialize(name, code)
|
16
|
+
@name = name
|
17
|
+
@code = code
|
18
|
+
populate_params
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
# To String
|
23
|
+
#
|
24
|
+
# @return [String] Powershell function
|
25
|
+
def to_s
|
26
|
+
"function #{name} #{code}"
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Identify the parameters from the code and
|
31
|
+
# store as Param in @params
|
32
|
+
#
|
33
|
+
def populate_params
|
34
|
+
@params = []
|
35
|
+
start = code.index(PARAMETER_REGEX)
|
36
|
+
return unless start
|
37
|
+
# Get start of our block
|
38
|
+
idx = scan_with_index('(', code[start..-1]).first.last + start
|
39
|
+
pclause = block_extract(idx)
|
40
|
+
|
41
|
+
matches = pclause.scan(FUNCTION_REGEX)
|
42
|
+
|
43
|
+
# Ignore assignment, create params with class and variable names
|
44
|
+
matches.each do |param|
|
45
|
+
klass = nil
|
46
|
+
name = nil
|
47
|
+
param.each do |value|
|
48
|
+
if value
|
49
|
+
if klass
|
50
|
+
name = value
|
51
|
+
@params << Param.new(klass, name)
|
52
|
+
break
|
53
|
+
else
|
54
|
+
klass = value
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
require 'rex/text'
|
4
|
+
|
5
|
+
module Rex
|
6
|
+
module Exploitation
|
7
|
+
module Powershell
|
8
|
+
module Obfu
|
9
|
+
MULTI_LINE_COMMENTS_REGEX = Regexp.new(/<#(.*?)#>/m)
|
10
|
+
SINGLE_LINE_COMMENTS_REGEX = Regexp.new(/^\s*#(?!.*region)(.*$)/i)
|
11
|
+
WINDOWS_EOL_REGEX = Regexp.new(/[\r\n]+/)
|
12
|
+
UNIX_EOL_REGEX = Regexp.new(/[\n]+/)
|
13
|
+
WHITESPACE_REGEX = Regexp.new(/\s+/)
|
14
|
+
EMPTY_LINE_REGEX = Regexp.new(/^$|^\s+$/)
|
15
|
+
|
16
|
+
#
|
17
|
+
# Remove comments
|
18
|
+
#
|
19
|
+
# @return [String] code without comments
|
20
|
+
def strip_comments
|
21
|
+
# Multi line
|
22
|
+
code.gsub!(MULTI_LINE_COMMENTS_REGEX, '')
|
23
|
+
# Single line
|
24
|
+
code.gsub!(SINGLE_LINE_COMMENTS_REGEX, '')
|
25
|
+
|
26
|
+
code
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Remove empty lines
|
31
|
+
#
|
32
|
+
# @return [String] code without empty lines
|
33
|
+
def strip_empty_lines
|
34
|
+
# Windows EOL
|
35
|
+
code.gsub!(WINDOWS_EOL_REGEX, "\r\n")
|
36
|
+
# UNIX EOL
|
37
|
+
code.gsub!(UNIX_EOL_REGEX, "\n")
|
38
|
+
|
39
|
+
code
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# Remove whitespace
|
44
|
+
# This can break some codes using inline .NET
|
45
|
+
#
|
46
|
+
# @return [String] code with whitespace stripped
|
47
|
+
def strip_whitespace
|
48
|
+
code.gsub!(WHITESPACE_REGEX, ' ')
|
49
|
+
|
50
|
+
code
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Identify variables and replace them
|
55
|
+
#
|
56
|
+
# @return [String] code with variable names replaced with unique values
|
57
|
+
def sub_vars
|
58
|
+
# Get list of variables, remove reserved
|
59
|
+
get_var_names.each do |var, _sub|
|
60
|
+
code.gsub!(var, "$#{@rig.init_var(var)}")
|
61
|
+
end
|
62
|
+
|
63
|
+
code
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# Identify function names and replace them
|
68
|
+
#
|
69
|
+
# @return [String] code with function names replaced with unique
|
70
|
+
# values
|
71
|
+
def sub_funcs
|
72
|
+
# Find out function names, make map
|
73
|
+
get_func_names.each do |var, _sub|
|
74
|
+
code.gsub!(var, @rig.init_var(var))
|
75
|
+
end
|
76
|
+
|
77
|
+
code
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# Perform standard substitutions
|
82
|
+
#
|
83
|
+
# @return [String] code with standard substitution methods applied
|
84
|
+
def standard_subs(subs = %w(strip_comments strip_whitespace sub_funcs sub_vars))
|
85
|
+
# Save us the trouble of breaking injected .NET and such
|
86
|
+
subs.delete('strip_whitespace') unless get_string_literals.empty?
|
87
|
+
# Run selected modifiers
|
88
|
+
subs.each do |modifier|
|
89
|
+
send(modifier)
|
90
|
+
end
|
91
|
+
code.gsub!(EMPTY_LINE_REGEX, '')
|
92
|
+
|
93
|
+
code
|
94
|
+
end
|
95
|
+
end # Obfu
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
require 'zlib'
|
4
|
+
require 'rex/text'
|
5
|
+
|
6
|
+
module Rex
|
7
|
+
module Exploitation
|
8
|
+
module Powershell
|
9
|
+
module Output
|
10
|
+
#
|
11
|
+
# To String
|
12
|
+
#
|
13
|
+
# @return [String] Code
|
14
|
+
def to_s
|
15
|
+
code
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Returns code size
|
20
|
+
#
|
21
|
+
# @return [Integer] Code size
|
22
|
+
def size
|
23
|
+
code.size
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Return code with numbered lines
|
28
|
+
#
|
29
|
+
# @return [String] Powershell code with line numbers
|
30
|
+
def to_s_lineno
|
31
|
+
numbered = ''
|
32
|
+
code.split(/\r\n|\n/).each_with_index do |line, idx|
|
33
|
+
numbered << "#{idx}: #{line}"
|
34
|
+
end
|
35
|
+
|
36
|
+
numbered
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Return a zlib compressed powershell code wrapped in decode stub
|
41
|
+
#
|
42
|
+
# @param eof [String] End of file identifier to append to code
|
43
|
+
#
|
44
|
+
# @return [String] Zlib compressed powershell code wrapped in
|
45
|
+
# decompression stub
|
46
|
+
def deflate_code(eof = nil)
|
47
|
+
# Compress using the Deflate algorithm
|
48
|
+
compressed_stream = ::Zlib::Deflate.deflate(code,
|
49
|
+
::Zlib::BEST_COMPRESSION)
|
50
|
+
|
51
|
+
# Base64 encode the compressed file contents
|
52
|
+
encoded_stream = Rex::Text.encode_base64(compressed_stream)
|
53
|
+
|
54
|
+
# Build the powershell expression
|
55
|
+
# Decode base64 encoded command and create a stream object
|
56
|
+
psh_expression = '$s=New-Object IO.MemoryStream(,'
|
57
|
+
psh_expression << "[Convert]::FromBase64String('#{encoded_stream}'));"
|
58
|
+
# Read & delete the first two bytes due to incompatibility with MS
|
59
|
+
psh_expression << '$s.ReadByte();'
|
60
|
+
psh_expression << '$s.ReadByte();'
|
61
|
+
# Uncompress and invoke the expression (execute)
|
62
|
+
psh_expression << 'IEX (New-Object IO.StreamReader('
|
63
|
+
psh_expression << 'New-Object IO.Compression.DeflateStream('
|
64
|
+
psh_expression << '$s,'
|
65
|
+
psh_expression << '[IO.Compression.CompressionMode]::Decompress)'
|
66
|
+
psh_expression << ')).ReadToEnd();'
|
67
|
+
|
68
|
+
# If eof is set, add a marker to signify end of code output
|
69
|
+
# if (eof && eof.length == 8) then psh_expression += "'#{eof}'" end
|
70
|
+
psh_expression << "echo '#{eof}';" if eof
|
71
|
+
|
72
|
+
@code = psh_expression
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# Return Base64 encoded powershell code
|
77
|
+
#
|
78
|
+
# @return [String] Base64 encoded powershell code
|
79
|
+
def encode_code
|
80
|
+
@code = Rex::Text.encode_base64(Rex::Text.to_unicode(code))
|
81
|
+
end
|
82
|
+
|
83
|
+
#
|
84
|
+
# Return a gzip compressed powershell code wrapped in decoder stub
|
85
|
+
#
|
86
|
+
# @param eof [String] End of file identifier to append to code
|
87
|
+
#
|
88
|
+
# @return [String] Gzip compressed powershell code wrapped in
|
89
|
+
# decompression stub
|
90
|
+
def gzip_code(eof = nil)
|
91
|
+
# Compress using the Deflate algorithm
|
92
|
+
compressed_stream = Rex::Text.gzip(code)
|
93
|
+
|
94
|
+
# Base64 encode the compressed file contents
|
95
|
+
encoded_stream = Rex::Text.encode_base64(compressed_stream)
|
96
|
+
|
97
|
+
# Build the powershell expression
|
98
|
+
# Decode base64 encoded command and create a stream object
|
99
|
+
psh_expression = '$s=New-Object IO.MemoryStream(,'
|
100
|
+
psh_expression << "[Convert]::FromBase64String('#{encoded_stream}'));"
|
101
|
+
# Uncompress and invoke the expression (execute)
|
102
|
+
psh_expression << 'IEX (New-Object IO.StreamReader('
|
103
|
+
psh_expression << 'New-Object IO.Compression.GzipStream('
|
104
|
+
psh_expression << '$s,'
|
105
|
+
psh_expression << '[IO.Compression.CompressionMode]::Decompress)'
|
106
|
+
psh_expression << ')).ReadToEnd();'
|
107
|
+
|
108
|
+
# If eof is set, add a marker to signify end of code output
|
109
|
+
# if (eof && eof.length == 8) then psh_expression += "'#{eof}'" end
|
110
|
+
psh_expression << "echo '#{eof}';" if eof
|
111
|
+
|
112
|
+
@code = psh_expression
|
113
|
+
end
|
114
|
+
|
115
|
+
#
|
116
|
+
# Compresses script contents with gzip (default) or deflate
|
117
|
+
#
|
118
|
+
# @param eof [String] End of file identifier to append to code
|
119
|
+
# @param gzip [Boolean] Whether to use gzip compression or deflate
|
120
|
+
#
|
121
|
+
# @return [String] Compressed code wrapped in decompression stub
|
122
|
+
def compress_code(eof = nil, gzip = true)
|
123
|
+
@code = gzip ? gzip_code(eof) : deflate_code(eof)
|
124
|
+
end
|
125
|
+
|
126
|
+
#
|
127
|
+
# Reverse the compression process
|
128
|
+
# Try gzip, inflate if that fails
|
129
|
+
#
|
130
|
+
# @return [String] Decompressed powershell code
|
131
|
+
def decompress_code
|
132
|
+
# Extract substring with payload
|
133
|
+
encoded_stream = @code.scan(/FromBase64String\('(.*)'/).flatten.first
|
134
|
+
# Decode and decompress the string
|
135
|
+
unencoded = Rex::Text.decode_base64(encoded_stream)
|
136
|
+
begin
|
137
|
+
@code = Rex::Text.ungzip(unencoded) || Rex::Text.zlib_inflate(unencoded)
|
138
|
+
rescue Zlib::GzipFile::Error
|
139
|
+
begin
|
140
|
+
@code = Rex::Text.zlib_inflate(unencoded)
|
141
|
+
rescue Zlib::DataError => e
|
142
|
+
raise RuntimeError, 'Invalid compression'
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
@code
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
module Rex
|
4
|
+
module Exploitation
|
5
|
+
module Powershell
|
6
|
+
class Param
|
7
|
+
attr_accessor :klass, :name
|
8
|
+
def initialize(klass, name)
|
9
|
+
@klass = klass.strip
|
10
|
+
@name = name.strip.gsub(/\s|,/, '')
|
11
|
+
end
|
12
|
+
|
13
|
+
#
|
14
|
+
# To String
|
15
|
+
#
|
16
|
+
# @return [String] Powershell param
|
17
|
+
def to_s
|
18
|
+
"[#{klass}]$#{name}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
module Rex
|
4
|
+
module Exploitation
|
5
|
+
module Powershell
|
6
|
+
module Parser
|
7
|
+
# Reserved special variables
|
8
|
+
# Acquired with: Get-Variable | Format-Table name, value -auto
|
9
|
+
RESERVED_VARIABLE_NAMES = [
|
10
|
+
'$$',
|
11
|
+
'$?',
|
12
|
+
'$^',
|
13
|
+
'$_',
|
14
|
+
'$args',
|
15
|
+
'$ConfirmPreference',
|
16
|
+
'$ConsoleFileName',
|
17
|
+
'$DebugPreference',
|
18
|
+
'$Env',
|
19
|
+
'$Error',
|
20
|
+
'$ErrorActionPreference',
|
21
|
+
'$ErrorView',
|
22
|
+
'$ExecutionContext',
|
23
|
+
'$false',
|
24
|
+
'$FormatEnumerationLimit',
|
25
|
+
'$HOME',
|
26
|
+
'$Host',
|
27
|
+
'$input',
|
28
|
+
'$LASTEXITCODE',
|
29
|
+
'$MaximumAliasCount',
|
30
|
+
'$MaximumDriveCount',
|
31
|
+
'$MaximumErrorCount',
|
32
|
+
'$MaximumFunctionCount',
|
33
|
+
'$MaximumHistoryCount',
|
34
|
+
'$MaximumVariableCount',
|
35
|
+
'$MyInvocation',
|
36
|
+
'$NestedPromptLevel',
|
37
|
+
'$null',
|
38
|
+
'$OutputEncoding',
|
39
|
+
'$PID',
|
40
|
+
'$PROFILE',
|
41
|
+
'$ProgressPreference',
|
42
|
+
'$PSBoundParameters',
|
43
|
+
'$PSCulture',
|
44
|
+
'$PSEmailServer',
|
45
|
+
'$PSHOME',
|
46
|
+
'$PSSessionApplicationName',
|
47
|
+
'$PSSessionConfigurationName',
|
48
|
+
'$PSSessionOption',
|
49
|
+
'$PSUICulture',
|
50
|
+
'$PSVersionTable',
|
51
|
+
'$PWD',
|
52
|
+
'$ReportErrorShowExceptionClass',
|
53
|
+
'$ReportErrorShowInnerException',
|
54
|
+
'$ReportErrorShowSource',
|
55
|
+
'$ReportErrorShowStackTrace',
|
56
|
+
'$ShellId',
|
57
|
+
'$StackTrace',
|
58
|
+
'$true',
|
59
|
+
'$VerbosePreference',
|
60
|
+
'$WarningPreference',
|
61
|
+
'$WhatIfPreference'
|
62
|
+
].map(&:downcase).freeze
|
63
|
+
|
64
|
+
#
|
65
|
+
# Get variable names from code, removes reserved names from return
|
66
|
+
#
|
67
|
+
# @return [Array] variable names
|
68
|
+
def get_var_names
|
69
|
+
our_vars = code.scan(/\$[a-zA-Z\-\_0-9]+/).uniq.flatten.map(&:strip)
|
70
|
+
our_vars.select { |v| !RESERVED_VARIABLE_NAMES.include?(v.downcase) }
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# Get function names from code
|
75
|
+
#
|
76
|
+
# @return [Array] function names
|
77
|
+
def get_func_names
|
78
|
+
code.scan(/function\s([a-zA-Z\-\_0-9]+)/).uniq.flatten
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Attempt to find string literals in PSH expression
|
83
|
+
#
|
84
|
+
# @return [Array] string literals
|
85
|
+
def get_string_literals
|
86
|
+
code.scan(/@"(.+?)"@|@'(.+?)'@/m)
|
87
|
+
end
|
88
|
+
|
89
|
+
#
|
90
|
+
# Scan code and return matches with index
|
91
|
+
#
|
92
|
+
# @param str [String] string to match in code
|
93
|
+
# @param source [String] source code to match, defaults to @code
|
94
|
+
#
|
95
|
+
# @return [Array[String,Integer]] matched items with index
|
96
|
+
def scan_with_index(str, source = code)
|
97
|
+
::Enumerator.new do |y|
|
98
|
+
source.scan(str) do
|
99
|
+
y << ::Regexp.last_match
|
100
|
+
end
|
101
|
+
end.map { |m| [m.to_s, m.offset(0)[0]] }
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
# Return matching bracket type
|
106
|
+
#
|
107
|
+
# @param char [String] opening bracket character
|
108
|
+
#
|
109
|
+
# @return [String] matching closing bracket
|
110
|
+
def match_start(char)
|
111
|
+
case char
|
112
|
+
when '{'
|
113
|
+
'}'
|
114
|
+
when '('
|
115
|
+
')'
|
116
|
+
when '['
|
117
|
+
']'
|
118
|
+
when '<'
|
119
|
+
'>'
|
120
|
+
else
|
121
|
+
fail ArgumentError, 'Unknown starting bracket'
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
#
|
126
|
+
# Extract block of code inside brackets/parenthesis
|
127
|
+
#
|
128
|
+
# Attempts to match the bracket at idx, handling nesting manually
|
129
|
+
# Once the balanced matching bracket is found, all script content
|
130
|
+
# between idx and the index of the matching bracket is returned
|
131
|
+
#
|
132
|
+
# @param idx [Integer] index of opening bracket
|
133
|
+
#
|
134
|
+
# @return [String] content between matching brackets
|
135
|
+
def block_extract(idx)
|
136
|
+
fail ArgumentError unless idx
|
137
|
+
|
138
|
+
if idx < 0 || idx >= code.length
|
139
|
+
fail ArgumentError, 'Invalid index'
|
140
|
+
end
|
141
|
+
|
142
|
+
start = code[idx]
|
143
|
+
stop = match_start(start)
|
144
|
+
delims = scan_with_index(/#{Regexp.escape(start)}|#{Regexp.escape(stop)}/, code[idx + 1..-1])
|
145
|
+
delims.map { |x| x[1] = x[1] + idx + 1 }
|
146
|
+
c = 1
|
147
|
+
sidx = nil
|
148
|
+
# Go through delims till we balance, get idx
|
149
|
+
while (c != 0) && (x = delims.shift)
|
150
|
+
sidx = x[1]
|
151
|
+
x[0] == stop ? c -= 1 : c += 1
|
152
|
+
end
|
153
|
+
|
154
|
+
code[idx..sidx]
|
155
|
+
end
|
156
|
+
|
157
|
+
#
|
158
|
+
# Extract a block of function code
|
159
|
+
#
|
160
|
+
# @param func_name [String] function name
|
161
|
+
# @param delete [Boolean] delete the function from the code
|
162
|
+
#
|
163
|
+
# @return [String] function block
|
164
|
+
def get_func(func_name, delete = false)
|
165
|
+
start = code.index(func_name)
|
166
|
+
|
167
|
+
return nil unless start
|
168
|
+
|
169
|
+
idx = code[start..-1].index('{') + start
|
170
|
+
func_txt = block_extract(idx)
|
171
|
+
|
172
|
+
if delete
|
173
|
+
delete_code = code[0..idx]
|
174
|
+
delete_code << code[(idx + func_txt.length)..-1]
|
175
|
+
@code = delete_code
|
176
|
+
end
|
177
|
+
|
178
|
+
Function.new(func_name, func_txt)
|
179
|
+
end
|
180
|
+
end # Parser
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|