librex 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.
- data/README +4 -0
- data/lib/rex.rb +101 -0
- data/lib/rex.rb.ts.rb +70 -0
- data/lib/rex/LICENSE +29 -0
- data/lib/rex/arch.rb +103 -0
- data/lib/rex/arch/sparc.rb +75 -0
- data/lib/rex/arch/sparc.rb.ut.rb +18 -0
- data/lib/rex/arch/x86.rb +513 -0
- data/lib/rex/arch/x86.rb.ut.rb +93 -0
- data/lib/rex/assembly/nasm.rb +100 -0
- data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +281 -0
- data/lib/rex/constants.rb +113 -0
- data/lib/rex/elfparsey.rb +11 -0
- data/lib/rex/elfparsey/elf.rb +123 -0
- data/lib/rex/elfparsey/elfbase.rb +260 -0
- data/lib/rex/elfparsey/exceptions.rb +27 -0
- data/lib/rex/elfscan.rb +12 -0
- data/lib/rex/elfscan/scanner.rb +207 -0
- data/lib/rex/elfscan/search.rb +46 -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 +113 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
- data/lib/rex/encoder/ndr.rb +89 -0
- data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
- data/lib/rex/encoder/nonalpha.rb +61 -0
- data/lib/rex/encoder/nonupper.rb +64 -0
- data/lib/rex/encoder/xdr.rb +106 -0
- data/lib/rex/encoder/xdr.rb.ut.rb +29 -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/encoders/xor_dword_additive.rb.ut.rb +12 -0
- data/lib/rex/encoding/xor.rb +20 -0
- data/lib/rex/encoding/xor.rb.ts.rb +14 -0
- data/lib/rex/encoding/xor/byte.rb +15 -0
- data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/dword_additive.rb +92 -0
- data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/exceptions.rb +17 -0
- data/lib/rex/encoding/xor/generic.rb +146 -0
- data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
- data/lib/rex/encoding/xor/qword.rb +15 -0
- data/lib/rex/encoding/xor/word.rb +21 -0
- data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
- data/lib/rex/exceptions.rb +275 -0
- data/lib/rex/exceptions.rb.ut.rb +44 -0
- data/lib/rex/exploitation/cmdstager.rb +133 -0
- data/lib/rex/exploitation/egghunter.rb +143 -0
- data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
- data/lib/rex/exploitation/encryptjs.rb +77 -0
- data/lib/rex/exploitation/heaplib.js.b64 +331 -0
- data/lib/rex/exploitation/heaplib.rb +94 -0
- data/lib/rex/exploitation/javascriptosdetect.rb +735 -0
- data/lib/rex/exploitation/obfuscatejs.rb +335 -0
- data/lib/rex/exploitation/opcodedb.rb +818 -0
- data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
- data/lib/rex/exploitation/seh.rb +92 -0
- data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
- data/lib/rex/file.rb +84 -0
- data/lib/rex/file.rb.ut.rb +16 -0
- data/lib/rex/image_source.rb +12 -0
- data/lib/rex/image_source/disk.rb +60 -0
- data/lib/rex/image_source/image_source.rb +46 -0
- data/lib/rex/image_source/memory.rb +37 -0
- data/lib/rex/io/bidirectional_pipe.rb +157 -0
- data/lib/rex/io/datagram_abstraction.rb +35 -0
- data/lib/rex/io/stream.rb +313 -0
- data/lib/rex/io/stream_abstraction.rb +186 -0
- data/lib/rex/io/stream_server.rb +211 -0
- data/lib/rex/job_container.rb +202 -0
- data/lib/rex/logging.rb +4 -0
- data/lib/rex/logging/log_dispatcher.rb +179 -0
- data/lib/rex/logging/log_sink.rb +42 -0
- data/lib/rex/logging/sinks/flatfile.rb +55 -0
- data/lib/rex/logging/sinks/stderr.rb +43 -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 +9 -0
- data/lib/rex/mime/header.rb +75 -0
- data/lib/rex/mime/message.rb +112 -0
- data/lib/rex/mime/part.rb +20 -0
- data/lib/rex/nop/opty2.rb +108 -0
- data/lib/rex/nop/opty2.rb.ut.rb +23 -0
- data/lib/rex/nop/opty2_tables.rb +300 -0
- data/lib/rex/ole.rb +128 -0
- data/lib/rex/ole/clsid.rb +47 -0
- data/lib/rex/ole/difat.rb +141 -0
- data/lib/rex/ole/directory.rb +230 -0
- data/lib/rex/ole/direntry.rb +240 -0
- data/lib/rex/ole/fat.rb +99 -0
- data/lib/rex/ole/header.rb +204 -0
- data/lib/rex/ole/minifat.rb +77 -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 +395 -0
- data/lib/rex/ole/stream.rb +53 -0
- data/lib/rex/ole/substorage.rb +49 -0
- data/lib/rex/ole/util.rb +157 -0
- data/lib/rex/parser/arguments.rb +97 -0
- data/lib/rex/parser/arguments.rb.ut.rb +67 -0
- data/lib/rex/parser/ini.rb +185 -0
- data/lib/rex/parser/ini.rb.ut.rb +29 -0
- data/lib/rex/parser/nmap_xml.rb +111 -0
- data/lib/rex/payloads.rb +1 -0
- data/lib/rex/payloads/win32.rb +2 -0
- data/lib/rex/payloads/win32/common.rb +26 -0
- data/lib/rex/payloads/win32/kernel.rb +53 -0
- data/lib/rex/payloads/win32/kernel/common.rb +54 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
- data/lib/rex/payloads/win32/kernel/stager.rb +171 -0
- data/lib/rex/peparsey.rb +12 -0
- data/lib/rex/peparsey/exceptions.rb +32 -0
- data/lib/rex/peparsey/pe.rb +188 -0
- data/lib/rex/peparsey/pe_memdump.rb +63 -0
- data/lib/rex/peparsey/pebase.rb +1655 -0
- data/lib/rex/peparsey/section.rb +136 -0
- data/lib/rex/pescan.rb +13 -0
- data/lib/rex/pescan/analyze.rb +309 -0
- data/lib/rex/pescan/scanner.rb +206 -0
- data/lib/rex/pescan/search.rb +56 -0
- data/lib/rex/platforms.rb +1 -0
- data/lib/rex/platforms/windows.rb +51 -0
- data/lib/rex/poly.rb +132 -0
- data/lib/rex/poly/block.rb +468 -0
- data/lib/rex/poly/register.rb +100 -0
- data/lib/rex/poly/register/x86.rb +40 -0
- data/lib/rex/post.rb +8 -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 +4 -0
- data/lib/rex/post/meterpreter/channel.rb +438 -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 +335 -0
- data/lib/rex/post/meterpreter/client_core.rb +274 -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/espia/espia.rb +58 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -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 +104 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +24 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +273 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +235 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +167 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +192 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +139 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +184 -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 +61 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +361 -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 +279 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +182 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +174 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +185 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -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 +596 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +409 -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 +135 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +595 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +63 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +376 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +270 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +484 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -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 +12 -0
- data/lib/rex/proto.rb.ts.rb +8 -0
- data/lib/rex/proto/dcerpc.rb +6 -0
- data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
- data/lib/rex/proto/dcerpc/client.rb +358 -0
- data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
- data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
- data/lib/rex/proto/dcerpc/handle.rb +47 -0
- data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
- data/lib/rex/proto/dcerpc/ndr.rb +72 -0
- data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
- data/lib/rex/proto/dcerpc/packet.rb +253 -0
- data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
- data/lib/rex/proto/dcerpc/response.rb +186 -0
- data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
- data/lib/rex/proto/dcerpc/uuid.rb +84 -0
- data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
- data/lib/rex/proto/drda.rb +5 -0
- data/lib/rex/proto/drda.rb.ts.rb +17 -0
- data/lib/rex/proto/drda/constants.rb +49 -0
- data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
- data/lib/rex/proto/drda/packet.rb +252 -0
- data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
- data/lib/rex/proto/drda/utils.rb +123 -0
- data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
- data/lib/rex/proto/http.rb +5 -0
- data/lib/rex/proto/http.rb.ts.rb +12 -0
- data/lib/rex/proto/http/client.rb +817 -0
- data/lib/rex/proto/http/client.rb.ut.rb +93 -0
- data/lib/rex/proto/http/handler.rb +46 -0
- data/lib/rex/proto/http/handler/erb.rb +128 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
- data/lib/rex/proto/http/handler/proc.rb +54 -0
- data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
- data/lib/rex/proto/http/header.rb +161 -0
- data/lib/rex/proto/http/header.rb.ut.rb +46 -0
- data/lib/rex/proto/http/packet.rb +394 -0
- data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
- data/lib/rex/proto/http/request.rb +356 -0
- data/lib/rex/proto/http/request.rb.ut.rb +214 -0
- data/lib/rex/proto/http/response.rb +85 -0
- data/lib/rex/proto/http/response.rb.ut.rb +149 -0
- data/lib/rex/proto/http/server.rb +367 -0
- data/lib/rex/proto/http/server.rb.ut.rb +79 -0
- data/lib/rex/proto/smb.rb +7 -0
- data/lib/rex/proto/smb.rb.ts.rb +8 -0
- data/lib/rex/proto/smb/client.rb +1733 -0
- data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
- data/lib/rex/proto/smb/constants.rb +1062 -0
- data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
- data/lib/rex/proto/smb/crypt.rb +95 -0
- data/lib/rex/proto/smb/crypt.rb.ut.rb +20 -0
- data/lib/rex/proto/smb/evasions.rb +65 -0
- data/lib/rex/proto/smb/exceptions.rb +846 -0
- data/lib/rex/proto/smb/simpleclient.rb +292 -0
- data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
- data/lib/rex/proto/smb/utils.rb +514 -0
- data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
- data/lib/rex/proto/sunrpc.rb +1 -0
- data/lib/rex/proto/sunrpc/client.rb +195 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +59 -0
- data/lib/rex/script/meterpreter.rb +9 -0
- data/lib/rex/script/shell.rb +9 -0
- data/lib/rex/service.rb +48 -0
- data/lib/rex/service_manager.rb +141 -0
- data/lib/rex/service_manager.rb.ut.rb +32 -0
- data/lib/rex/services/local_relay.rb +423 -0
- data/lib/rex/socket.rb +586 -0
- data/lib/rex/socket.rb.ut.rb +86 -0
- data/lib/rex/socket/comm.rb +119 -0
- data/lib/rex/socket/comm/local.rb +409 -0
- data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
- data/lib/rex/socket/ip.rb +129 -0
- data/lib/rex/socket/parameters.rb +345 -0
- data/lib/rex/socket/parameters.rb.ut.rb +51 -0
- data/lib/rex/socket/range_walker.rb +295 -0
- data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
- data/lib/rex/socket/ssl_tcp.rb +184 -0
- data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
- data/lib/rex/socket/ssl_tcp_server.rb +122 -0
- data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +51 -0
- data/lib/rex/socket/subnet_walker.rb +75 -0
- data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
- data/lib/rex/socket/switch_board.rb +272 -0
- data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
- data/lib/rex/socket/tcp.rb +76 -0
- data/lib/rex/socket/tcp.rb.ut.rb +64 -0
- data/lib/rex/socket/tcp_server.rb +67 -0
- data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
- data/lib/rex/socket/udp.rb +157 -0
- data/lib/rex/socket/udp.rb.ut.rb +44 -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 +94 -0
- data/lib/rex/sync/read_write_lock.rb +176 -0
- data/lib/rex/sync/ref.rb +57 -0
- data/lib/rex/sync/thread_safe.rb +82 -0
- data/lib/rex/test.rb +35 -0
- data/lib/rex/text.rb +1029 -0
- data/lib/rex/text.rb.ut.rb +168 -0
- data/lib/rex/time.rb +65 -0
- data/lib/rex/transformer.rb +115 -0
- data/lib/rex/transformer.rb.ut.rb +38 -0
- data/lib/rex/ui.rb +21 -0
- data/lib/rex/ui/interactive.rb +252 -0
- data/lib/rex/ui/output.rb +80 -0
- data/lib/rex/ui/output/none.rb +18 -0
- data/lib/rex/ui/progress_tracker.rb +96 -0
- data/lib/rex/ui/subscriber.rb +149 -0
- data/lib/rex/ui/text/color.rb +97 -0
- data/lib/rex/ui/text/color.rb.ut.rb +18 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +382 -0
- data/lib/rex/ui/text/input.rb +117 -0
- data/lib/rex/ui/text/input/buffer.rb +75 -0
- data/lib/rex/ui/text/input/readline.rb +129 -0
- data/lib/rex/ui/text/input/socket.rb +95 -0
- data/lib/rex/ui/text/input/stdio.rb +45 -0
- data/lib/rex/ui/text/irb_shell.rb +55 -0
- data/lib/rex/ui/text/output.rb +80 -0
- data/lib/rex/ui/text/output/buffer.rb +65 -0
- data/lib/rex/ui/text/output/file.rb +37 -0
- data/lib/rex/ui/text/output/socket.rb +43 -0
- data/lib/rex/ui/text/output/stdio.rb +40 -0
- data/lib/rex/ui/text/progress_tracker.rb +56 -0
- data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
- data/lib/rex/ui/text/shell.rb +321 -0
- data/lib/rex/ui/text/table.rb +254 -0
- data/lib/rex/ui/text/table.rb.ut.rb +55 -0
- data/lib/rex/zip.rb +93 -0
- data/lib/rex/zip/archive.rb +91 -0
- data/lib/rex/zip/blocks.rb +182 -0
- data/lib/rex/zip/entry.rb +95 -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 +435 -0
data/lib/rex/socket.rb
ADDED
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
require 'socket'
|
|
2
|
+
require 'thread'
|
|
3
|
+
require 'resolv'
|
|
4
|
+
require 'rex/exceptions'
|
|
5
|
+
|
|
6
|
+
module Rex
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# Base class for all sockets.
|
|
11
|
+
#
|
|
12
|
+
###
|
|
13
|
+
module Socket
|
|
14
|
+
|
|
15
|
+
module Comm
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
require 'rex/socket/parameters'
|
|
19
|
+
require 'rex/socket/tcp'
|
|
20
|
+
require 'rex/socket/tcp_server'
|
|
21
|
+
|
|
22
|
+
require 'rex/socket/comm'
|
|
23
|
+
require 'rex/socket/comm/local'
|
|
24
|
+
|
|
25
|
+
require 'rex/socket/switch_board'
|
|
26
|
+
require 'rex/socket/subnet_walker'
|
|
27
|
+
require 'rex/socket/range_walker'
|
|
28
|
+
|
|
29
|
+
##
|
|
30
|
+
#
|
|
31
|
+
# Factory methods
|
|
32
|
+
#
|
|
33
|
+
##
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Create a socket instance using the supplied parameter hash.
|
|
37
|
+
#
|
|
38
|
+
def self.create(opts = {})
|
|
39
|
+
return create_param(Rex::Socket::Parameters.from_hash(opts))
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# Create a socket using the supplied Rex::Socket::Parameter instance.
|
|
44
|
+
#
|
|
45
|
+
def self.create_param(param)
|
|
46
|
+
return param.comm.create(param)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# Create a TCP socket using the supplied parameter hash.
|
|
51
|
+
#
|
|
52
|
+
def self.create_tcp(opts = {})
|
|
53
|
+
return create_param(Rex::Socket::Parameters.from_hash(opts.merge('Proto' => 'tcp')))
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Create a TCP server socket using the supplied parameter hash.
|
|
58
|
+
#
|
|
59
|
+
def self.create_tcp_server(opts = {})
|
|
60
|
+
return create_tcp(opts.merge('Server' => true))
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Create a UDP socket using the supplied parameter hash.
|
|
65
|
+
#
|
|
66
|
+
def self.create_udp(opts = {})
|
|
67
|
+
return create_param(Rex::Socket::Parameters.from_hash(opts.merge('Proto' => 'udp')))
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# Create a IP socket using the supplied parameter hash.
|
|
72
|
+
#
|
|
73
|
+
def self.create_ip(opts = {})
|
|
74
|
+
return create_param(Rex::Socket::Parameters.from_hash(opts.merge('Proto' => 'ip')))
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
##
|
|
78
|
+
#
|
|
79
|
+
# Serialization
|
|
80
|
+
#
|
|
81
|
+
##
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# Cache our IPv6 support flag
|
|
85
|
+
@@support_ipv6 = nil
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# Determine whether we support IPv6
|
|
89
|
+
#
|
|
90
|
+
def self.support_ipv6?
|
|
91
|
+
return @@support_ipv6 if not @@support_ipv6.nil?
|
|
92
|
+
|
|
93
|
+
@@support_ipv6 = false
|
|
94
|
+
|
|
95
|
+
if (::Socket.const_defined?('AF_INET6'))
|
|
96
|
+
begin
|
|
97
|
+
s = ::Socket.new(::Socket::AF_INET6, ::Socket::SOCK_DGRAM, ::Socket::IPPROTO_UDP)
|
|
98
|
+
s.close
|
|
99
|
+
@@support_ipv6 = true
|
|
100
|
+
rescue
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
return @@support_ipv6
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
#
|
|
108
|
+
# Determine whether this is an IPv4 address
|
|
109
|
+
#
|
|
110
|
+
def self.is_ipv4?(addr)
|
|
111
|
+
res = Rex::Socket.getaddress(addr)
|
|
112
|
+
res.match(/:/) ? false : true
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
#
|
|
116
|
+
# Determine whether this is an IPv6 address
|
|
117
|
+
#
|
|
118
|
+
def self.is_ipv6?(addr)
|
|
119
|
+
res = Rex::Socket.getaddress(addr)
|
|
120
|
+
res.match(/:/) ? true : false
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
#
|
|
124
|
+
# Checks to see if the supplied address is a dotted quad.
|
|
125
|
+
#
|
|
126
|
+
def self.dotted_ip?(addr)
|
|
127
|
+
# Assume anything with a colon is IPv6
|
|
128
|
+
return true if (support_ipv6? and addr =~ /:/)
|
|
129
|
+
|
|
130
|
+
# Otherwise assume this is IPv4
|
|
131
|
+
(addr =~ /^(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))$/) ? true : false
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
#
|
|
135
|
+
# Wrapper for Resolv.getaddress that takes special care to see if the
|
|
136
|
+
# supplied address is already a dotted quad, for instance. This is
|
|
137
|
+
# necessary to prevent calls to gethostbyaddr (which occurs on windows).
|
|
138
|
+
# These calls can be quite slow.
|
|
139
|
+
#
|
|
140
|
+
def self.getaddress(addr)
|
|
141
|
+
begin
|
|
142
|
+
dotted_ip?(addr) ? addr : Resolv.getaddress(addr)
|
|
143
|
+
rescue ::ArgumentError # Win32 bug
|
|
144
|
+
nil
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
#
|
|
149
|
+
# Wrapper for Socket.gethostbyname which takes into account whether or not
|
|
150
|
+
# an IP address is supplied. If it is, then reverse DNS resolution does
|
|
151
|
+
# not occur. This is done in order to prevent delays, such as would occur
|
|
152
|
+
# on Windows.
|
|
153
|
+
#
|
|
154
|
+
def self.gethostbyname(host)
|
|
155
|
+
if (dotted_ip?(host))
|
|
156
|
+
if (is_ipv4?(host))
|
|
157
|
+
return [ host, host, 2, host.split('.').map{ |c| c.to_i }.pack("C4") ]
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
::Socket.gethostbyname(host)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
#
|
|
165
|
+
# Create a sockaddr structure using the supplied IP address, port, and
|
|
166
|
+
# address family
|
|
167
|
+
#
|
|
168
|
+
def self.to_sockaddr(ip, port)
|
|
169
|
+
|
|
170
|
+
if (ip == '::ffff:0.0.0.0')
|
|
171
|
+
ip = support_ipv6?() ? '::' : '0.0.0.0'
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
return ::Socket.pack_sockaddr_in(port, ip)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
#
|
|
178
|
+
# Returns the address family, host, and port of the supplied sockaddr as
|
|
179
|
+
# [ af, host, port ]
|
|
180
|
+
#
|
|
181
|
+
def self.from_sockaddr(saddr)
|
|
182
|
+
port, host = ::Socket::unpack_sockaddr_in(saddr)
|
|
183
|
+
af = ::Socket::AF_INET
|
|
184
|
+
if (support_ipv6?() and is_ipv6?(host))
|
|
185
|
+
af = ::Socket::AF_INET6
|
|
186
|
+
end
|
|
187
|
+
return [ af, host, port ]
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
#
|
|
191
|
+
# Resolves a host to raw network-byte order.
|
|
192
|
+
#
|
|
193
|
+
def self.resolv_nbo(host)
|
|
194
|
+
self.gethostbyname(Rex::Socket.getaddress(host))[3]
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
#
|
|
198
|
+
# Resolves a host to a network-byte order ruby integer.
|
|
199
|
+
#
|
|
200
|
+
def self.resolv_nbo_i(host)
|
|
201
|
+
addr_ntoi(resolv_nbo(host))
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
#
|
|
205
|
+
# Resolves a host to a dotted address.
|
|
206
|
+
#
|
|
207
|
+
def self.resolv_to_dotted(host)
|
|
208
|
+
addr_ntoa(addr_aton(host))
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
#
|
|
212
|
+
# Converts a ascii address into an integer
|
|
213
|
+
#
|
|
214
|
+
def self.addr_atoi(addr)
|
|
215
|
+
resolv_nbo_i(addr)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
#
|
|
219
|
+
# Converts an integer address into ascii
|
|
220
|
+
#
|
|
221
|
+
def self.addr_itoa(addr, v6=false)
|
|
222
|
+
|
|
223
|
+
nboa = addr_iton(addr, v6)
|
|
224
|
+
|
|
225
|
+
# IPv4
|
|
226
|
+
if (addr < 0x100000000 and not v6)
|
|
227
|
+
nboa.unpack('C4').join('.')
|
|
228
|
+
# IPv6
|
|
229
|
+
else
|
|
230
|
+
nboa.unpack('n8').map{ |c| "%.4x" % c }.join(":")
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
#
|
|
235
|
+
# Converts a ascii address to network byte order
|
|
236
|
+
#
|
|
237
|
+
def self.addr_aton(addr)
|
|
238
|
+
resolv_nbo(addr)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
#
|
|
242
|
+
# Converts a network byte order address to ascii
|
|
243
|
+
#
|
|
244
|
+
def self.addr_ntoa(addr)
|
|
245
|
+
|
|
246
|
+
# IPv4
|
|
247
|
+
if (addr.length == 4)
|
|
248
|
+
return addr.unpack('C4').join('.')
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# IPv6
|
|
252
|
+
if (addr.length == 16)
|
|
253
|
+
return addr.unpack('n8').map{ |c| "%.4x" % c }.join(":")
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
raise RuntimeError, "Invalid address format"
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
#
|
|
260
|
+
# Converts a network byte order address to an integer
|
|
261
|
+
#
|
|
262
|
+
def self.addr_ntoi(addr)
|
|
263
|
+
|
|
264
|
+
bits = addr.unpack("N*")
|
|
265
|
+
|
|
266
|
+
if (bits.length == 1)
|
|
267
|
+
return bits[0]
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
if (bits.length == 4)
|
|
271
|
+
val = 0
|
|
272
|
+
bits.each_index { |i| val += ( bits[i] << (96 - (i * 32)) ) }
|
|
273
|
+
return val
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
raise RuntimeError, "Invalid address format"
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
#
|
|
280
|
+
# Converts an integer into a network byte order address
|
|
281
|
+
#
|
|
282
|
+
def self.addr_iton(addr, v6=false)
|
|
283
|
+
if(addr < 0x100000000 and not v6)
|
|
284
|
+
return [addr].pack('N')
|
|
285
|
+
else
|
|
286
|
+
w = []
|
|
287
|
+
w[0] = (addr >> 96) & 0xffffffff
|
|
288
|
+
w[1] = (addr >> 64) & 0xffffffff
|
|
289
|
+
w[2] = (addr >> 32) & 0xffffffff
|
|
290
|
+
w[3] = addr & 0xffffffff
|
|
291
|
+
return w.pack('N4')
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
#
|
|
296
|
+
# Converts a CIDR subnet into an array (base, bcast)
|
|
297
|
+
#
|
|
298
|
+
def self.cidr_crack(cidr, v6=false)
|
|
299
|
+
tmp = cidr.split('/')
|
|
300
|
+
|
|
301
|
+
tst,scope = tmp[0].split("%",2)
|
|
302
|
+
scope = "%" + scope if scope
|
|
303
|
+
scope ||= ""
|
|
304
|
+
|
|
305
|
+
addr = addr_atoi(tst)
|
|
306
|
+
|
|
307
|
+
bits = 32
|
|
308
|
+
mask = 0
|
|
309
|
+
use6 = false
|
|
310
|
+
|
|
311
|
+
if (addr > 0xffffffff or v6 or cidr =~ /:/)
|
|
312
|
+
use6 = true
|
|
313
|
+
bits = 128
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
mask = (2 ** bits) - (2 ** (bits - tmp[1].to_i))
|
|
317
|
+
base = addr & mask
|
|
318
|
+
|
|
319
|
+
stop = base + (2 ** (bits - tmp[1].to_i)) - 1
|
|
320
|
+
return [self.addr_itoa(base, use6) + scope, self.addr_itoa(stop, use6) + scope]
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
#
|
|
324
|
+
# Converts a netmask (255.255.255.240) into a bitmask (28). This is the
|
|
325
|
+
# lame kid way of doing it.
|
|
326
|
+
#
|
|
327
|
+
def self.net2bitmask(netmask)
|
|
328
|
+
|
|
329
|
+
nmask = resolv_nbo(netmask)
|
|
330
|
+
imask = addr_ntoi(nmask)
|
|
331
|
+
bits = 32
|
|
332
|
+
|
|
333
|
+
if (imask > 0xffffffff)
|
|
334
|
+
bits = 128
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
0.upto(bits-1) do |bit|
|
|
338
|
+
p = 2 ** bit
|
|
339
|
+
return (bits - bit) if ((imask & p) == p)
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
0
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
#
|
|
346
|
+
# Converts a bitmask (28) into a netmask (255.255.255.240)
|
|
347
|
+
# TODO: IPv6 (use is ambiguous right now)
|
|
348
|
+
#
|
|
349
|
+
def self.bit2netmask(bitmask)
|
|
350
|
+
[ (~((2 ** (32 - bitmask)) - 1)) & 0xffffffff ].pack('N').unpack('CCCC').join('.')
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def self.portspec_crack(pspec)
|
|
355
|
+
portspec_to_portlist(pspec)
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
#
|
|
359
|
+
# Converts a port specification like "80,21-23,443" into a sorted,
|
|
360
|
+
# unique array of valid port numbers like [21,22,23,80,443]
|
|
361
|
+
#
|
|
362
|
+
def self.portspec_to_portlist(pspec)
|
|
363
|
+
ports = []
|
|
364
|
+
|
|
365
|
+
# Build ports array from port specification
|
|
366
|
+
pspec.split(/,/).each do |item|
|
|
367
|
+
start, stop = item.split(/-/).map { |p| p.to_i }
|
|
368
|
+
|
|
369
|
+
start ||= 0
|
|
370
|
+
stop ||= item.match(/-/) ? 65535 : start
|
|
371
|
+
|
|
372
|
+
start, stop = stop, start if stop < start
|
|
373
|
+
|
|
374
|
+
start.upto(stop) { |p| ports << p }
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
# Sort, and remove dups and invalid ports
|
|
378
|
+
ports.sort.uniq.delete_if { |p| p < 1 or p > 65535 }
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
#
|
|
382
|
+
# Converts a port list like [1,2,3,4,5,100] into a
|
|
383
|
+
# range specification like "1-5,100"
|
|
384
|
+
#
|
|
385
|
+
def self.portlist_to_portspec(parr)
|
|
386
|
+
ranges = []
|
|
387
|
+
range = []
|
|
388
|
+
lastp = nil
|
|
389
|
+
|
|
390
|
+
parr.uniq.sort{|a,b| a<=>b}.map{|a| a.to_i}.each do |n|
|
|
391
|
+
next if (n < 1 or n > 65535)
|
|
392
|
+
if not lastp
|
|
393
|
+
range = [n]
|
|
394
|
+
lastp = n
|
|
395
|
+
next
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
if lastp == n - 1
|
|
399
|
+
range << n
|
|
400
|
+
else
|
|
401
|
+
ranges << range
|
|
402
|
+
range = [n]
|
|
403
|
+
end
|
|
404
|
+
lastp = n
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
ranges << range
|
|
408
|
+
ranges.delete(nil)
|
|
409
|
+
ranges.uniq.map{|x| x.length == 1 ? "#{x[0]}" : "#{x[0]}-#{x[-1]}"}.join(",")
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
##
|
|
413
|
+
#
|
|
414
|
+
# Utility class methods
|
|
415
|
+
#
|
|
416
|
+
##
|
|
417
|
+
|
|
418
|
+
def self.source_address(dest='50.50.50.50')
|
|
419
|
+
begin
|
|
420
|
+
s = self.create_udp(
|
|
421
|
+
'PeerHost' => dest,
|
|
422
|
+
'PeerPort' => 31337
|
|
423
|
+
)
|
|
424
|
+
r = s.getsockname[1]
|
|
425
|
+
s.close
|
|
426
|
+
return r
|
|
427
|
+
rescue ::Exception
|
|
428
|
+
return '127.0.0.1'
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
#
|
|
433
|
+
# Create a TCP socket pair.
|
|
434
|
+
#
|
|
435
|
+
# sf: This create a socket pair using native ruby sockets and will work
|
|
436
|
+
# on Windows where ::Socket.pair is not implemented.
|
|
437
|
+
# Note: OpenSSL requires native ruby sockets for its io.
|
|
438
|
+
#
|
|
439
|
+
def self.tcp_socket_pair
|
|
440
|
+
lsock = nil
|
|
441
|
+
rsock = nil
|
|
442
|
+
laddr = '127.0.0.1'
|
|
443
|
+
lport = 0
|
|
444
|
+
threads = []
|
|
445
|
+
mutex = ::Mutex.new
|
|
446
|
+
|
|
447
|
+
threads << ::Thread.new {
|
|
448
|
+
server = nil
|
|
449
|
+
mutex.synchronize {
|
|
450
|
+
threads << ::Thread.new {
|
|
451
|
+
mutex.synchronize {
|
|
452
|
+
rsock = ::TCPSocket.new( laddr, lport )
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
server = ::Socket.new( ::Socket::AF_INET, ::Socket::SOCK_STREAM, 0 )
|
|
456
|
+
server.bind( ::Socket.sockaddr_in( 0, laddr ) )
|
|
457
|
+
lport, caddr = ::Socket.unpack_sockaddr_in( server.getsockname )
|
|
458
|
+
server.listen( 1 )
|
|
459
|
+
}
|
|
460
|
+
lsock, saddr = server.accept
|
|
461
|
+
server.close
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
threads.each { |t| t.join }
|
|
465
|
+
|
|
466
|
+
return [lsock, rsock]
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
#
|
|
470
|
+
# Create a UDP socket pair using native ruby UDP sockets.
|
|
471
|
+
#
|
|
472
|
+
def self.udp_socket_pair
|
|
473
|
+
laddr = '127.0.0.1'
|
|
474
|
+
|
|
475
|
+
lsock = ::UDPSocket.new
|
|
476
|
+
lsock.bind( laddr, 0 )
|
|
477
|
+
|
|
478
|
+
rsock = ::UDPSocket.new
|
|
479
|
+
rsock.bind( laddr, 0 )
|
|
480
|
+
|
|
481
|
+
rsock.connect( *lsock.addr.values_at(3,1) )
|
|
482
|
+
|
|
483
|
+
lsock.connect( *rsock.addr.values_at(3,1) )
|
|
484
|
+
|
|
485
|
+
return [lsock, rsock]
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
##
|
|
489
|
+
#
|
|
490
|
+
# Class initialization
|
|
491
|
+
#
|
|
492
|
+
##
|
|
493
|
+
|
|
494
|
+
#
|
|
495
|
+
# Initialize general socket parameters.
|
|
496
|
+
#
|
|
497
|
+
def initsock(params = nil)
|
|
498
|
+
if (params)
|
|
499
|
+
self.peerhost = params.peerhost
|
|
500
|
+
self.peerport = params.peerport
|
|
501
|
+
self.localhost = params.localhost
|
|
502
|
+
self.localport = params.localport
|
|
503
|
+
self.context = params.context || {}
|
|
504
|
+
self.ipv = params.v6 ? 6 : 4
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
#
|
|
509
|
+
# By default, all sockets are themselves selectable file descriptors.
|
|
510
|
+
#
|
|
511
|
+
def fd
|
|
512
|
+
self
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
#
|
|
516
|
+
# Returns local connection information.
|
|
517
|
+
#
|
|
518
|
+
def getsockname
|
|
519
|
+
Socket.from_sockaddr(super)
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
#
|
|
523
|
+
# Wrapper around getsockname
|
|
524
|
+
#
|
|
525
|
+
def getlocalname
|
|
526
|
+
getsockname
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
#
|
|
530
|
+
# Return peer connection information.
|
|
531
|
+
#
|
|
532
|
+
def getpeername
|
|
533
|
+
return Socket.from_sockaddr(super)
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
#
|
|
537
|
+
# Returns a string that indicates the type of the socket, such as 'tcp'.
|
|
538
|
+
#
|
|
539
|
+
def type?
|
|
540
|
+
raise NotImplementedError, "Socket type is not supported."
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
#
|
|
544
|
+
# The peer host of the connected socket.
|
|
545
|
+
#
|
|
546
|
+
attr_reader :peerhost
|
|
547
|
+
#
|
|
548
|
+
# The peer port of the connected socket.
|
|
549
|
+
#
|
|
550
|
+
attr_reader :peerport
|
|
551
|
+
#
|
|
552
|
+
# The local host of the connected socket.
|
|
553
|
+
#
|
|
554
|
+
attr_reader :localhost
|
|
555
|
+
#
|
|
556
|
+
# The local port of the connected socket.
|
|
557
|
+
#
|
|
558
|
+
attr_reader :localport
|
|
559
|
+
#
|
|
560
|
+
# The IP version of the socket
|
|
561
|
+
#
|
|
562
|
+
attr_reader :ipv
|
|
563
|
+
#
|
|
564
|
+
# Contextual information that describes the source and other
|
|
565
|
+
# instance-specific attributes. This comes from the param.context
|
|
566
|
+
# attribute.
|
|
567
|
+
#
|
|
568
|
+
attr_reader :context
|
|
569
|
+
|
|
570
|
+
protected
|
|
571
|
+
|
|
572
|
+
attr_writer :peerhost, :peerport, :localhost, :localport # :nodoc:
|
|
573
|
+
attr_writer :context # :nodoc:
|
|
574
|
+
attr_writer :ipv # :nodoc:
|
|
575
|
+
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
#
|
|
581
|
+
# Globalized socket constants
|
|
582
|
+
#
|
|
583
|
+
SHUT_RDWR = ::Socket::SHUT_RDWR
|
|
584
|
+
SHUT_RD = ::Socket::SHUT_RD
|
|
585
|
+
SHUT_WR = ::Socket::SHUT_WR
|
|
586
|
+
|