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,403 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex/ui'
|
|
3
|
+
|
|
4
|
+
module Rex
|
|
5
|
+
module Ui
|
|
6
|
+
module Text
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# The shell class provides a command-prompt style interface in a
|
|
11
|
+
# generic fashion.
|
|
12
|
+
#
|
|
13
|
+
###
|
|
14
|
+
module Shell
|
|
15
|
+
|
|
16
|
+
###
|
|
17
|
+
#
|
|
18
|
+
# This module is meant to be mixed into an input medium class instance as a
|
|
19
|
+
# means of extending it to display a prompt before each call to gets.
|
|
20
|
+
#
|
|
21
|
+
###
|
|
22
|
+
module InputShell
|
|
23
|
+
attr_accessor :prompt, :output
|
|
24
|
+
|
|
25
|
+
def pgets()
|
|
26
|
+
|
|
27
|
+
output.print(prompt)
|
|
28
|
+
output.flush
|
|
29
|
+
|
|
30
|
+
output.prompting
|
|
31
|
+
buf = gets
|
|
32
|
+
output.prompting(false)
|
|
33
|
+
|
|
34
|
+
buf
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Initializes a shell that has a prompt and can be interacted with.
|
|
40
|
+
#
|
|
41
|
+
def initialize(prompt, prompt_char = '>', histfile = nil, framework = nil)
|
|
42
|
+
# Set the stop flag to false
|
|
43
|
+
self.stop_flag = false
|
|
44
|
+
self.disable_output = false
|
|
45
|
+
self.stop_count = 0
|
|
46
|
+
|
|
47
|
+
# Initialize the prompt
|
|
48
|
+
self.init_prompt = prompt
|
|
49
|
+
self.prompt_char = prompt_char
|
|
50
|
+
|
|
51
|
+
self.histfile = histfile
|
|
52
|
+
self.hist_last_saved = 0
|
|
53
|
+
|
|
54
|
+
self.framework = framework
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def init_tab_complete
|
|
58
|
+
if (self.input and self.input.supports_readline)
|
|
59
|
+
self.input = Input::Readline.new(lambda { |str| tab_complete(str) })
|
|
60
|
+
if Readline::HISTORY.length == 0 and histfile and File.exists?(histfile)
|
|
61
|
+
File.readlines(histfile).each { |e|
|
|
62
|
+
Readline::HISTORY << e.chomp
|
|
63
|
+
}
|
|
64
|
+
self.hist_last_saved = Readline::HISTORY.length
|
|
65
|
+
end
|
|
66
|
+
self.input.output = self.output
|
|
67
|
+
update_prompt(input.prompt)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
#
|
|
72
|
+
# Initializes the user interface input/output classes.
|
|
73
|
+
#
|
|
74
|
+
def init_ui(in_input = nil, in_output = nil)
|
|
75
|
+
# Initialize the input and output methods
|
|
76
|
+
self.input = in_input
|
|
77
|
+
self.output = in_output
|
|
78
|
+
|
|
79
|
+
if (self.input)
|
|
80
|
+
# Extend the input medium as an input shell if the input medium
|
|
81
|
+
# isn't intrinsicly a shell.
|
|
82
|
+
if (self.input.intrinsic_shell? == false)
|
|
83
|
+
self.input.extend(InputShell)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
self.input.output = self.output
|
|
87
|
+
end
|
|
88
|
+
update_prompt('')
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
#
|
|
92
|
+
# Resets the user interface handles.
|
|
93
|
+
#
|
|
94
|
+
def reset_ui
|
|
95
|
+
init_ui
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
#
|
|
99
|
+
# Sets the log source that should be used for logging input and output.
|
|
100
|
+
#
|
|
101
|
+
def set_log_source(log_source)
|
|
102
|
+
self.log_source = log_source
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
#
|
|
106
|
+
# Unsets the log source so that logging becomes disabled.
|
|
107
|
+
#
|
|
108
|
+
def unset_log_source
|
|
109
|
+
set_log_source(nil)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
#
|
|
113
|
+
# Performs tab completion on the supplied string.
|
|
114
|
+
#
|
|
115
|
+
def tab_complete(str)
|
|
116
|
+
return tab_complete_proc(str) if (tab_complete_proc)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
#
|
|
120
|
+
# Run the command processing loop.
|
|
121
|
+
#
|
|
122
|
+
def run(&block)
|
|
123
|
+
|
|
124
|
+
begin
|
|
125
|
+
|
|
126
|
+
while true
|
|
127
|
+
# If the stop flag was set or we've hit EOF, break out
|
|
128
|
+
break if (self.stop_flag or self.stop_count > 1)
|
|
129
|
+
|
|
130
|
+
init_tab_complete
|
|
131
|
+
|
|
132
|
+
if framework
|
|
133
|
+
if input.prompt.include?("%T")
|
|
134
|
+
t = Time.now
|
|
135
|
+
if framework.datastore['PromptTimeFormat']
|
|
136
|
+
t = t.strftime(framework.datastore['PromptTimeFormat'])
|
|
137
|
+
end
|
|
138
|
+
input.prompt.gsub!(/%T/, t.to_s)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
if input.prompt.include?("%H")
|
|
142
|
+
hostname = ENV['HOSTNAME']
|
|
143
|
+
if hostname.nil?
|
|
144
|
+
hostname = `hostname`.split('.')[0]
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# check if hostname is still nil
|
|
148
|
+
if hostname.nil?
|
|
149
|
+
hostname = ENV['COMPUTERNAME']
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
if hostname.nil?
|
|
153
|
+
hostname = 'unknown'
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
input.prompt.gsub!(/%H/, hostname.chomp)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
if input.prompt.include?("%U")
|
|
160
|
+
user = ENV['USER']
|
|
161
|
+
if user.nil?
|
|
162
|
+
user = `whoami`
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# check if username is still nil
|
|
166
|
+
if user.nil?
|
|
167
|
+
user = ENV['USERNAME']
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
if user.nil?
|
|
171
|
+
user = 'unknown'
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
input.prompt.gsub!(/%U/, user.chomp)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
input.prompt.gsub!(/%S/, framework.sessions.length.to_s)
|
|
178
|
+
input.prompt.gsub!(/%J/, framework.jobs.length.to_s)
|
|
179
|
+
input.prompt.gsub!(/%L/, Rex::Socket.source_address("50.50.50.50"))
|
|
180
|
+
input.prompt.gsub!(/%D/, ::Dir.getwd)
|
|
181
|
+
self.init_prompt = input.prompt
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
line = input.pgets()
|
|
185
|
+
log_output(input.prompt)
|
|
186
|
+
|
|
187
|
+
# If a block was passed in, pass the line to it. If it returns true,
|
|
188
|
+
# break out of the shell loop.
|
|
189
|
+
if (block)
|
|
190
|
+
break if (line == nil or block.call(line))
|
|
191
|
+
elsif(input.eof? or line == nil)
|
|
192
|
+
# If you have sessions active, this will give you a shot to exit gravefully
|
|
193
|
+
# If you really are ambitious, 2 eofs will kick this out
|
|
194
|
+
self.stop_count += 1
|
|
195
|
+
next if(self.stop_count > 1)
|
|
196
|
+
run_single("quit")
|
|
197
|
+
else
|
|
198
|
+
# Otherwise, call what should be an overriden instance method to
|
|
199
|
+
# process the line.
|
|
200
|
+
ret = run_single(line)
|
|
201
|
+
# don't bother saving lines that couldn't be found as a
|
|
202
|
+
# command, create the file if it doesn't exist
|
|
203
|
+
if ret and self.histfile
|
|
204
|
+
File.open(self.histfile, "a+") { |f|
|
|
205
|
+
f.puts(line)
|
|
206
|
+
}
|
|
207
|
+
end
|
|
208
|
+
self.stop_count = 0
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
end
|
|
212
|
+
# Prevent accidental console quits
|
|
213
|
+
rescue ::Interrupt
|
|
214
|
+
output.print("Interrupt: use the 'exit' command to quit\n")
|
|
215
|
+
retry
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
#
|
|
220
|
+
# Stop processing user input.
|
|
221
|
+
#
|
|
222
|
+
def stop
|
|
223
|
+
self.stop_flag = true
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
#
|
|
227
|
+
# Checks to see if the shell has stopped.
|
|
228
|
+
#
|
|
229
|
+
def stopped?
|
|
230
|
+
self.stop_flag
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
#
|
|
234
|
+
# Change the input prompt.
|
|
235
|
+
#
|
|
236
|
+
# prompt - the actual prompt
|
|
237
|
+
# new_prompt_char the char to append to the prompt
|
|
238
|
+
# mode - append or not to append - false = append true = make a new prompt
|
|
239
|
+
def update_prompt(prompt = nil, new_prompt_char = nil, mode = false)
|
|
240
|
+
if (self.input)
|
|
241
|
+
if prompt
|
|
242
|
+
new_prompt = self.init_prompt + ' ' + prompt + prompt_char + ' '
|
|
243
|
+
else
|
|
244
|
+
new_prompt = self.prompt || ''
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
if mode
|
|
248
|
+
new_prompt = prompt + (new_prompt_char || prompt_char) + ' '
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# Save the prompt before any substitutions
|
|
252
|
+
self.prompt = new_prompt
|
|
253
|
+
|
|
254
|
+
# Set the actual prompt to the saved prompt with any substitutions
|
|
255
|
+
# or updates from our output driver, be they color or whatever
|
|
256
|
+
self.input.prompt = self.output.update_prompt(new_prompt)
|
|
257
|
+
self.prompt_char = new_prompt_char if (new_prompt_char)
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
#
|
|
262
|
+
# Output shortcuts
|
|
263
|
+
#
|
|
264
|
+
|
|
265
|
+
#
|
|
266
|
+
# Prints an error message to the output handle.
|
|
267
|
+
#
|
|
268
|
+
def print_error(msg='')
|
|
269
|
+
return if (output.nil?)
|
|
270
|
+
|
|
271
|
+
self.on_print_proc.call(msg) if self.on_print_proc
|
|
272
|
+
# Errors are not subject to disabled output
|
|
273
|
+
log_output(output.print_error(msg))
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
#
|
|
277
|
+
# Prints a status message to the output handle.
|
|
278
|
+
#
|
|
279
|
+
def print_status(msg='')
|
|
280
|
+
return if (disable_output == true)
|
|
281
|
+
|
|
282
|
+
self.on_print_proc.call(msg) if self.on_print_proc
|
|
283
|
+
log_output(output.print_status(msg))
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
#
|
|
287
|
+
# Prints a good message to the output handle.
|
|
288
|
+
#
|
|
289
|
+
def print_good(msg='')
|
|
290
|
+
return if (disable_output == true)
|
|
291
|
+
|
|
292
|
+
self.on_print_proc.call(msg) if self.on_print_proc
|
|
293
|
+
log_output(output.print_good(msg))
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
#
|
|
297
|
+
# Prints a line of text to the output handle.
|
|
298
|
+
#
|
|
299
|
+
def print_line(msg='')
|
|
300
|
+
return if (disable_output == true)
|
|
301
|
+
|
|
302
|
+
self.on_print_proc.call(msg) if self.on_print_proc
|
|
303
|
+
log_output(output.print_line(msg))
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
#
|
|
307
|
+
# Prints a warning message to the output handle.
|
|
308
|
+
#
|
|
309
|
+
def print_warning(msg='')
|
|
310
|
+
return if (disable_output == true)
|
|
311
|
+
|
|
312
|
+
self.on_print_proc.call(msg) if self.on_print_proc
|
|
313
|
+
log_output(output.print_warning(msg))
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
#
|
|
317
|
+
# Prints a raw message to the output handle.
|
|
318
|
+
#
|
|
319
|
+
def print(msg='')
|
|
320
|
+
return if (disable_output == true)
|
|
321
|
+
self.on_print_proc.call(msg) if self.on_print_proc
|
|
322
|
+
log_output(output.print(msg))
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
#
|
|
326
|
+
# Whether or not output has been disabled.
|
|
327
|
+
#
|
|
328
|
+
attr_accessor :disable_output
|
|
329
|
+
#
|
|
330
|
+
# The input handle to read user input from.
|
|
331
|
+
#
|
|
332
|
+
attr_reader :input
|
|
333
|
+
#
|
|
334
|
+
# The output handle to write output to.
|
|
335
|
+
#
|
|
336
|
+
attr_reader :output
|
|
337
|
+
|
|
338
|
+
attr_accessor :on_command_proc
|
|
339
|
+
attr_accessor :on_print_proc
|
|
340
|
+
attr_accessor :framework
|
|
341
|
+
|
|
342
|
+
protected
|
|
343
|
+
|
|
344
|
+
#
|
|
345
|
+
# Parse a line into an array of arguments.
|
|
346
|
+
#
|
|
347
|
+
def parse_line(line)
|
|
348
|
+
log_input(line)
|
|
349
|
+
|
|
350
|
+
line.gsub!(/(\r|\n)/, '')
|
|
351
|
+
|
|
352
|
+
begin
|
|
353
|
+
return args = Rex::Parser::Arguments.from_s(line)
|
|
354
|
+
rescue ::ArgumentError
|
|
355
|
+
print_error("Parse error: #{$!}")
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
return []
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
#
|
|
362
|
+
# Print the prompt, but do not log it.
|
|
363
|
+
#
|
|
364
|
+
def _print_prompt(prompt)
|
|
365
|
+
output.print(prompt)
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
#
|
|
369
|
+
# Writes the supplied input to the log source if one has been registered.
|
|
370
|
+
#
|
|
371
|
+
def log_input(buf)
|
|
372
|
+
rlog(buf, log_source) if (log_source)
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
#
|
|
376
|
+
# Writes the supplied output to the log source if one has been registered.
|
|
377
|
+
#
|
|
378
|
+
def log_output(buf)
|
|
379
|
+
rlog(buf, log_source) if (log_source)
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
attr_writer :input, :output # :nodoc:
|
|
383
|
+
attr_accessor :stop_flag, :init_prompt # :nodoc:
|
|
384
|
+
attr_accessor :prompt # :nodoc:
|
|
385
|
+
attr_accessor :prompt_char, :tab_complete_proc # :nodoc:
|
|
386
|
+
attr_accessor :histfile # :nodoc:
|
|
387
|
+
attr_accessor :hist_last_saved # the number of history lines when last saved/loaded
|
|
388
|
+
attr_accessor :log_source, :stop_count # :nodoc:
|
|
389
|
+
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
###
|
|
393
|
+
#
|
|
394
|
+
# Pseudo-shell interface that simply includes the Shell mixin.
|
|
395
|
+
#
|
|
396
|
+
###
|
|
397
|
+
class PseudoShell
|
|
398
|
+
include Shell
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
end end end
|
|
403
|
+
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex/ui'
|
|
3
|
+
require 'rex/socket'
|
|
4
|
+
|
|
5
|
+
module Rex
|
|
6
|
+
module Ui
|
|
7
|
+
module Text
|
|
8
|
+
|
|
9
|
+
###
|
|
10
|
+
#
|
|
11
|
+
# Prints text in a tablized format. Pretty lame at the moment, but
|
|
12
|
+
# whatever.
|
|
13
|
+
#
|
|
14
|
+
###
|
|
15
|
+
class Table
|
|
16
|
+
|
|
17
|
+
#
|
|
18
|
+
# Initializes a text table instance using the supplied properties. The
|
|
19
|
+
# Table class supports the following hash attributes:
|
|
20
|
+
#
|
|
21
|
+
# Header
|
|
22
|
+
#
|
|
23
|
+
# The string to display as a heading above the table. If none is
|
|
24
|
+
# specified, no header will be displayed.
|
|
25
|
+
#
|
|
26
|
+
# HeaderIndent
|
|
27
|
+
#
|
|
28
|
+
# The amount of space to indent the header. The default is zero.
|
|
29
|
+
#
|
|
30
|
+
# Columns
|
|
31
|
+
#
|
|
32
|
+
# The array of columns that will exist within the table.
|
|
33
|
+
#
|
|
34
|
+
# Rows
|
|
35
|
+
#
|
|
36
|
+
# The array of rows that will exist.
|
|
37
|
+
#
|
|
38
|
+
# Width
|
|
39
|
+
#
|
|
40
|
+
# The maximum width of the table in characters.
|
|
41
|
+
#
|
|
42
|
+
# Indent
|
|
43
|
+
#
|
|
44
|
+
# The number of characters to indent the table.
|
|
45
|
+
#
|
|
46
|
+
# CellPad
|
|
47
|
+
#
|
|
48
|
+
# The number of characters to put between each horizontal cell.
|
|
49
|
+
#
|
|
50
|
+
# Prefix
|
|
51
|
+
#
|
|
52
|
+
# The text to prefix before the table.
|
|
53
|
+
#
|
|
54
|
+
# Postfix
|
|
55
|
+
#
|
|
56
|
+
# The text to affix to the end of the table.
|
|
57
|
+
#
|
|
58
|
+
# Sortindex
|
|
59
|
+
#
|
|
60
|
+
# The column to sort the table on, -1 disables sorting.
|
|
61
|
+
#
|
|
62
|
+
def initialize(opts = {})
|
|
63
|
+
self.header = opts['Header']
|
|
64
|
+
self.headeri = opts['HeaderIndent'] || 0
|
|
65
|
+
self.columns = opts['Columns'] || []
|
|
66
|
+
# updated below if we got a "Rows" option
|
|
67
|
+
self.rows = []
|
|
68
|
+
|
|
69
|
+
self.width = opts['Width'] || 80
|
|
70
|
+
self.indent = opts['Indent'] || 0
|
|
71
|
+
self.cellpad = opts['CellPad'] || 2
|
|
72
|
+
self.prefix = opts['Prefix'] || ''
|
|
73
|
+
self.postfix = opts['Postfix'] || ''
|
|
74
|
+
self.colprops = []
|
|
75
|
+
|
|
76
|
+
self.sort_index = opts['SortIndex'] || 0
|
|
77
|
+
|
|
78
|
+
# Default column properties
|
|
79
|
+
self.columns.length.times { |idx|
|
|
80
|
+
self.colprops[idx] = {}
|
|
81
|
+
self.colprops[idx]['MaxWidth'] = self.columns[idx].length
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# ensure all our internal state gets updated with the given rows by
|
|
85
|
+
# using add_row instead of just adding them to self.rows. See #3825.
|
|
86
|
+
opts['Rows'].each { |row| add_row(row) } if opts['Rows']
|
|
87
|
+
|
|
88
|
+
# Merge in options
|
|
89
|
+
if (opts['ColProps'])
|
|
90
|
+
opts['ColProps'].each_key { |col|
|
|
91
|
+
idx = self.columns.index(col)
|
|
92
|
+
|
|
93
|
+
if (idx)
|
|
94
|
+
self.colprops[idx].merge!(opts['ColProps'][col])
|
|
95
|
+
end
|
|
96
|
+
}
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
#
|
|
102
|
+
# Converts table contents to a string.
|
|
103
|
+
#
|
|
104
|
+
def to_s
|
|
105
|
+
str = prefix.dup
|
|
106
|
+
str << header_to_s || ''
|
|
107
|
+
str << columns_to_s || ''
|
|
108
|
+
str << hr_to_s || ''
|
|
109
|
+
|
|
110
|
+
sort_rows
|
|
111
|
+
rows.each { |row|
|
|
112
|
+
if (is_hr(row))
|
|
113
|
+
str << hr_to_s
|
|
114
|
+
else
|
|
115
|
+
str << row_to_s(row)
|
|
116
|
+
end
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
str << postfix
|
|
120
|
+
|
|
121
|
+
return str
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# Converts table contents to a csv
|
|
126
|
+
#
|
|
127
|
+
def to_csv
|
|
128
|
+
str = ''
|
|
129
|
+
str << ( columns.join(",") + "\n" )
|
|
130
|
+
rows.each { |row|
|
|
131
|
+
next if is_hr(row)
|
|
132
|
+
str << ( row.map{|x|
|
|
133
|
+
x = x.to_s
|
|
134
|
+
|
|
135
|
+
x.gsub(/[\r\n]/, ' ').gsub(/\s+/, ' ').gsub('"', '""')
|
|
136
|
+
}.map{|x| "\"#{x}\"" }.join(",") + "\n" )
|
|
137
|
+
}
|
|
138
|
+
str
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
#
|
|
142
|
+
#
|
|
143
|
+
# Returns the header string.
|
|
144
|
+
#
|
|
145
|
+
def header_to_s # :nodoc:
|
|
146
|
+
if (header)
|
|
147
|
+
pad = " " * headeri
|
|
148
|
+
|
|
149
|
+
return pad + header + "\n" + pad + "=" * header.length + "\n\n"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
return ''
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
#
|
|
156
|
+
# Prints the contents of the table.
|
|
157
|
+
#
|
|
158
|
+
def print
|
|
159
|
+
puts to_s
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
#
|
|
163
|
+
# Adds a row using the supplied fields.
|
|
164
|
+
#
|
|
165
|
+
def <<(fields)
|
|
166
|
+
add_row(fields)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
#
|
|
170
|
+
# Adds a row with the supplied fields.
|
|
171
|
+
#
|
|
172
|
+
def add_row(fields = [])
|
|
173
|
+
if fields.length != self.columns.length
|
|
174
|
+
raise RuntimeError, 'Invalid number of columns!'
|
|
175
|
+
end
|
|
176
|
+
fields.each_with_index { |field, idx|
|
|
177
|
+
if (colprops[idx]['MaxWidth'] < field.to_s.length)
|
|
178
|
+
colprops[idx]['MaxWidth'] = field.to_s.length
|
|
179
|
+
end
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
rows << fields
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
#
|
|
186
|
+
# Sorts the rows based on the supplied index of sub-arrays
|
|
187
|
+
# If the supplied index is an IPv4 address, handle it differently, but
|
|
188
|
+
# avoid actually resolving domain names.
|
|
189
|
+
#
|
|
190
|
+
def sort_rows(index=sort_index)
|
|
191
|
+
return if index == -1
|
|
192
|
+
return unless rows
|
|
193
|
+
rows.sort! do |a,b|
|
|
194
|
+
if a[index].nil?
|
|
195
|
+
-1
|
|
196
|
+
elsif b[index].nil?
|
|
197
|
+
1
|
|
198
|
+
elsif Rex::Socket.dotted_ip?(a[index]) and Rex::Socket.dotted_ip?(b[index])
|
|
199
|
+
Rex::Socket::addr_atoi(a[index]) <=> Rex::Socket::addr_atoi(b[index])
|
|
200
|
+
elsif a[index] =~ /^[0-9]+$/ and b[index] =~ /^[0-9]+$/
|
|
201
|
+
a[index].to_i <=> b[index].to_i
|
|
202
|
+
else
|
|
203
|
+
a[index] <=> b[index] # assumes otherwise comparable.
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
#
|
|
209
|
+
# Adds a horizontal line.
|
|
210
|
+
#
|
|
211
|
+
def add_hr
|
|
212
|
+
rows << '__hr__'
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
#
|
|
216
|
+
# Returns new sub-table with headers and rows maching column names submitted
|
|
217
|
+
#
|
|
218
|
+
def [](*col_names)
|
|
219
|
+
tbl = self.class.new('Indent' => self.indent,
|
|
220
|
+
'Header' => self.header,
|
|
221
|
+
'Columns' => col_names)
|
|
222
|
+
indexes = []
|
|
223
|
+
|
|
224
|
+
col_names.each do |col_name|
|
|
225
|
+
index = self.columns.index(col_name)
|
|
226
|
+
raise RuntimeError, "Invalid column name #{col_name}" if index.nil?
|
|
227
|
+
indexes << index
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
self.rows.each do |old_row|
|
|
231
|
+
new_row = []
|
|
232
|
+
indexes.map {|i| new_row << old_row[i]}
|
|
233
|
+
tbl << new_row
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
return tbl
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
alias p print
|
|
241
|
+
|
|
242
|
+
attr_accessor :header, :headeri # :nodoc:
|
|
243
|
+
attr_accessor :columns, :rows, :colprops # :nodoc:
|
|
244
|
+
attr_accessor :width, :indent, :cellpad # :nodoc:
|
|
245
|
+
attr_accessor :prefix, :postfix # :nodoc:
|
|
246
|
+
attr_accessor :sort_index # :nodoc:
|
|
247
|
+
|
|
248
|
+
protected
|
|
249
|
+
|
|
250
|
+
#
|
|
251
|
+
# Defaults cell widths and alignments.
|
|
252
|
+
#
|
|
253
|
+
def defaults # :nodoc:
|
|
254
|
+
self.columns.length.times { |idx|
|
|
255
|
+
}
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
#
|
|
259
|
+
# Checks to see if the row is an hr.
|
|
260
|
+
#
|
|
261
|
+
def is_hr(row) # :nodoc:
|
|
262
|
+
return ((row.kind_of?(String)) && (row == '__hr__'))
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
#
|
|
266
|
+
# Converts the columns to a string.
|
|
267
|
+
#
|
|
268
|
+
def columns_to_s # :nodoc:
|
|
269
|
+
nameline = ' ' * indent
|
|
270
|
+
barline = nameline.dup
|
|
271
|
+
last_col = nil
|
|
272
|
+
last_idx = nil
|
|
273
|
+
columns.each_with_index { |col,idx|
|
|
274
|
+
if (last_col)
|
|
275
|
+
nameline << pad(' ', last_col, last_idx)
|
|
276
|
+
|
|
277
|
+
remainder = colprops[last_idx]['MaxWidth'] - last_col.length
|
|
278
|
+
if (remainder < 0)
|
|
279
|
+
remainder = 0
|
|
280
|
+
end
|
|
281
|
+
barline << (' ' * (cellpad + remainder))
|
|
282
|
+
end
|
|
283
|
+
nameline << col
|
|
284
|
+
barline << ('-' * col.length)
|
|
285
|
+
|
|
286
|
+
last_col = col
|
|
287
|
+
last_idx = idx
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return "#{nameline}\n#{barline}"
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
#
|
|
294
|
+
# Converts an hr to a string.
|
|
295
|
+
#
|
|
296
|
+
def hr_to_s # :nodoc:
|
|
297
|
+
return "\n"
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
#
|
|
301
|
+
# Converts a row to a string.
|
|
302
|
+
#
|
|
303
|
+
def row_to_s(row) # :nodoc:
|
|
304
|
+
line = ' ' * indent
|
|
305
|
+
last_cell = nil
|
|
306
|
+
last_idx = nil
|
|
307
|
+
row.each_with_index { |cell, idx|
|
|
308
|
+
if (idx != 0)
|
|
309
|
+
line << pad(' ', last_cell.to_s, last_idx)
|
|
310
|
+
end
|
|
311
|
+
# line << pad(' ', cell.to_s, idx)
|
|
312
|
+
# Limit wide cells
|
|
313
|
+
if colprops[idx]['MaxChar']
|
|
314
|
+
last_cell = cell.to_s[0..colprops[idx]['MaxChar'].to_i]
|
|
315
|
+
line << last_cell
|
|
316
|
+
else
|
|
317
|
+
line << cell.to_s
|
|
318
|
+
last_cell = cell
|
|
319
|
+
end
|
|
320
|
+
last_idx = idx
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return line + "\n"
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
#
|
|
327
|
+
# Pads out with the supplied character for the remainder of the space given
|
|
328
|
+
# some text and a column index.
|
|
329
|
+
#
|
|
330
|
+
def pad(chr, buf, colidx, use_cell_pad = true) # :nodoc:
|
|
331
|
+
remainder = colprops[colidx]['MaxWidth'] - buf.length
|
|
332
|
+
val = chr * remainder;
|
|
333
|
+
|
|
334
|
+
if (use_cell_pad)
|
|
335
|
+
val << ' ' * cellpad
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
return val
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
end
|