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
data/lib/rex/service.rb
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex'
|
|
3
|
+
require 'rex/proto'
|
|
4
|
+
|
|
5
|
+
module Rex
|
|
6
|
+
|
|
7
|
+
###
|
|
8
|
+
#
|
|
9
|
+
# The service module is used to extend classes that are passed into the
|
|
10
|
+
# service manager start routine. It provides extra methods, such as reference
|
|
11
|
+
# counting, that are used to track the service instances more uniformly.
|
|
12
|
+
#
|
|
13
|
+
###
|
|
14
|
+
module Service
|
|
15
|
+
include Ref
|
|
16
|
+
|
|
17
|
+
require 'rex/services/local_relay'
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Returns the hardcore, as in porno, alias for this service. This is used
|
|
21
|
+
# by the service manager to manage singleton services.
|
|
22
|
+
#
|
|
23
|
+
def self.hardcore_alias(*args)
|
|
24
|
+
return "__#{args}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def deref
|
|
28
|
+
rv = super
|
|
29
|
+
|
|
30
|
+
# If there's only one reference, then it's the service managers.
|
|
31
|
+
if @_references == 1
|
|
32
|
+
Rex::ServiceManager.stop_service(self)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
rv
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Calls stop on the service once the ref count drops.
|
|
40
|
+
#
|
|
41
|
+
def cleanup
|
|
42
|
+
stop
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
attr_accessor :alias
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'singleton'
|
|
3
|
+
require 'rex'
|
|
4
|
+
require 'rex/service'
|
|
5
|
+
|
|
6
|
+
module Rex
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# This class manages service allocation and interaction. This class can be
|
|
11
|
+
# used to start HTTP servers and manage them and all that stuff. Yup.
|
|
12
|
+
#
|
|
13
|
+
###
|
|
14
|
+
class ServiceManager < Hash
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# This class is a singleton.
|
|
18
|
+
#
|
|
19
|
+
include Singleton
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# Calls the instance method to start a service.
|
|
23
|
+
#
|
|
24
|
+
def self.start(klass, *args)
|
|
25
|
+
self.instance.start(klass, *args)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Calls the instance method to stop a service.
|
|
30
|
+
#
|
|
31
|
+
def self.stop(klass, *args)
|
|
32
|
+
self.instance.stop(klass, *args)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Stop a service using the alias that's associated with it.
|
|
37
|
+
#
|
|
38
|
+
def self.stop_by_alias(als)
|
|
39
|
+
self.instance.stop_by_alias(als)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# Stop the supplied service instance.
|
|
44
|
+
#
|
|
45
|
+
def self.stop_service(service)
|
|
46
|
+
self.instance.stop_service(service)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# Starts a service and assigns it a unique name in the service hash.
|
|
51
|
+
#
|
|
52
|
+
def start(klass, *args)
|
|
53
|
+
# Get the hardcore alias.
|
|
54
|
+
hals = "#{klass}" + klass.hardcore_alias(*args)
|
|
55
|
+
|
|
56
|
+
# Has a service already been constructed for this guy? If so, increment
|
|
57
|
+
# its reference count like it aint no thang.
|
|
58
|
+
if (inst = self[hals])
|
|
59
|
+
inst.ref
|
|
60
|
+
return inst
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
inst = klass.new(*args)
|
|
64
|
+
als = inst.alias
|
|
65
|
+
|
|
66
|
+
# Find an alias that isn't taken.
|
|
67
|
+
if (self[als])
|
|
68
|
+
cnt = 1
|
|
69
|
+
cnt += 1 while (self[als + " #{cnt}"])
|
|
70
|
+
als = inst.alias + " #{cnt}"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Extend the instance as a service.
|
|
74
|
+
inst.extend(Rex::Service)
|
|
75
|
+
|
|
76
|
+
# Re-aliases the instance.
|
|
77
|
+
inst.alias = als
|
|
78
|
+
|
|
79
|
+
# Fire up the engines. If an error occurs an exception will be
|
|
80
|
+
# raised.
|
|
81
|
+
inst.start
|
|
82
|
+
|
|
83
|
+
# Alias associate and initialize reference counting
|
|
84
|
+
self[als] = self[hals] = inst.refinit
|
|
85
|
+
|
|
86
|
+
# Pass the caller a reference
|
|
87
|
+
inst.ref
|
|
88
|
+
|
|
89
|
+
inst
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
#
|
|
93
|
+
# Stop a service using a given klass and arguments. These should mirror
|
|
94
|
+
# what was originally passed to start exactly. If the reference count of
|
|
95
|
+
# the service drops to zero the service will be destroyed.
|
|
96
|
+
#
|
|
97
|
+
def stop(klass, *args)
|
|
98
|
+
stop_service(hals[hardcore_alias(klass, *args)])
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
#
|
|
102
|
+
# Stops a service using the provided alias.
|
|
103
|
+
#
|
|
104
|
+
def stop_by_alias(als)
|
|
105
|
+
stop_service(self[als])
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# Stops a service instance.
|
|
110
|
+
#
|
|
111
|
+
def stop_service(inst)
|
|
112
|
+
# Stop the service and be done wif it, but only if the number of
|
|
113
|
+
# references has dropped to zero
|
|
114
|
+
if (inst)
|
|
115
|
+
# Since the instance may have multiple aliases, scan through
|
|
116
|
+
# all the pairs for matching stuff.
|
|
117
|
+
self.each_pair { |cals, cinst|
|
|
118
|
+
self.delete(cals) if (inst == cinst)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# Lose the list-held reference to the instance
|
|
122
|
+
inst.deref
|
|
123
|
+
|
|
124
|
+
return true
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Return false if the service isn't there
|
|
128
|
+
return false
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
#
|
|
132
|
+
# Overrides the builtin 'each' operator to avoid the following exception on Ruby 1.9.2+
|
|
133
|
+
# "can't add a new key into hash during iteration"
|
|
134
|
+
#
|
|
135
|
+
def each(&block)
|
|
136
|
+
list = []
|
|
137
|
+
self.keys.sort.each do |sidx|
|
|
138
|
+
list << [sidx, self[sidx]]
|
|
139
|
+
end
|
|
140
|
+
list.each(&block)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
protected
|
|
144
|
+
|
|
145
|
+
#
|
|
146
|
+
# Returns the alias for a given service instance.
|
|
147
|
+
#
|
|
148
|
+
def hardcore_alias(klass, *args)
|
|
149
|
+
"__#{klass.name}#{args}"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
end
|
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'thread'
|
|
3
|
+
require 'rex/socket'
|
|
4
|
+
|
|
5
|
+
module Rex
|
|
6
|
+
module Services
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# This service acts as a local TCP relay whereby clients can connect to a
|
|
11
|
+
# local listener that forwards to an arbitrary remote endpoint. Interaction
|
|
12
|
+
# with the remote endpoint socket requires that it implement the
|
|
13
|
+
# Rex::IO::Stream interface.
|
|
14
|
+
#
|
|
15
|
+
###
|
|
16
|
+
class LocalRelay
|
|
17
|
+
|
|
18
|
+
include Rex::Service
|
|
19
|
+
|
|
20
|
+
###
|
|
21
|
+
#
|
|
22
|
+
# This module is used to extend streams such that they can be associated
|
|
23
|
+
# with a relay context and the other side of the stream.
|
|
24
|
+
#
|
|
25
|
+
###
|
|
26
|
+
module Stream
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# This method is called when the other side has data that has been read
|
|
30
|
+
# in.
|
|
31
|
+
#
|
|
32
|
+
def on_other_data(data)
|
|
33
|
+
if (relay.on_other_data_proc)
|
|
34
|
+
relay.on_other_data_proc.call(relay, self, data)
|
|
35
|
+
else
|
|
36
|
+
put(data)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
attr_accessor :relay
|
|
41
|
+
attr_accessor :other_stream
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
###
|
|
45
|
+
#
|
|
46
|
+
# This module is used to extend stream servers such that they can be
|
|
47
|
+
# associated with a relay context.
|
|
48
|
+
#
|
|
49
|
+
###
|
|
50
|
+
module StreamServer
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# This method is called when the stream server receives a local
|
|
54
|
+
# connection such that the remote half can be allocated. The return
|
|
55
|
+
# value of the callback should be a Stream instance.
|
|
56
|
+
#
|
|
57
|
+
def on_local_connection(relay, lfd)
|
|
58
|
+
if (relay.on_local_connection_proc)
|
|
59
|
+
relay.on_local_connection_proc.call(relay, lfd)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
attr_accessor :relay
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
###
|
|
68
|
+
#
|
|
69
|
+
# This class acts as an instance of a given local relay.
|
|
70
|
+
#
|
|
71
|
+
###
|
|
72
|
+
class Relay
|
|
73
|
+
|
|
74
|
+
def initialize(name, listener, opts = {})
|
|
75
|
+
self.name = name
|
|
76
|
+
self.listener = listener
|
|
77
|
+
self.opts = opts
|
|
78
|
+
self.on_local_connection_proc = opts['OnLocalConnection']
|
|
79
|
+
self.on_conn_close_proc = opts['OnConnectionClose']
|
|
80
|
+
self.on_other_data_proc = opts['OnOtherData']
|
|
81
|
+
if (not $dispatcher['rex'])
|
|
82
|
+
register_log_source('rex', $dispatcher['core'], get_log_level('core'))
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def shutdown
|
|
87
|
+
begin
|
|
88
|
+
listener.shutdown if (listener)
|
|
89
|
+
rescue ::Exception
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def close
|
|
94
|
+
begin
|
|
95
|
+
listener.close if (listener)
|
|
96
|
+
rescue ::Exception
|
|
97
|
+
end
|
|
98
|
+
listener = nil
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
attr_reader :name, :listener, :opts
|
|
102
|
+
attr_accessor :on_local_connection_proc
|
|
103
|
+
attr_accessor :on_conn_close_proc
|
|
104
|
+
attr_accessor :on_other_data_proc
|
|
105
|
+
protected
|
|
106
|
+
attr_writer :name, :listener, :opts
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# Initializes the local tcp relay monitor.
|
|
112
|
+
#
|
|
113
|
+
def initialize
|
|
114
|
+
self.relays = Hash.new
|
|
115
|
+
self.rfds = Array.new
|
|
116
|
+
self.relay_thread = nil
|
|
117
|
+
self.relay_mutex = Mutex.new
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
##
|
|
121
|
+
#
|
|
122
|
+
# Service interface implementors
|
|
123
|
+
#
|
|
124
|
+
##
|
|
125
|
+
|
|
126
|
+
#
|
|
127
|
+
# Returns the hardcore alias for the local relay service.
|
|
128
|
+
#
|
|
129
|
+
def self.hardcore_alias(*args)
|
|
130
|
+
"__#{args}"
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
#
|
|
134
|
+
# Returns the alias for this service.
|
|
135
|
+
#
|
|
136
|
+
def alias
|
|
137
|
+
super || "Local Relay"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
#
|
|
141
|
+
# Starts the thread that monitors the local relays.
|
|
142
|
+
#
|
|
143
|
+
def start
|
|
144
|
+
if (!self.relay_thread)
|
|
145
|
+
self.relay_thread = Rex::ThreadFactory.spawn("LocalRelay", false) {
|
|
146
|
+
begin
|
|
147
|
+
monitor_relays
|
|
148
|
+
rescue ::Exception
|
|
149
|
+
elog("Error in #{self} monitor_relays: #{$!}", 'rex')
|
|
150
|
+
end
|
|
151
|
+
}
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
#
|
|
156
|
+
# Stops the thread that monitors the local relays and destroys all local
|
|
157
|
+
# listeners.
|
|
158
|
+
#
|
|
159
|
+
def stop
|
|
160
|
+
if (self.relay_thread)
|
|
161
|
+
self.relay_thread.kill
|
|
162
|
+
self.relay_thread = nil
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
self.relay_mutex.synchronize {
|
|
166
|
+
self.relays.delete_if { |k, v|
|
|
167
|
+
v.shutdown
|
|
168
|
+
v.close
|
|
169
|
+
true
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
# Flush the relay list and read fd list
|
|
174
|
+
self.relays.clear
|
|
175
|
+
self.rfds.clear
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
##
|
|
179
|
+
#
|
|
180
|
+
# Adding/removing local tcp relays
|
|
181
|
+
#
|
|
182
|
+
##
|
|
183
|
+
|
|
184
|
+
#
|
|
185
|
+
# Starts a local TCP relay.
|
|
186
|
+
#
|
|
187
|
+
def start_tcp_relay(lport, opts = {})
|
|
188
|
+
# Make sure our options are valid
|
|
189
|
+
if ((opts['PeerHost'] == nil or opts['PeerPort'] == nil) and (opts['Stream'] != true))
|
|
190
|
+
raise ArgumentError, "Missing peer host or peer port.", caller
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
listener = Rex::Socket.create_tcp_server(
|
|
194
|
+
'LocalHost' => opts['LocalHost'],
|
|
195
|
+
'LocalPort' => lport)
|
|
196
|
+
|
|
197
|
+
opts['LocalPort'] = lport
|
|
198
|
+
opts['__RelayType'] = 'tcp'
|
|
199
|
+
|
|
200
|
+
start_relay(listener, lport.to_s + (opts['LocalHost'] || '0.0.0.0'), opts)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
#
|
|
204
|
+
# Starts a local relay on the supplied local port. This listener will call
|
|
205
|
+
# the supplied callback procedures when various events occur.
|
|
206
|
+
#
|
|
207
|
+
def start_relay(stream_server, name, opts = {})
|
|
208
|
+
# Create a Relay instance with the local stream and remote stream
|
|
209
|
+
relay = Relay.new(name, stream_server, opts)
|
|
210
|
+
|
|
211
|
+
# Extend the stream_server so that we can associate it with this relay
|
|
212
|
+
stream_server.extend(StreamServer)
|
|
213
|
+
stream_server.relay = relay
|
|
214
|
+
|
|
215
|
+
# Add the stream associations the appropriate lists and hashes
|
|
216
|
+
self.relay_mutex.synchronize {
|
|
217
|
+
self.relays[name] = relay
|
|
218
|
+
|
|
219
|
+
self.rfds << stream_server
|
|
220
|
+
}
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
#
|
|
224
|
+
# Stops relaying on a given local port.
|
|
225
|
+
#
|
|
226
|
+
def stop_tcp_relay(lport, lhost = nil)
|
|
227
|
+
stop_relay(lport.to_s + (lhost || '0.0.0.0'))
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
#
|
|
231
|
+
# Stops a relay with a given name.
|
|
232
|
+
#
|
|
233
|
+
def stop_relay(name)
|
|
234
|
+
rv = false
|
|
235
|
+
|
|
236
|
+
self.relay_mutex.synchronize {
|
|
237
|
+
relay = self.relays[name]
|
|
238
|
+
|
|
239
|
+
if (relay)
|
|
240
|
+
close_relay(relay)
|
|
241
|
+
rv = true
|
|
242
|
+
end
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
rv
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
#
|
|
249
|
+
# Enumerate each TCP relay
|
|
250
|
+
#
|
|
251
|
+
def each_tcp_relay(&block)
|
|
252
|
+
self.relays.each_pair { |name, relay|
|
|
253
|
+
next if (relay.opts['__RelayType'] != 'tcp')
|
|
254
|
+
|
|
255
|
+
yield(
|
|
256
|
+
relay.opts['LocalHost'] || '0.0.0.0',
|
|
257
|
+
relay.opts['LocalPort'],
|
|
258
|
+
relay.opts['PeerHost'],
|
|
259
|
+
relay.opts['PeerPort'],
|
|
260
|
+
relay.opts)
|
|
261
|
+
}
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
protected
|
|
265
|
+
|
|
266
|
+
attr_accessor :relays, :relay_thread, :relay_mutex
|
|
267
|
+
attr_accessor :rfds
|
|
268
|
+
|
|
269
|
+
#
|
|
270
|
+
# Closes an cleans up a specific relay
|
|
271
|
+
#
|
|
272
|
+
def close_relay(relay)
|
|
273
|
+
self.rfds.delete(relay.listener)
|
|
274
|
+
self.relays.delete(relay.name)
|
|
275
|
+
|
|
276
|
+
begin
|
|
277
|
+
relay.shutdown
|
|
278
|
+
relay.close
|
|
279
|
+
rescue IOError
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
#
|
|
284
|
+
# Closes a specific relay connection without tearing down the actual relay
|
|
285
|
+
# itself.
|
|
286
|
+
#
|
|
287
|
+
def close_relay_conn(fd)
|
|
288
|
+
relay = fd.relay
|
|
289
|
+
ofd = fd.other_stream
|
|
290
|
+
|
|
291
|
+
self.rfds.delete(fd)
|
|
292
|
+
|
|
293
|
+
begin
|
|
294
|
+
if (relay.on_conn_close_proc)
|
|
295
|
+
relay.on_conn_close_proc.call(fd)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
fd.shutdown
|
|
299
|
+
fd.close
|
|
300
|
+
rescue IOError
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
if (ofd)
|
|
304
|
+
self.rfds.delete(ofd)
|
|
305
|
+
|
|
306
|
+
begin
|
|
307
|
+
if (relay.on_conn_close_proc)
|
|
308
|
+
relay.on_conn_close_proc.call(ofd)
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
ofd.shutdown
|
|
312
|
+
ofd.close
|
|
313
|
+
rescue IOError
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
#
|
|
319
|
+
# Accepts a client connection on a local relay.
|
|
320
|
+
#
|
|
321
|
+
def accept_relay_conn(srvfd)
|
|
322
|
+
relay = srvfd.relay
|
|
323
|
+
|
|
324
|
+
begin
|
|
325
|
+
dlog("Accepting relay client connection...", 'rex', LEV_3)
|
|
326
|
+
|
|
327
|
+
# Accept the child connection
|
|
328
|
+
lfd = srvfd.accept
|
|
329
|
+
dlog("Got left side of relay: #{lfd}", 'rex', LEV_3)
|
|
330
|
+
|
|
331
|
+
# Call the relay's on_local_connection method which should return a
|
|
332
|
+
# remote connection on success
|
|
333
|
+
rfd = srvfd.on_local_connection(relay, lfd)
|
|
334
|
+
|
|
335
|
+
dlog("Got right side of relay: #{rfd}", 'rex', LEV_3)
|
|
336
|
+
rescue
|
|
337
|
+
wlog("Failed to get remote half of local connection on relay #{relay.name}: #{$!}", 'rex')
|
|
338
|
+
lfd.close
|
|
339
|
+
return
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
# If we have both sides, then we rock. Extend the instances, associate
|
|
343
|
+
# them with the relay, associate them with each other, and add them to
|
|
344
|
+
# the list of polling file descriptors
|
|
345
|
+
if (lfd and rfd)
|
|
346
|
+
lfd.extend(Stream)
|
|
347
|
+
rfd.extend(Stream)
|
|
348
|
+
|
|
349
|
+
lfd.relay = relay
|
|
350
|
+
rfd.relay = relay
|
|
351
|
+
|
|
352
|
+
lfd.other_stream = rfd
|
|
353
|
+
rfd.other_stream = lfd
|
|
354
|
+
|
|
355
|
+
self.rfds << lfd
|
|
356
|
+
self.rfds << rfd
|
|
357
|
+
|
|
358
|
+
# Otherwise, we don't have both sides, we'll close them.
|
|
359
|
+
else
|
|
360
|
+
close_relay_conn(lfd)
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
#
|
|
365
|
+
# Monitors the relays for data and passes it in both directions.
|
|
366
|
+
#
|
|
367
|
+
def monitor_relays
|
|
368
|
+
begin
|
|
369
|
+
# Helps with latency
|
|
370
|
+
Thread.current.priority = 2
|
|
371
|
+
|
|
372
|
+
# Poll all the streams...
|
|
373
|
+
begin
|
|
374
|
+
socks = Rex::ThreadSafe.select(rfds, nil, nil, 0.25)
|
|
375
|
+
rescue StreamClosedError => e
|
|
376
|
+
dlog("monitor_relays: closing stream #{e.stream}", 'rex', LEV_3)
|
|
377
|
+
|
|
378
|
+
# Close the relay connection that is associated with the stream
|
|
379
|
+
# closed error
|
|
380
|
+
if (e.stream.kind_of?(Stream))
|
|
381
|
+
close_relay_conn(e.stream)
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
dlog("monitor_relays: closed stream #{e.stream}", 'rex', LEV_3)
|
|
385
|
+
|
|
386
|
+
next
|
|
387
|
+
rescue
|
|
388
|
+
elog("Error in #{self} monitor_relays select: #{$!.class} #{$!}", 'rex')
|
|
389
|
+
return
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
# If socks is nil, go again.
|
|
393
|
+
next unless socks
|
|
394
|
+
|
|
395
|
+
# Process read-ready file descriptors, if any.
|
|
396
|
+
socks[0].each { |rfd|
|
|
397
|
+
|
|
398
|
+
# If this file descriptor is a server, accept the connection
|
|
399
|
+
if (rfd.kind_of?(StreamServer))
|
|
400
|
+
accept_relay_conn(rfd)
|
|
401
|
+
# Otherwise, it's a relay connection, read data from one side
|
|
402
|
+
# and write it to the other
|
|
403
|
+
else
|
|
404
|
+
begin
|
|
405
|
+
# Pass the data onto the other fd, most likely writing it.
|
|
406
|
+
data = rfd.sysread(65536)
|
|
407
|
+
rfd.other_stream.on_other_data(data)
|
|
408
|
+
# If we catch an error, close the connection
|
|
409
|
+
rescue ::Exception
|
|
410
|
+
elog("Error in #{self} monitor_relays read: #{$!}", 'rex')
|
|
411
|
+
close_relay_conn(rfd)
|
|
412
|
+
end
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
} if (socks[0])
|
|
416
|
+
|
|
417
|
+
end while true
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
|