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,57 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Post
|
|
5
|
+
|
|
6
|
+
###
|
|
7
|
+
#
|
|
8
|
+
# This class provides generalized methods for interacting with a thread
|
|
9
|
+
# running in a process on a remote machine via a post-exploitation client.
|
|
10
|
+
#
|
|
11
|
+
###
|
|
12
|
+
class Thread
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Suspend the remote thread.
|
|
16
|
+
#
|
|
17
|
+
def suspend
|
|
18
|
+
raise NotImplementedError
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# Resume execution of the remote thread.
|
|
23
|
+
#
|
|
24
|
+
def resume
|
|
25
|
+
raise NotImplementedError
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Terminate the remote thread.
|
|
30
|
+
#
|
|
31
|
+
def terminate
|
|
32
|
+
raise NotImplementedError
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Query architecture-specific register state.
|
|
37
|
+
#
|
|
38
|
+
def query_regs
|
|
39
|
+
raise NotImplementedError
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# Set architecture-specific register state.
|
|
44
|
+
#
|
|
45
|
+
def set_regs
|
|
46
|
+
raise NotImplementedError
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# Close resources associated with the thread.
|
|
51
|
+
#
|
|
52
|
+
def close
|
|
53
|
+
raise NotImplementedError
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end; end
|
data/lib/rex/post/ui.rb
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Post
|
|
5
|
+
|
|
6
|
+
###
|
|
7
|
+
#
|
|
8
|
+
# This class provides generalized user interface manipulation routines that
|
|
9
|
+
# might be supported by post-exploitation clients.
|
|
10
|
+
#
|
|
11
|
+
###
|
|
12
|
+
class UI
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# This method disables the keyboard on the remote machine.
|
|
16
|
+
#
|
|
17
|
+
def disable_keyboard
|
|
18
|
+
raise NotImplementedError
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# This method enables the keyboard on the remote machine.
|
|
23
|
+
#
|
|
24
|
+
def enable_keyboard
|
|
25
|
+
raise NotImplementedError
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# This method disables the mouse on the remote machine.
|
|
30
|
+
#
|
|
31
|
+
def disable_mouse
|
|
32
|
+
raise NotImplementedError
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# This method enables the mouse on the remote machine.
|
|
37
|
+
#
|
|
38
|
+
def enable_mouse
|
|
39
|
+
raise NotImplementedError
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# This method gets the number of seconds the user has been idle from input
|
|
44
|
+
# on the remote machine.
|
|
45
|
+
#
|
|
46
|
+
def idle_time
|
|
47
|
+
raise NotImplementedError
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end; end
|
data/lib/rex/proto.rb
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rex/test'
|
|
4
|
+
require 'rex/proto/dcerpc/uuid.rb.ut'
|
|
5
|
+
require 'rex/proto/dcerpc/response.rb.ut'
|
|
6
|
+
require 'rex/proto/dcerpc/packet.rb.ut'
|
|
7
|
+
# require 'rex/proto/dcerpc/ndr.rb.ut'
|
|
8
|
+
require 'rex/proto/dcerpc/handle.rb.ut'
|
|
9
|
+
require 'rex/proto/dcerpc/client.rb.ut'
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Proto
|
|
3
|
+
module DCERPC
|
|
4
|
+
class Client
|
|
5
|
+
|
|
6
|
+
require 'rex/proto/dcerpc/uuid'
|
|
7
|
+
require 'rex/proto/dcerpc/response'
|
|
8
|
+
require 'rex/proto/dcerpc/exceptions'
|
|
9
|
+
require 'rex/text'
|
|
10
|
+
require 'rex/proto/smb/exceptions'
|
|
11
|
+
|
|
12
|
+
attr_accessor :handle, :socket, :options, :last_response, :context, :no_bind, :ispipe, :smb
|
|
13
|
+
|
|
14
|
+
# initialize a DCE/RPC Function Call
|
|
15
|
+
def initialize(handle, socket, useroptions = Hash.new)
|
|
16
|
+
self.handle = handle
|
|
17
|
+
self.socket = socket
|
|
18
|
+
self.options = {
|
|
19
|
+
'smb_user' => '',
|
|
20
|
+
'smb_pass' => '',
|
|
21
|
+
'smb_pipeio' => 'rw',
|
|
22
|
+
'smb_name' => nil,
|
|
23
|
+
'read_timeout' => 10,
|
|
24
|
+
'connect_timeout' => 5
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
self.options.merge!(useroptions)
|
|
28
|
+
|
|
29
|
+
# If the caller passed us a smb_client object, use it and
|
|
30
|
+
# and skip the connect/login/ipc$ stages of the setup
|
|
31
|
+
if (self.options['smb_client'])
|
|
32
|
+
self.smb = self.options['smb_client']
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# we must have a valid handle, regardless of everything else
|
|
36
|
+
raise ArgumentError, 'handle is not a Rex::Proto::DCERPC::Handle' if !self.handle.is_a?(Rex::Proto::DCERPC::Handle)
|
|
37
|
+
|
|
38
|
+
# we do this in case socket needs setup first, ie, socket = nil
|
|
39
|
+
if !self.options['no_socketsetup']
|
|
40
|
+
self.socket_check()
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
raise ArgumentError, 'socket can not read' if !self.socket.respond_to?(:read)
|
|
44
|
+
raise ArgumentError, 'socket can not write' if !self.socket.respond_to?(:write)
|
|
45
|
+
|
|
46
|
+
if !self.options['no_autobind']
|
|
47
|
+
self.bind()
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def socket_check()
|
|
52
|
+
if self.socket == nil
|
|
53
|
+
self.socket_setup()
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
case self.handle.protocol
|
|
57
|
+
when 'ncacn_ip_tcp'
|
|
58
|
+
if self.socket.type? != 'tcp'
|
|
59
|
+
raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
|
|
60
|
+
end
|
|
61
|
+
when 'ncacn_np'
|
|
62
|
+
if self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe
|
|
63
|
+
self.ispipe = 1
|
|
64
|
+
elsif self.socket.type? == 'tcp'
|
|
65
|
+
self.smb_connect()
|
|
66
|
+
else
|
|
67
|
+
raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
|
|
68
|
+
end
|
|
69
|
+
# No support ncacn_ip_udp (is it needed now that its ripped from Vista?)
|
|
70
|
+
else
|
|
71
|
+
raise "Unsupported protocol : #{self.handle.protocol}"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Create the appropriate socket based on protocol
|
|
76
|
+
def socket_setup()
|
|
77
|
+
ctx = { 'Msf' => self.options['Msf'], 'MsfExploit' => self.options['MsfExploit'] }
|
|
78
|
+
self.socket = case self.handle.protocol
|
|
79
|
+
|
|
80
|
+
when 'ncacn_ip_tcp'
|
|
81
|
+
Rex::Socket.create_tcp(
|
|
82
|
+
'PeerHost' => self.handle.address,
|
|
83
|
+
'PeerPort' => self.handle.options[0],
|
|
84
|
+
'Context' => ctx,
|
|
85
|
+
'Timeout' => self.options['connect_timeout']
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
when 'ncacn_np'
|
|
89
|
+
begin
|
|
90
|
+
socket = Rex::Socket.create_tcp(
|
|
91
|
+
'PeerHost' => self.handle.address,
|
|
92
|
+
'PeerPort' => 445,
|
|
93
|
+
'Context' => ctx,
|
|
94
|
+
'Timeout' => self.options['connect_timeout']
|
|
95
|
+
)
|
|
96
|
+
rescue Timeout::Error, Rex::ConnectionRefused
|
|
97
|
+
socket = Rex::Socket.create_tcp(
|
|
98
|
+
'PeerHost' => self.handle.address,
|
|
99
|
+
'PeerPort' => 139,
|
|
100
|
+
'Context' => ctx,
|
|
101
|
+
'Timeout' => self.options['connect_timeout']
|
|
102
|
+
)
|
|
103
|
+
end
|
|
104
|
+
socket
|
|
105
|
+
else nil
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Add this socket to the exploit's list of open sockets
|
|
109
|
+
options['MsfExploit'].add_socket(self.socket) if (options['MsfExploit'])
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def smb_connect()
|
|
113
|
+
require 'rex/proto/smb/simpleclient'
|
|
114
|
+
|
|
115
|
+
if(not self.smb)
|
|
116
|
+
if self.socket.peerport == 139
|
|
117
|
+
smb = Rex::Proto::SMB::SimpleClient.new(self.socket)
|
|
118
|
+
else
|
|
119
|
+
smb = Rex::Proto::SMB::SimpleClient.new(self.socket, true)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
smb.login('*SMBSERVER', self.options['smb_user'], self.options['smb_pass'])
|
|
123
|
+
smb.connect("\\\\#{self.handle.address}\\IPC$")
|
|
124
|
+
self.smb = smb
|
|
125
|
+
self.smb.read_timeout = self.options['read_timeout']
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
f = self.smb.create_pipe(self.handle.options[0])
|
|
129
|
+
f.mode = self.options['smb_pipeio']
|
|
130
|
+
self.socket = f
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def read()
|
|
134
|
+
|
|
135
|
+
max_read = self.options['pipe_read_max_size'] || 1024*1024
|
|
136
|
+
min_read = self.options['pipe_read_min_size'] || max_read
|
|
137
|
+
|
|
138
|
+
raw_response = ''
|
|
139
|
+
|
|
140
|
+
# Are we reading from a remote pipe over SMB?
|
|
141
|
+
if (self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe)
|
|
142
|
+
begin
|
|
143
|
+
|
|
144
|
+
# Max SMB read is 65535, cap it at 64000
|
|
145
|
+
max_read = [64000, max_read].min
|
|
146
|
+
min_read = [64000, min_read].min
|
|
147
|
+
|
|
148
|
+
read_limit = nil
|
|
149
|
+
|
|
150
|
+
while(true)
|
|
151
|
+
# Random read offsets will not work on Windows NT 4.0 (thanks Dave!)
|
|
152
|
+
|
|
153
|
+
read_cnt = (rand(max_read-min_read)+min_read)
|
|
154
|
+
if(read_limit)
|
|
155
|
+
if(read_cnt + raw_response.length > read_limit)
|
|
156
|
+
read_cnt = raw_response.length - read_limit
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
data = self.socket.read( read_cnt, rand(1024)+1)
|
|
161
|
+
break if !(data and data.length > 0)
|
|
162
|
+
raw_response += data
|
|
163
|
+
|
|
164
|
+
# Keep reading until we have at least the DCERPC header
|
|
165
|
+
next if raw_response.length < 10
|
|
166
|
+
|
|
167
|
+
# We now have to process the raw_response and parse out the DCERPC fragment length
|
|
168
|
+
# if we have read enough data. Once we have the length value, we need to make sure
|
|
169
|
+
# that we don't read beyond this amount, or it can screw up the SMB state
|
|
170
|
+
if (not read_limit)
|
|
171
|
+
begin
|
|
172
|
+
check = Rex::Proto::DCERPC::Response.new(raw_response)
|
|
173
|
+
read_limit = check.frag_len
|
|
174
|
+
rescue ::Rex::Proto::DCERPC::Exceptions::InvalidPacket
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
break if (read_limit and read_limit == raw_response.length)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
rescue Rex::Proto::SMB::Exceptions::NoReply
|
|
182
|
+
# I don't care if I didn't get a reply...
|
|
183
|
+
rescue Rex::Proto::SMB::Exceptions::ErrorCode => exception
|
|
184
|
+
if exception.error_code != 0xC000014B
|
|
185
|
+
raise exception
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
# This must be a regular TCP or UDP socket
|
|
189
|
+
else
|
|
190
|
+
if (self.socket.type? == 'tcp')
|
|
191
|
+
if (false and max_read)
|
|
192
|
+
while (true)
|
|
193
|
+
data = self.socket.get_once((rand(max_read-min_read)+min_read), self.options['read_timeout'])
|
|
194
|
+
break if not data
|
|
195
|
+
break if not data.length
|
|
196
|
+
raw_response << data
|
|
197
|
+
end
|
|
198
|
+
else
|
|
199
|
+
# Just read the entire response in one go
|
|
200
|
+
raw_response = self.socket.get_once(-1, self.options['read_timeout'])
|
|
201
|
+
end
|
|
202
|
+
else
|
|
203
|
+
# No segmented read support for non-TCP sockets
|
|
204
|
+
raw_response = self.socket.read(0xFFFFFFFF / 2 - 1) # read max data
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
raw_response
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# Write data to the underlying socket, limiting the sizes of the writes based on
|
|
212
|
+
# the pipe_write_min / pipe_write_max options.
|
|
213
|
+
def write(data)
|
|
214
|
+
|
|
215
|
+
max_write = self.options['pipe_write_max_size'] || data.length
|
|
216
|
+
min_write = self.options['pipe_write_min_size'] || max_write
|
|
217
|
+
|
|
218
|
+
if(min_write > max_write)
|
|
219
|
+
max_write = min_write
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
idx = 0
|
|
223
|
+
|
|
224
|
+
if (self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe)
|
|
225
|
+
while(idx < data.length)
|
|
226
|
+
bsize = (rand(max_write-min_write)+min_write).to_i
|
|
227
|
+
len = self.socket.write(data[idx, bsize], rand(1024)+1)
|
|
228
|
+
idx += bsize
|
|
229
|
+
end
|
|
230
|
+
else
|
|
231
|
+
self.socket.write(data)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
data.length
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def bind()
|
|
238
|
+
require 'rex/proto/dcerpc/packet'
|
|
239
|
+
bind = ''
|
|
240
|
+
context = ''
|
|
241
|
+
if self.options['fake_multi_bind']
|
|
242
|
+
|
|
243
|
+
args = [ self.handle.uuid[0], self.handle.uuid[1] ]
|
|
244
|
+
|
|
245
|
+
if (self.options['fake_multi_bind_prepend'])
|
|
246
|
+
args << self.options['fake_multi_bind_prepend']
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
if (self.options['fake_multi_bind_append'])
|
|
250
|
+
args << self.options['fake_multi_bind_append']
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
bind, context = Rex::Proto::DCERPC::Packet.make_bind_fake_multi(*args)
|
|
254
|
+
else
|
|
255
|
+
bind, context = Rex::Proto::DCERPC::Packet.make_bind(self.handle.uuid[0], self.handle.uuid[1])
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
raise 'make_bind failed' if !bind
|
|
259
|
+
|
|
260
|
+
self.write(bind)
|
|
261
|
+
raw_response = self.read()
|
|
262
|
+
response = Rex::Proto::DCERPC::Response.new(raw_response)
|
|
263
|
+
self.last_response = response
|
|
264
|
+
if response.type == 12 or response.type == 15
|
|
265
|
+
if self.last_response.ack_result[context] == 2
|
|
266
|
+
raise "Could not bind to #{self.handle}"
|
|
267
|
+
end
|
|
268
|
+
self.context = context
|
|
269
|
+
else
|
|
270
|
+
raise "Could not bind to #{self.handle}"
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
# Perform a DCE/RPC Function Call
|
|
275
|
+
def call(function, data)
|
|
276
|
+
|
|
277
|
+
frag_size = data.length
|
|
278
|
+
if options['frag_size']
|
|
279
|
+
frag_size = options['frag_size']
|
|
280
|
+
end
|
|
281
|
+
object_id = ''
|
|
282
|
+
if options['object_call']
|
|
283
|
+
object_id = self.handle.uuid[0]
|
|
284
|
+
end
|
|
285
|
+
if options['random_object_id']
|
|
286
|
+
object_id = Rex::Proto::DCERPC::UUID.uuid_unpack(Rex::Text.rand_text(16))
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
call_packets = Rex::Proto::DCERPC::Packet.make_request(function, data, frag_size, self.context, object_id)
|
|
290
|
+
call_packets.each { |packet|
|
|
291
|
+
self.write(packet)
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
raw_response = ''
|
|
295
|
+
|
|
296
|
+
begin
|
|
297
|
+
raw_response = self.read()
|
|
298
|
+
rescue ::EOFError
|
|
299
|
+
raise Rex::Proto::DCERPC::Exceptions::NoResponse
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
if (raw_response == nil or raw_response.length == 0)
|
|
303
|
+
raise Rex::Proto::DCERPC::Exceptions::NoResponse
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
self.last_response = Rex::Proto::DCERPC::Response.new(raw_response)
|
|
308
|
+
|
|
309
|
+
if self.last_response.type == 3
|
|
310
|
+
e = Rex::Proto::DCERPC::Exceptions::Fault.new
|
|
311
|
+
e.fault = self.last_response.status
|
|
312
|
+
raise e
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
self.last_response.stub_data
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
# Process a DCERPC response packet from a socket
|
|
319
|
+
def self.read_response(socket, timeout=self.options['read_timeout'])
|
|
320
|
+
|
|
321
|
+
data = socket.get_once(-1, timeout)
|
|
322
|
+
|
|
323
|
+
# We need at least 10 bytes to find the FragLen
|
|
324
|
+
if (! data or data.length() < 10)
|
|
325
|
+
return
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
# Pass the first 10 bytes to the constructor
|
|
329
|
+
resp = Rex::Proto::DCERPC::Response.new(data.slice!(0, 10))
|
|
330
|
+
|
|
331
|
+
# Something went wrong in the parser...
|
|
332
|
+
if (! resp.frag_len)
|
|
333
|
+
return resp
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
# Do we need to read more data?
|
|
337
|
+
if (resp.frag_len > (data.length + 10))
|
|
338
|
+
begin
|
|
339
|
+
data << socket.timed_read(resp.frag_len - data.length - 10, timeout)
|
|
340
|
+
rescue Timeout::Error
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
# Still missing some data...
|
|
345
|
+
if (data.length() != resp.frag_len - 10)
|
|
346
|
+
# TODO: Bubble this up somehow
|
|
347
|
+
# $stderr.puts "Truncated DCERPC response :-("
|
|
348
|
+
return resp
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
resp.parse(data)
|
|
352
|
+
return resp
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
end
|