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,130 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
require 'bit-struct'
|
|
4
|
+
|
|
5
|
+
module Rex
|
|
6
|
+
module Proto
|
|
7
|
+
module NTP
|
|
8
|
+
|
|
9
|
+
# A very generic NTP message
|
|
10
|
+
#
|
|
11
|
+
# Uses the common/similar parts from versions 1-4 and considers everything
|
|
12
|
+
# after to be just one big field. For the particulars on the different versions,
|
|
13
|
+
# see:
|
|
14
|
+
# http://tools.ietf.org/html/rfc958#appendix-B
|
|
15
|
+
# http://tools.ietf.org/html/rfc1059#appendix-B
|
|
16
|
+
# pages 45/48 of http://tools.ietf.org/pdf/rfc1119.pdf
|
|
17
|
+
# http://tools.ietf.org/html/rfc1305#appendix-D
|
|
18
|
+
# http://tools.ietf.org/html/rfc5905#page-19
|
|
19
|
+
class NTPGeneric < BitStruct
|
|
20
|
+
# 0 1 2 3
|
|
21
|
+
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
22
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
23
|
+
# |LI | VN | mode| Stratum | Poll | Precision |
|
|
24
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
25
|
+
unsigned :li, 2, default: 0
|
|
26
|
+
unsigned :version, 3, default: 0
|
|
27
|
+
unsigned :mode, 3, default: 0
|
|
28
|
+
unsigned :stratum, 8, default: 0
|
|
29
|
+
unsigned :poll, 8, default: 0
|
|
30
|
+
unsigned :precision, 8, default: 0
|
|
31
|
+
rest :payload
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# An NTP control message. Control messages are only specified for NTP
|
|
35
|
+
# versions 2-4, but this is a fuzzer so why not try them all...
|
|
36
|
+
class NTPControl < BitStruct
|
|
37
|
+
# 0 1 2 3
|
|
38
|
+
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
39
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
40
|
+
# |00 | VN | 6 |R E M| op | Sequence |
|
|
41
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
42
|
+
# | status | association id |
|
|
43
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
44
|
+
# | offset | count |
|
|
45
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
46
|
+
unsigned :reserved, 2, default: 0
|
|
47
|
+
unsigned :version, 3, default: 0
|
|
48
|
+
unsigned :mode, 3, default: 6
|
|
49
|
+
unsigned :response, 1, default: 0
|
|
50
|
+
unsigned :error, 1, default: 0
|
|
51
|
+
unsigned :more, 1, default: 0
|
|
52
|
+
unsigned :operation, 5, default: 0
|
|
53
|
+
unsigned :sequence, 16, default: 0
|
|
54
|
+
unsigned :status, 16, default: 0
|
|
55
|
+
unsigned :association_id, 16, default: 0
|
|
56
|
+
# TODO: there *must* be bugs in the handling of these next two fields!
|
|
57
|
+
unsigned :payload_offset, 16, default: 0
|
|
58
|
+
unsigned :payload_size, 16, default: 0
|
|
59
|
+
rest :payload
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# An NTP "private" message. Private messages are only specified for NTP
|
|
63
|
+
# versions 2-4, but this is a fuzzer so why not try them all...
|
|
64
|
+
class NTPPrivate < BitStruct
|
|
65
|
+
# 0 1 2 3
|
|
66
|
+
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
67
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
68
|
+
# |R M| VN | 7 |A| Sequence | Implementation| Req code |
|
|
69
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
70
|
+
# | err | Number of data items | MBZ | Size of data item |
|
|
71
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
72
|
+
unsigned :response, 1, default: 0
|
|
73
|
+
unsigned :more, 1, default: 0
|
|
74
|
+
unsigned :version, 3, default: 0
|
|
75
|
+
unsigned :mode, 3, default: 7
|
|
76
|
+
unsigned :auth, 1, default: 0
|
|
77
|
+
unsigned :sequence, 7, default: 0
|
|
78
|
+
unsigned :implementation, 8, default: 0
|
|
79
|
+
unsigned :request_code, 8, default: 0
|
|
80
|
+
unsigned :error, 4, default: 0
|
|
81
|
+
unsigned :record_count, 12, default: 0
|
|
82
|
+
unsigned :mbz, 4, default: 0
|
|
83
|
+
unsigned :record_size, 12, default: 0
|
|
84
|
+
rest :payload
|
|
85
|
+
|
|
86
|
+
def records
|
|
87
|
+
records = []
|
|
88
|
+
1.upto(record_count) do |record_num|
|
|
89
|
+
records << payload[record_size*(record_num-1), record_size]
|
|
90
|
+
end
|
|
91
|
+
records
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def self.ntp_control(version, operation, payload = nil)
|
|
96
|
+
n = NTPControl.new
|
|
97
|
+
n.version = version
|
|
98
|
+
n.operation = operation
|
|
99
|
+
if payload
|
|
100
|
+
n.payload_offset = 0
|
|
101
|
+
n.payload_size = payload.size
|
|
102
|
+
n.payload = payload
|
|
103
|
+
end
|
|
104
|
+
n
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def self.ntp_private(version, implementation, request_code, payload = nil)
|
|
108
|
+
n = NTPPrivate.new
|
|
109
|
+
n.version = version
|
|
110
|
+
n.implementation = implementation
|
|
111
|
+
n.request_code = request_code
|
|
112
|
+
n.payload = payload if payload
|
|
113
|
+
n
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def self.ntp_generic(version, mode)
|
|
117
|
+
n = NTPGeneric.new
|
|
118
|
+
n.version = version
|
|
119
|
+
n.mode = mode
|
|
120
|
+
n
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Parses the given message and provides a description about the NTP message inside
|
|
124
|
+
def self.describe(message)
|
|
125
|
+
ntp = NTPGeneric.new(message)
|
|
126
|
+
"#{message.size}-byte version #{ntp.version} mode #{ntp.mode} reply"
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
# https://en.wikipedia.org/wiki/Printer_Job_Language
|
|
3
|
+
# See external links for PJL spec
|
|
4
|
+
|
|
5
|
+
module Rex::Proto::PJL
|
|
6
|
+
|
|
7
|
+
require "rex/proto/pjl/client"
|
|
8
|
+
|
|
9
|
+
DEFAULT_PORT = 9100
|
|
10
|
+
DEFAULT_TIMEOUT = 5
|
|
11
|
+
|
|
12
|
+
COUNT_MAX = 2_147_483_647
|
|
13
|
+
SIZE_MAX = 2_147_483_647
|
|
14
|
+
|
|
15
|
+
UEL = "\e%-12345X" # Universal Exit Language
|
|
16
|
+
PREFIX = "@PJL"
|
|
17
|
+
|
|
18
|
+
module Info
|
|
19
|
+
ID = "#{PREFIX} INFO ID"
|
|
20
|
+
STATUS = "#{PREFIX} INFO STATUS"
|
|
21
|
+
VARIABLES = "#{PREFIX} INFO VARIABLES"
|
|
22
|
+
FILESYS = "#{PREFIX} INFO FILESYS"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
RDYMSG = "#{PREFIX} RDYMSG"
|
|
26
|
+
|
|
27
|
+
FSINIT = "#{PREFIX} FSINIT"
|
|
28
|
+
FSDIRLIST = "#{PREFIX} FSDIRLIST"
|
|
29
|
+
FSUPLOAD = "#{PREFIX} FSUPLOAD"
|
|
30
|
+
|
|
31
|
+
end
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
# https://en.wikipedia.org/wiki/Printer_Job_Language
|
|
3
|
+
# See external links for PJL spec
|
|
4
|
+
|
|
5
|
+
module Rex::Proto::PJL
|
|
6
|
+
class Client
|
|
7
|
+
|
|
8
|
+
attr_reader :sock
|
|
9
|
+
|
|
10
|
+
def initialize(sock)
|
|
11
|
+
@sock = sock
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Begin a PJL job
|
|
15
|
+
#
|
|
16
|
+
# @return [void]
|
|
17
|
+
def begin_job
|
|
18
|
+
@sock.put("#{UEL}#{PREFIX}\n")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# End a PJL job
|
|
22
|
+
#
|
|
23
|
+
# @return [void]
|
|
24
|
+
def end_job
|
|
25
|
+
@sock.put(UEL)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Send an INFO request and read the response
|
|
29
|
+
#
|
|
30
|
+
# @param category [String] INFO category
|
|
31
|
+
# @return [String] INFO response
|
|
32
|
+
def info(category)
|
|
33
|
+
categories = {
|
|
34
|
+
:id => Info::ID,
|
|
35
|
+
:status => Info::STATUS,
|
|
36
|
+
:variables => Info::VARIABLES,
|
|
37
|
+
:filesys => Info::FILESYS
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
unless categories.has_key?(category)
|
|
41
|
+
raise ArgumentError, "Unknown INFO category"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
@sock.put("#{categories[category]}\n")
|
|
45
|
+
@sock.get(DEFAULT_TIMEOUT)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Get version information
|
|
49
|
+
#
|
|
50
|
+
# @return [String] Version information
|
|
51
|
+
def info_id
|
|
52
|
+
id = nil
|
|
53
|
+
|
|
54
|
+
if info(:id) =~ /"(.*?)"/m
|
|
55
|
+
id = $1
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
id
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Get environment variables
|
|
62
|
+
#
|
|
63
|
+
# @return [String] Environment variables
|
|
64
|
+
def info_variables
|
|
65
|
+
env_vars = nil
|
|
66
|
+
|
|
67
|
+
if info(:variables) =~ /#{Info::VARIABLES}\r?\n(.*?)\f/m
|
|
68
|
+
env_vars = $1
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
env_vars
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# List volumes
|
|
75
|
+
#
|
|
76
|
+
# @return [String] Volume listing
|
|
77
|
+
def info_filesys
|
|
78
|
+
filesys = nil
|
|
79
|
+
|
|
80
|
+
if info(:filesys) =~ /\[\d+ TABLE\]\r?\n(.*?)\f/m
|
|
81
|
+
filesys = $1
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
filesys
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Get the ready message
|
|
88
|
+
#
|
|
89
|
+
# @return [String] Ready message
|
|
90
|
+
def get_rdymsg
|
|
91
|
+
rdymsg = nil
|
|
92
|
+
|
|
93
|
+
if info(:status) =~ /DISPLAY="(.*?)"/m
|
|
94
|
+
rdymsg = $1
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
rdymsg
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Set the ready message
|
|
101
|
+
#
|
|
102
|
+
# @param message [String] Ready message
|
|
103
|
+
# @return [void]
|
|
104
|
+
def set_rdymsg(message)
|
|
105
|
+
@sock.put(%Q{#{RDYMSG} DISPLAY = "#{message}"\n})
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Initialize a volume
|
|
109
|
+
#
|
|
110
|
+
# @param volume [String] Volume
|
|
111
|
+
# @return [void]
|
|
112
|
+
def fsinit(volume)
|
|
113
|
+
if volume !~ /^[0-2]:$/
|
|
114
|
+
raise ArgumentError, "Volume must be 0:, 1:, or 2:"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
@sock.put(%Q{#{FSINIT} VOLUME = "#{volume}"\n})
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# List a directory
|
|
121
|
+
#
|
|
122
|
+
# @param pathname [String] Pathname
|
|
123
|
+
# @param count [Fixnum] Number of entries to list
|
|
124
|
+
# @return [String] Directory listing
|
|
125
|
+
def fsdirlist(pathname, count = COUNT_MAX)
|
|
126
|
+
if pathname !~ /^[0-2]:/
|
|
127
|
+
raise ArgumentError, "Pathname must begin with 0:, 1:, or 2:"
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
listing = nil
|
|
131
|
+
|
|
132
|
+
@sock.put(%Q{#{FSDIRLIST} NAME = "#{pathname}" ENTRY=1 COUNT=#{count}\n})
|
|
133
|
+
|
|
134
|
+
if @sock.get(DEFAULT_TIMEOUT) =~ /ENTRY=1\r?\n(.*?)\f/m
|
|
135
|
+
listing = $1
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
listing
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Download a file
|
|
142
|
+
#
|
|
143
|
+
# @param pathname [String] Pathname
|
|
144
|
+
# @param size [Fixnum] Size of file
|
|
145
|
+
# @return [String] File as a string
|
|
146
|
+
def fsupload(pathname, size = SIZE_MAX)
|
|
147
|
+
if pathname !~ /^[0-2]:/
|
|
148
|
+
raise ArgumentError, "Pathname must begin with 0:, 1:, or 2:"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
file = nil
|
|
152
|
+
|
|
153
|
+
@sock.put(%Q{#{FSUPLOAD} NAME = "#{pathname}" OFFSET=0 SIZE=#{size}\n})
|
|
154
|
+
|
|
155
|
+
if @sock.get(DEFAULT_TIMEOUT) =~ /SIZE=\d+\r?\n(.*)\f/m
|
|
156
|
+
file = $1
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
file
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
end
|
|
163
|
+
end
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
#
|
|
3
|
+
# sf - Sept 2010
|
|
4
|
+
#
|
|
5
|
+
require 'thread'
|
|
6
|
+
require 'rex/logging'
|
|
7
|
+
require 'rex/socket'
|
|
8
|
+
|
|
9
|
+
module Rex
|
|
10
|
+
module Proto
|
|
11
|
+
module Proxy
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# A Socks4a proxy server.
|
|
15
|
+
#
|
|
16
|
+
class Socks4a
|
|
17
|
+
|
|
18
|
+
#
|
|
19
|
+
# A client connected to the Socks4a server.
|
|
20
|
+
#
|
|
21
|
+
class Client
|
|
22
|
+
|
|
23
|
+
REQUEST_VERSION = 4
|
|
24
|
+
REPLY_VERSION = 0
|
|
25
|
+
|
|
26
|
+
COMMAND_CONNECT = 1
|
|
27
|
+
COMMAND_BIND = 2
|
|
28
|
+
|
|
29
|
+
REQUEST_GRANTED = 90
|
|
30
|
+
REQUEST_REJECT_FAILED = 91
|
|
31
|
+
REQUEST_REJECT_CONNECT = 92
|
|
32
|
+
REQUEST_REJECT_USERID = 93
|
|
33
|
+
|
|
34
|
+
HOST = 1
|
|
35
|
+
PORT = 2
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# A Socks4a packet.
|
|
39
|
+
#
|
|
40
|
+
class Packet
|
|
41
|
+
|
|
42
|
+
def initialize
|
|
43
|
+
@version = REQUEST_VERSION
|
|
44
|
+
@command = 0
|
|
45
|
+
@dest_port = 0
|
|
46
|
+
@dest_ip = '0.0.0.0'
|
|
47
|
+
@userid = ''
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# A helper function to recv in a Socks4a packet byte by byte.
|
|
52
|
+
#
|
|
53
|
+
# sf: we could just call raw = sock.get_once but some clients
|
|
54
|
+
# seem to need reading this byte by byte instead.
|
|
55
|
+
#
|
|
56
|
+
def Packet.recv( sock, timeout=30 )
|
|
57
|
+
raw = ''
|
|
58
|
+
# read in the 8 byte header
|
|
59
|
+
while( raw.length < 8 )
|
|
60
|
+
raw << sock.read( 1 )
|
|
61
|
+
end
|
|
62
|
+
# if its a request there will be more data
|
|
63
|
+
if( raw[0..0].unpack( 'C' ).first == REQUEST_VERSION )
|
|
64
|
+
# read in the userid
|
|
65
|
+
while( raw[8..raw.length].index( "\x00" ) == nil )
|
|
66
|
+
raw << sock.read( 1 )
|
|
67
|
+
end
|
|
68
|
+
# if a hostname is going to be present, read it in
|
|
69
|
+
ip = raw[4..7].unpack( 'N' ).first
|
|
70
|
+
if( ( ip & 0xFFFFFF00 ) == 0x00000000 and ( ip & 0x000000FF ) != 0x00 )
|
|
71
|
+
hostname = ''
|
|
72
|
+
while( hostname.index( "\x00" ) == nil )
|
|
73
|
+
hostname += sock.read( 1 )
|
|
74
|
+
end
|
|
75
|
+
raw << hostname
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
# create a packet from this raw data...
|
|
79
|
+
packet = Packet.new
|
|
80
|
+
packet.from_r( raw ) ? packet : nil
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
#
|
|
84
|
+
# Pack a packet into raw bytes for transmitting on the wire.
|
|
85
|
+
#
|
|
86
|
+
def to_r
|
|
87
|
+
raw = [ @version, @command, @dest_port, Rex::Socket.addr_atoi( @dest_ip ) ].pack( 'CCnN' )
|
|
88
|
+
return raw if( @userid.empty? )
|
|
89
|
+
return raw + [ @userid ].pack( 'Z*' )
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
#
|
|
93
|
+
# Unpack a raw packet into its components.
|
|
94
|
+
#
|
|
95
|
+
def from_r( raw )
|
|
96
|
+
return false if( raw.length < 8 )
|
|
97
|
+
@version = raw[0..0].unpack( 'C' ).first
|
|
98
|
+
return false if( @version != REQUEST_VERSION and @version != REPLY_VERSION )
|
|
99
|
+
@command = raw[1..1].unpack( 'C' ).first
|
|
100
|
+
@dest_port = raw[2..3].unpack( 'n' ).first
|
|
101
|
+
@dest_ip = Rex::Socket.addr_itoa( raw[4..7].unpack( 'N' ).first )
|
|
102
|
+
if( raw.length > 8 )
|
|
103
|
+
@userid = raw[8..raw.length].unpack( 'Z*' ).first
|
|
104
|
+
# if this is a socks4a request we can resolve the provided hostname
|
|
105
|
+
if( self.is_hostname? )
|
|
106
|
+
hostname = raw[(8+@userid.length+1)..raw.length].unpack( 'Z*' ).first
|
|
107
|
+
@dest_ip = self.resolve( hostname )
|
|
108
|
+
# fail if we couldnt resolve the hostname
|
|
109
|
+
return false if( not @dest_ip )
|
|
110
|
+
end
|
|
111
|
+
else
|
|
112
|
+
@userid = ''
|
|
113
|
+
end
|
|
114
|
+
return true
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def is_connect?
|
|
118
|
+
@command == COMMAND_CONNECT ? true : false
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def is_bind?
|
|
122
|
+
@command == COMMAND_BIND ? true : false
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
attr_accessor :version, :command, :dest_port, :dest_ip, :userid
|
|
126
|
+
|
|
127
|
+
protected
|
|
128
|
+
|
|
129
|
+
#
|
|
130
|
+
# Resolve the given hostname into a dotted IP address.
|
|
131
|
+
#
|
|
132
|
+
def resolve( hostname )
|
|
133
|
+
if( not hostname.empty? )
|
|
134
|
+
begin
|
|
135
|
+
return Rex::Socket.addr_itoa( Rex::Socket.gethostbyname( hostname )[3].unpack( 'N' ).first )
|
|
136
|
+
rescue ::SocketError
|
|
137
|
+
return nil
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
return nil
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
#
|
|
144
|
+
# As per the Socks4a spec, check to see if the provided dest_ip is 0.0.0.XX
|
|
145
|
+
# which indicates after the @userid field contains a hostname to resolve.
|
|
146
|
+
#
|
|
147
|
+
def is_hostname?
|
|
148
|
+
ip = Rex::Socket.addr_atoi( @dest_ip )
|
|
149
|
+
if( ip & 0xFFFFFF00 == 0x00000000 )
|
|
150
|
+
return true if( ip & 0x000000FF != 0x00 )
|
|
151
|
+
end
|
|
152
|
+
return false
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
#
|
|
158
|
+
# A mixin for a socket to perform a relay to another socket.
|
|
159
|
+
#
|
|
160
|
+
module Relay
|
|
161
|
+
|
|
162
|
+
#
|
|
163
|
+
# Relay data coming in from relay_sock to this socket.
|
|
164
|
+
#
|
|
165
|
+
def relay( relay_client, relay_sock )
|
|
166
|
+
@relay_client = relay_client
|
|
167
|
+
@relay_sock = relay_sock
|
|
168
|
+
# start the relay thread (modified from Rex::IO::StreamAbstraction)
|
|
169
|
+
@relay_thread = Rex::ThreadFactory.spawn("SOCKS4AProxyServerRelay", false) do
|
|
170
|
+
loop do
|
|
171
|
+
closed = false
|
|
172
|
+
buf = nil
|
|
173
|
+
|
|
174
|
+
begin
|
|
175
|
+
s = Rex::ThreadSafe.select( [ @relay_sock ], nil, nil, 0.2 )
|
|
176
|
+
if( s == nil || s[0] == nil )
|
|
177
|
+
next
|
|
178
|
+
end
|
|
179
|
+
rescue
|
|
180
|
+
closed = true
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
if( closed == false )
|
|
184
|
+
begin
|
|
185
|
+
buf = @relay_sock.sysread( 32768 )
|
|
186
|
+
closed = true if( buf == nil )
|
|
187
|
+
rescue
|
|
188
|
+
closed = true
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
if( closed == false )
|
|
193
|
+
total_sent = 0
|
|
194
|
+
total_length = buf.length
|
|
195
|
+
while( total_sent < total_length )
|
|
196
|
+
begin
|
|
197
|
+
data = buf[total_sent, buf.length]
|
|
198
|
+
sent = self.write( data )
|
|
199
|
+
if( sent > 0 )
|
|
200
|
+
total_sent += sent
|
|
201
|
+
end
|
|
202
|
+
rescue
|
|
203
|
+
closed = true
|
|
204
|
+
break
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
if( closed )
|
|
210
|
+
@relay_client.stop
|
|
211
|
+
::Thread.exit
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
#
|
|
221
|
+
# Create a new client connected to the server.
|
|
222
|
+
#
|
|
223
|
+
def initialize( server, sock )
|
|
224
|
+
@server = server
|
|
225
|
+
@lsock = sock
|
|
226
|
+
@rsock = nil
|
|
227
|
+
@client_thread = nil
|
|
228
|
+
@mutex = ::Mutex.new
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
#
|
|
232
|
+
# Start handling the client connection.
|
|
233
|
+
#
|
|
234
|
+
def start
|
|
235
|
+
# create a thread to handle this client request so as to not block the socks4a server
|
|
236
|
+
@client_thread = Rex::ThreadFactory.spawn("SOCKS4AProxyClient", false) do
|
|
237
|
+
begin
|
|
238
|
+
@server.add_client( self )
|
|
239
|
+
# get the initial client request packet
|
|
240
|
+
request = Packet.recv( @lsock )
|
|
241
|
+
raise "Invalid Socks4 request packet received." if not request
|
|
242
|
+
# handle the request
|
|
243
|
+
begin
|
|
244
|
+
# handle socks4a conenct requests
|
|
245
|
+
if( request.is_connect? )
|
|
246
|
+
# perform the connection request
|
|
247
|
+
params = {
|
|
248
|
+
'PeerHost' => request.dest_ip,
|
|
249
|
+
'PeerPort' => request.dest_port,
|
|
250
|
+
}
|
|
251
|
+
params['Context'] = @server.opts['Context'] if @server.opts.has_key?('Context')
|
|
252
|
+
|
|
253
|
+
@rsock = Rex::Socket::Tcp.create( params )
|
|
254
|
+
# and send back success to the client
|
|
255
|
+
response = Packet.new
|
|
256
|
+
response.version = REPLY_VERSION
|
|
257
|
+
response.command = REQUEST_GRANTED
|
|
258
|
+
@lsock.put( response.to_r )
|
|
259
|
+
# handle socks4a bind requests
|
|
260
|
+
elsif( request.is_bind? )
|
|
261
|
+
# create a server socket for this request
|
|
262
|
+
params = {
|
|
263
|
+
'LocalHost' => '0.0.0.0',
|
|
264
|
+
'LocalPort' => 0,
|
|
265
|
+
}
|
|
266
|
+
params['Context'] = @server.opts['Context'] if @server.opts.has_key?('Context')
|
|
267
|
+
bsock = Rex::Socket::TcpServer.create( params )
|
|
268
|
+
# send back the bind success to the client
|
|
269
|
+
response = Packet.new
|
|
270
|
+
response.version = REPLY_VERSION
|
|
271
|
+
response.command = REQUEST_GRANTED
|
|
272
|
+
response.dest_ip = '0.0.0.0'
|
|
273
|
+
response.dest_port = bsock.getlocalname()[PORT]
|
|
274
|
+
@lsock.put( response.to_r )
|
|
275
|
+
# accept a client connection (2 minute timeout as per spec)
|
|
276
|
+
begin
|
|
277
|
+
::Timeout.timeout( 120 ) do
|
|
278
|
+
@rsock = bsock.accept
|
|
279
|
+
end
|
|
280
|
+
rescue ::Timeout::Error
|
|
281
|
+
raise "Timeout reached on accept request."
|
|
282
|
+
end
|
|
283
|
+
# close the listening socket
|
|
284
|
+
bsock.close
|
|
285
|
+
# verify the connection is from the dest_ip origionally specified by the client
|
|
286
|
+
rpeer = @rsock.getpeername
|
|
287
|
+
raise "Got connection from an invalid peer." if( rpeer[HOST] != request.dest_ip )
|
|
288
|
+
# send back the client connect success to the client
|
|
289
|
+
#
|
|
290
|
+
# sf: according to the spec we send this response back to the client, however
|
|
291
|
+
# I have seen some clients who bawk if they get this second response.
|
|
292
|
+
#
|
|
293
|
+
response = Packet.new
|
|
294
|
+
response.version = REPLY_VERSION
|
|
295
|
+
response.command = REQUEST_GRANTED
|
|
296
|
+
response.dest_ip = rpeer[HOST]
|
|
297
|
+
response.dest_port = rpeer[PORT]
|
|
298
|
+
@lsock.put( response.to_r )
|
|
299
|
+
else
|
|
300
|
+
raise "Unknown request command received #{request.command} received."
|
|
301
|
+
end
|
|
302
|
+
rescue
|
|
303
|
+
# send back failure to the client
|
|
304
|
+
response = Packet.new
|
|
305
|
+
response.version = REPLY_VERSION
|
|
306
|
+
response.command = REQUEST_REJECT_FAILED
|
|
307
|
+
@lsock.put( response.to_r )
|
|
308
|
+
# raise an exception to close this client connection
|
|
309
|
+
raise "Failed to handle the clients request."
|
|
310
|
+
end
|
|
311
|
+
# setup the two way relay for full duplex io
|
|
312
|
+
@lsock.extend( Relay )
|
|
313
|
+
@rsock.extend( Relay )
|
|
314
|
+
# start the socket relays...
|
|
315
|
+
@lsock.relay( self, @rsock )
|
|
316
|
+
@rsock.relay( self, @lsock )
|
|
317
|
+
rescue
|
|
318
|
+
wlog( "Client.start - #{$!}" )
|
|
319
|
+
self.stop
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
#
|
|
325
|
+
# Stop handling the client connection.
|
|
326
|
+
#
|
|
327
|
+
def stop
|
|
328
|
+
@mutex.synchronize do
|
|
329
|
+
if( not @closed )
|
|
330
|
+
|
|
331
|
+
begin
|
|
332
|
+
@lsock.close if @lsock
|
|
333
|
+
rescue
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
begin
|
|
337
|
+
@rsock.close if @rsock
|
|
338
|
+
rescue
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
@client_thread.kill if( @client_thread and @client_thread.alive? )
|
|
342
|
+
|
|
343
|
+
@server.remove_client( self )
|
|
344
|
+
|
|
345
|
+
@closed = true
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
#
|
|
353
|
+
# Create a new Socks4a server.
|
|
354
|
+
#
|
|
355
|
+
def initialize( opts={} )
|
|
356
|
+
@opts = { 'ServerHost' => '0.0.0.0', 'ServerPort' => 1080 }
|
|
357
|
+
@opts = @opts.merge( opts )
|
|
358
|
+
@server = nil
|
|
359
|
+
@clients = ::Array.new
|
|
360
|
+
@running = false
|
|
361
|
+
@server_thread = nil
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
#
|
|
365
|
+
# Check if the server is running.
|
|
366
|
+
#
|
|
367
|
+
def is_running?
|
|
368
|
+
return @running
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
#
|
|
372
|
+
# Start the Socks4a server.
|
|
373
|
+
#
|
|
374
|
+
def start
|
|
375
|
+
begin
|
|
376
|
+
# create the servers main socket (ignore the context here because we don't want a remote bind)
|
|
377
|
+
@server = Rex::Socket::TcpServer.create( 'LocalHost' => @opts['ServerHost'], 'LocalPort' => @opts['ServerPort'] )
|
|
378
|
+
# signal we are now running
|
|
379
|
+
@running = true
|
|
380
|
+
# start the servers main thread to pick up new clients
|
|
381
|
+
@server_thread = Rex::ThreadFactory.spawn("SOCKS4AProxyServer", false) do
|
|
382
|
+
while( @running ) do
|
|
383
|
+
begin
|
|
384
|
+
# accept the client connection
|
|
385
|
+
sock = @server.accept
|
|
386
|
+
# and fire off a new client instance to handle it
|
|
387
|
+
Client.new( self, sock ).start
|
|
388
|
+
rescue
|
|
389
|
+
wlog( "Socks4a.start - server_thread - #{$!}" )
|
|
390
|
+
end
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
rescue
|
|
394
|
+
wlog( "Socks4a.start - #{$!}" )
|
|
395
|
+
return false
|
|
396
|
+
end
|
|
397
|
+
return true
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
#
|
|
401
|
+
# Block while the server is running.
|
|
402
|
+
#
|
|
403
|
+
def join
|
|
404
|
+
@server_thread.join if @server_thread
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
#
|
|
408
|
+
# Stop the Socks4a server.
|
|
409
|
+
#
|
|
410
|
+
def stop
|
|
411
|
+
if( @running )
|
|
412
|
+
# signal we are no longer running
|
|
413
|
+
@running = false
|
|
414
|
+
# stop any clients we have (create a new client array as client.stop will delete from @clients)
|
|
415
|
+
clients = []
|
|
416
|
+
clients.concat( @clients )
|
|
417
|
+
clients.each do | client |
|
|
418
|
+
client.stop
|
|
419
|
+
end
|
|
420
|
+
# close the server socket
|
|
421
|
+
@server.close if @server
|
|
422
|
+
# if the server thread did not terminate gracefully, kill it.
|
|
423
|
+
@server_thread.kill if( @server_thread and @server_thread.alive? )
|
|
424
|
+
end
|
|
425
|
+
return !@running
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
def add_client( client )
|
|
429
|
+
@clients << client
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
def remove_client( client )
|
|
433
|
+
@clients.delete( client )
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
attr_reader :opts
|
|
437
|
+
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
end; end; end
|
|
441
|
+
|