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,206 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module PeScan
|
|
3
|
+
module Scanner
|
|
4
|
+
|
|
5
|
+
class Generic
|
|
6
|
+
|
|
7
|
+
attr_accessor :pe, :regex
|
|
8
|
+
|
|
9
|
+
def initialize(pe)
|
|
10
|
+
self.pe = pe
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def config(param)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def scan(param)
|
|
17
|
+
config(param)
|
|
18
|
+
|
|
19
|
+
$stdout.puts "[#{param['file']}]"
|
|
20
|
+
pe.all_sections.each do |section|
|
|
21
|
+
hits = scan_section(section, param)
|
|
22
|
+
hits.each do |hit|
|
|
23
|
+
vma = pe.rva_to_vma(hit[0])
|
|
24
|
+
|
|
25
|
+
next if (param['filteraddr'] and [vma].pack("V").reverse !~ /#{param['filteraddr']}/)
|
|
26
|
+
|
|
27
|
+
msg = hit[1].is_a?(Array) ? hit[1].join(" ") : hit[1]
|
|
28
|
+
$stdout.puts pe.ptr_s(vma) + " " + msg
|
|
29
|
+
if(param['disasm'])
|
|
30
|
+
::Rex::Assembly::Nasm.disassemble([msg].pack("H*")).split("\n").each do |line|
|
|
31
|
+
$stdout.puts "\t#{line.strip}"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def scan_section(section, param={})
|
|
39
|
+
[]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class JmpRegScanner < Generic
|
|
44
|
+
|
|
45
|
+
def config(param)
|
|
46
|
+
regnums = param['args']
|
|
47
|
+
|
|
48
|
+
# build a list of the call bytes
|
|
49
|
+
calls = _build_byte_list(0xd0, regnums - [4]) # note call esp's don't work..
|
|
50
|
+
jmps = _build_byte_list(0xe0, regnums)
|
|
51
|
+
pushs1 = _build_byte_list(0x50, regnums)
|
|
52
|
+
pushs2 = _build_byte_list(0xf0, regnums)
|
|
53
|
+
|
|
54
|
+
regexstr = '('
|
|
55
|
+
if !calls.empty?
|
|
56
|
+
regexstr += "\xff[#{calls}]|"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
regexstr += "\xff[#{jmps}]|([#{pushs1}]|\xff[#{pushs2}])(\xc3|\xc2..))"
|
|
60
|
+
|
|
61
|
+
self.regex = Regexp.new(regexstr, nil, 'n')
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# build a list for regex of the possible bytes, based on a base
|
|
65
|
+
# byte and a list of register numbers..
|
|
66
|
+
def _build_byte_list(base, regnums)
|
|
67
|
+
regnums.collect { |regnum| Regexp.escape((base | regnum).chr) }.join('')
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def _ret_size(section, index)
|
|
71
|
+
d = section.read(index, 1)
|
|
72
|
+
case d
|
|
73
|
+
when "\xc3"
|
|
74
|
+
return 1
|
|
75
|
+
when "\xc2"
|
|
76
|
+
return 3
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
raise RuntimeError, "invalid return opcode"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def _parse_ret(data)
|
|
83
|
+
if data.length == 1
|
|
84
|
+
return "ret"
|
|
85
|
+
else
|
|
86
|
+
return "retn 0x%04x" % data[1, 2].unpack('v')[0]
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def scan_section(section, param={})
|
|
92
|
+
index = 0
|
|
93
|
+
|
|
94
|
+
hits = [ ]
|
|
95
|
+
|
|
96
|
+
while (index = section.index(regex, index)) != nil
|
|
97
|
+
rva = section.offset_to_rva(index)
|
|
98
|
+
message = ''
|
|
99
|
+
|
|
100
|
+
parse_ret = false
|
|
101
|
+
|
|
102
|
+
byte1 = section.read(index, 1).unpack("C*")[0]
|
|
103
|
+
|
|
104
|
+
if byte1 == 0xff
|
|
105
|
+
byte2 = section.read(index+1, 1).unpack("C*")[0]
|
|
106
|
+
regname = Rex::Arch::X86.reg_name32(byte2 & 0x7)
|
|
107
|
+
|
|
108
|
+
case byte2 & 0xf8
|
|
109
|
+
when 0xd0
|
|
110
|
+
message = "call #{regname}"
|
|
111
|
+
index += 2
|
|
112
|
+
when 0xe0
|
|
113
|
+
message = "jmp #{regname}"
|
|
114
|
+
index += 2
|
|
115
|
+
when 0xf0
|
|
116
|
+
retsize = _ret_size(section, index+2)
|
|
117
|
+
message = "push #{regname}; " + _parse_ret(section.read(index+2, retsize))
|
|
118
|
+
index += 2 + retsize
|
|
119
|
+
else
|
|
120
|
+
raise "wtf"
|
|
121
|
+
end
|
|
122
|
+
else
|
|
123
|
+
regname = Rex::Arch::X86.reg_name32(byte1 & 0x7)
|
|
124
|
+
retsize = _ret_size(section, index+1)
|
|
125
|
+
message = "push #{regname}; " + _parse_ret(section.read(index+1, retsize))
|
|
126
|
+
index += 1 + retsize
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
hits << [ rva, message ]
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
return hits
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class PopPopRetScanner < JmpRegScanner
|
|
137
|
+
|
|
138
|
+
def config(param)
|
|
139
|
+
pops = _build_byte_list(0x58, (0 .. 7).to_a - [4]) # we don't want pop esp's...
|
|
140
|
+
self.regex = Regexp.new("[#{pops}][#{pops}](\xc3|\xc2..)", nil, 'n')
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def scan_section(section, param={})
|
|
144
|
+
|
|
145
|
+
index = 0
|
|
146
|
+
|
|
147
|
+
hits = [ ]
|
|
148
|
+
|
|
149
|
+
while index < section.size && (index = section.index(regex, index)) != nil
|
|
150
|
+
rva = section.offset_to_rva(index)
|
|
151
|
+
message = ''
|
|
152
|
+
|
|
153
|
+
pops = section.read(index, 2)
|
|
154
|
+
reg1 = Rex::Arch::X86.reg_name32(pops[0,1].unpack("C*")[0] & 0x7)
|
|
155
|
+
reg2 = Rex::Arch::X86.reg_name32(pops[1,1].unpack("C*")[0] & 0x7)
|
|
156
|
+
|
|
157
|
+
message = "pop #{reg1}; pop #{reg2}; "
|
|
158
|
+
|
|
159
|
+
retsize = _ret_size(section, index+2)
|
|
160
|
+
message += _parse_ret(section.read(index+2, retsize))
|
|
161
|
+
|
|
162
|
+
index += 2 + retsize
|
|
163
|
+
|
|
164
|
+
hits << [ rva, message ]
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
return hits
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
class RegexScanner < Generic
|
|
172
|
+
|
|
173
|
+
def config(param)
|
|
174
|
+
self.regex = Regexp.new(param['args'], nil, 'n')
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def scan_section(section, param={})
|
|
178
|
+
index = 0
|
|
179
|
+
|
|
180
|
+
hits = [ ]
|
|
181
|
+
|
|
182
|
+
while index < section.size && (index = section.index(regex, index)) != nil
|
|
183
|
+
|
|
184
|
+
idx = index
|
|
185
|
+
buf = ''
|
|
186
|
+
mat = nil
|
|
187
|
+
|
|
188
|
+
while (! (mat = buf.match(regex)))
|
|
189
|
+
buf << section.read(idx, 1)
|
|
190
|
+
idx += 1
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
rva = section.offset_to_rva(index)
|
|
194
|
+
|
|
195
|
+
hits << [ rva, buf.unpack("H*") ]
|
|
196
|
+
index += buf.length
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
return hits
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module PeScan
|
|
3
|
+
module Search
|
|
4
|
+
|
|
5
|
+
require "rex/assembly/nasm"
|
|
6
|
+
|
|
7
|
+
class DumpRVA
|
|
8
|
+
attr_accessor :pe
|
|
9
|
+
|
|
10
|
+
def initialize(pe)
|
|
11
|
+
self.pe = pe
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def config(param)
|
|
15
|
+
@address = pe.vma_to_rva(param['args'])
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def scan(param)
|
|
19
|
+
config(param)
|
|
20
|
+
|
|
21
|
+
$stdout.puts "[#{param['file']}]"
|
|
22
|
+
|
|
23
|
+
# Adjust based on -A and -B flags
|
|
24
|
+
pre = param['before'] || 0
|
|
25
|
+
suf = param['after'] || 16
|
|
26
|
+
|
|
27
|
+
@address -= pre
|
|
28
|
+
@address = 0 if (@address < 0 || ! @address)
|
|
29
|
+
|
|
30
|
+
begin
|
|
31
|
+
buf = pe.read_rva(@address, suf)
|
|
32
|
+
rescue ::Rex::PeParsey::WtfError
|
|
33
|
+
return
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
$stdout.puts pe.ptr_s(pe.rva_to_vma(@address)) + " " + buf.unpack("H*")[0]
|
|
37
|
+
if(param['disasm'])
|
|
38
|
+
::Rex::Assembly::Nasm.disassemble(buf).split("\n").each do |line|
|
|
39
|
+
$stdout.puts "\t#{line.strip}"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class DumpOffset < DumpRVA
|
|
47
|
+
def config(param)
|
|
48
|
+
begin
|
|
49
|
+
@address = pe.file_offset_to_rva(param['args'])
|
|
50
|
+
rescue Rex::PeParsey::BoundsError
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'rex/platforms/windows'
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Platforms
|
|
3
|
+
module Windows
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# Windows Registry Constants
|
|
9
|
+
#
|
|
10
|
+
REG_NONE = 1
|
|
11
|
+
REG_SZ = 1
|
|
12
|
+
REG_EXPAND_SZ = 2
|
|
13
|
+
REG_BINARY = 3
|
|
14
|
+
REG_DWORD = 4
|
|
15
|
+
REG_LITTLE_ENDIAN = 4
|
|
16
|
+
REG_BIG_ENDIAN = 5
|
|
17
|
+
REG_LINK = 6
|
|
18
|
+
REG_MULTI_SZ = 7
|
|
19
|
+
|
|
20
|
+
HKEY_CLASSES_ROOT = 0x80000000
|
|
21
|
+
HKEY_CURRENT_USER = 0x80000001
|
|
22
|
+
HKEY_LOCAL_MACHINE = 0x80000002
|
|
23
|
+
HKEY_USERS = 0x80000003
|
|
24
|
+
HKEY_PERFORMANCE_DATA = 0x80000004
|
|
25
|
+
HKEY_CURRENT_CONFIG = 0x80000005
|
|
26
|
+
HKEY_DYN_DATA = 0x80000006
|
|
27
|
+
|
|
28
|
+
def registry_hive_lookup(hive)
|
|
29
|
+
case hive
|
|
30
|
+
when 'HKCR'
|
|
31
|
+
HKEY_LOCAL_MACHINE
|
|
32
|
+
when 'HKCU'
|
|
33
|
+
HKEY_CURRENT_USER
|
|
34
|
+
when 'HKLM'
|
|
35
|
+
HKEY_LOCAL_MACHINE
|
|
36
|
+
when 'HKU'
|
|
37
|
+
HKEY_USERS
|
|
38
|
+
when 'HKPD'
|
|
39
|
+
HKEY_PERFORMANCE_DATA
|
|
40
|
+
when 'HKCC'
|
|
41
|
+
HKEY_CURRENT_CONFIG
|
|
42
|
+
when 'HKDD'
|
|
43
|
+
HKEY_DYN_DATA
|
|
44
|
+
else
|
|
45
|
+
HKEY_LOCAL_MACHINE
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
data/lib/rex/poly.rb
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Poly
|
|
3
|
+
|
|
4
|
+
require 'rex/poly/register'
|
|
5
|
+
require 'rex/poly/block'
|
|
6
|
+
|
|
7
|
+
###
|
|
8
|
+
#
|
|
9
|
+
# This class encapsulates the state of a single polymorphic block set
|
|
10
|
+
# generation. It tracks the current set of consumed registers, the linear
|
|
11
|
+
# list of blocks generated, the end-result buffer, and the phase of
|
|
12
|
+
# generation. The fields exposed by the State class are intended for use only
|
|
13
|
+
# by the polymorphic generation subsystem and should not be modified directly.
|
|
14
|
+
#
|
|
15
|
+
###
|
|
16
|
+
class State
|
|
17
|
+
|
|
18
|
+
#
|
|
19
|
+
# Initializes the polymorphic generation state.
|
|
20
|
+
#
|
|
21
|
+
def initialize
|
|
22
|
+
@block_list = nil
|
|
23
|
+
reset
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# Resets the generation state to have a plain start by clearing all
|
|
28
|
+
# consumed registers, resetting the polymorphic buffer back to its
|
|
29
|
+
# beginning and destroying any block generation state.
|
|
30
|
+
#
|
|
31
|
+
def reset
|
|
32
|
+
# Reset the generation flag on any blocks in the block list
|
|
33
|
+
@block_list.each { |block|
|
|
34
|
+
block[0].generated = false
|
|
35
|
+
} if (@block_list)
|
|
36
|
+
|
|
37
|
+
@regnums = Hash.new
|
|
38
|
+
@buffer = ''
|
|
39
|
+
@block_list = []
|
|
40
|
+
@curr_offset = 0
|
|
41
|
+
@first_phase = true
|
|
42
|
+
@badchars = nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Returns true if the supplied register number is already consumed.
|
|
47
|
+
#
|
|
48
|
+
def consumed_regnum?(regnum)
|
|
49
|
+
@regnums[regnum]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# Consumes a register number, thus removing it from the pool that can be
|
|
54
|
+
# assigned. The consumed register number is returned to the caller.
|
|
55
|
+
#
|
|
56
|
+
def consume_regnum(regnum)
|
|
57
|
+
raise RuntimeError, "Register #{regnum} is already consumed." if (consumed_regnum?(regnum))
|
|
58
|
+
|
|
59
|
+
@regnums[regnum] = true
|
|
60
|
+
|
|
61
|
+
regnum
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
#
|
|
65
|
+
# Acquires a register number that has not already been consumed from the
|
|
66
|
+
# supplied register number set and consumes it, returning the selected
|
|
67
|
+
# register number to the caller. The register number is selected from the
|
|
68
|
+
# set at random.
|
|
69
|
+
#
|
|
70
|
+
def consume_regnum_from_set(regnum_set)
|
|
71
|
+
# Pick a random starting point within the supplied set.
|
|
72
|
+
idx = rand(regnum_set.length)
|
|
73
|
+
|
|
74
|
+
# Try each index in the set.
|
|
75
|
+
regnum_set.length.times { |x|
|
|
76
|
+
regnum = regnum_set[(idx + x) % regnum_set.length]
|
|
77
|
+
|
|
78
|
+
next if (consumed_regnum?(regnum))
|
|
79
|
+
|
|
80
|
+
return consume_regnum(regnum)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
# If we get through the entire iteration without finding a register,
|
|
84
|
+
# then we are out of registers to assign.
|
|
85
|
+
raise RuntimeError, "No registers are available to consume from the set"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
#
|
|
89
|
+
# Eliminates a register number from the consumed pool so that it can be
|
|
90
|
+
# used in the future. This happens after a block indicates that a register
|
|
91
|
+
# has been clobbered.
|
|
92
|
+
#
|
|
93
|
+
def defecate_regnum(regnum)
|
|
94
|
+
@regnums.delete(regnum)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
#
|
|
98
|
+
# The buffer state for the current polymorphic generation. This stores the
|
|
99
|
+
# end-result of a call to generate on a LogicalBlock.
|
|
100
|
+
#
|
|
101
|
+
attr_accessor :buffer
|
|
102
|
+
|
|
103
|
+
#
|
|
104
|
+
# The linear list of blocks that is generated by calling the generate
|
|
105
|
+
# method on a LogicalBlock.
|
|
106
|
+
#
|
|
107
|
+
attr_accessor :block_list
|
|
108
|
+
|
|
109
|
+
#
|
|
110
|
+
# The current offset into the polymorphic buffer that is being generated.
|
|
111
|
+
# This is updated as blocks are appended to the block_list.
|
|
112
|
+
#
|
|
113
|
+
attr_accessor :curr_offset
|
|
114
|
+
|
|
115
|
+
#
|
|
116
|
+
# A boolean field that is used by the LogicalBlock class to track whether
|
|
117
|
+
# or not it is in the first phase (generating the block list), or in the
|
|
118
|
+
# second phase (generating the polymorphic buffer). This phases are used
|
|
119
|
+
# to indicate whether or not the offset_of and regnum_of methods will
|
|
120
|
+
# return actual results.
|
|
121
|
+
#
|
|
122
|
+
attr_accessor :first_phase
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# Characters to avoid when selecting permutations, if any.
|
|
126
|
+
#
|
|
127
|
+
attr_accessor :badchars
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
end
|
|
132
|
+
end
|