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,538 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex/ui'
|
|
3
|
+
require 'pp'
|
|
4
|
+
|
|
5
|
+
module Rex
|
|
6
|
+
module Ui
|
|
7
|
+
module Text
|
|
8
|
+
|
|
9
|
+
###
|
|
10
|
+
#
|
|
11
|
+
# The dispatcher shell class is designed to provide a generic means
|
|
12
|
+
# of processing various shell commands that may be located in
|
|
13
|
+
# different modules or chunks of codes. These chunks are referred
|
|
14
|
+
# to as command dispatchers. The only requirement for command dispatchers is
|
|
15
|
+
# that they prefix every method that they wish to be mirrored as a command
|
|
16
|
+
# with the cmd_ prefix.
|
|
17
|
+
#
|
|
18
|
+
###
|
|
19
|
+
module DispatcherShell
|
|
20
|
+
|
|
21
|
+
###
|
|
22
|
+
#
|
|
23
|
+
# Empty template base class for command dispatchers.
|
|
24
|
+
#
|
|
25
|
+
###
|
|
26
|
+
module CommandDispatcher
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Initializes the command dispatcher mixin.
|
|
30
|
+
#
|
|
31
|
+
def initialize(shell)
|
|
32
|
+
self.shell = shell
|
|
33
|
+
self.tab_complete_items = []
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# Returns nil for an empty set of commands.
|
|
38
|
+
#
|
|
39
|
+
# This method should be overridden to return a Hash with command
|
|
40
|
+
# names for keys and brief help text for values.
|
|
41
|
+
#
|
|
42
|
+
def commands
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Returns an empty set of commands.
|
|
47
|
+
#
|
|
48
|
+
# This method should be overridden if the dispatcher has commands that
|
|
49
|
+
# should be treated as deprecated. Deprecated commands will not show up in
|
|
50
|
+
# help and will not tab-complete, but will still be callable.
|
|
51
|
+
#
|
|
52
|
+
def deprecated_commands
|
|
53
|
+
[]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Wraps shell.print_error
|
|
58
|
+
#
|
|
59
|
+
def print_error(msg = '')
|
|
60
|
+
shell.print_error(msg)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Wraps shell.print_status
|
|
65
|
+
#
|
|
66
|
+
def print_status(msg = '')
|
|
67
|
+
shell.print_status(msg)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# Wraps shell.print_line
|
|
72
|
+
#
|
|
73
|
+
def print_line(msg = '')
|
|
74
|
+
shell.print_line(msg)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# Wraps shell.print_good
|
|
79
|
+
#
|
|
80
|
+
def print_good(msg = '')
|
|
81
|
+
shell.print_good(msg)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
#
|
|
85
|
+
# Wraps shell.print_warning
|
|
86
|
+
#
|
|
87
|
+
def print_warning(msg = '')
|
|
88
|
+
shell.print_warning(msg)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
#
|
|
92
|
+
# Wraps shell.print
|
|
93
|
+
#
|
|
94
|
+
def print(msg = '')
|
|
95
|
+
shell.print(msg)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
#
|
|
99
|
+
# Print a warning that the called command is deprecated and optionally
|
|
100
|
+
# forward to the replacement +method+ (useful for when commands are
|
|
101
|
+
# renamed).
|
|
102
|
+
#
|
|
103
|
+
def deprecated_cmd(method=nil, *args)
|
|
104
|
+
cmd = caller[0].match(/`cmd_(.*)'/)[1]
|
|
105
|
+
print_error "The #{cmd} command is DEPRECATED"
|
|
106
|
+
if cmd == "db_autopwn"
|
|
107
|
+
print_error "See http://r-7.co/xY65Zr instead"
|
|
108
|
+
elsif method and self.respond_to?("cmd_#{method}")
|
|
109
|
+
print_error "Use #{method} instead"
|
|
110
|
+
self.send("cmd_#{method}", *args)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def deprecated_help(method=nil)
|
|
115
|
+
cmd = caller[0].match(/`cmd_(.*)_help'/)[1]
|
|
116
|
+
print_error "The #{cmd} command is DEPRECATED"
|
|
117
|
+
if cmd == "db_autopwn"
|
|
118
|
+
print_error "See http://r-7.co/xY65Zr instead"
|
|
119
|
+
elsif method and self.respond_to?("cmd_#{method}_help")
|
|
120
|
+
print_error "Use 'help #{method}' instead"
|
|
121
|
+
self.send("cmd_#{method}_help")
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
#
|
|
126
|
+
# Wraps shell.update_prompt
|
|
127
|
+
#
|
|
128
|
+
def update_prompt(prompt=nil, prompt_char = nil, mode = false)
|
|
129
|
+
shell.update_prompt(prompt, prompt_char, mode)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def cmd_help_help
|
|
133
|
+
print_line "There's only so much I can do"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
#
|
|
137
|
+
# Displays the help banner. With no arguments, this is just a list of
|
|
138
|
+
# all commands grouped by dispatcher. Otherwise, tries to use a method
|
|
139
|
+
# named cmd_#{+cmd+}_help for the first dispatcher that has a command
|
|
140
|
+
# named +cmd+. If no such method exists, uses +cmd+ as a regex to
|
|
141
|
+
# compare against each enstacked dispatcher's name and dumps commands
|
|
142
|
+
# of any that match.
|
|
143
|
+
#
|
|
144
|
+
def cmd_help(cmd=nil, *ignored)
|
|
145
|
+
if cmd
|
|
146
|
+
help_found = false
|
|
147
|
+
cmd_found = false
|
|
148
|
+
shell.dispatcher_stack.each do |dispatcher|
|
|
149
|
+
next unless dispatcher.respond_to?(:commands)
|
|
150
|
+
next if (dispatcher.commands.nil?)
|
|
151
|
+
next if (dispatcher.commands.length == 0)
|
|
152
|
+
|
|
153
|
+
if dispatcher.respond_to?("cmd_#{cmd}")
|
|
154
|
+
cmd_found = true
|
|
155
|
+
break unless dispatcher.respond_to? "cmd_#{cmd}_help"
|
|
156
|
+
dispatcher.send("cmd_#{cmd}_help")
|
|
157
|
+
help_found = true
|
|
158
|
+
break
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
unless cmd_found
|
|
163
|
+
# We didn't find a cmd, try it as a dispatcher name
|
|
164
|
+
shell.dispatcher_stack.each do |dispatcher|
|
|
165
|
+
if dispatcher.name =~ /#{cmd}/i
|
|
166
|
+
print_line(dispatcher.help_to_s)
|
|
167
|
+
cmd_found = help_found = true
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
print_error("No help for #{cmd}, try -h") if cmd_found and not help_found
|
|
172
|
+
print_error("No such command") if not cmd_found
|
|
173
|
+
else
|
|
174
|
+
print(shell.help_to_s)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
#
|
|
179
|
+
# Tab completion for the help command
|
|
180
|
+
#
|
|
181
|
+
# By default just returns a list of all commands in all dispatchers.
|
|
182
|
+
#
|
|
183
|
+
def cmd_help_tabs(str, words)
|
|
184
|
+
return [] if words.length > 1
|
|
185
|
+
|
|
186
|
+
tabs = []
|
|
187
|
+
shell.dispatcher_stack.each { |dispatcher|
|
|
188
|
+
tabs += dispatcher.commands.keys
|
|
189
|
+
}
|
|
190
|
+
return tabs
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
alias cmd_? cmd_help
|
|
194
|
+
|
|
195
|
+
#
|
|
196
|
+
# Return a pretty, user-readable table of commands provided by this
|
|
197
|
+
# dispatcher.
|
|
198
|
+
#
|
|
199
|
+
def help_to_s(opts={})
|
|
200
|
+
# If this dispatcher has no commands, we can't do anything useful.
|
|
201
|
+
return "" if commands.nil? or commands.length == 0
|
|
202
|
+
|
|
203
|
+
# Display the commands
|
|
204
|
+
tbl = Table.new(
|
|
205
|
+
'Header' => "#{self.name} Commands",
|
|
206
|
+
'Indent' => opts['Indent'] || 4,
|
|
207
|
+
'Columns' =>
|
|
208
|
+
[
|
|
209
|
+
'Command',
|
|
210
|
+
'Description'
|
|
211
|
+
],
|
|
212
|
+
'ColProps' =>
|
|
213
|
+
{
|
|
214
|
+
'Command' =>
|
|
215
|
+
{
|
|
216
|
+
'MaxWidth' => 12
|
|
217
|
+
}
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
commands.sort.each { |c|
|
|
221
|
+
tbl << c
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return "\n" + tbl.to_s + "\n"
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
#
|
|
228
|
+
# No tab completion items by default
|
|
229
|
+
#
|
|
230
|
+
attr_accessor :shell, :tab_complete_items
|
|
231
|
+
|
|
232
|
+
#
|
|
233
|
+
# Provide a generic tab completion for file names.
|
|
234
|
+
#
|
|
235
|
+
# If the only completion is a directory, this descends into that directory
|
|
236
|
+
# and continues completions with filenames contained within.
|
|
237
|
+
#
|
|
238
|
+
def tab_complete_filenames(str, words)
|
|
239
|
+
matches = ::Readline::FILENAME_COMPLETION_PROC.call(str)
|
|
240
|
+
if matches and matches.length == 1 and File.directory?(matches[0])
|
|
241
|
+
dir = matches[0]
|
|
242
|
+
dir += File::SEPARATOR if dir[-1,1] != File::SEPARATOR
|
|
243
|
+
matches = ::Readline::FILENAME_COMPLETION_PROC.call(dir)
|
|
244
|
+
end
|
|
245
|
+
matches
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
#
|
|
251
|
+
# DispatcherShell derives from shell.
|
|
252
|
+
#
|
|
253
|
+
include Shell
|
|
254
|
+
|
|
255
|
+
#
|
|
256
|
+
# Initialize the dispatcher shell.
|
|
257
|
+
#
|
|
258
|
+
def initialize(prompt, prompt_char = '>', histfile = nil, framework = nil)
|
|
259
|
+
super
|
|
260
|
+
|
|
261
|
+
# Initialze the dispatcher array
|
|
262
|
+
self.dispatcher_stack = []
|
|
263
|
+
|
|
264
|
+
# Initialize the tab completion array
|
|
265
|
+
self.tab_words = []
|
|
266
|
+
self.on_command_proc = nil
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
#
|
|
270
|
+
# This method accepts the entire line of text from the Readline
|
|
271
|
+
# routine, stores all completed words, and passes the partial
|
|
272
|
+
# word to the real tab completion function. This works around
|
|
273
|
+
# a design problem in the Readline module and depends on the
|
|
274
|
+
# Readline.basic_word_break_characters variable being set to \x00
|
|
275
|
+
#
|
|
276
|
+
def tab_complete(str)
|
|
277
|
+
# Check trailing whitespace so we can tell 'x' from 'x '
|
|
278
|
+
str_match = str.match(/\s+$/)
|
|
279
|
+
str_trail = (str_match.nil?) ? '' : str_match[0]
|
|
280
|
+
|
|
281
|
+
# Split the line up by whitespace into words
|
|
282
|
+
str_words = str.split(/[\s\t\n]+/)
|
|
283
|
+
|
|
284
|
+
# Append an empty word if we had trailing whitespace
|
|
285
|
+
str_words << '' if str_trail.length > 0
|
|
286
|
+
|
|
287
|
+
# Place the word list into an instance variable
|
|
288
|
+
self.tab_words = str_words
|
|
289
|
+
|
|
290
|
+
# Pop the last word and pass it to the real method
|
|
291
|
+
tab_complete_stub(self.tab_words.pop)
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
# Performs tab completion of a command, if supported
|
|
295
|
+
# Current words can be found in self.tab_words
|
|
296
|
+
#
|
|
297
|
+
def tab_complete_stub(str)
|
|
298
|
+
items = []
|
|
299
|
+
|
|
300
|
+
return nil if not str
|
|
301
|
+
|
|
302
|
+
# puts "Words(#{tab_words.join(", ")}) Partial='#{str}'"
|
|
303
|
+
|
|
304
|
+
# Next, try to match internal command or value completion
|
|
305
|
+
# Enumerate each entry in the dispatcher stack
|
|
306
|
+
dispatcher_stack.each { |dispatcher|
|
|
307
|
+
|
|
308
|
+
# If no command is set and it supports commands, add them all
|
|
309
|
+
if (tab_words.empty? and dispatcher.respond_to?('commands'))
|
|
310
|
+
items.concat(dispatcher.commands.keys)
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
# If the dispatcher exports a tab completion function, use it
|
|
314
|
+
if(dispatcher.respond_to?('tab_complete_helper'))
|
|
315
|
+
res = dispatcher.tab_complete_helper(str, tab_words)
|
|
316
|
+
else
|
|
317
|
+
res = tab_complete_helper(dispatcher, str, tab_words)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
if (res.nil?)
|
|
321
|
+
# A nil response indicates no optional arguments
|
|
322
|
+
return [''] if items.empty?
|
|
323
|
+
else
|
|
324
|
+
# Otherwise we add the completion items to the list
|
|
325
|
+
items.concat(res)
|
|
326
|
+
end
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
# Verify that our search string is a valid regex
|
|
330
|
+
begin
|
|
331
|
+
Regexp.compile(str)
|
|
332
|
+
rescue RegexpError
|
|
333
|
+
str = Regexp.escape(str)
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
# @todo - This still doesn't fix some Regexp warnings:
|
|
337
|
+
# ./lib/rex/ui/text/dispatcher_shell.rb:171: warning: regexp has `]' without escape
|
|
338
|
+
|
|
339
|
+
# Match based on the partial word
|
|
340
|
+
items.find_all { |e|
|
|
341
|
+
e =~ /^#{str}/
|
|
342
|
+
# Prepend the rest of the command (or it all gets replaced!)
|
|
343
|
+
}.map { |e|
|
|
344
|
+
tab_words.dup.push(e).join(' ')
|
|
345
|
+
}
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
#
|
|
349
|
+
# Provide command-specific tab completion
|
|
350
|
+
#
|
|
351
|
+
def tab_complete_helper(dispatcher, str, words)
|
|
352
|
+
items = []
|
|
353
|
+
|
|
354
|
+
tabs_meth = "cmd_#{words[0]}_tabs"
|
|
355
|
+
# Is the user trying to tab complete one of our commands?
|
|
356
|
+
if (dispatcher.commands.include?(words[0]) and dispatcher.respond_to?(tabs_meth))
|
|
357
|
+
res = dispatcher.send(tabs_meth, str, words)
|
|
358
|
+
return [] if res.nil?
|
|
359
|
+
items.concat(res)
|
|
360
|
+
else
|
|
361
|
+
# Avoid the default completion list for known commands
|
|
362
|
+
return []
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
return items
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
#
|
|
369
|
+
# Run a single command line.
|
|
370
|
+
#
|
|
371
|
+
def run_single(line)
|
|
372
|
+
arguments = parse_line(line)
|
|
373
|
+
method = arguments.shift
|
|
374
|
+
found = false
|
|
375
|
+
error = false
|
|
376
|
+
|
|
377
|
+
# If output is disabled output will be nil
|
|
378
|
+
output.reset_color if (output)
|
|
379
|
+
|
|
380
|
+
if (method)
|
|
381
|
+
entries = dispatcher_stack.length
|
|
382
|
+
|
|
383
|
+
dispatcher_stack.each { |dispatcher|
|
|
384
|
+
next if not dispatcher.respond_to?('commands')
|
|
385
|
+
|
|
386
|
+
begin
|
|
387
|
+
if (dispatcher.commands.has_key?(method) or dispatcher.deprecated_commands.include?(method))
|
|
388
|
+
self.on_command_proc.call(line.strip) if self.on_command_proc
|
|
389
|
+
run_command(dispatcher, method, arguments)
|
|
390
|
+
found = true
|
|
391
|
+
end
|
|
392
|
+
rescue
|
|
393
|
+
error = $!
|
|
394
|
+
|
|
395
|
+
print_error(
|
|
396
|
+
"Error while running command #{method}: #{$!}" +
|
|
397
|
+
"\n\nCall stack:\n#{$@.join("\n")}")
|
|
398
|
+
rescue ::Exception
|
|
399
|
+
error = $!
|
|
400
|
+
|
|
401
|
+
print_error(
|
|
402
|
+
"Error while running command #{method}: #{$!}")
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
# If the dispatcher stack changed as a result of this command,
|
|
406
|
+
# break out
|
|
407
|
+
break if (dispatcher_stack.length != entries)
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
if (found == false and error == false)
|
|
411
|
+
unknown_command(method, line)
|
|
412
|
+
end
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
return found
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
#
|
|
419
|
+
# Runs the supplied command on the given dispatcher.
|
|
420
|
+
#
|
|
421
|
+
def run_command(dispatcher, method, arguments)
|
|
422
|
+
self.busy = true
|
|
423
|
+
|
|
424
|
+
if(blocked_command?(method))
|
|
425
|
+
print_error("The #{method} command has been disabled.")
|
|
426
|
+
else
|
|
427
|
+
dispatcher.send('cmd_' + method, *arguments)
|
|
428
|
+
end
|
|
429
|
+
self.busy = false
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
#
|
|
433
|
+
# If the command is unknown...
|
|
434
|
+
#
|
|
435
|
+
def unknown_command(method, line)
|
|
436
|
+
print_error("Unknown command: #{method}.")
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
#
|
|
440
|
+
# Push a dispatcher to the front of the stack.
|
|
441
|
+
#
|
|
442
|
+
def enstack_dispatcher(dispatcher)
|
|
443
|
+
self.dispatcher_stack.unshift(inst = dispatcher.new(self))
|
|
444
|
+
|
|
445
|
+
inst
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
#
|
|
449
|
+
# Pop a dispatcher from the front of the stacker.
|
|
450
|
+
#
|
|
451
|
+
def destack_dispatcher
|
|
452
|
+
self.dispatcher_stack.shift
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
#
|
|
456
|
+
# Adds the supplied dispatcher to the end of the dispatcher stack so that
|
|
457
|
+
# it doesn't affect any enstack'd dispatchers.
|
|
458
|
+
#
|
|
459
|
+
def append_dispatcher(dispatcher)
|
|
460
|
+
inst = dispatcher.new(self)
|
|
461
|
+
self.dispatcher_stack.each { |disp|
|
|
462
|
+
if (disp.name == inst.name)
|
|
463
|
+
raise RuntimeError.new("Attempting to load already loaded dispatcher #{disp.name}")
|
|
464
|
+
end
|
|
465
|
+
}
|
|
466
|
+
self.dispatcher_stack.push(inst)
|
|
467
|
+
|
|
468
|
+
inst
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
#
|
|
472
|
+
# Removes the supplied dispatcher instance.
|
|
473
|
+
#
|
|
474
|
+
def remove_dispatcher(name)
|
|
475
|
+
self.dispatcher_stack.delete_if { |inst|
|
|
476
|
+
(inst.name == name)
|
|
477
|
+
}
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
#
|
|
481
|
+
# Returns the current active dispatcher
|
|
482
|
+
#
|
|
483
|
+
def current_dispatcher
|
|
484
|
+
self.dispatcher_stack[0]
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
#
|
|
488
|
+
# Return a readable version of a help banner for all of the enstacked
|
|
489
|
+
# dispatchers.
|
|
490
|
+
#
|
|
491
|
+
# See +CommandDispatcher#help_to_s+
|
|
492
|
+
#
|
|
493
|
+
def help_to_s(opts = {})
|
|
494
|
+
str = ''
|
|
495
|
+
|
|
496
|
+
dispatcher_stack.reverse.each { |dispatcher|
|
|
497
|
+
str << dispatcher.help_to_s
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return str
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
#
|
|
505
|
+
# Returns nil for an empty set of blocked commands.
|
|
506
|
+
#
|
|
507
|
+
def blocked_command?(cmd)
|
|
508
|
+
return false if not self.blocked
|
|
509
|
+
self.blocked.has_key?(cmd)
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
#
|
|
513
|
+
# Block a specific command
|
|
514
|
+
#
|
|
515
|
+
def block_command(cmd)
|
|
516
|
+
self.blocked ||= {}
|
|
517
|
+
self.blocked[cmd] = true
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
#
|
|
521
|
+
# Unblock a specific command
|
|
522
|
+
#
|
|
523
|
+
def unblock_command(cmd)
|
|
524
|
+
self.blocked || return
|
|
525
|
+
self.blocked.delete(cmd)
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
attr_accessor :dispatcher_stack # :nodoc:
|
|
530
|
+
attr_accessor :tab_words # :nodoc:
|
|
531
|
+
attr_accessor :busy # :nodoc:
|
|
532
|
+
attr_accessor :blocked # :nodoc:
|
|
533
|
+
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
end
|
|
537
|
+
end
|
|
538
|
+
end
|