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,543 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
require 'rex/post/meterpreter/packet_response_waiter'
|
|
4
|
+
require 'rex/logging'
|
|
5
|
+
require 'rex/exceptions'
|
|
6
|
+
|
|
7
|
+
module Rex
|
|
8
|
+
module Post
|
|
9
|
+
module Meterpreter
|
|
10
|
+
|
|
11
|
+
###
|
|
12
|
+
#
|
|
13
|
+
# Exception thrown when a request fails.
|
|
14
|
+
#
|
|
15
|
+
###
|
|
16
|
+
class RequestError < ArgumentError
|
|
17
|
+
def initialize(method, einfo, ecode=nil)
|
|
18
|
+
@method = method
|
|
19
|
+
@result = einfo
|
|
20
|
+
@code = ecode || einfo
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def to_s
|
|
24
|
+
"#{@method}: Operation failed: #{@result}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# The method that failed.
|
|
28
|
+
attr_reader :method
|
|
29
|
+
|
|
30
|
+
# The error result that occurred, typically a windows error message.
|
|
31
|
+
attr_reader :result
|
|
32
|
+
|
|
33
|
+
# The error result that occurred, typically a windows error code.
|
|
34
|
+
attr_reader :code
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
###
|
|
38
|
+
#
|
|
39
|
+
# Handles packet transmission, reception, and correlation,
|
|
40
|
+
# and processing
|
|
41
|
+
#
|
|
42
|
+
###
|
|
43
|
+
module PacketDispatcher
|
|
44
|
+
|
|
45
|
+
PacketTimeout = 600
|
|
46
|
+
|
|
47
|
+
##
|
|
48
|
+
#
|
|
49
|
+
# Synchronization
|
|
50
|
+
#
|
|
51
|
+
##
|
|
52
|
+
attr_accessor :comm_mutex
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
##
|
|
56
|
+
#
|
|
57
|
+
#
|
|
58
|
+
# Passive Dispatching
|
|
59
|
+
#
|
|
60
|
+
##
|
|
61
|
+
attr_accessor :passive_service, :send_queue, :recv_queue
|
|
62
|
+
|
|
63
|
+
def initialize_passive_dispatcher
|
|
64
|
+
self.send_queue = []
|
|
65
|
+
self.recv_queue = []
|
|
66
|
+
self.waiters = []
|
|
67
|
+
self.alive = true
|
|
68
|
+
|
|
69
|
+
self.passive_service = self.passive_dispatcher
|
|
70
|
+
self.passive_service.remove_resource("/" + self.conn_id + "/")
|
|
71
|
+
self.passive_service.add_resource("/" + self.conn_id + "/",
|
|
72
|
+
'Proc' => Proc.new { |cli, req| on_passive_request(cli, req) },
|
|
73
|
+
'VirtualDirectory' => true
|
|
74
|
+
)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def shutdown_passive_dispatcher
|
|
78
|
+
return if not self.passive_service
|
|
79
|
+
self.passive_service.remove_resource("/" + self.conn_id + "/")
|
|
80
|
+
|
|
81
|
+
self.alive = false
|
|
82
|
+
self.send_queue = []
|
|
83
|
+
self.recv_queue = []
|
|
84
|
+
self.waiters = []
|
|
85
|
+
|
|
86
|
+
self.passive_service = nil
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def on_passive_request(cli, req)
|
|
90
|
+
|
|
91
|
+
begin
|
|
92
|
+
|
|
93
|
+
resp = Rex::Proto::Http::Response.new(200, "OK")
|
|
94
|
+
resp['Content-Type'] = 'application/octet-stream'
|
|
95
|
+
resp['Connection'] = 'close'
|
|
96
|
+
|
|
97
|
+
# If the first 4 bytes are "RECV", return the oldest packet from the outbound queue
|
|
98
|
+
if req.body[0,4] == "RECV"
|
|
99
|
+
rpkt = send_queue.pop
|
|
100
|
+
resp.body = rpkt || ''
|
|
101
|
+
begin
|
|
102
|
+
cli.send_response(resp)
|
|
103
|
+
rescue ::Exception => e
|
|
104
|
+
send_queue.unshift(rpkt) if rpkt
|
|
105
|
+
elog("Exception sending a reply to the reader request: #{cli.inspect} #{e.class} #{e} #{e.backtrace}")
|
|
106
|
+
end
|
|
107
|
+
else
|
|
108
|
+
resp.body = ""
|
|
109
|
+
if req.body and req.body.length > 0
|
|
110
|
+
packet = Packet.new(0)
|
|
111
|
+
packet.from_r(req.body)
|
|
112
|
+
dispatch_inbound_packet(packet)
|
|
113
|
+
end
|
|
114
|
+
cli.send_response(resp)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Force a closure for older WinInet implementations
|
|
118
|
+
self.passive_service.close_client( cli )
|
|
119
|
+
|
|
120
|
+
rescue ::Exception => e
|
|
121
|
+
elog("Exception handling request: #{cli.inspect} #{req.inspect} #{e.class} #{e} #{e.backtrace}")
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
##
|
|
126
|
+
#
|
|
127
|
+
# Transmission
|
|
128
|
+
#
|
|
129
|
+
##
|
|
130
|
+
|
|
131
|
+
#
|
|
132
|
+
# Sends a packet without waiting for a response.
|
|
133
|
+
#
|
|
134
|
+
def send_packet(packet, completion_routine = nil, completion_param = nil)
|
|
135
|
+
if (completion_routine)
|
|
136
|
+
add_response_waiter(packet, completion_routine, completion_param)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
bytes = 0
|
|
140
|
+
raw = packet.to_r
|
|
141
|
+
err = nil
|
|
142
|
+
|
|
143
|
+
# Short-circuit send when using a passive dispatcher
|
|
144
|
+
if self.passive_service
|
|
145
|
+
send_queue.push(raw)
|
|
146
|
+
return raw.size # Lie!
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
if (raw)
|
|
150
|
+
|
|
151
|
+
# This mutex is used to lock out new commands during an
|
|
152
|
+
# active migration.
|
|
153
|
+
|
|
154
|
+
self.comm_mutex.synchronize do
|
|
155
|
+
begin
|
|
156
|
+
bytes = self.sock.write(raw)
|
|
157
|
+
rescue ::Exception => e
|
|
158
|
+
err = e
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
if bytes.to_i == 0
|
|
163
|
+
# Mark the session itself as dead
|
|
164
|
+
self.alive = false
|
|
165
|
+
|
|
166
|
+
# Indicate that the dispatcher should shut down too
|
|
167
|
+
@finish = true
|
|
168
|
+
|
|
169
|
+
# Reraise the error to the top-level caller
|
|
170
|
+
raise err if err
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
return bytes
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
#
|
|
178
|
+
# Sends a packet and waits for a timeout for the given time interval.
|
|
179
|
+
#
|
|
180
|
+
def send_request(packet, t = self.response_timeout)
|
|
181
|
+
|
|
182
|
+
if not t
|
|
183
|
+
send_packet(packet)
|
|
184
|
+
return nil
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
response = send_packet_wait_response(packet, t)
|
|
188
|
+
|
|
189
|
+
if (response == nil)
|
|
190
|
+
raise TimeoutError.new("Send timed out")
|
|
191
|
+
elsif (response.result != 0)
|
|
192
|
+
einfo = lookup_error(response.result)
|
|
193
|
+
e = RequestError.new(packet.method, einfo, response.result)
|
|
194
|
+
|
|
195
|
+
e.set_backtrace(caller)
|
|
196
|
+
|
|
197
|
+
raise e
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
return response
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
#
|
|
204
|
+
# Transmits a packet and waits for a response.
|
|
205
|
+
#
|
|
206
|
+
def send_packet_wait_response(packet, t)
|
|
207
|
+
# First, add the waiter association for the supplied packet
|
|
208
|
+
waiter = add_response_waiter(packet)
|
|
209
|
+
|
|
210
|
+
# Transmit the packet
|
|
211
|
+
if (send_packet(packet).to_i <= 0)
|
|
212
|
+
# Remove the waiter if we failed to send the packet.
|
|
213
|
+
remove_response_waiter(waiter)
|
|
214
|
+
return nil
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# Wait for the supplied time interval
|
|
218
|
+
waiter.wait(t)
|
|
219
|
+
|
|
220
|
+
# Remove the waiter from the list of waiters in case it wasn't
|
|
221
|
+
# removed
|
|
222
|
+
remove_response_waiter(waiter)
|
|
223
|
+
|
|
224
|
+
# Return the response packet, if any
|
|
225
|
+
return waiter.response
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
##
|
|
229
|
+
#
|
|
230
|
+
# Reception
|
|
231
|
+
#
|
|
232
|
+
##
|
|
233
|
+
#
|
|
234
|
+
# Monitors the PacketDispatcher's sock for data in its own
|
|
235
|
+
# thread context and parsers all inbound packets.
|
|
236
|
+
#
|
|
237
|
+
def monitor_socket
|
|
238
|
+
|
|
239
|
+
# Skip if we are using a passive dispatcher
|
|
240
|
+
return if self.passive_service
|
|
241
|
+
|
|
242
|
+
self.comm_mutex = ::Mutex.new
|
|
243
|
+
|
|
244
|
+
self.waiters = []
|
|
245
|
+
|
|
246
|
+
@pqueue = []
|
|
247
|
+
@finish = false
|
|
248
|
+
@last_recvd = Time.now
|
|
249
|
+
@ping_sent = false
|
|
250
|
+
|
|
251
|
+
self.alive = true
|
|
252
|
+
|
|
253
|
+
# Spawn a thread for receiving packets
|
|
254
|
+
self.receiver_thread = Rex::ThreadFactory.spawn("MeterpreterReceiver", false) do
|
|
255
|
+
while (self.alive)
|
|
256
|
+
begin
|
|
257
|
+
rv = Rex::ThreadSafe.select([ self.sock.fd ], nil, nil, 0.25)
|
|
258
|
+
ping_time = 60
|
|
259
|
+
# If there's nothing to read, and it's been awhile since we
|
|
260
|
+
# saw a packet, we need to send a ping. We wait
|
|
261
|
+
# ping_time*2 seconds before deciding a session is dead.
|
|
262
|
+
if (not rv and self.send_keepalives and Time.now - @last_recvd > ping_time)
|
|
263
|
+
# If the queue is empty and we've already sent a
|
|
264
|
+
# keepalive without getting a reply, then this
|
|
265
|
+
# session is hosed, and we should give up on it.
|
|
266
|
+
if @ping_sent and @pqueue.empty? and (Time.now - @last_recvd > ping_time * 2)
|
|
267
|
+
dlog("No response to ping, session #{self.sid} is dead", LEV_3)
|
|
268
|
+
self.alive = false
|
|
269
|
+
@finish = true
|
|
270
|
+
break
|
|
271
|
+
end
|
|
272
|
+
# Let the packet queue processor finish up before
|
|
273
|
+
# we send a ping.
|
|
274
|
+
if not @ping_sent and @pqueue.empty?
|
|
275
|
+
# Our 'ping' is actually just a check for eof on
|
|
276
|
+
# channel id 0. This method has no side effects
|
|
277
|
+
# and always returns an answer (regardless of the
|
|
278
|
+
# existence of chan 0), which is all that's
|
|
279
|
+
# needed for a liveness check. The answer itself
|
|
280
|
+
# is unimportant and is ignored.
|
|
281
|
+
pkt = Packet.create_request('core_channel_eof')
|
|
282
|
+
pkt.add_tlv(TLV_TYPE_CHANNEL_ID, 0)
|
|
283
|
+
waiter = Proc.new { |response, param|
|
|
284
|
+
@ping_sent = false
|
|
285
|
+
@last_recvd = Time.now
|
|
286
|
+
}
|
|
287
|
+
send_packet(pkt, waiter)
|
|
288
|
+
@ping_sent = true
|
|
289
|
+
end
|
|
290
|
+
next
|
|
291
|
+
end
|
|
292
|
+
next if not rv
|
|
293
|
+
packet = receive_packet
|
|
294
|
+
@pqueue << packet if packet
|
|
295
|
+
@last_recvd = Time.now
|
|
296
|
+
rescue ::Exception
|
|
297
|
+
dlog("Exception caught in monitor_socket: #{$!}", 'meterpreter', LEV_1)
|
|
298
|
+
@finish = true
|
|
299
|
+
self.alive = false
|
|
300
|
+
break
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# Spawn a new thread that monitors the socket
|
|
306
|
+
self.dispatcher_thread = Rex::ThreadFactory.spawn("MeterpreterDispatcher", false) do
|
|
307
|
+
begin
|
|
308
|
+
# Whether we're finished or not is determined by the receiver
|
|
309
|
+
# thread above.
|
|
310
|
+
while(not @finish)
|
|
311
|
+
if(@pqueue.empty?)
|
|
312
|
+
::IO.select(nil, nil, nil, 0.10)
|
|
313
|
+
next
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
incomplete = []
|
|
317
|
+
backlog = []
|
|
318
|
+
|
|
319
|
+
while(@pqueue.length > 0)
|
|
320
|
+
backlog << @pqueue.shift
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
#
|
|
324
|
+
# Prioritize message processing here
|
|
325
|
+
# 1. Close should always be processed at the end
|
|
326
|
+
# 2. Command responses always before channel data
|
|
327
|
+
#
|
|
328
|
+
|
|
329
|
+
tmp_command = []
|
|
330
|
+
tmp_channel = []
|
|
331
|
+
tmp_close = []
|
|
332
|
+
backlog.each do |pkt|
|
|
333
|
+
if(pkt.response?)
|
|
334
|
+
tmp_command << pkt
|
|
335
|
+
next
|
|
336
|
+
end
|
|
337
|
+
if(pkt.method == "core_channel_close")
|
|
338
|
+
tmp_close << pkt
|
|
339
|
+
next
|
|
340
|
+
end
|
|
341
|
+
tmp_channel << pkt
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
backlog = []
|
|
345
|
+
backlog.push(*tmp_command)
|
|
346
|
+
backlog.push(*tmp_channel)
|
|
347
|
+
backlog.push(*tmp_close)
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
#
|
|
351
|
+
# Process the message queue
|
|
352
|
+
#
|
|
353
|
+
|
|
354
|
+
backlog.each do |pkt|
|
|
355
|
+
|
|
356
|
+
begin
|
|
357
|
+
if ! dispatch_inbound_packet(pkt)
|
|
358
|
+
# Only requeue packets newer than the timeout
|
|
359
|
+
if (::Time.now.to_i - pkt.created_at.to_i < PacketTimeout)
|
|
360
|
+
incomplete << pkt
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
rescue ::Exception => e
|
|
365
|
+
dlog("Dispatching exception with packet #{pkt}: #{e} #{e.backtrace}", 'meterpreter', LEV_1)
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
# If the backlog and incomplete arrays are the same, it means
|
|
370
|
+
# dispatch_inbound_packet wasn't able to handle any of the
|
|
371
|
+
# packets. When that's the case, we can get into a situation
|
|
372
|
+
# where @pqueue is not empty and, since nothing else bounds this
|
|
373
|
+
# loop, we spin CPU trying to handle packets that can't be
|
|
374
|
+
# handled. Sleep here to treat that situation as though the
|
|
375
|
+
# queue is empty.
|
|
376
|
+
if (backlog.length > 0 && backlog.length == incomplete.length)
|
|
377
|
+
::IO.select(nil, nil, nil, 0.10)
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
@pqueue.unshift(*incomplete)
|
|
381
|
+
|
|
382
|
+
if(@pqueue.length > 100)
|
|
383
|
+
dlog("Backlog has grown to over 100 in monitor_socket, dropping older packets: #{@pqueue[0 .. 25].map{|x| x.inspect}.join(" - ")}", 'meterpreter', LEV_1)
|
|
384
|
+
@pqueue = @pqueue[25 .. 100]
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
rescue ::Exception => e
|
|
388
|
+
dlog("Exception caught in monitor_socket dispatcher: #{e.class} #{e} #{e.backtrace}", 'meterpreter', LEV_1)
|
|
389
|
+
ensure
|
|
390
|
+
self.receiver_thread.kill if self.receiver_thread
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
#
|
|
397
|
+
# Parses data from the dispatcher's sock and returns a Packet context
|
|
398
|
+
# once a full packet has been received.
|
|
399
|
+
#
|
|
400
|
+
def receive_packet
|
|
401
|
+
return parser.recv(self.sock)
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
#
|
|
405
|
+
# Stop the monitor
|
|
406
|
+
#
|
|
407
|
+
def monitor_stop
|
|
408
|
+
if(self.receiver_thread)
|
|
409
|
+
self.receiver_thread.kill
|
|
410
|
+
self.receiver_thread = nil
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
if(self.dispatcher_thread)
|
|
414
|
+
self.dispatcher_thread.kill
|
|
415
|
+
self.dispatcher_thread = nil
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
##
|
|
420
|
+
#
|
|
421
|
+
# Waiter registration
|
|
422
|
+
#
|
|
423
|
+
##
|
|
424
|
+
|
|
425
|
+
#
|
|
426
|
+
# Adds a waiter association with the supplied request packet.
|
|
427
|
+
#
|
|
428
|
+
def add_response_waiter(request, completion_routine = nil, completion_param = nil)
|
|
429
|
+
waiter = PacketResponseWaiter.new(request.rid, completion_routine, completion_param)
|
|
430
|
+
|
|
431
|
+
self.waiters << waiter
|
|
432
|
+
|
|
433
|
+
return waiter
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
#
|
|
437
|
+
# Notifies a whomever is waiting for a the supplied response,
|
|
438
|
+
# if anyone.
|
|
439
|
+
#
|
|
440
|
+
def notify_response_waiter(response)
|
|
441
|
+
self.waiters.each() { |waiter|
|
|
442
|
+
if (waiter.waiting_for?(response))
|
|
443
|
+
waiter.notify(response)
|
|
444
|
+
|
|
445
|
+
remove_response_waiter(waiter)
|
|
446
|
+
|
|
447
|
+
break
|
|
448
|
+
end
|
|
449
|
+
}
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
#
|
|
453
|
+
# Removes a waiter from the list of waiters.
|
|
454
|
+
#
|
|
455
|
+
def remove_response_waiter(waiter)
|
|
456
|
+
self.waiters.delete(waiter)
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
##
|
|
460
|
+
#
|
|
461
|
+
# Dispatching
|
|
462
|
+
#
|
|
463
|
+
##
|
|
464
|
+
|
|
465
|
+
#
|
|
466
|
+
# Initializes the inbound handlers.
|
|
467
|
+
#
|
|
468
|
+
def initialize_inbound_handlers
|
|
469
|
+
@inbound_handlers = []
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
#
|
|
473
|
+
# Dispatches and processes an inbound packet. If the packet is a
|
|
474
|
+
# response that has an associated waiter, the waiter is notified.
|
|
475
|
+
# Otherwise, the packet is passed onto any registered dispatch
|
|
476
|
+
# handlers until one returns success.
|
|
477
|
+
#
|
|
478
|
+
def dispatch_inbound_packet(packet, client = nil)
|
|
479
|
+
handled = false
|
|
480
|
+
|
|
481
|
+
# If no client context was provided, return self as PacketDispatcher
|
|
482
|
+
# is a mixin for the Client instance
|
|
483
|
+
if (client == nil)
|
|
484
|
+
client = self
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
# If the packet is a response, try to notify any potential
|
|
488
|
+
# waiters
|
|
489
|
+
if ((resp = packet.response?))
|
|
490
|
+
if (notify_response_waiter(packet))
|
|
491
|
+
return true
|
|
492
|
+
end
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
# Enumerate all of the inbound packet handlers until one handles
|
|
496
|
+
# the packet
|
|
497
|
+
@inbound_handlers.each { |handler|
|
|
498
|
+
|
|
499
|
+
handled = nil
|
|
500
|
+
begin
|
|
501
|
+
|
|
502
|
+
if ! resp
|
|
503
|
+
handled = handler.request_handler(client, packet)
|
|
504
|
+
else
|
|
505
|
+
handled = handler.response_handler(client, packet)
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
rescue ::Exception => e
|
|
509
|
+
dlog("Exception caught in dispatch_inbound_packet: handler=#{handler} #{e.class} #{e} #{e.backtrace}", 'meterpreter', LEV_1)
|
|
510
|
+
return true
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
if (handled)
|
|
514
|
+
break
|
|
515
|
+
end
|
|
516
|
+
}
|
|
517
|
+
return handled
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
#
|
|
521
|
+
# Registers an inbound packet handler that implements the
|
|
522
|
+
# InboundPacketHandler interface.
|
|
523
|
+
#
|
|
524
|
+
def register_inbound_handler(handler)
|
|
525
|
+
@inbound_handlers << handler
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
#
|
|
529
|
+
# Deregisters a previously registered inbound packet handler.
|
|
530
|
+
#
|
|
531
|
+
def deregister_inbound_handler(handler)
|
|
532
|
+
@inbound_handlers.delete(handler)
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
protected
|
|
536
|
+
|
|
537
|
+
attr_accessor :receiver_thread # :nodoc:
|
|
538
|
+
attr_accessor :dispatcher_thread # :nodoc:
|
|
539
|
+
attr_accessor :waiters # :nodoc:
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
end; end; end
|
|
543
|
+
|