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,43 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
module Rex
|
|
3
|
+
|
|
4
|
+
###
|
|
5
|
+
#
|
|
6
|
+
# This class provides a wrapper around Thread.new that can provide
|
|
7
|
+
# additional features if a corresponding thread provider is set.
|
|
8
|
+
#
|
|
9
|
+
###
|
|
10
|
+
|
|
11
|
+
class ThreadFactory
|
|
12
|
+
|
|
13
|
+
@@provider = nil
|
|
14
|
+
|
|
15
|
+
def self.provider=(val)
|
|
16
|
+
@@provider = val
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.spawn(name, crit, *args, &block)
|
|
20
|
+
if @@provider
|
|
21
|
+
if block
|
|
22
|
+
return @@provider.spawn(name, crit, *args){ |*args_copy| block.call(*args_copy) }
|
|
23
|
+
else
|
|
24
|
+
return @@provider.spawn(name, crit, *args)
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
t = nil
|
|
28
|
+
if block
|
|
29
|
+
t = ::Thread.new(*args){ |*args_copy| block.call(*args_copy) }
|
|
30
|
+
else
|
|
31
|
+
t = ::Thread.new(*args)
|
|
32
|
+
end
|
|
33
|
+
t[:tm_name] = name
|
|
34
|
+
t[:tm_crit] = crit
|
|
35
|
+
t[:tm_time] = Time.now
|
|
36
|
+
t[:tm_call] = caller
|
|
37
|
+
return t
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
data/lib/rex/time.rb
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
module Rex
|
|
3
|
+
|
|
4
|
+
###
|
|
5
|
+
#
|
|
6
|
+
# Extended time related functions.
|
|
7
|
+
#
|
|
8
|
+
###
|
|
9
|
+
module ExtTime
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# Convert seconds to a string that is broken down into years, days, hours,
|
|
13
|
+
# minutes, and second.
|
|
14
|
+
#
|
|
15
|
+
def self.sec_to_s(seconds)
|
|
16
|
+
parts = [ 31536000, 86400, 3600, 60, 1 ].map { |d|
|
|
17
|
+
if ((c = seconds / d) > 0)
|
|
18
|
+
seconds -= c.truncate * d
|
|
19
|
+
c.truncate
|
|
20
|
+
else
|
|
21
|
+
0
|
|
22
|
+
end
|
|
23
|
+
}.reverse
|
|
24
|
+
|
|
25
|
+
str = ''
|
|
26
|
+
|
|
27
|
+
[ "sec", "min", "hour", "day", "year" ].each_with_index { |name, idx|
|
|
28
|
+
next if (!parts[idx] or parts[idx] == 0)
|
|
29
|
+
|
|
30
|
+
str = "#{parts[idx]} #{name + ((parts[idx] != 1) ? 's' :'')} " + str
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
str.empty? ? "0 secs" : str.strip
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# Converts a string in the form n years g days x hours y mins z secs.
|
|
38
|
+
#
|
|
39
|
+
def self.str_to_sec(str)
|
|
40
|
+
fields = str.split(/ /)
|
|
41
|
+
secs = 0
|
|
42
|
+
|
|
43
|
+
fields.each_with_index { |f, idx|
|
|
44
|
+
val = 0
|
|
45
|
+
case f
|
|
46
|
+
when /^year/
|
|
47
|
+
val = 31536000
|
|
48
|
+
when /^day/
|
|
49
|
+
val = 86400
|
|
50
|
+
when /^hour/
|
|
51
|
+
val = 3600
|
|
52
|
+
when /^min/
|
|
53
|
+
val = 60
|
|
54
|
+
when /^sec/
|
|
55
|
+
val = 1
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
secs += val * fields[idx-1].to_i
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
secs
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
module Rex
|
|
3
|
+
|
|
4
|
+
###
|
|
5
|
+
#
|
|
6
|
+
# Transformer - more than meets the eye!
|
|
7
|
+
#
|
|
8
|
+
# This class, aside from having a kickass name, is responsible for translating
|
|
9
|
+
# object instances of one or more types into a single list instance of one or
|
|
10
|
+
# more types. This is useful for translating object instances that be can
|
|
11
|
+
# either strings or an array of strings into an array of strings, for
|
|
12
|
+
# instance. It lets you make things take a uniform structure in an abstract
|
|
13
|
+
# manner.
|
|
14
|
+
#
|
|
15
|
+
###
|
|
16
|
+
class Transformer
|
|
17
|
+
|
|
18
|
+
#
|
|
19
|
+
# Translates the object instance supplied in src_instance to an instance of
|
|
20
|
+
# dst_class. The dst_class parameter's instance must support the <<
|
|
21
|
+
# operator. An example call to this method looks something like:
|
|
22
|
+
#
|
|
23
|
+
# Transformer.transform(string, Array, [ String ], target)
|
|
24
|
+
#
|
|
25
|
+
def Transformer.transform(src_instance, dst_class, supported_classes,
|
|
26
|
+
target = nil)
|
|
27
|
+
dst_instance = dst_class.new
|
|
28
|
+
|
|
29
|
+
if (src_instance.kind_of?(Array))
|
|
30
|
+
src_instance.each { |src_inst|
|
|
31
|
+
Transformer.transform_single(src_inst, dst_instance,
|
|
32
|
+
supported_classes, target)
|
|
33
|
+
}
|
|
34
|
+
elsif (!src_instance.kind_of?(NilClass))
|
|
35
|
+
Transformer.transform_single(src_instance, dst_instance,
|
|
36
|
+
supported_classes, target)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
return dst_instance
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
protected
|
|
43
|
+
|
|
44
|
+
#
|
|
45
|
+
# Transform a single source instance.
|
|
46
|
+
#
|
|
47
|
+
def Transformer.transform_single(src_instance, dst_instance,
|
|
48
|
+
supported_classes, target)
|
|
49
|
+
# If the src instance's class is supported, just add it to the dst
|
|
50
|
+
# instance
|
|
51
|
+
if (supported_classes.include?(src_instance.class))
|
|
52
|
+
dst_instance << src_instance
|
|
53
|
+
# If the src instance's class is an array, then we should check to see
|
|
54
|
+
# if any of the supporting classes support from_a.
|
|
55
|
+
elsif (src_instance.kind_of?(Array))
|
|
56
|
+
new_src_instance = nil
|
|
57
|
+
|
|
58
|
+
# Walk each supported class calling from_a if exported
|
|
59
|
+
supported_classes.each { |sup_class|
|
|
60
|
+
next if (sup_class.respond_to?('from_a') == false)
|
|
61
|
+
|
|
62
|
+
new_src_instance = sup_class.from_a(src_instance)
|
|
63
|
+
|
|
64
|
+
if (new_src_instance != nil)
|
|
65
|
+
dst_instance << new_src_instance
|
|
66
|
+
break
|
|
67
|
+
end
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# If we don't have a valid new src instance, then we suck
|
|
71
|
+
if (new_src_instance == nil)
|
|
72
|
+
bomb_translation(src_instance, target)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# If the source instance is a string, query each of the supported
|
|
76
|
+
# classes to see if they can serialize it to their particular data
|
|
77
|
+
# type.
|
|
78
|
+
elsif (src_instance.kind_of?(String))
|
|
79
|
+
new_src_instance = nil
|
|
80
|
+
|
|
81
|
+
# Walk each supported class calling from_s if exported
|
|
82
|
+
supported_classes.each { |sup_class|
|
|
83
|
+
next if (sup_class.respond_to?('from_s') == false)
|
|
84
|
+
|
|
85
|
+
new_src_instance = sup_class.from_s(src_instance)
|
|
86
|
+
|
|
87
|
+
if (new_src_instance != nil)
|
|
88
|
+
dst_instance << new_src_instance
|
|
89
|
+
break
|
|
90
|
+
end
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# If we don't have a valid new src instance, then we suck
|
|
94
|
+
if (new_src_instance == nil)
|
|
95
|
+
bomb_translation(src_instance, target)
|
|
96
|
+
end
|
|
97
|
+
# Otherwise, bomb translation
|
|
98
|
+
else
|
|
99
|
+
bomb_translation(src_instance, target)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def Transformer.bomb_translation(src_instance, target) # :nodoc:
|
|
104
|
+
error = "Invalid source class (#{src_instance.class})"
|
|
105
|
+
|
|
106
|
+
if (target != nil)
|
|
107
|
+
error += " for #{target}"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
raise ArgumentError, error, caller
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
end
|
|
116
|
+
|
data/lib/rex/ui.rb
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
#
|
|
3
|
+
# This file includes everything needed to interact with the user interface
|
|
4
|
+
# wrappers of the rex library.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
# General classes
|
|
8
|
+
require 'rex/ui/output'
|
|
9
|
+
require 'rex/ui/progress_tracker'
|
|
10
|
+
|
|
11
|
+
# Text-based user interfaces
|
|
12
|
+
require 'rex/ui/text/input'
|
|
13
|
+
require 'rex/ui/text/shell'
|
|
14
|
+
require 'rex/ui/text/dispatcher_shell'
|
|
15
|
+
require 'rex/ui/text/irb_shell'
|
|
16
|
+
|
|
17
|
+
require 'rex/ui/text/color'
|
|
18
|
+
require 'rex/ui/text/table'
|
|
19
|
+
|
|
20
|
+
# Ui subscriber
|
|
21
|
+
require 'rex/ui/subscriber'
|
|
22
|
+
require 'rex/ui/interactive'
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
module Rex
|
|
3
|
+
module Ui
|
|
4
|
+
|
|
5
|
+
###
|
|
6
|
+
#
|
|
7
|
+
# This class implements the stubs that are needed to provide an interactive
|
|
8
|
+
# user interface that is backed against something arbitrary.
|
|
9
|
+
#
|
|
10
|
+
###
|
|
11
|
+
module Interactive
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Interactive sessions by default may interact with the local user input
|
|
15
|
+
# and output.
|
|
16
|
+
#
|
|
17
|
+
include Rex::Ui::Subscriber
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Starts interacting with the session at the most raw level, simply
|
|
21
|
+
# forwarding input from user_input to rstream and forwarding input from
|
|
22
|
+
# rstream to user_output.
|
|
23
|
+
#
|
|
24
|
+
def interact(user_input, user_output)
|
|
25
|
+
|
|
26
|
+
# Detach from any existing console
|
|
27
|
+
if(self.interacting)
|
|
28
|
+
detach()
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
init_ui(user_input, user_output)
|
|
32
|
+
|
|
33
|
+
self.interacting = true
|
|
34
|
+
self.completed = false
|
|
35
|
+
|
|
36
|
+
eof = false
|
|
37
|
+
|
|
38
|
+
# Start the readline stdin monitor
|
|
39
|
+
# XXX disabled
|
|
40
|
+
# user_input.readline_start() if user_input.supports_readline
|
|
41
|
+
|
|
42
|
+
# Handle suspend notifications
|
|
43
|
+
handle_suspend
|
|
44
|
+
|
|
45
|
+
# As long as we're interacting...
|
|
46
|
+
while (self.interacting == true)
|
|
47
|
+
|
|
48
|
+
begin
|
|
49
|
+
_interact
|
|
50
|
+
|
|
51
|
+
rescue Interrupt
|
|
52
|
+
# If we get an interrupt exception, ask the user if they want to
|
|
53
|
+
# abort the interaction. If they do, then we return out of
|
|
54
|
+
# the interact function and call it a day.
|
|
55
|
+
eof = true if (_interrupt)
|
|
56
|
+
|
|
57
|
+
rescue EOFError, Errno::ECONNRESET, IOError
|
|
58
|
+
# If we reach EOF or the connection is reset...
|
|
59
|
+
eof = true
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
break if eof
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
begin
|
|
67
|
+
|
|
68
|
+
# Restore the suspend handler
|
|
69
|
+
restore_suspend
|
|
70
|
+
|
|
71
|
+
# If we've hit eof, call the interact complete handler
|
|
72
|
+
_interact_complete if (eof == true)
|
|
73
|
+
|
|
74
|
+
# Shutdown the readline thread
|
|
75
|
+
# XXX disabled
|
|
76
|
+
# user_input.readline_stop() if user_input.supports_readline
|
|
77
|
+
|
|
78
|
+
# Detach from the input/output handles
|
|
79
|
+
reset_ui()
|
|
80
|
+
|
|
81
|
+
ensure
|
|
82
|
+
# Mark this as completed
|
|
83
|
+
self.completed = true
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Return whether or not EOF was reached
|
|
87
|
+
return eof
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
#
|
|
91
|
+
# Stops the current interaction
|
|
92
|
+
#
|
|
93
|
+
def detach
|
|
94
|
+
if (self.interacting)
|
|
95
|
+
self.interacting = false
|
|
96
|
+
while(not self.completed)
|
|
97
|
+
::IO.select(nil, nil, nil, 0.25)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
# Whether or not the session is currently being interacted with
|
|
104
|
+
#
|
|
105
|
+
attr_accessor :interacting
|
|
106
|
+
|
|
107
|
+
#
|
|
108
|
+
# Whether or not the session has completed interaction
|
|
109
|
+
#
|
|
110
|
+
attr_accessor :completed
|
|
111
|
+
|
|
112
|
+
attr_accessor :on_print_proc
|
|
113
|
+
attr_accessor :on_command_proc
|
|
114
|
+
|
|
115
|
+
protected
|
|
116
|
+
|
|
117
|
+
#
|
|
118
|
+
# The original suspend proc.
|
|
119
|
+
#
|
|
120
|
+
attr_accessor :orig_suspend
|
|
121
|
+
|
|
122
|
+
#
|
|
123
|
+
# Stub method that is meant to handler interaction
|
|
124
|
+
#
|
|
125
|
+
def _interact
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
#
|
|
129
|
+
# Called when an interrupt is sent.
|
|
130
|
+
#
|
|
131
|
+
def _interrupt
|
|
132
|
+
true
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
#
|
|
136
|
+
# Called when a suspend is sent.
|
|
137
|
+
#
|
|
138
|
+
def _suspend
|
|
139
|
+
false
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#
|
|
143
|
+
# Called when interaction has completed and one of the sides has closed.
|
|
144
|
+
#
|
|
145
|
+
def _interact_complete
|
|
146
|
+
true
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
#
|
|
150
|
+
# Read from remote and write to local.
|
|
151
|
+
#
|
|
152
|
+
def _stream_read_remote_write_local(stream)
|
|
153
|
+
data = stream.get
|
|
154
|
+
|
|
155
|
+
self.on_print_proc.call(data) if self.on_print_proc
|
|
156
|
+
user_output.print(data)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
#
|
|
160
|
+
# Read from local and write to remote.
|
|
161
|
+
#
|
|
162
|
+
def _stream_read_local_write_remote(stream)
|
|
163
|
+
data = user_input.gets
|
|
164
|
+
|
|
165
|
+
self.on_command_proc.call(data) if self.on_command_proc
|
|
166
|
+
stream.put(data)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
#
|
|
170
|
+
# The local file descriptor handle.
|
|
171
|
+
#
|
|
172
|
+
def _local_fd
|
|
173
|
+
user_input.fd
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
#
|
|
177
|
+
# The remote file descriptor handle.
|
|
178
|
+
#
|
|
179
|
+
def _remote_fd(stream)
|
|
180
|
+
stream.fd
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
#
|
|
184
|
+
# Interacts with two streaming connections, reading data from one and
|
|
185
|
+
# writing it to the other. Both are expected to implement Rex::IO::Stream.
|
|
186
|
+
#
|
|
187
|
+
def interact_stream(stream)
|
|
188
|
+
while self.interacting
|
|
189
|
+
|
|
190
|
+
# Select input and rstream
|
|
191
|
+
sd = Rex::ThreadSafe.select([ _local_fd, _remote_fd(stream) ], nil, nil, 0.25)
|
|
192
|
+
|
|
193
|
+
# Cycle through the items that have data
|
|
194
|
+
# From the stream? Write to user_output.
|
|
195
|
+
sd[0].each { |s|
|
|
196
|
+
if (s == _remote_fd(stream))
|
|
197
|
+
_stream_read_remote_write_local(stream)
|
|
198
|
+
# From user_input? Write to stream.
|
|
199
|
+
elsif (s == _local_fd)
|
|
200
|
+
_stream_read_local_write_remote(stream)
|
|
201
|
+
end
|
|
202
|
+
} if (sd)
|
|
203
|
+
|
|
204
|
+
Thread.pass
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
#
|
|
210
|
+
# Interacts between a local stream and a remote ring buffer. This has to use
|
|
211
|
+
# a secondary thread to prevent the select on the local stream from blocking
|
|
212
|
+
#
|
|
213
|
+
def interact_ring(ring)
|
|
214
|
+
begin
|
|
215
|
+
|
|
216
|
+
rdr = Rex::ThreadFactory.spawn("RingMonitor", false) do
|
|
217
|
+
seq = nil
|
|
218
|
+
while self.interacting
|
|
219
|
+
|
|
220
|
+
# Look for any pending data from the remote ring
|
|
221
|
+
nseq,data = ring.read_data(seq)
|
|
222
|
+
|
|
223
|
+
# Update the sequence number if necessary
|
|
224
|
+
seq = nseq || seq
|
|
225
|
+
|
|
226
|
+
# Write output to the local stream if successful
|
|
227
|
+
user_output.print(data) if data
|
|
228
|
+
|
|
229
|
+
# Wait for new data to arrive on this session
|
|
230
|
+
ring.wait(seq)
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
while self.interacting
|
|
235
|
+
|
|
236
|
+
# Look for any pending input from the local stream
|
|
237
|
+
sd = Rex::ThreadSafe.select([ _local_fd ], nil, [_local_fd], 5.0)
|
|
238
|
+
|
|
239
|
+
# Write input to the ring's input mechanism
|
|
240
|
+
if sd
|
|
241
|
+
data = user_input.gets
|
|
242
|
+
ring.put(data)
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
ensure
|
|
247
|
+
rdr.kill
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
#
|
|
253
|
+
# Installs a signal handler to monitor suspend signal notifications.
|
|
254
|
+
#
|
|
255
|
+
def handle_suspend
|
|
256
|
+
if (orig_suspend == nil)
|
|
257
|
+
begin
|
|
258
|
+
self.orig_suspend = Signal.trap("TSTP") {
|
|
259
|
+
_suspend
|
|
260
|
+
}
|
|
261
|
+
rescue
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
#
|
|
267
|
+
# Restores the previously installed signal handler for suspend
|
|
268
|
+
# notifications.
|
|
269
|
+
#
|
|
270
|
+
def restore_suspend
|
|
271
|
+
begin
|
|
272
|
+
if (orig_suspend)
|
|
273
|
+
Signal.trap("TSTP", orig_suspend)
|
|
274
|
+
else
|
|
275
|
+
Signal.trap("TSTP", "DEFAULT")
|
|
276
|
+
end
|
|
277
|
+
self.orig_suspend = nil
|
|
278
|
+
rescue
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
#
|
|
283
|
+
# Prompt the user for input if possible.
|
|
284
|
+
# XXX: This is not thread-safe on Windows
|
|
285
|
+
#
|
|
286
|
+
def prompt(query)
|
|
287
|
+
if (user_output and user_input)
|
|
288
|
+
user_output.print("\n" + query)
|
|
289
|
+
user_input.sysread(2)
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
#
|
|
294
|
+
# Check the return value of a yes/no prompt
|
|
295
|
+
#
|
|
296
|
+
def prompt_yesno(query)
|
|
297
|
+
(prompt(query + " [y/N] ") =~ /^y/i) ? true : false
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
|