librex 0.0.4 → 0.0.5
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.
- data/README.md +12 -0
- data/lib/rex.rb +0 -0
- data/lib/rex.rb.ts.rb +0 -0
- data/lib/rex/LICENSE +0 -0
- data/lib/rex/arch.rb +0 -0
- data/lib/rex/arch/sparc.rb +0 -0
- data/lib/rex/arch/sparc.rb.ut.rb +0 -0
- data/lib/rex/arch/x86.rb +0 -0
- data/lib/rex/arch/x86.rb.ut.rb +0 -0
- data/lib/rex/assembly/nasm.rb +0 -0
- data/lib/rex/assembly/nasm.rb.ut.rb +0 -0
- data/lib/rex/codepage.map +0 -0
- data/lib/rex/compat.rb +0 -0
- data/lib/rex/constants.rb +0 -0
- data/lib/rex/elfparsey.rb +0 -0
- data/lib/rex/elfparsey/elf.rb +0 -0
- data/lib/rex/elfparsey/elfbase.rb +2 -4
- data/lib/rex/elfparsey/exceptions.rb +0 -0
- data/lib/rex/elfscan.rb +0 -0
- data/lib/rex/elfscan/scanner.rb +0 -0
- data/lib/rex/elfscan/search.rb +10 -10
- data/lib/rex/encoder/alpha2.rb +0 -0
- data/lib/rex/encoder/alpha2/alpha_mixed.rb +0 -0
- data/lib/rex/encoder/alpha2/alpha_upper.rb +0 -0
- data/lib/rex/encoder/alpha2/generic.rb +0 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +0 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +0 -0
- data/lib/rex/encoder/ndr.rb +0 -0
- data/lib/rex/encoder/ndr.rb.ut.rb +0 -0
- data/lib/rex/encoder/nonalpha.rb +0 -0
- data/lib/rex/encoder/nonupper.rb +0 -0
- data/lib/rex/encoder/xdr.rb +0 -0
- data/lib/rex/encoder/xdr.rb.ut.rb +0 -0
- data/lib/rex/encoder/xor.rb +0 -0
- data/lib/rex/encoder/xor/dword.rb +0 -0
- data/lib/rex/encoder/xor/dword_additive.rb +0 -0
- data/lib/rex/encoders/xor_dword.rb +0 -0
- data/lib/rex/encoders/xor_dword_additive.rb +0 -0
- data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -0
- data/lib/rex/encoding/xor.rb +0 -0
- data/lib/rex/encoding/xor.rb.ts.rb +0 -0
- data/lib/rex/encoding/xor/byte.rb +0 -0
- data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -0
- data/lib/rex/encoding/xor/dword.rb +0 -0
- data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -0
- data/lib/rex/encoding/xor/dword_additive.rb +0 -0
- data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -0
- data/lib/rex/encoding/xor/exceptions.rb +0 -0
- data/lib/rex/encoding/xor/generic.rb +0 -0
- data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -0
- data/lib/rex/encoding/xor/qword.rb +0 -0
- data/lib/rex/encoding/xor/word.rb +0 -0
- data/lib/rex/encoding/xor/word.rb.ut.rb +0 -0
- data/lib/rex/exceptions.rb +0 -0
- data/lib/rex/exceptions.rb.ut.rb +0 -0
- data/lib/rex/exploitation/cmdstager.rb +0 -0
- data/lib/rex/exploitation/cmdstager/base.rb +6 -1
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +0 -0
- data/lib/rex/exploitation/cmdstager/debug_write.rb +0 -0
- data/lib/rex/exploitation/cmdstager/tftp.rb +8 -8
- data/lib/rex/exploitation/cmdstager/vbs.rb +0 -0
- data/lib/rex/exploitation/egghunter.rb +143 -36
- data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -0
- data/lib/rex/exploitation/encryptjs.rb +0 -0
- data/lib/rex/exploitation/heaplib.js.b64 +0 -0
- data/lib/rex/exploitation/heaplib.rb +0 -0
- data/lib/rex/exploitation/javascriptosdetect.rb +114 -15
- data/lib/rex/exploitation/obfuscatejs.rb +0 -0
- data/lib/rex/exploitation/omelet.rb +320 -0
- data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
- data/lib/rex/exploitation/opcodedb.rb +0 -0
- data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -0
- data/lib/rex/exploitation/seh.rb +0 -0
- data/lib/rex/exploitation/seh.rb.ut.rb +0 -0
- data/lib/rex/file.rb +1 -1
- data/lib/rex/file.rb.ut.rb +0 -0
- data/lib/rex/image_source.rb +0 -0
- data/lib/rex/image_source/disk.rb +0 -0
- data/lib/rex/image_source/image_source.rb +0 -0
- data/lib/rex/image_source/memory.rb +0 -0
- data/lib/rex/io/bidirectional_pipe.rb +0 -0
- data/lib/rex/io/datagram_abstraction.rb +0 -0
- data/lib/rex/io/stream.rb +1 -1
- data/lib/rex/io/stream_abstraction.rb +0 -0
- data/lib/rex/io/stream_server.rb +0 -0
- data/lib/rex/job_container.rb +0 -1
- data/lib/rex/logging.rb +0 -0
- data/lib/rex/logging/log_dispatcher.rb +0 -0
- data/lib/rex/logging/log_sink.rb +0 -0
- data/lib/rex/logging/sinks/flatfile.rb +0 -0
- data/lib/rex/logging/sinks/stderr.rb +0 -0
- data/lib/rex/machparsey.rb +0 -0
- data/lib/rex/machparsey/exceptions.rb +0 -0
- data/lib/rex/machparsey/machbase.rb +0 -0
- data/lib/rex/machscan.rb +0 -0
- data/lib/rex/machscan/scanner.rb +0 -0
- data/lib/rex/mime.rb +0 -0
- data/lib/rex/mime/header.rb +0 -0
- data/lib/rex/mime/message.rb +0 -0
- data/lib/rex/mime/part.rb +0 -0
- data/lib/rex/nop/opty2.rb +0 -0
- data/lib/rex/nop/opty2.rb.ut.rb +0 -0
- data/lib/rex/nop/opty2_tables.rb +0 -0
- data/lib/rex/ole.rb +0 -0
- data/lib/rex/ole/clsid.rb +0 -0
- data/lib/rex/ole/difat.rb +0 -0
- data/lib/rex/ole/directory.rb +0 -0
- data/lib/rex/ole/direntry.rb +0 -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 +0 -0
- data/lib/rex/ole/header.rb +3 -3
- data/lib/rex/ole/minifat.rb +0 -0
- data/lib/rex/ole/storage.rb +4 -4
- data/lib/rex/ole/stream.rb +0 -0
- data/lib/rex/ole/substorage.rb +0 -0
- data/lib/rex/ole/util.rb +0 -0
- data/lib/rex/parser/arguments.rb +0 -0
- data/lib/rex/parser/arguments.rb.ut.rb +0 -0
- data/lib/rex/parser/ini.rb +0 -0
- data/lib/rex/parser/ini.rb.ut.rb +0 -0
- data/lib/rex/parser/nexpose_xml.rb +0 -0
- data/lib/rex/parser/nmap_xml.rb +0 -0
- data/lib/rex/payloads.rb +0 -0
- data/lib/rex/payloads/win32.rb +0 -0
- data/lib/rex/payloads/win32/common.rb +0 -0
- data/lib/rex/payloads/win32/kernel.rb +0 -0
- data/lib/rex/payloads/win32/kernel/common.rb +0 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +0 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +0 -0
- data/lib/rex/peparsey.rb +0 -0
- data/lib/rex/peparsey/exceptions.rb +0 -0
- data/lib/rex/peparsey/pe.rb +7 -1
- data/lib/rex/peparsey/pe_memdump.rb +0 -0
- data/lib/rex/peparsey/pebase.rb +27 -2
- data/lib/rex/peparsey/section.rb +0 -0
- data/lib/rex/pescan.rb +0 -0
- data/lib/rex/pescan/analyze.rb +0 -0
- data/lib/rex/pescan/scanner.rb +0 -0
- data/lib/rex/pescan/search.rb +0 -0
- data/lib/rex/platforms.rb +0 -0
- data/lib/rex/platforms/windows.rb +0 -0
- data/lib/rex/poly.rb +0 -0
- data/lib/rex/poly/block.rb +0 -0
- data/lib/rex/poly/register.rb +0 -0
- data/lib/rex/poly/register/x86.rb +0 -0
- data/lib/rex/post.rb +0 -0
- data/lib/rex/post/dir.rb +0 -0
- data/lib/rex/post/file.rb +0 -0
- data/lib/rex/post/file_stat.rb +0 -0
- data/lib/rex/post/gen.pl +0 -0
- data/lib/rex/post/io.rb +0 -0
- data/lib/rex/post/meterpreter.rb +0 -0
- data/lib/rex/post/meterpreter/channel.rb +0 -0
- data/lib/rex/post/meterpreter/channel_container.rb +0 -0
- data/lib/rex/post/meterpreter/channels/pool.rb +0 -0
- data/lib/rex/post/meterpreter/channels/pools/file.rb +0 -0
- data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +0 -0
- data/lib/rex/post/meterpreter/channels/stream.rb +0 -0
- data/lib/rex/post/meterpreter/client.rb +3 -0
- data/lib/rex/post/meterpreter/client_core.rb +0 -0
- data/lib/rex/post/meterpreter/dependencies.rb +0 -0
- data/lib/rex/post/meterpreter/extension.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
- data/lib/rex/post/meterpreter/extensions/priv/fs.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/priv/priv.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +2 -1
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +12 -10
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +31 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/{railgun → stdapi/railgun}/api_constants.rb +38106 -38105
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1804 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
- data/lib/rex/post/meterpreter/extensions/{railgun → stdapi/railgun/def}/def_kernel32.rb +3848 -3678
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/model.rb +540 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +308 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +196 -0
- data/lib/rex/post/meterpreter/extensions/{railgun → stdapi/railgun}/tlv.rb +6 -9
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +5 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +0 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +6 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +0 -0
- data/lib/rex/post/meterpreter/inbound_packet_handler.rb +0 -0
- data/lib/rex/post/meterpreter/object_aliases.rb +0 -0
- data/lib/rex/post/meterpreter/packet.rb +23 -1
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +13 -2
- data/lib/rex/post/meterpreter/packet_parser.rb +0 -0
- data/lib/rex/post/meterpreter/packet_response_waiter.rb +17 -10
- data/lib/rex/post/meterpreter/ui/console.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +12 -7
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +221 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +4 -3
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +56 -1
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +22 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +0 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +0 -0
- data/lib/rex/post/permission.rb +0 -0
- data/lib/rex/post/process.rb +0 -0
- data/lib/rex/post/thread.rb +0 -0
- data/lib/rex/post/ui.rb +0 -0
- data/lib/rex/proto.rb +0 -0
- data/lib/rex/proto.rb.ts.rb +0 -0
- data/lib/rex/proto/dcerpc.rb +0 -0
- data/lib/rex/proto/dcerpc.rb.ts.rb +0 -0
- data/lib/rex/proto/dcerpc/client.rb +3 -1
- data/lib/rex/proto/dcerpc/exceptions.rb +0 -0
- data/lib/rex/proto/dcerpc/handle.rb +0 -0
- data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -0
- data/lib/rex/proto/dcerpc/ndr.rb +0 -0
- data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -0
- data/lib/rex/proto/dcerpc/packet.rb +0 -0
- data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -0
- data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -0
- data/lib/rex/proto/dcerpc/uuid.rb +0 -0
- data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -0
- data/lib/rex/proto/dhcp.rb +7 -0
- data/lib/rex/proto/dhcp/constants.rb +33 -0
- data/lib/rex/proto/dhcp/server.rb +285 -0
- data/lib/rex/proto/drda.rb +0 -0
- data/lib/rex/proto/drda.rb.ts.rb +0 -0
- data/lib/rex/proto/drda/constants.rb +0 -0
- data/lib/rex/proto/drda/constants.rb.ut.rb +0 -0
- data/lib/rex/proto/drda/packet.rb +0 -0
- data/lib/rex/proto/drda/packet.rb.ut.rb +0 -0
- data/lib/rex/proto/drda/utils.rb +0 -0
- data/lib/rex/proto/drda/utils.rb.ut.rb +0 -0
- data/lib/rex/proto/http.rb +0 -0
- data/lib/rex/proto/http.rb.ts.rb +0 -0
- data/lib/rex/proto/http/client.rb +27 -2
- data/lib/rex/proto/http/client.rb.ut.rb +4 -2
- data/lib/rex/proto/http/handler.rb +0 -0
- data/lib/rex/proto/http/handler/erb.rb +0 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -0
- data/lib/rex/proto/http/handler/proc.rb +6 -0
- data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -0
- data/lib/rex/proto/http/header.rb +0 -0
- data/lib/rex/proto/http/header.rb.ut.rb +0 -0
- data/lib/rex/proto/http/packet.rb +20 -19
- data/lib/rex/proto/http/packet.rb.ut.rb +0 -0
- data/lib/rex/proto/http/request.rb +0 -0
- data/lib/rex/proto/http/request.rb.ut.rb +0 -0
- data/lib/rex/proto/http/response.rb +0 -0
- data/lib/rex/proto/http/response.rb.ut.rb +0 -0
- data/lib/rex/proto/http/server.rb +5 -3
- data/lib/rex/proto/http/server.rb.ut.rb +0 -0
- data/lib/rex/proto/proxy/socks4a.rb +440 -0
- data/lib/rex/proto/smb.rb +0 -0
- data/lib/rex/proto/smb.rb.ts.rb +0 -0
- data/lib/rex/proto/smb/client.rb +110 -61
- data/lib/rex/proto/smb/client.rb.ut.rb +0 -0
- data/lib/rex/proto/smb/constants.rb +5 -3
- data/lib/rex/proto/smb/constants.rb.ut.rb +0 -0
- data/lib/rex/proto/smb/crypt.rb +0 -0
- data/lib/rex/proto/smb/crypt.rb.ut.rb +0 -0
- data/lib/rex/proto/smb/exceptions.rb +0 -0
- data/lib/rex/proto/smb/simpleclient.rb +0 -0
- data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -0
- data/lib/rex/proto/smb/utils.rb +2 -0
- data/lib/rex/proto/smb/utils.rb.ut.rb +0 -0
- data/lib/rex/proto/sunrpc.rb +0 -0
- data/lib/rex/proto/sunrpc/client.rb +0 -0
- data/lib/rex/proto/tftp.rb +10 -1
- data/lib/rex/proto/tftp/constants.rb +5 -3
- data/lib/rex/proto/tftp/server.rb +79 -9
- data/lib/rex/script.rb +0 -0
- data/lib/rex/script/base.rb +0 -0
- data/lib/rex/script/meterpreter.rb +0 -0
- data/lib/rex/script/shell.rb +0 -0
- data/lib/rex/service.rb +0 -0
- data/lib/rex/service_manager.rb +0 -0
- data/lib/rex/service_manager.rb.ut.rb +0 -0
- data/lib/rex/services/local_relay.rb +0 -0
- data/lib/rex/socket.rb +6 -4
- data/lib/rex/socket.rb.ut.rb +0 -0
- data/lib/rex/socket/comm.rb +0 -0
- data/lib/rex/socket/comm/local.rb +0 -0
- data/lib/rex/socket/comm/local.rb.ut.rb +0 -0
- data/lib/rex/socket/ip.rb +0 -0
- data/lib/rex/socket/parameters.rb +0 -0
- data/lib/rex/socket/parameters.rb.ut.rb +0 -0
- data/lib/rex/socket/range_walker.rb +0 -0
- data/lib/rex/socket/range_walker.rb.ut.rb +0 -0
- data/lib/rex/socket/ssl_tcp.rb +1 -1
- data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -0
- data/lib/rex/socket/ssl_tcp_server.rb +0 -0
- data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -0
- data/lib/rex/socket/subnet_walker.rb +0 -0
- data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -0
- data/lib/rex/socket/switch_board.rb.ut.rb +0 -0
- data/lib/rex/socket/tcp.rb +0 -0
- data/lib/rex/socket/tcp.rb.ut.rb +0 -0
- data/lib/rex/socket/tcp_server.rb +0 -0
- data/lib/rex/socket/tcp_server.rb.ut.rb +0 -0
- data/lib/rex/socket/udp.rb +0 -0
- data/lib/rex/socket/udp.rb.ut.rb +0 -0
- data/lib/rex/struct2.rb +0 -0
- data/lib/rex/struct2/c_struct.rb +0 -0
- data/lib/rex/struct2/c_struct_template.rb +0 -0
- data/lib/rex/struct2/constant.rb +0 -0
- data/lib/rex/struct2/element.rb +0 -0
- data/lib/rex/struct2/generic.rb +0 -0
- data/lib/rex/struct2/restraint.rb +0 -0
- data/lib/rex/struct2/s_string.rb +0 -0
- data/lib/rex/struct2/s_struct.rb +0 -0
- data/lib/rex/sync.rb +0 -0
- data/lib/rex/sync/event.rb +0 -0
- data/lib/rex/sync/read_write_lock.rb +0 -0
- data/lib/rex/sync/ref.rb +0 -0
- data/lib/rex/sync/thread_safe.rb +0 -0
- data/lib/rex/test.rb +0 -0
- data/lib/rex/text.rb +13 -3
- data/lib/rex/text.rb.ut.rb +9 -4
- data/lib/rex/time.rb +0 -0
- data/lib/rex/transformer.rb +0 -0
- data/lib/rex/transformer.rb.ut.rb +0 -0
- data/lib/rex/ui.rb +0 -0
- data/lib/rex/ui/interactive.rb +0 -0
- data/lib/rex/ui/output.rb +0 -0
- data/lib/rex/ui/output/none.rb +0 -0
- data/lib/rex/ui/progress_tracker.rb +0 -0
- data/lib/rex/ui/subscriber.rb +0 -0
- data/lib/rex/ui/text/color.rb +0 -0
- data/lib/rex/ui/text/color.rb.ut.rb +0 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +0 -0
- data/lib/rex/ui/text/input.rb +0 -0
- data/lib/rex/ui/text/input/buffer.rb +0 -0
- data/lib/rex/ui/text/input/readline.rb +0 -0
- data/lib/rex/ui/text/input/socket.rb +0 -0
- data/lib/rex/ui/text/input/stdio.rb +0 -0
- data/lib/rex/ui/text/irb_shell.rb +0 -0
- data/lib/rex/ui/text/output.rb +0 -0
- data/lib/rex/ui/text/output/buffer.rb +0 -0
- data/lib/rex/ui/text/output/file.rb +0 -0
- data/lib/rex/ui/text/output/socket.rb +0 -0
- data/lib/rex/ui/text/output/stdio.rb +0 -0
- data/lib/rex/ui/text/progress_tracker.rb +0 -0
- data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -0
- data/lib/rex/ui/text/shell.rb +9 -6
- data/lib/rex/ui/text/table.rb +5 -0
- data/lib/rex/ui/text/table.rb.ut.rb +0 -0
- data/lib/rex/zip.rb +0 -0
- data/lib/rex/zip/archive.rb +29 -1
- data/lib/rex/zip/blocks.rb +0 -0
- data/lib/rex/zip/entry.rb +5 -1
- metadata +369 -413
- data/README +0 -8
- data/lib/rex/post/meterpreter/extensions/railgun/api.rb +0 -9303
- data/lib/rex/post/meterpreter/extensions/railgun/railgun.rb +0 -815
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/railgun.rb +0 -57
data/lib/rex/proto/drda.rb
CHANGED
|
File without changes
|
data/lib/rex/proto/drda.rb.ts.rb
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
data/lib/rex/proto/drda/utils.rb
CHANGED
|
File without changes
|
|
File without changes
|
data/lib/rex/proto/http.rb
CHANGED
|
File without changes
|
data/lib/rex/proto/http.rb.ts.rb
CHANGED
|
File without changes
|
|
@@ -8,8 +8,9 @@ module Http
|
|
|
8
8
|
|
|
9
9
|
###
|
|
10
10
|
#
|
|
11
|
-
# Acts as a client to an HTTP server, sending requests and receiving
|
|
12
|
-
#
|
|
11
|
+
# Acts as a client to an HTTP server, sending requests and receiving responses.
|
|
12
|
+
#
|
|
13
|
+
# See the RFC: http://www.w3.org/Protocols/rfc2616/rfc2616.html
|
|
13
14
|
#
|
|
14
15
|
###
|
|
15
16
|
class Client
|
|
@@ -172,6 +173,25 @@ class Client
|
|
|
172
173
|
#
|
|
173
174
|
# Create a CGI compatible request
|
|
174
175
|
#
|
|
176
|
+
# Options:
|
|
177
|
+
# - agent: User-Agent header value
|
|
178
|
+
# - basic_auth: Basic-Auth header value
|
|
179
|
+
# - connection: Connection header value
|
|
180
|
+
# - cookie: Cookie header value
|
|
181
|
+
# - ctype: Content-Type header value, default: +application/x-www-form-urlencoded+
|
|
182
|
+
# - data: HTTP data (only useful with some methods, see rfc2616)
|
|
183
|
+
# - encode: URI encode the supplied URI
|
|
184
|
+
# - headers: HTTP headers as a hash, e.g. <code>{ "X-MyHeader" => "value" }</code>
|
|
185
|
+
# - method: HTTP method to use in the request, not limited to standard methods defined by rfc2616, default: GET
|
|
186
|
+
# - proto: protocol, default: HTTP
|
|
187
|
+
# - query: raw query string
|
|
188
|
+
# - raw_headers: HTTP headers as a hash
|
|
189
|
+
# - uri: the URI to request
|
|
190
|
+
# - vars_get: GET variables as a hash to be translated into a query string
|
|
191
|
+
# - vars_post: POST variables as a hash to be translated into POST data
|
|
192
|
+
# - version: version of the protocol, default: 1.1
|
|
193
|
+
# - vhost: Host header value
|
|
194
|
+
#
|
|
175
195
|
def request_cgi(opts={})
|
|
176
196
|
c_enc = opts['encode'] || false
|
|
177
197
|
c_cgi = opts['uri'] || '/'
|
|
@@ -345,6 +365,11 @@ class Client
|
|
|
345
365
|
buff = conn.get_once(-1, 1)
|
|
346
366
|
rv = resp.parse( buff || '')
|
|
347
367
|
|
|
368
|
+
##########################################################################
|
|
369
|
+
# XXX: NOTE: BUG: get_once currently (as of r10042) rescues "Exception"
|
|
370
|
+
# As such, the following rescue block will ever be reached. -jjd
|
|
371
|
+
##########################################################################
|
|
372
|
+
|
|
348
373
|
# Handle unexpected disconnects
|
|
349
374
|
rescue ::Errno::EPIPE, ::EOFError, ::IOError
|
|
350
375
|
case resp.state
|
|
@@ -69,8 +69,10 @@ class Rex::Proto::Http::Client::UnitTest < Test::Unit::TestCase
|
|
|
69
69
|
|
|
70
70
|
resp = c.send_recv(r)
|
|
71
71
|
|
|
72
|
-
assert_equal(200, resp.code)
|
|
73
|
-
assert_equal('OK', resp.message)
|
|
72
|
+
#assert_equal(200, resp.code)
|
|
73
|
+
#assert_equal('OK', resp.message)
|
|
74
|
+
assert_equal(301, resp.code)
|
|
75
|
+
assert_equal('Moved Permanently', resp.message)
|
|
74
76
|
assert_equal('1.1', resp.proto)
|
|
75
77
|
end
|
|
76
78
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -39,6 +39,12 @@ class Handler::Proc < Handler
|
|
|
39
39
|
elog("Proc::on_request: Client closed connection prematurely", LogSource)
|
|
40
40
|
rescue
|
|
41
41
|
elog("Proc::on_request: #{$!}\n\n#{$@.join("\n")}", LogSource)
|
|
42
|
+
if self.server and self.server.context
|
|
43
|
+
exploit = self.server.context['MsfExploit']
|
|
44
|
+
if exploit
|
|
45
|
+
exploit.print_error("Exception handling request: #{$!}")
|
|
46
|
+
end
|
|
47
|
+
end
|
|
42
48
|
end
|
|
43
49
|
end
|
|
44
50
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -92,7 +92,7 @@ class Packet
|
|
|
92
92
|
end
|
|
93
93
|
end
|
|
94
94
|
rescue
|
|
95
|
-
# This rescue might be a problem because it will swallow TimeoutError
|
|
95
|
+
# XXX: BUG: This rescue might be a problem because it will swallow TimeoutError
|
|
96
96
|
self.error = $!
|
|
97
97
|
return ParseCode::Error
|
|
98
98
|
end
|
|
@@ -284,24 +284,25 @@ protected
|
|
|
284
284
|
end
|
|
285
285
|
|
|
286
286
|
# Determine how to handle data when there is no length header
|
|
287
|
-
if(self.body_bytes_left == -1
|
|
288
|
-
if(self.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
287
|
+
if (self.body_bytes_left == -1)
|
|
288
|
+
if (not self.transfer_chunked)
|
|
289
|
+
if (self.headers['Connection'].to_s.downcase.include?('keep-alive'))
|
|
290
|
+
# If we are using keep-alive, but have no content-length and
|
|
291
|
+
# no chunked transfer header, pretend this is the entire
|
|
292
|
+
# buffer and call it done
|
|
293
|
+
self.body_bytes_left = self.bufq.length
|
|
294
|
+
elsif (not self.headers['Content-Length'] and self.class == Rex::Proto::Http::Request)
|
|
295
|
+
# RFC 2616 says: "The presence of a message-body in a request
|
|
296
|
+
# is signaled by the inclusion of a Content-Length or
|
|
297
|
+
# Transfer-Encoding header field in the request's
|
|
298
|
+
# message-headers."
|
|
299
|
+
#
|
|
300
|
+
# So if we haven't seen either a Content-Length or a
|
|
301
|
+
# Transfer-Encoding header, there shouldn't be a message body.
|
|
302
|
+
self.body_bytes_left = 0
|
|
303
|
+
#else
|
|
303
304
|
# Otherwise we need to keep reading until EOF
|
|
304
|
-
|
|
305
|
+
end
|
|
305
306
|
end
|
|
306
307
|
end
|
|
307
308
|
|
|
@@ -390,7 +391,7 @@ protected
|
|
|
390
391
|
|
|
391
392
|
# If there are no more bytes left, then parsing has completed and we're
|
|
392
393
|
# ready to go.
|
|
393
|
-
if (self.transfer_chunked
|
|
394
|
+
if (not self.transfer_chunked and self.body_bytes_left == 0)
|
|
394
395
|
self.state = ParseState::Completed
|
|
395
396
|
return
|
|
396
397
|
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -99,7 +99,7 @@ class Server
|
|
|
99
99
|
# Initializes an HTTP server as listening on the provided port and
|
|
100
100
|
# hostname.
|
|
101
101
|
#
|
|
102
|
-
def initialize(port = 80, listen_host = '0.0.0.0', ssl = false, context = {})
|
|
102
|
+
def initialize(port = 80, listen_host = '0.0.0.0', ssl = false, context = {}, comm = nil)
|
|
103
103
|
self.listen_host = listen_host
|
|
104
104
|
self.listen_port = port
|
|
105
105
|
self.context = context
|
|
@@ -107,6 +107,7 @@ class Server
|
|
|
107
107
|
self.resources = {}
|
|
108
108
|
self.server_name = DefaultServer
|
|
109
109
|
self.ssl = ssl
|
|
110
|
+
self.comm = comm
|
|
110
111
|
end
|
|
111
112
|
|
|
112
113
|
#
|
|
@@ -132,7 +133,8 @@ class Server
|
|
|
132
133
|
'LocalHost' => self.listen_host,
|
|
133
134
|
'LocalPort' => self.listen_port,
|
|
134
135
|
'Context' => self.context,
|
|
135
|
-
'SSL' => self.ssl
|
|
136
|
+
'SSL' => self.ssl,
|
|
137
|
+
'Comm' => self.comm
|
|
136
138
|
)
|
|
137
139
|
|
|
138
140
|
# Register callbacks
|
|
@@ -254,7 +256,7 @@ class Server
|
|
|
254
256
|
cli.send_response(resp)
|
|
255
257
|
end
|
|
256
258
|
|
|
257
|
-
attr_accessor :listen_port, :listen_host, :server_name, :context, :ssl
|
|
259
|
+
attr_accessor :listen_port, :listen_host, :server_name, :context, :ssl, :comm
|
|
258
260
|
attr_accessor :listener, :resources
|
|
259
261
|
|
|
260
262
|
protected
|
|
File without changes
|
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
#
|
|
2
|
+
# sf - Sept 2010
|
|
3
|
+
#
|
|
4
|
+
require 'thread'
|
|
5
|
+
require 'rex/logging'
|
|
6
|
+
require 'rex/socket'
|
|
7
|
+
|
|
8
|
+
module Rex
|
|
9
|
+
module Proto
|
|
10
|
+
module Proxy
|
|
11
|
+
|
|
12
|
+
#
|
|
13
|
+
# A Socks4a proxy server.
|
|
14
|
+
#
|
|
15
|
+
class Socks4a
|
|
16
|
+
|
|
17
|
+
#
|
|
18
|
+
# A client connected to the Socks4a server.
|
|
19
|
+
#
|
|
20
|
+
class Client
|
|
21
|
+
|
|
22
|
+
REQUEST_VERSION = 4
|
|
23
|
+
REPLY_VERSION = 0
|
|
24
|
+
|
|
25
|
+
COMMAND_CONNECT = 1
|
|
26
|
+
COMMAND_BIND = 2
|
|
27
|
+
|
|
28
|
+
REQUEST_GRANTED = 90
|
|
29
|
+
REQUEST_REJECT_FAILED = 91
|
|
30
|
+
REQUEST_REJECT_CONNECT = 92
|
|
31
|
+
REQUEST_REJECT_USERID = 93
|
|
32
|
+
|
|
33
|
+
HOST = 1
|
|
34
|
+
PORT = 2
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# A Socks4a packet.
|
|
38
|
+
#
|
|
39
|
+
class Packet
|
|
40
|
+
|
|
41
|
+
def initialize
|
|
42
|
+
@version = REQUEST_VERSION
|
|
43
|
+
@command = 0
|
|
44
|
+
@dest_port = 0
|
|
45
|
+
@dest_ip = '0.0.0.0'
|
|
46
|
+
@userid = ''
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# A helper function to recv in a Socks4a packet byte by byte.
|
|
51
|
+
#
|
|
52
|
+
# sf: we could just call raw = sock.get_once but some clients
|
|
53
|
+
# seem to need reading this byte by byte instead.
|
|
54
|
+
#
|
|
55
|
+
def Packet.recv( sock, timeout=30 )
|
|
56
|
+
raw = ''
|
|
57
|
+
# read in the 8 byte header
|
|
58
|
+
while( raw.length < 8 )
|
|
59
|
+
raw << sock.read( 1 )
|
|
60
|
+
end
|
|
61
|
+
# if its a request there will be more data
|
|
62
|
+
if( raw[0..0].unpack( 'C' ).first == REQUEST_VERSION )
|
|
63
|
+
# read in the userid
|
|
64
|
+
while( raw[8..raw.length].index( "\x00" ) == nil )
|
|
65
|
+
raw << sock.read( 1 )
|
|
66
|
+
end
|
|
67
|
+
# if a hostname is going to be present, read it in
|
|
68
|
+
ip = raw[4..7].unpack( 'N' ).first
|
|
69
|
+
if( ( ip & 0xFFFFFF00 ) == 0x00000000 and ( ip & 0x000000FF ) != 0x00 )
|
|
70
|
+
hostname = ''
|
|
71
|
+
while( hostname.index( "\x00" ) == nil )
|
|
72
|
+
hostname += sock.read( 1 )
|
|
73
|
+
end
|
|
74
|
+
raw << hostname
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
# create a packet from this raw data...
|
|
78
|
+
packet = Packet.new
|
|
79
|
+
packet.from_r( raw ) ? packet : nil
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
#
|
|
83
|
+
# Pack a packet into raw bytes for transmitting on the wire.
|
|
84
|
+
#
|
|
85
|
+
def to_r
|
|
86
|
+
raw = [ @version, @command, @dest_port, Rex::Socket.addr_atoi( @dest_ip ) ].pack( 'CCnN' )
|
|
87
|
+
return raw if( @userid.empty? )
|
|
88
|
+
return raw + [ @userid ].pack( 'Z*' )
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
#
|
|
92
|
+
# Unpack a raw packet into its components.
|
|
93
|
+
#
|
|
94
|
+
def from_r( raw )
|
|
95
|
+
return false if( raw.length < 8 )
|
|
96
|
+
@version = raw[0..0].unpack( 'C' ).first
|
|
97
|
+
return false if( @version != REQUEST_VERSION and @version != REPLY_VERSION )
|
|
98
|
+
@command = raw[1..1].unpack( 'C' ).first
|
|
99
|
+
@dest_port = raw[2..3].unpack( 'n' ).first
|
|
100
|
+
@dest_ip = Rex::Socket.addr_itoa( raw[4..7].unpack( 'N' ).first )
|
|
101
|
+
if( raw.length > 8 )
|
|
102
|
+
@userid = raw[8..raw.length].unpack( 'Z*' ).first
|
|
103
|
+
# if this is a socks4a request we can resolve the provided hostname
|
|
104
|
+
if( self.is_hostname? )
|
|
105
|
+
hostname = raw[(8+@userid.length+1)..raw.length].unpack( 'Z*' ).first
|
|
106
|
+
@dest_ip = self.resolve( hostname )
|
|
107
|
+
# fail if we couldnt resolve the hostname
|
|
108
|
+
return false if( not @dest_ip )
|
|
109
|
+
end
|
|
110
|
+
else
|
|
111
|
+
@userid = ''
|
|
112
|
+
end
|
|
113
|
+
return true
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def is_connect?
|
|
117
|
+
@command == COMMAND_CONNECT ? true : false
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def is_bind?
|
|
121
|
+
@command == COMMAND_BIND ? true : false
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
attr_accessor :version, :command, :dest_port, :dest_ip, :userid
|
|
125
|
+
|
|
126
|
+
protected
|
|
127
|
+
|
|
128
|
+
#
|
|
129
|
+
# Resolve the given hostname into a dotted IP address.
|
|
130
|
+
#
|
|
131
|
+
def resolve( hostname )
|
|
132
|
+
if( not hostname.empty? )
|
|
133
|
+
begin
|
|
134
|
+
return Rex::Socket.addr_itoa( Rex::Socket.gethostbyname( hostname )[3].unpack( 'N' ).first )
|
|
135
|
+
rescue ::SocketError
|
|
136
|
+
return nil
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
return nil
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#
|
|
143
|
+
# As per the Socks4a spec, check to see if the provided dest_ip is 0.0.0.XX
|
|
144
|
+
# which indicates after the @userid field contains a hostname to resolve.
|
|
145
|
+
#
|
|
146
|
+
def is_hostname?
|
|
147
|
+
ip = Rex::Socket.addr_atoi( @dest_ip )
|
|
148
|
+
if( ip & 0xFFFFFF00 == 0x00000000 )
|
|
149
|
+
return true if( ip & 0x000000FF != 0x00 )
|
|
150
|
+
end
|
|
151
|
+
return false
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
#
|
|
157
|
+
# A mixin for a socket to perform a relay to another socket.
|
|
158
|
+
#
|
|
159
|
+
module Relay
|
|
160
|
+
|
|
161
|
+
#
|
|
162
|
+
# Relay data coming in from relay_sock to this socket.
|
|
163
|
+
#
|
|
164
|
+
def relay( relay_client, relay_sock )
|
|
165
|
+
@relay_client = relay_client
|
|
166
|
+
@relay_sock = relay_sock
|
|
167
|
+
# start the relay thread (modified from Rex::IO::StreamAbstraction)
|
|
168
|
+
@relay_thread = ::Thread.new do
|
|
169
|
+
loop do
|
|
170
|
+
closed = false
|
|
171
|
+
buf = nil
|
|
172
|
+
|
|
173
|
+
begin
|
|
174
|
+
s = Rex::ThreadSafe.select( [ @relay_sock ], nil, nil, 0.2 )
|
|
175
|
+
if( s == nil || s[0] == nil )
|
|
176
|
+
next
|
|
177
|
+
end
|
|
178
|
+
rescue
|
|
179
|
+
closed = true
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
if( closed == false )
|
|
183
|
+
begin
|
|
184
|
+
buf = @relay_sock.sysread( 32768 )
|
|
185
|
+
closed = true if( buf == nil )
|
|
186
|
+
rescue
|
|
187
|
+
closed = true
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
if( closed == false )
|
|
192
|
+
total_sent = 0
|
|
193
|
+
total_length = buf.length
|
|
194
|
+
while( total_sent < total_length )
|
|
195
|
+
begin
|
|
196
|
+
data = buf[0, buf.length]
|
|
197
|
+
sent = self.write( data )
|
|
198
|
+
if( sent > 0 )
|
|
199
|
+
total_sent += sent
|
|
200
|
+
buf[0, 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
|
+
@closed = false
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
#
|
|
233
|
+
# Start handling the client connection.
|
|
234
|
+
#
|
|
235
|
+
def start
|
|
236
|
+
# create a thread to handle this client request so as to not block the socks4a server
|
|
237
|
+
@client_thread = ::Thread.new do
|
|
238
|
+
begin
|
|
239
|
+
@server.add_client( self )
|
|
240
|
+
# get the initial client request packet
|
|
241
|
+
request = Packet.recv( @lsock )
|
|
242
|
+
raise "Invalid Socks4 request packet received." if not request
|
|
243
|
+
# handle the request
|
|
244
|
+
begin
|
|
245
|
+
# handle socks4a conenct requests
|
|
246
|
+
if( request.is_connect? )
|
|
247
|
+
# perform the connection request
|
|
248
|
+
params = {
|
|
249
|
+
'PeerHost' => request.dest_ip,
|
|
250
|
+
'PeerPort' => request.dest_port,
|
|
251
|
+
'Comm' => @server.opts['Comm']
|
|
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
|
+
'Comm' => @server.opts['Comm']
|
|
266
|
+
}
|
|
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, 'Comm' => nil }
|
|
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
|
|
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 = ::Thread.new 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
|
|
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
|