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