librex 0.0.20 → 0.0.21
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.
- data/Rakefile +1 -0
- data/lib/rex/LICENSE +29 -0
- data/lib/rex/arch.rb +103 -0
- data/lib/rex/arch/sparc.rb +75 -0
- data/lib/rex/arch/sparc.rb.ut.rb +18 -0
- data/lib/rex/arch/x86.rb +513 -0
- data/lib/rex/arch/x86.rb.ut.rb +93 -0
- data/lib/rex/assembly/nasm.rb +104 -0
- data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +311 -0
- data/lib/rex/constants.rb +113 -0
- data/lib/rex/elfparsey.rb +11 -0
- data/lib/rex/elfparsey/elf.rb +123 -0
- data/lib/rex/elfparsey/elfbase.rb +258 -0
- data/lib/rex/elfparsey/exceptions.rb +27 -0
- data/lib/rex/elfscan.rb +12 -0
- data/lib/rex/elfscan/scanner.rb +207 -0
- data/lib/rex/elfscan/search.rb +46 -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 +114 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
- data/lib/rex/encoder/ndr.rb +89 -0
- data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
- data/lib/rex/encoder/nonalpha.rb +61 -0
- data/lib/rex/encoder/nonupper.rb +64 -0
- data/lib/rex/encoder/xdr.rb +106 -0
- data/lib/rex/encoder/xdr.rb.ut.rb +29 -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/encoders/xor_dword_additive.rb.ut.rb +12 -0
- data/lib/rex/encoding/xor.rb +20 -0
- data/lib/rex/encoding/xor.rb.ts.rb +14 -0
- data/lib/rex/encoding/xor/byte.rb +15 -0
- data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/dword_additive.rb +92 -0
- data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/exceptions.rb +17 -0
- data/lib/rex/encoding/xor/generic.rb +146 -0
- data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
- data/lib/rex/encoding/xor/qword.rb +15 -0
- data/lib/rex/encoding/xor/word.rb +21 -0
- data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
- data/lib/rex/exceptions.rb +275 -0
- data/lib/rex/exceptions.rb.ut.rb +44 -0
- data/lib/rex/exploitation/cmdstager.rb +9 -0
- data/lib/rex/exploitation/cmdstager/base.rb +175 -0
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +142 -0
- data/lib/rex/exploitation/cmdstager/debug_write.rb +136 -0
- data/lib/rex/exploitation/cmdstager/tftp.rb +63 -0
- data/lib/rex/exploitation/cmdstager/vbs.rb +128 -0
- data/lib/rex/exploitation/egghunter.rb +277 -0
- data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
- data/lib/rex/exploitation/encryptjs.rb +77 -0
- data/lib/rex/exploitation/heaplib.js.b64 +331 -0
- data/lib/rex/exploitation/heaplib.rb +94 -0
- data/lib/rex/exploitation/javascriptosdetect.rb +897 -0
- data/lib/rex/exploitation/obfuscatejs.rb +335 -0
- data/lib/rex/exploitation/omelet.rb +320 -0
- data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
- data/lib/rex/exploitation/opcodedb.rb +818 -0
- data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
- data/lib/rex/exploitation/seh.rb +92 -0
- data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
- data/lib/rex/file.rb +112 -0
- data/lib/rex/file.rb.ut.rb +16 -0
- data/lib/rex/image_source.rb +12 -0
- data/lib/rex/image_source/disk.rb +60 -0
- data/lib/rex/image_source/image_source.rb +46 -0
- data/lib/rex/image_source/memory.rb +37 -0
- data/lib/rex/io/bidirectional_pipe.rb +157 -0
- data/lib/rex/io/datagram_abstraction.rb +35 -0
- data/lib/rex/io/ring_buffer.rb +364 -0
- data/lib/rex/io/stream.rb +319 -0
- data/lib/rex/io/stream_abstraction.rb +197 -0
- data/lib/rex/io/stream_server.rb +211 -0
- data/lib/rex/job_container.rb +187 -0
- data/lib/rex/logging.rb +4 -0
- data/lib/rex/logging/log_dispatcher.rb +179 -0
- data/lib/rex/logging/log_sink.rb +42 -0
- data/lib/rex/logging/sinks/flatfile.rb +55 -0
- data/lib/rex/logging/sinks/stderr.rb +43 -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 +9 -0
- data/lib/rex/mime/header.rb +77 -0
- data/lib/rex/mime/message.rb +144 -0
- data/lib/rex/mime/part.rb +20 -0
- data/lib/rex/nop/opty2.rb +108 -0
- data/lib/rex/nop/opty2.rb.ut.rb +23 -0
- data/lib/rex/nop/opty2_tables.rb +300 -0
- data/lib/rex/ole.rb +205 -0
- data/lib/rex/ole/clsid.rb +47 -0
- data/lib/rex/ole/difat.rb +141 -0
- data/lib/rex/ole/directory.rb +231 -0
- data/lib/rex/ole/direntry.rb +240 -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 +99 -0
- data/lib/rex/ole/header.rb +204 -0
- data/lib/rex/ole/minifat.rb +77 -0
- data/lib/rex/ole/propset.rb +144 -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 +395 -0
- data/lib/rex/ole/stream.rb +53 -0
- data/lib/rex/ole/substorage.rb +49 -0
- data/lib/rex/ole/util.rb +157 -0
- data/lib/rex/parser/arguments.rb +97 -0
- data/lib/rex/parser/arguments.rb.ut.rb +67 -0
- data/lib/rex/parser/ini.rb +185 -0
- data/lib/rex/parser/ini.rb.ut.rb +29 -0
- data/lib/rex/parser/ip360_aspl_xml.rb +102 -0
- data/lib/rex/parser/ip360_xml.rb +97 -0
- data/lib/rex/parser/nessus_xml.rb +118 -0
- data/lib/rex/parser/netsparker_xml.rb +94 -0
- data/lib/rex/parser/nexpose_xml.rb +136 -0
- data/lib/rex/parser/nmap_xml.rb +137 -0
- data/lib/rex/parser/retina_xml.rb +109 -0
- data/lib/rex/payloads.rb +1 -0
- data/lib/rex/payloads/win32.rb +2 -0
- data/lib/rex/payloads/win32/common.rb +26 -0
- data/lib/rex/payloads/win32/kernel.rb +53 -0
- data/lib/rex/payloads/win32/kernel/common.rb +54 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
- data/lib/rex/payloads/win32/kernel/stager.rb +194 -0
- data/lib/rex/peparsey.rb +12 -0
- data/lib/rex/peparsey/exceptions.rb +32 -0
- data/lib/rex/peparsey/pe.rb +212 -0
- data/lib/rex/peparsey/pe_memdump.rb +63 -0
- data/lib/rex/peparsey/pebase.rb +1680 -0
- data/lib/rex/peparsey/section.rb +136 -0
- data/lib/rex/pescan.rb +13 -0
- data/lib/rex/pescan/analyze.rb +309 -0
- data/lib/rex/pescan/scanner.rb +206 -0
- data/lib/rex/pescan/search.rb +56 -0
- data/lib/rex/platforms.rb +1 -0
- data/lib/rex/platforms/windows.rb +51 -0
- data/lib/rex/poly.rb +132 -0
- data/lib/rex/poly/block.rb +477 -0
- data/lib/rex/poly/register.rb +100 -0
- data/lib/rex/poly/register/x86.rb +40 -0
- data/lib/rex/post.rb +8 -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 +4 -0
- data/lib/rex/post/meterpreter/channel.rb +445 -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 +364 -0
- data/lib/rex/post/meterpreter/client_core.rb +274 -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/espia/espia.rb +58 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -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 +111 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +101 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +26 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +282 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +266 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -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 +167 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +208 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +6 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +31 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +47 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +36 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1818 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3848 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +26 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +318 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +42 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +148 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +127 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +309 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +204 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +51 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +630 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +75 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +103 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +149 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -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 +61 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +370 -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 +279 -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/thread.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +211 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +63 -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 +688 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +431 -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 +137 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +730 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +231 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +65 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +442 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +298 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +486 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +157 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -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 +13 -0
- data/lib/rex/proto.rb.ts.rb +8 -0
- data/lib/rex/proto/dcerpc.rb +6 -0
- data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
- data/lib/rex/proto/dcerpc/client.rb +361 -0
- data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
- data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
- data/lib/rex/proto/dcerpc/handle.rb +47 -0
- data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
- data/lib/rex/proto/dcerpc/ndr.rb +72 -0
- data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
- data/lib/rex/proto/dcerpc/packet.rb +253 -0
- data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
- data/lib/rex/proto/dcerpc/response.rb +187 -0
- data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
- data/lib/rex/proto/dcerpc/uuid.rb +84 -0
- data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
- data/lib/rex/proto/dhcp.rb +7 -0
- data/lib/rex/proto/dhcp/constants.rb +33 -0
- data/lib/rex/proto/dhcp/server.rb +292 -0
- data/lib/rex/proto/drda.rb +5 -0
- data/lib/rex/proto/drda.rb.ts.rb +17 -0
- data/lib/rex/proto/drda/constants.rb +49 -0
- data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
- data/lib/rex/proto/drda/packet.rb +252 -0
- data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
- data/lib/rex/proto/drda/utils.rb +123 -0
- data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
- data/lib/rex/proto/http.rb +5 -0
- data/lib/rex/proto/http.rb.ts.rb +12 -0
- data/lib/rex/proto/http/client.rb +821 -0
- data/lib/rex/proto/http/client.rb.ut.rb +95 -0
- data/lib/rex/proto/http/handler.rb +46 -0
- data/lib/rex/proto/http/handler/erb.rb +128 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
- data/lib/rex/proto/http/handler/proc.rb +60 -0
- data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
- data/lib/rex/proto/http/header.rb +161 -0
- data/lib/rex/proto/http/header.rb.ut.rb +46 -0
- data/lib/rex/proto/http/packet.rb +407 -0
- data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
- data/lib/rex/proto/http/request.rb +356 -0
- data/lib/rex/proto/http/request.rb.ut.rb +214 -0
- data/lib/rex/proto/http/response.rb +90 -0
- data/lib/rex/proto/http/response.rb.ut.rb +149 -0
- data/lib/rex/proto/http/server.rb +369 -0
- data/lib/rex/proto/http/server.rb.ut.rb +79 -0
- data/lib/rex/proto/ntlm.rb +7 -0
- data/lib/rex/proto/ntlm.rb.ut.rb +177 -0
- data/lib/rex/proto/ntlm/base.rb +326 -0
- data/lib/rex/proto/ntlm/constants.rb +74 -0
- data/lib/rex/proto/ntlm/crypt.rb +415 -0
- data/lib/rex/proto/ntlm/exceptions.rb +16 -0
- data/lib/rex/proto/ntlm/message.rb +536 -0
- data/lib/rex/proto/ntlm/utils.rb +764 -0
- data/lib/rex/proto/proxy/socks4a.rb +440 -0
- data/lib/rex/proto/rfb.rb +19 -0
- data/lib/rex/proto/rfb.rb.ut.rb +37 -0
- data/lib/rex/proto/rfb/cipher.rb +84 -0
- data/lib/rex/proto/rfb/client.rb +207 -0
- data/lib/rex/proto/rfb/constants.rb +52 -0
- data/lib/rex/proto/smb.rb +7 -0
- data/lib/rex/proto/smb.rb.ts.rb +8 -0
- data/lib/rex/proto/smb/client.rb +1952 -0
- data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
- data/lib/rex/proto/smb/constants.rb +1047 -0
- data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
- data/lib/rex/proto/smb/crypt.rb +36 -0
- data/lib/rex/proto/smb/evasions.rb +66 -0
- data/lib/rex/proto/smb/exceptions.rb +858 -0
- data/lib/rex/proto/smb/simpleclient.rb +306 -0
- data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
- data/lib/rex/proto/smb/utils.rb +103 -0
- data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
- data/lib/rex/proto/sunrpc.rb +1 -0
- data/lib/rex/proto/sunrpc/client.rb +195 -0
- data/lib/rex/proto/tftp.rb +12 -0
- data/lib/rex/proto/tftp/constants.rb +39 -0
- data/lib/rex/proto/tftp/server.rb +497 -0
- data/lib/rex/proto/tftp/server.rb.ut.rb +28 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +59 -0
- data/lib/rex/script/meterpreter.rb +15 -0
- data/lib/rex/script/shell.rb +9 -0
- data/lib/rex/service.rb +48 -0
- data/lib/rex/service_manager.rb +141 -0
- data/lib/rex/service_manager.rb.ut.rb +32 -0
- data/lib/rex/services/local_relay.rb +423 -0
- data/lib/rex/socket.rb +684 -0
- data/lib/rex/socket.rb.ut.rb +107 -0
- data/lib/rex/socket/comm.rb +119 -0
- data/lib/rex/socket/comm/local.rb +412 -0
- data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
- data/lib/rex/socket/ip.rb +130 -0
- data/lib/rex/socket/parameters.rb +345 -0
- data/lib/rex/socket/parameters.rb.ut.rb +51 -0
- data/lib/rex/socket/range_walker.rb +346 -0
- data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
- data/lib/rex/socket/ssl_tcp.rb +184 -0
- data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
- data/lib/rex/socket/ssl_tcp_server.rb +122 -0
- data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +61 -0
- data/lib/rex/socket/subnet_walker.rb +75 -0
- data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
- data/lib/rex/socket/switch_board.rb +278 -0
- data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
- data/lib/rex/socket/tcp.rb +76 -0
- data/lib/rex/socket/tcp.rb.ut.rb +64 -0
- data/lib/rex/socket/tcp_server.rb +66 -0
- data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
- data/lib/rex/socket/udp.rb +164 -0
- data/lib/rex/socket/udp.rb.ut.rb +44 -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 +94 -0
- data/lib/rex/sync/read_write_lock.rb +176 -0
- data/lib/rex/sync/ref.rb +57 -0
- data/lib/rex/sync/thread_safe.rb +82 -0
- data/lib/rex/test.rb +35 -0
- data/lib/rex/text.rb +1163 -0
- data/lib/rex/text.rb.ut.rb +190 -0
- data/lib/rex/thread_factory.rb +42 -0
- data/lib/rex/time.rb +65 -0
- data/lib/rex/transformer.rb +115 -0
- data/lib/rex/transformer.rb.ut.rb +38 -0
- data/lib/rex/ui.rb +21 -0
- data/lib/rex/ui/interactive.rb +298 -0
- data/lib/rex/ui/output.rb +78 -0
- data/lib/rex/ui/output/none.rb +18 -0
- data/lib/rex/ui/progress_tracker.rb +96 -0
- data/lib/rex/ui/subscriber.rb +149 -0
- data/lib/rex/ui/text/color.rb +97 -0
- data/lib/rex/ui/text/color.rb.ut.rb +18 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +467 -0
- data/lib/rex/ui/text/input.rb +117 -0
- data/lib/rex/ui/text/input/buffer.rb +75 -0
- data/lib/rex/ui/text/input/readline.rb +129 -0
- data/lib/rex/ui/text/input/socket.rb +95 -0
- data/lib/rex/ui/text/input/stdio.rb +45 -0
- data/lib/rex/ui/text/irb_shell.rb +57 -0
- data/lib/rex/ui/text/output.rb +80 -0
- data/lib/rex/ui/text/output/buffer.rb +61 -0
- data/lib/rex/ui/text/output/file.rb +43 -0
- data/lib/rex/ui/text/output/socket.rb +43 -0
- data/lib/rex/ui/text/output/stdio.rb +40 -0
- data/lib/rex/ui/text/progress_tracker.rb +56 -0
- data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
- data/lib/rex/ui/text/shell.rb +328 -0
- data/lib/rex/ui/text/table.rb +279 -0
- data/lib/rex/ui/text/table.rb.ut.rb +55 -0
- data/lib/rex/zip.rb +93 -0
- data/lib/rex/zip/archive.rb +184 -0
- data/lib/rex/zip/blocks.rb +182 -0
- data/lib/rex/zip/entry.rb +104 -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 +434 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Ui
|
|
3
|
+
|
|
4
|
+
###
|
|
5
|
+
#
|
|
6
|
+
# This module provides a subscriber interface to input/output.
|
|
7
|
+
#
|
|
8
|
+
###
|
|
9
|
+
module Subscriber
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
#
|
|
13
|
+
# Subscribes to the output half of the user interface.
|
|
14
|
+
#
|
|
15
|
+
##
|
|
16
|
+
module Output
|
|
17
|
+
|
|
18
|
+
#
|
|
19
|
+
# Wraps user_output.print_line
|
|
20
|
+
#
|
|
21
|
+
def print_line(msg='')
|
|
22
|
+
if (user_output)
|
|
23
|
+
print_blank_line if user_output.prompting?
|
|
24
|
+
user_output.print_line(msg)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Wraps user_output.print_status
|
|
30
|
+
#
|
|
31
|
+
def print_status(msg='')
|
|
32
|
+
if (user_output)
|
|
33
|
+
print_blank_line if user_output.prompting?
|
|
34
|
+
user_output.print_status(msg)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Wraps user_output.print_error
|
|
40
|
+
#
|
|
41
|
+
def print_error(msg='')
|
|
42
|
+
if (user_output)
|
|
43
|
+
print_blank_line if user_output.prompting?
|
|
44
|
+
user_output.print_error(msg)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# Wraps user_output.print_good
|
|
50
|
+
#
|
|
51
|
+
def print_good(msg='')
|
|
52
|
+
if (user_output)
|
|
53
|
+
print_blank_line if user_output.prompting?
|
|
54
|
+
user_output.print_good(msg)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
#
|
|
59
|
+
# Wraps user_output.print_debug
|
|
60
|
+
#
|
|
61
|
+
def print_debug(msg='')
|
|
62
|
+
if (user_output)
|
|
63
|
+
print_blank_line if user_output.prompting?
|
|
64
|
+
user_output.print_debug(msg)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
#
|
|
69
|
+
# Wraps user_output.print
|
|
70
|
+
#
|
|
71
|
+
def print(msg='')
|
|
72
|
+
user_output.print(msg) if (user_output)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
#
|
|
76
|
+
# Wraps user_output.flush
|
|
77
|
+
#
|
|
78
|
+
def flush
|
|
79
|
+
user_output.flush if (user_output)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
#
|
|
83
|
+
# The user output handle.
|
|
84
|
+
#
|
|
85
|
+
attr_accessor :user_output
|
|
86
|
+
|
|
87
|
+
protected
|
|
88
|
+
|
|
89
|
+
#
|
|
90
|
+
# Prints a blank line. Used when the input is prompting.
|
|
91
|
+
#
|
|
92
|
+
def print_blank_line
|
|
93
|
+
user_output.prompting(false)
|
|
94
|
+
user_output.print_line
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
##
|
|
100
|
+
#
|
|
101
|
+
# Subscribes to the input half of the user interface.
|
|
102
|
+
#
|
|
103
|
+
##
|
|
104
|
+
module Input
|
|
105
|
+
|
|
106
|
+
#
|
|
107
|
+
# Gets a line of input from the user_input handle by calling gets.
|
|
108
|
+
#
|
|
109
|
+
def gets
|
|
110
|
+
user_input.gets if (user_input)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
#
|
|
114
|
+
# The user intput handle.
|
|
115
|
+
#
|
|
116
|
+
attr_accessor :user_input
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
include Output
|
|
121
|
+
include Input
|
|
122
|
+
|
|
123
|
+
#
|
|
124
|
+
# Sets the input and output handles.
|
|
125
|
+
#
|
|
126
|
+
def init_ui(input = nil, output = nil)
|
|
127
|
+
self.user_input = input
|
|
128
|
+
self.user_output = output
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
#
|
|
132
|
+
# Disables input/output
|
|
133
|
+
#
|
|
134
|
+
def reset_ui
|
|
135
|
+
self.user_input = nil
|
|
136
|
+
self.user_output = nil
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
#
|
|
140
|
+
# Copy the user input and output handles from the supplied subscriber.
|
|
141
|
+
#
|
|
142
|
+
def copy_ui(subscriber)
|
|
143
|
+
init_ui(subscriber.user_input, subscriber.user_output)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
end
|
|
149
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Ui
|
|
3
|
+
module Text
|
|
4
|
+
|
|
5
|
+
###
|
|
6
|
+
#
|
|
7
|
+
# This module provides an interface to getting ANSI color codes.
|
|
8
|
+
# It's taken mostly from perl's Term::ANSIColor by Russ Allbery
|
|
9
|
+
# <rra@stanford.edu> and Zenin <zenin@best.com>.
|
|
10
|
+
#
|
|
11
|
+
###
|
|
12
|
+
module Color
|
|
13
|
+
|
|
14
|
+
AnsiAttributes =
|
|
15
|
+
{
|
|
16
|
+
'clear' => 0,
|
|
17
|
+
'reset' => 0,
|
|
18
|
+
'bold' => 1,
|
|
19
|
+
'dark' => 2,
|
|
20
|
+
'underline' => 4,
|
|
21
|
+
'underscore' => 4,
|
|
22
|
+
'blink' => 5,
|
|
23
|
+
'reverse' => 7,
|
|
24
|
+
'concealed' => 8,
|
|
25
|
+
'black' => 30, 'on_black' => 40,
|
|
26
|
+
'red' => 31, 'on_red' => 41,
|
|
27
|
+
'green' => 32, 'on_green' => 42,
|
|
28
|
+
'yellow' => 33, 'on_yellow' => 43,
|
|
29
|
+
'blue' => 34, 'on_blue' => 44,
|
|
30
|
+
'magenta' => 35, 'on_magenta' => 45,
|
|
31
|
+
'cyan' => 36, 'on_cyan' => 46,
|
|
32
|
+
'white' => 37, 'on_white' => 47
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Return a string with ANSI codes substituted. Derived from code
|
|
37
|
+
# written by The FaerieMUD Consortium.
|
|
38
|
+
#
|
|
39
|
+
def ansi(*attrs)
|
|
40
|
+
attr = attrs.collect {|a| AnsiAttributes[a] ? AnsiAttributes[a] : nil}.compact.join(';')
|
|
41
|
+
attr = "\e[%sm" % attr if (attr.empty? == false)
|
|
42
|
+
return attr
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Colorize if this shell supports it
|
|
47
|
+
#
|
|
48
|
+
def colorize(*color)
|
|
49
|
+
supports_color?() ? ansi(*color) : ''
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def substitute_colors(msg, in_prompt = nil)
|
|
53
|
+
str = msg.dup
|
|
54
|
+
pre_color = post_color = ''
|
|
55
|
+
if (in_prompt)
|
|
56
|
+
pre_color = "\x01" # RL_PROMPT_START_IGNORE
|
|
57
|
+
post_color = "\x02" # RL_PROMPT_END_IGNORE
|
|
58
|
+
end
|
|
59
|
+
str.gsub!(/%cya/, pre_color+colorize('cyan')+post_color)
|
|
60
|
+
str.gsub!(/%red/, pre_color+colorize('red')+post_color)
|
|
61
|
+
str.gsub!(/%grn/, pre_color+colorize('green')+post_color)
|
|
62
|
+
str.gsub!(/%blu/, pre_color+colorize('blue')+post_color)
|
|
63
|
+
str.gsub!(/%yel/, pre_color+colorize('yellow')+post_color)
|
|
64
|
+
str.gsub!(/%whi/, pre_color+colorize('white')+post_color)
|
|
65
|
+
str.gsub!(/%mag/, pre_color+colorize('magenta')+post_color)
|
|
66
|
+
str.gsub!(/%blk/, pre_color+colorize('black')+post_color)
|
|
67
|
+
str.gsub!(/%dred/, pre_color+colorize('dark', 'red')+post_color)
|
|
68
|
+
str.gsub!(/%dgrn/, pre_color+colorize('dark', 'green')+post_color)
|
|
69
|
+
str.gsub!(/%dblu/, pre_color+colorize('dark', 'blue')+post_color)
|
|
70
|
+
str.gsub!(/%dyel/, pre_color+colorize('dark', 'yellow')+post_color)
|
|
71
|
+
str.gsub!(/%dcya/, pre_color+colorize('dark', 'cyan')+post_color)
|
|
72
|
+
str.gsub!(/%dwhi/, pre_color+colorize('dark', 'white')+post_color)
|
|
73
|
+
str.gsub!(/%dmag/, pre_color+colorize('dark', 'magenta')+post_color)
|
|
74
|
+
str.gsub!(/%und/, pre_color+colorize('underline')+post_color)
|
|
75
|
+
str.gsub!(/%bld/, pre_color+colorize('bold')+post_color)
|
|
76
|
+
str.gsub!(/%clr/, pre_color+colorize('clear')+post_color)
|
|
77
|
+
|
|
78
|
+
str
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
#
|
|
82
|
+
# Resets coloring so that it's back to normal.
|
|
83
|
+
#
|
|
84
|
+
def reset_color
|
|
85
|
+
return if not supports_color?
|
|
86
|
+
print(colorize('clear'))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
#
|
|
90
|
+
# Colorize if this shell supports it
|
|
91
|
+
#
|
|
92
|
+
def do_colorize(*color)
|
|
93
|
+
supports_color?() ? ansi(*color) : ''
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end end end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
4
|
+
|
|
5
|
+
require 'test/unit'
|
|
6
|
+
require 'rex/ui/text/color'
|
|
7
|
+
|
|
8
|
+
class Rex::Ui::Text::Color::UnitTest < Test::Unit::TestCase
|
|
9
|
+
|
|
10
|
+
def test_color
|
|
11
|
+
color = Rex::Ui::Text::Color.new.ansi('bold', 'red')
|
|
12
|
+
color += 'hey sup'
|
|
13
|
+
color += Rex::Ui::Text::Color.new.ansi('clear')
|
|
14
|
+
|
|
15
|
+
assert_equal("\e[1;31mhey sup\e[0m", color)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
require 'rex/ui'
|
|
2
|
+
require 'pp'
|
|
3
|
+
|
|
4
|
+
module Rex
|
|
5
|
+
module Ui
|
|
6
|
+
module Text
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# The dispatcher shell class is designed to provide a generic means
|
|
11
|
+
# of processing various shell commands that may be located in
|
|
12
|
+
# different modules or chunks of codes. These chunks are referred
|
|
13
|
+
# to as command dispatchers. The only requirement for command dispatchers is
|
|
14
|
+
# that they prefix every method that they wish to be mirrored as a command
|
|
15
|
+
# with the cmd_ prefix.
|
|
16
|
+
#
|
|
17
|
+
###
|
|
18
|
+
module DispatcherShell
|
|
19
|
+
|
|
20
|
+
###
|
|
21
|
+
#
|
|
22
|
+
# Empty template base class for command dispatchers.
|
|
23
|
+
#
|
|
24
|
+
###
|
|
25
|
+
module CommandDispatcher
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Initializes the command dispatcher mixin.
|
|
29
|
+
#
|
|
30
|
+
def initialize(shell)
|
|
31
|
+
self.shell = shell
|
|
32
|
+
self.tab_complete_items = []
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Returns nil for an empty set of commands.
|
|
37
|
+
#
|
|
38
|
+
def commands
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# Wraps shell.print_error
|
|
43
|
+
#
|
|
44
|
+
def print_error(msg = '')
|
|
45
|
+
shell.print_error(msg)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# Wraps shell.print_status
|
|
50
|
+
#
|
|
51
|
+
def print_status(msg = '')
|
|
52
|
+
shell.print_status(msg)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
#
|
|
56
|
+
# Wraps shell.print_line
|
|
57
|
+
#
|
|
58
|
+
def print_line(msg = '')
|
|
59
|
+
shell.print_line(msg)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# Wraps shell.print_good
|
|
64
|
+
#
|
|
65
|
+
def print_good(msg = '')
|
|
66
|
+
shell.print_good(msg)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
# Wraps shell.print
|
|
71
|
+
#
|
|
72
|
+
def print(msg = '')
|
|
73
|
+
shell.print(msg)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
#
|
|
77
|
+
# Wraps shell.update_prompt
|
|
78
|
+
#
|
|
79
|
+
def update_prompt(prompt=nil)
|
|
80
|
+
shell.update_prompt(prompt)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
#
|
|
84
|
+
# Displays the help banner. With no arguments, this is just a list of
|
|
85
|
+
# all commands grouped by dispatcher. Otherwise, tries to use a method
|
|
86
|
+
# named cmd_#{+cmd+}_help for the first dispatcher that has a command
|
|
87
|
+
# named +cmd+.
|
|
88
|
+
#
|
|
89
|
+
def cmd_help(cmd=nil, *ignored)
|
|
90
|
+
if cmd
|
|
91
|
+
help_found = false
|
|
92
|
+
cmd_found = false
|
|
93
|
+
shell.dispatcher_stack.each do |dispatcher|
|
|
94
|
+
next unless dispatcher.respond_to?(:commands)
|
|
95
|
+
next if (dispatcher.commands.nil?)
|
|
96
|
+
next if (dispatcher.commands.length == 0)
|
|
97
|
+
|
|
98
|
+
if dispatcher.respond_to?("cmd_#{cmd}")
|
|
99
|
+
cmd_found = true
|
|
100
|
+
break unless dispatcher.respond_to? "cmd_#{cmd}_help"
|
|
101
|
+
dispatcher.send("cmd_#{cmd}_help")
|
|
102
|
+
help_found = true
|
|
103
|
+
break
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
print_error("No help for #{cmd}, try -h") if cmd_found and not help_found
|
|
107
|
+
print_error("No such command") if not cmd_found
|
|
108
|
+
else
|
|
109
|
+
print(shell.help_to_s)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
#
|
|
114
|
+
# Tab completion for the help command
|
|
115
|
+
#
|
|
116
|
+
# By default just returns a list of all commands in all dispatchers.
|
|
117
|
+
#
|
|
118
|
+
def cmd_help_tabs(str, words)
|
|
119
|
+
return [] if words.length > 1
|
|
120
|
+
|
|
121
|
+
tabs = []
|
|
122
|
+
shell.dispatcher_stack.each { |dispatcher|
|
|
123
|
+
tabs += dispatcher.commands.keys
|
|
124
|
+
}
|
|
125
|
+
return tabs
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
alias cmd_? cmd_help
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
#
|
|
132
|
+
# No tab completion items by default
|
|
133
|
+
#
|
|
134
|
+
attr_accessor :shell, :tab_complete_items
|
|
135
|
+
|
|
136
|
+
#
|
|
137
|
+
# Provide a generic tab completion for file names.
|
|
138
|
+
#
|
|
139
|
+
# If the only completion is a directory, this descends into that directory
|
|
140
|
+
# and continues completions with filenames contained within.
|
|
141
|
+
#
|
|
142
|
+
def tab_complete_filenames(str, words)
|
|
143
|
+
matches = ::Readline::FILENAME_COMPLETION_PROC.call(str)
|
|
144
|
+
if matches and matches.length == 1 and File.directory?(matches[0])
|
|
145
|
+
dir = matches[0]
|
|
146
|
+
dir += File::SEPARATOR if dir[-1,1] != File::SEPARATOR
|
|
147
|
+
matches = ::Readline::FILENAME_COMPLETION_PROC.call(dir)
|
|
148
|
+
end
|
|
149
|
+
matches
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
#
|
|
155
|
+
# DispatcherShell derives from shell.
|
|
156
|
+
#
|
|
157
|
+
include Shell
|
|
158
|
+
|
|
159
|
+
#
|
|
160
|
+
# Initialize the dispatcher shell.
|
|
161
|
+
#
|
|
162
|
+
def initialize(prompt, prompt_char = '>', histfile = nil)
|
|
163
|
+
super
|
|
164
|
+
|
|
165
|
+
# Initialze the dispatcher array
|
|
166
|
+
self.dispatcher_stack = []
|
|
167
|
+
|
|
168
|
+
# Initialize the tab completion array
|
|
169
|
+
self.tab_words = []
|
|
170
|
+
self.on_command_proc = nil
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
#
|
|
174
|
+
# This method accepts the entire line of text from the Readline
|
|
175
|
+
# routine, stores all completed words, and passes the partial
|
|
176
|
+
# word to the real tab completion function. This works around
|
|
177
|
+
# a design problem in the Readline module and depends on the
|
|
178
|
+
# Readline.basic_word_break_characters variable being set to \x00
|
|
179
|
+
#
|
|
180
|
+
def tab_complete(str)
|
|
181
|
+
# Check trailing whitespace so we can tell 'x' from 'x '
|
|
182
|
+
str_match = str.match(/\s+$/)
|
|
183
|
+
str_trail = (str_match.nil?) ? '' : str_match[0]
|
|
184
|
+
|
|
185
|
+
# Split the line up by whitespace into words
|
|
186
|
+
str_words = str.split(/[\s\t\n]+/)
|
|
187
|
+
|
|
188
|
+
# Append an empty word if we had trailing whitespace
|
|
189
|
+
str_words << '' if str_trail.length > 0
|
|
190
|
+
|
|
191
|
+
# Place the word list into an instance variable
|
|
192
|
+
self.tab_words = str_words
|
|
193
|
+
|
|
194
|
+
# Pop the last word and pass it to the real method
|
|
195
|
+
tab_complete_stub(self.tab_words.pop)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Performs tab completion of a command, if supported
|
|
199
|
+
# Current words can be found in self.tab_words
|
|
200
|
+
#
|
|
201
|
+
def tab_complete_stub(str)
|
|
202
|
+
items = []
|
|
203
|
+
|
|
204
|
+
return nil if not str
|
|
205
|
+
|
|
206
|
+
# puts "Words(#{tab_words.join(", ")}) Partial='#{str}'"
|
|
207
|
+
|
|
208
|
+
# Next, try to match internal command or value completion
|
|
209
|
+
# Enumerate each entry in the dispatcher stack
|
|
210
|
+
dispatcher_stack.each { |dispatcher|
|
|
211
|
+
|
|
212
|
+
# If no command is set and it supports commands, add them all
|
|
213
|
+
if (tab_words.empty? and dispatcher.respond_to?('commands'))
|
|
214
|
+
items.concat(dispatcher.commands.keys)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# If the dispatcher exports a tab completion function, use it
|
|
218
|
+
if(dispatcher.respond_to?('tab_complete_helper'))
|
|
219
|
+
res = dispatcher.tab_complete_helper(str, tab_words)
|
|
220
|
+
else
|
|
221
|
+
res = tab_complete_helper(dispatcher, str, tab_words)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
if (res.nil?)
|
|
225
|
+
# A nil response indicates no optional arguments
|
|
226
|
+
return [''] if items.empty?
|
|
227
|
+
else
|
|
228
|
+
# Otherwise we add the completion items to the list
|
|
229
|
+
items.concat(res)
|
|
230
|
+
end
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
# Verify that our search string is a valid regex
|
|
234
|
+
begin
|
|
235
|
+
Regexp.compile(str)
|
|
236
|
+
rescue RegexpError
|
|
237
|
+
str = Regexp.escape(str)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
# XXX - This still doesn't fix some Regexp warnings:
|
|
241
|
+
# ./lib/rex/ui/text/dispatcher_shell.rb:171: warning: regexp has `]' without escape
|
|
242
|
+
|
|
243
|
+
# Match based on the partial word
|
|
244
|
+
items.find_all { |e|
|
|
245
|
+
e =~ /^#{str}/
|
|
246
|
+
# Prepend the rest of the command (or it gets replaced!)
|
|
247
|
+
}.map { |e|
|
|
248
|
+
tab_words.dup.push(e).join(' ')
|
|
249
|
+
}
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
#
|
|
253
|
+
# Provide command-specific tab completion
|
|
254
|
+
#
|
|
255
|
+
def tab_complete_helper(dispatcher, str, words)
|
|
256
|
+
items = []
|
|
257
|
+
|
|
258
|
+
tabs_meth = "cmd_#{words[0]}_tabs"
|
|
259
|
+
# Is the user trying to tab complete one of our commands?
|
|
260
|
+
if (dispatcher.commands.include?(words[0]) and dispatcher.respond_to?(tabs_meth))
|
|
261
|
+
res = dispatcher.send(tabs_meth, str, words)
|
|
262
|
+
return [] if res.nil?
|
|
263
|
+
items.concat(res)
|
|
264
|
+
else
|
|
265
|
+
# Avoid the default completion list for known commands
|
|
266
|
+
return []
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
return items
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
#
|
|
273
|
+
# Run a single command line.
|
|
274
|
+
#
|
|
275
|
+
def run_single(line)
|
|
276
|
+
arguments = parse_line(line)
|
|
277
|
+
method = arguments.shift
|
|
278
|
+
found = false
|
|
279
|
+
error = false
|
|
280
|
+
|
|
281
|
+
# If output is disabled output will be nil
|
|
282
|
+
output.reset_color if (output)
|
|
283
|
+
|
|
284
|
+
if (method)
|
|
285
|
+
entries = dispatcher_stack.length
|
|
286
|
+
|
|
287
|
+
dispatcher_stack.each { |dispatcher|
|
|
288
|
+
next if not dispatcher.respond_to?('commands')
|
|
289
|
+
|
|
290
|
+
begin
|
|
291
|
+
if (dispatcher.commands.has_key?(method))
|
|
292
|
+
self.on_command_proc.call(line.strip) if self.on_command_proc
|
|
293
|
+
run_command(dispatcher, method, arguments)
|
|
294
|
+
found = true
|
|
295
|
+
end
|
|
296
|
+
rescue
|
|
297
|
+
error = $!
|
|
298
|
+
|
|
299
|
+
print_error(
|
|
300
|
+
"Error while running command #{method}: #{$!}" +
|
|
301
|
+
"\n\nCall stack:\n#{$@.join("\n")}")
|
|
302
|
+
rescue ::Exception
|
|
303
|
+
error = $!
|
|
304
|
+
|
|
305
|
+
print_error(
|
|
306
|
+
"Error while running command #{method}: #{$!}")
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
# If the dispatcher stack changed as a result of this command,
|
|
310
|
+
# break out
|
|
311
|
+
break if (dispatcher_stack.length != entries)
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (found == false and error == false)
|
|
315
|
+
unknown_command(method, line)
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
return found
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
#
|
|
323
|
+
# Runs the supplied command on the given dispatcher.
|
|
324
|
+
#
|
|
325
|
+
def run_command(dispatcher, method, arguments)
|
|
326
|
+
self.busy = true
|
|
327
|
+
|
|
328
|
+
if(blocked_command?(method))
|
|
329
|
+
print_error("The #{method} command has been disabled.")
|
|
330
|
+
else
|
|
331
|
+
dispatcher.send('cmd_' + method, *arguments)
|
|
332
|
+
end
|
|
333
|
+
self.busy = false
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
#
|
|
337
|
+
# If the command is unknown...
|
|
338
|
+
#
|
|
339
|
+
def unknown_command(method, line)
|
|
340
|
+
print_error("Unknown command: #{method}.")
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
#
|
|
344
|
+
# Push a dispatcher to the front of the stack.
|
|
345
|
+
#
|
|
346
|
+
def enstack_dispatcher(dispatcher)
|
|
347
|
+
self.dispatcher_stack.unshift(inst = dispatcher.new(self))
|
|
348
|
+
|
|
349
|
+
inst
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
#
|
|
353
|
+
# Pop a dispatcher from the front of the stacker.
|
|
354
|
+
#
|
|
355
|
+
def destack_dispatcher
|
|
356
|
+
self.dispatcher_stack.shift
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
#
|
|
360
|
+
# Adds the supplied dispatcher to the end of the dispatcher stack so that
|
|
361
|
+
# it doesn't affect any enstack'd dispatchers.
|
|
362
|
+
#
|
|
363
|
+
def append_dispatcher(dispatcher)
|
|
364
|
+
inst = dispatcher.new(self)
|
|
365
|
+
self.dispatcher_stack.each { |disp|
|
|
366
|
+
if (disp.name == inst.name)
|
|
367
|
+
raise RuntimeError.new("Attempting to load already loaded dispatcher #{disp.name}")
|
|
368
|
+
end
|
|
369
|
+
}
|
|
370
|
+
self.dispatcher_stack.push(inst)
|
|
371
|
+
|
|
372
|
+
inst
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
#
|
|
376
|
+
# Removes the supplied dispatcher instance.
|
|
377
|
+
#
|
|
378
|
+
def remove_dispatcher(name)
|
|
379
|
+
self.dispatcher_stack.delete_if { |inst|
|
|
380
|
+
(inst.name == name)
|
|
381
|
+
}
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
#
|
|
385
|
+
# Returns the current active dispatcher
|
|
386
|
+
#
|
|
387
|
+
def current_dispatcher
|
|
388
|
+
self.dispatcher_stack[0]
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
#
|
|
392
|
+
# Return a readable version of a help banner for all of the enstacked
|
|
393
|
+
# dispatchers.
|
|
394
|
+
#
|
|
395
|
+
def help_to_s(opts = {})
|
|
396
|
+
str = ''
|
|
397
|
+
|
|
398
|
+
dispatcher_stack.reverse.each { |dispatcher|
|
|
399
|
+
# No commands? Suckage.
|
|
400
|
+
next if ((dispatcher.respond_to?('commands') == false) or
|
|
401
|
+
(dispatcher.commands == nil) or
|
|
402
|
+
(dispatcher.commands.length == 0))
|
|
403
|
+
|
|
404
|
+
# Display the commands
|
|
405
|
+
tbl = Table.new(
|
|
406
|
+
'Header' => "#{dispatcher.name} Commands",
|
|
407
|
+
'Indent' => opts['Indent'] || 4,
|
|
408
|
+
'Columns' =>
|
|
409
|
+
[
|
|
410
|
+
'Command',
|
|
411
|
+
'Description'
|
|
412
|
+
],
|
|
413
|
+
'ColProps' =>
|
|
414
|
+
{
|
|
415
|
+
'Command' =>
|
|
416
|
+
{
|
|
417
|
+
'MaxWidth' => 12
|
|
418
|
+
}
|
|
419
|
+
})
|
|
420
|
+
|
|
421
|
+
dispatcher.commands.sort.each { |c|
|
|
422
|
+
tbl << c
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
str << "\n" + tbl.to_s + "\n"
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return str
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
#
|
|
434
|
+
# Returns nil for an empty set of blocked commands.
|
|
435
|
+
#
|
|
436
|
+
def blocked_command?(cmd)
|
|
437
|
+
return false if not self.blocked
|
|
438
|
+
self.blocked.has_key?(cmd)
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
#
|
|
442
|
+
# Block a specific command
|
|
443
|
+
#
|
|
444
|
+
def block_command(cmd)
|
|
445
|
+
self.blocked ||= {}
|
|
446
|
+
self.blocked[cmd] = true
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
#
|
|
450
|
+
# Unblock a specific command
|
|
451
|
+
#
|
|
452
|
+
def unblock_command(cmd)
|
|
453
|
+
self.blocked || return
|
|
454
|
+
self.blocked.delete(cmd)
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
attr_accessor :dispatcher_stack # :nodoc:
|
|
459
|
+
attr_accessor :tab_words # :nodoc:
|
|
460
|
+
attr_accessor :busy # :nodoc:
|
|
461
|
+
attr_accessor :blocked # :nodoc:
|
|
462
|
+
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
end
|
|
466
|
+
end
|
|
467
|
+
end
|