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,23 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
4
|
+
|
|
5
|
+
require 'rex/test'
|
|
6
|
+
require 'rex/proto/drda/constants'
|
|
7
|
+
|
|
8
|
+
class Rex::Proto::DRDA::Constants::UnitTest < Test::Unit::TestCase
|
|
9
|
+
|
|
10
|
+
Konst = Rex::Proto::DRDA::Constants
|
|
11
|
+
|
|
12
|
+
def test_defines
|
|
13
|
+
assert_equal(Konst::EXCSAT, 0x1041)
|
|
14
|
+
assert_equal(Konst::MGRLVLLS, 0x1404)
|
|
15
|
+
assert_equal(Konst::SECCHKCD, 0x11a4)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_const_values
|
|
19
|
+
assert_kind_of(Array, Konst.const_values)
|
|
20
|
+
assert Konst.const_values.include? Konst::EXCSAT
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
require 'rex/proto/drda'
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Proto
|
|
5
|
+
module DRDA
|
|
6
|
+
|
|
7
|
+
class Error < StandardError; end
|
|
8
|
+
class RespError < Error; end
|
|
9
|
+
|
|
10
|
+
# See:
|
|
11
|
+
# http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.drda/db2z_excsat.htm
|
|
12
|
+
class MGRLVLLS_PARAM < Struct.new(:length, :codepoint, :payload)
|
|
13
|
+
def initialize(args={})
|
|
14
|
+
self[:codepoint] = Constants::MGRLVLLS
|
|
15
|
+
self[:payload] = "\x14\x03\x00\x0a\x24\x07\x00\x0a" +
|
|
16
|
+
"\x14\x74\x00\x05\x24\x0f\x00\x08" +
|
|
17
|
+
"\x14\x40\x00\x09\x1c\x08\x04\xb8"
|
|
18
|
+
self[:length] = self[:payload].to_s.size+4
|
|
19
|
+
end
|
|
20
|
+
def to_s
|
|
21
|
+
self.to_a.pack("nna*")
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Currently, only takes a MGRLVLLS param. Extend the struct
|
|
26
|
+
# when more parameters are defined.
|
|
27
|
+
class EXCSAT_DDM < Struct.new(:length, :magic, :format, :correlid, :length2,
|
|
28
|
+
:codepoint, :mgrlvlls)
|
|
29
|
+
|
|
30
|
+
def initialize(args={})
|
|
31
|
+
self[:magic] = 0xd0
|
|
32
|
+
self[:format] = 0x41
|
|
33
|
+
self[:correlid] = 1
|
|
34
|
+
self[:codepoint] = Constants::EXCSAT
|
|
35
|
+
self[:mgrlvlls] = args[:mgrlvlls] || MGRLVLLS_PARAM.new.to_s
|
|
36
|
+
self[:length] = (10 + self[:mgrlvlls].to_s.size)
|
|
37
|
+
self[:length2] = self[:length]-6
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def to_s
|
|
41
|
+
packstr = "nCCnnn"
|
|
42
|
+
packstr += "a*" # Pack smarter as more params are added.
|
|
43
|
+
self.to_a.pack(packstr)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# See http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.drda/db2z_accsec.htm
|
|
48
|
+
# for all sorts of info about SECMEC.
|
|
49
|
+
class SECMEC_PARAM < Struct.new(:length, :codepoint, :payload)
|
|
50
|
+
def initialize(args={})
|
|
51
|
+
self[:length] = 6
|
|
52
|
+
self[:codepoint] = Constants::SECMEC
|
|
53
|
+
self[:payload] = 3 # Plaintext username and password.
|
|
54
|
+
end
|
|
55
|
+
def to_s
|
|
56
|
+
self.to_a.pack("nnn")
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Relational Database name parameter.
|
|
61
|
+
class RDBNAM_PARAM < Struct.new(:length, :codepoint, :payload)
|
|
62
|
+
def initialize(args={})
|
|
63
|
+
self[:length] = 22 # Since the database name is padded out.
|
|
64
|
+
self[:codepoint] = Constants::RDBNAM
|
|
65
|
+
self[:payload] = encode(args[:payload].to_s)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def encode(str)
|
|
69
|
+
Rex::Text.to_ebcdic([str].pack("A18"))
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def payload=(str)
|
|
73
|
+
self[:payload] = encode(str.to_s)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def to_s
|
|
77
|
+
self.to_a.pack("nna18")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# The ACCSEC DDM is responsible for picking the security mechanism (SECMEC)
|
|
83
|
+
# which, in our case, will always be plain text username and password. It
|
|
84
|
+
# also sets the relational database name (RDBNAM), if specified. You need
|
|
85
|
+
# one to login, but not to probe.
|
|
86
|
+
class ACCSEC_DDM < Struct.new(:length, :magic, :format, :correlid, :length2,
|
|
87
|
+
:codepoint, :secmec, :rdbnam)
|
|
88
|
+
def initialize(args={})
|
|
89
|
+
self[:magic] = 0xd0
|
|
90
|
+
self[:format] = args[:format] || 0x01
|
|
91
|
+
self[:correlid] = 2
|
|
92
|
+
self[:codepoint] = Constants::ACCSEC
|
|
93
|
+
self[:secmec] = SECMEC_PARAM.new.to_s
|
|
94
|
+
if args[:dbname] # Include a database name if we're given one.
|
|
95
|
+
self[:rdbnam] = RDBNAM_PARAM.new(:payload => args[:dbname]).to_s
|
|
96
|
+
end
|
|
97
|
+
self[:length] = 10 + self[:secmec].to_s.size + self[:rdbnam].to_s.size
|
|
98
|
+
self[:length2] = self[:length]-6
|
|
99
|
+
end
|
|
100
|
+
def dbname=(str)
|
|
101
|
+
self[:rdbnam] = RDBNAM_PARAM.new(:payload => args[:dbname]).to_s
|
|
102
|
+
end
|
|
103
|
+
def to_s
|
|
104
|
+
packstr = "nCCnnna6"
|
|
105
|
+
packstr += "a22" if self[:rdbnam]
|
|
106
|
+
self.to_a.pack(packstr)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
class DDM_PARAM < Struct.new(:length, :codepoint, :payload)
|
|
111
|
+
|
|
112
|
+
def read(str="")
|
|
113
|
+
raise DRDA::Error, "Input isn't a String." if !str.kind_of? String
|
|
114
|
+
raise DRDA::RespError, "DDM_PARAM is too short" if str.size < 4
|
|
115
|
+
(self[:length], self[:codepoint]) =
|
|
116
|
+
str.unpack("nn")
|
|
117
|
+
raise DRDA::RespError, "DDM_PARAM Length is too short" if self[:length] < 4
|
|
118
|
+
rest = str[4,self[:length]-4] # If it's negative or whatever, it'll end up as "".
|
|
119
|
+
self[:payload] = rest.to_s[0,self[:length]-4]
|
|
120
|
+
return self
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def to_s
|
|
124
|
+
self.to_a.pack("nna*")
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
class BASIC_DDM < Struct.new(:length, :magic, :format, :correlid,
|
|
130
|
+
:length2, :codepoint, :payload)
|
|
131
|
+
def initialize
|
|
132
|
+
self[:payload] = []
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def read(str="")
|
|
136
|
+
self[:payload].clear
|
|
137
|
+
raise DRDA::Error, "Input isn't a String." if !str.kind_of? String
|
|
138
|
+
raise DRDA::RespError, "Response is too short." if str.size < 10
|
|
139
|
+
(self[:length],self[:magic],self[:format],
|
|
140
|
+
self[:correlid],self[:length2],self[:codepoint]) =
|
|
141
|
+
str.unpack("nCCnnn")
|
|
142
|
+
sanity_check
|
|
143
|
+
rest = str[10,self[:length2]-4]
|
|
144
|
+
i = 0
|
|
145
|
+
while (i < rest.size)
|
|
146
|
+
if self[:codepoint] == Constants::SQLCARD # These aren't DDM's.
|
|
147
|
+
this_param = rest[i,self[:length]-10]
|
|
148
|
+
else
|
|
149
|
+
this_param = DDM_PARAM.new.read(rest[i,rest.size])
|
|
150
|
+
end
|
|
151
|
+
self[:payload] << this_param
|
|
152
|
+
i += this_param.to_s.size
|
|
153
|
+
end
|
|
154
|
+
return self
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Just a quick test.
|
|
158
|
+
def sanity_check
|
|
159
|
+
if self[:length] < 10
|
|
160
|
+
raise DRDA::RespError, "DDM Length is too short."
|
|
161
|
+
elsif self[:length2] < 4
|
|
162
|
+
raise DRDA::RespError, "DDM Length2 is too short."
|
|
163
|
+
elsif self[:length]-6 != self[:length2]
|
|
164
|
+
raise DRDA::RespError, "Codepoint: 0x#{self[:codepoint].to_s(16)} DDM Length2 (0x#{self[:length2].to_s(16)}) isn't six less than Length (0x#{self[:length].to_s(16)})"
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def to_s
|
|
169
|
+
self.to_a.pack("nCCnnn") + self[:payload].map {|x| x.to_s}.join
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
class SERVER_PACKET < Array
|
|
175
|
+
|
|
176
|
+
def read(str="")
|
|
177
|
+
raise DRDA::Error, "Input isn't a String." if !str.kind_of? String
|
|
178
|
+
self.clear
|
|
179
|
+
i = 0
|
|
180
|
+
while(i < str.size)
|
|
181
|
+
this_ddm = BASIC_DDM.new.read(str[i,str.size])
|
|
182
|
+
self << this_ddm
|
|
183
|
+
i += this_ddm.to_s.size
|
|
184
|
+
end
|
|
185
|
+
return self
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def to_s; self.join; end
|
|
189
|
+
def sz; self.to_s.size; end
|
|
190
|
+
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
class PASSWORD_PARAM < Struct.new(:length, :codepoint, :payload)
|
|
194
|
+
def initialize(args={})
|
|
195
|
+
self[:codepoint] = Constants::PASSWORD
|
|
196
|
+
self[:payload] = Rex::Text.to_ebcdic(args[:payload].to_s)
|
|
197
|
+
self[:length] = self[:payload].size + 4
|
|
198
|
+
end
|
|
199
|
+
def encode(str)
|
|
200
|
+
Rex::Text.to_ebcdic(str)
|
|
201
|
+
end
|
|
202
|
+
def to_s
|
|
203
|
+
self.to_a.pack("nna*")
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
class USERID_PARAM < Struct.new(:length, :codepoint, :payload)
|
|
208
|
+
def initialize(args={})
|
|
209
|
+
self[:codepoint] = Constants::USERID
|
|
210
|
+
self[:payload] = Rex::Text.to_ebcdic(args[:payload].to_s)
|
|
211
|
+
self[:length] = self[:payload].size + 4
|
|
212
|
+
end
|
|
213
|
+
def encode(str)
|
|
214
|
+
Rex::Text.to_ebcdic(str)
|
|
215
|
+
end
|
|
216
|
+
def to_s
|
|
217
|
+
self.to_a.pack("nna*")
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
class SECCHK_DDM < Struct.new(:length, :magic, :format, :correlid, :length2,
|
|
222
|
+
:codepoint, :secmec, :rdbnam, :password, :userid)
|
|
223
|
+
def initialize(args={}) # Takes :dbname, :dbpass, :dbuser
|
|
224
|
+
self[:magic] = 0xd0
|
|
225
|
+
self[:format] = 0x01
|
|
226
|
+
self[:correlid] = 2
|
|
227
|
+
self[:codepoint] = Constants::SECCHK
|
|
228
|
+
self[:secmec] = SECMEC_PARAM.new.to_s
|
|
229
|
+
if args[:dbname] # Include a database name if we're given one.
|
|
230
|
+
self[:rdbnam] = RDBNAM_PARAM.new(:payload => args[:dbname]).to_s
|
|
231
|
+
end
|
|
232
|
+
self[:password] = PASSWORD_PARAM.new(:payload => args[:dbpass]).to_s
|
|
233
|
+
self[:userid] = USERID_PARAM.new(:payload => args[:dbuser]).to_s
|
|
234
|
+
self[:length] = ( 10 + self[:secmec].to_s.size + self[:rdbnam].to_s.size +
|
|
235
|
+
self[:password].to_s.size + self[:userid].to_s.size )
|
|
236
|
+
self[:length2] = self[:length]-6
|
|
237
|
+
end
|
|
238
|
+
def dbname=(str)
|
|
239
|
+
self[:rdbnam] = RDBNAM_PARAM.new(:payload => args[:dbname]).to_s
|
|
240
|
+
end
|
|
241
|
+
def to_s
|
|
242
|
+
packstr = "nCCnnna6"
|
|
243
|
+
packstr += "a22" if self[:rdbnam]
|
|
244
|
+
packstr += "a*a*" # username and password
|
|
245
|
+
self.to_a.pack(packstr)
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
4
|
+
|
|
5
|
+
require 'rex/test'
|
|
6
|
+
require 'rex/proto/drda/packet'
|
|
7
|
+
|
|
8
|
+
class Rex::Proto::DRDA::UnitTest < Test::Unit::TestCase
|
|
9
|
+
|
|
10
|
+
Klass = Rex::Proto::DRDA
|
|
11
|
+
Konst = Rex::Proto::DRDA::Constants
|
|
12
|
+
|
|
13
|
+
# Test a sample param
|
|
14
|
+
def test_mgrlvlls_param
|
|
15
|
+
p = Klass::MGRLVLLS_PARAM.new
|
|
16
|
+
assert_kind_of(Struct, p)
|
|
17
|
+
assert_equal(Konst::MGRLVLLS, p.codepoint)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Test a sample ddm
|
|
21
|
+
def test_secchk_ddm
|
|
22
|
+
d = Klass::SECCHK_DDM.new
|
|
23
|
+
assert_kind_of Struct, d
|
|
24
|
+
assert_equal Konst::SECCHK, d.codepoint
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# All parameter names should have a corresponding codepoint,
|
|
28
|
+
# except "DDM_PARAM" (a generic parameter).
|
|
29
|
+
def test_all_param_codepoints
|
|
30
|
+
params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
|
|
31
|
+
assert_operator params.size, :>=, 6 # Allow for more later.
|
|
32
|
+
params.each do |p|
|
|
33
|
+
cp = p.split(/_PARAM/).first
|
|
34
|
+
next if cp == "DDM"
|
|
35
|
+
assert Konst.const_defined? cp
|
|
36
|
+
assert_kind_of Numeric, Konst.const_get(cp)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Similarly, so should DDM Structs.
|
|
41
|
+
def test_all_ddm_codepoints
|
|
42
|
+
ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
|
|
43
|
+
assert_operator ddms.size, :>=, 4 # Allow for more later.
|
|
44
|
+
ddms.each do |p|
|
|
45
|
+
cp = p.split(/_DDM/).first
|
|
46
|
+
next if cp == "BASIC"
|
|
47
|
+
assert_kind_of Numeric, Konst.const_get(cp)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Ensure that all params have the same struct.
|
|
52
|
+
def test_param_struct
|
|
53
|
+
params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
|
|
54
|
+
params.each do |p|
|
|
55
|
+
obj = Klass.const_get(p).new
|
|
56
|
+
assert_equal 3, obj.size
|
|
57
|
+
assert_respond_to obj, :codepoint
|
|
58
|
+
assert_respond_to obj, :length
|
|
59
|
+
assert_respond_to obj, :payload
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Make some similiar assertions about DDMs, though specific DDMs
|
|
64
|
+
# will have particular elements after the codepoint, usually more
|
|
65
|
+
# than one.
|
|
66
|
+
def test_ddm_struct
|
|
67
|
+
ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
|
|
68
|
+
ddms.each do |d|
|
|
69
|
+
obj = Klass.const_get(d).new
|
|
70
|
+
assert_operator obj.size, :>=, 7
|
|
71
|
+
assert_respond_to obj, :length
|
|
72
|
+
assert_respond_to obj, :magic
|
|
73
|
+
assert_respond_to obj, :format
|
|
74
|
+
assert_respond_to obj, :correlid
|
|
75
|
+
assert_respond_to obj, :length2
|
|
76
|
+
assert_respond_to obj, :codepoint
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# The server packet is special since it's an Array of BASIC_DDM's,
|
|
81
|
+
# and doesn't have a particular, fixed struct. (It would be nice
|
|
82
|
+
# to build those up on the fly, but we're not really interested in
|
|
83
|
+
# validating most server responses right now.
|
|
84
|
+
def test_server_packet_structure
|
|
85
|
+
s = Klass::SERVER_PACKET.new
|
|
86
|
+
assert_kind_of Array, s
|
|
87
|
+
assert_respond_to s, :to_s
|
|
88
|
+
assert_respond_to s, :sz
|
|
89
|
+
assert_respond_to s, :read
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Exercise the SERVER_PACKET#read function with a sample packet.
|
|
93
|
+
def test_server_packet_read
|
|
94
|
+
pkt = "0015d0420001000f1219000611490000000511a4000050d0520002004a2201000611490000000c112ee2d8d3f0f8f0f2f4000d002fd8e3c4e2d8d3e7f8f6000a00350006119c033300062103022e00172135c3f0c1f8f6c1f0f14bc5c6f1f2070402195612008cd0030002008624080000000000303030303053514c303830323400ffffffff0200000000000000030000000000000000000000202020202020202020202000124d59444232444220202020202020202020200000003331ff383139ff4d59555345522020ff4d594442324442ff514442322f4c494e5558ff353538ff353538ff30ff31323038ff30ffff".scan(/../).map {|x| x.to_i(16).chr}.join
|
|
95
|
+
s = Klass::SERVER_PACKET.new
|
|
96
|
+
assert_equal 0, s.size
|
|
97
|
+
s.read(pkt)
|
|
98
|
+
assert_equal 3, s.size
|
|
99
|
+
assert_equal Konst::SECCHKRM, s[0].codepoint
|
|
100
|
+
assert_equal Konst::ACCRDBRM, s[1].codepoint
|
|
101
|
+
assert_equal Konst::SQLCARD, s[2].codepoint
|
|
102
|
+
assert_equal 0xd0, s[0].magic
|
|
103
|
+
assert_equal 0x52, s[1].format
|
|
104
|
+
assert_equal 134, s[2].length2
|
|
105
|
+
assert_equal 21+80+140, s.sz
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
require 'rex/proto/drda'
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Proto
|
|
5
|
+
module DRDA
|
|
6
|
+
class Utils
|
|
7
|
+
|
|
8
|
+
# Creates a packet with EXCSAT_DDM and an ACCSEC_DDM. This will elicit
|
|
9
|
+
# a reponse from the target server.
|
|
10
|
+
def self.client_probe(dbname=nil)
|
|
11
|
+
pkt = [
|
|
12
|
+
EXCSAT_DDM.new,
|
|
13
|
+
ACCSEC_DDM.new(:dbname => dbname)
|
|
14
|
+
]
|
|
15
|
+
pkt.map {|x| x.to_s}.join
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Creates a packet with EXCSAT_DDM and an SECCHK_DDM.
|
|
19
|
+
# In order to ever succeed, you do need a successful probe first.
|
|
20
|
+
def self.client_auth(args={})
|
|
21
|
+
dbname = args[:dbname]
|
|
22
|
+
dbuser = args[:dbuser]
|
|
23
|
+
dbpass = args[:dbpass]
|
|
24
|
+
pkt = [
|
|
25
|
+
ACCSEC_DDM.new(:format => 0x41),
|
|
26
|
+
SECCHK_DDM.new(:dbname => dbname, :dbuser => dbuser, :dbpass => dbpass)
|
|
27
|
+
]
|
|
28
|
+
pkt.map {|x| x.to_s}.join
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.server_packet_info(obj)
|
|
32
|
+
info_hash = {}
|
|
33
|
+
return info_hash unless obj.kind_of? Rex::Proto::DRDA::SERVER_PACKET
|
|
34
|
+
obj.each do |ddm|
|
|
35
|
+
case ddm.codepoint
|
|
36
|
+
when Constants::EXCSATRD
|
|
37
|
+
info_hash.merge!(_info_excsatrd(ddm))
|
|
38
|
+
when Constants::ACCSECRD
|
|
39
|
+
info_hash.merge!(_info_accsecrd(ddm))
|
|
40
|
+
when Constants::RDBNFNRM
|
|
41
|
+
info_hash.merge!(_info_rdbnfnrm(ddm))
|
|
42
|
+
when Constants::SECCHKRM
|
|
43
|
+
info_hash.merge!(_info_secchkrm(ddm))
|
|
44
|
+
else
|
|
45
|
+
next
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
return info_hash
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self._info_excsatrd(ddm)
|
|
52
|
+
info_hash = {:excsatrd => true}
|
|
53
|
+
ddm.payload.each do |param|
|
|
54
|
+
case param.codepoint
|
|
55
|
+
when Constants::SRVNAM
|
|
56
|
+
info_hash[:instance_name] = Rex::Text.from_ebcdic(param.payload)
|
|
57
|
+
when Constants::SRVCLSNM
|
|
58
|
+
info_hash[:platform] = Rex::Text.from_ebcdic(param.payload)
|
|
59
|
+
when Constants::SRVRLSLV
|
|
60
|
+
info_hash[:version] = Rex::Text.from_ebcdic(param.payload)
|
|
61
|
+
else
|
|
62
|
+
next
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
return info_hash
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def self._info_accsecrd(ddm)
|
|
69
|
+
info_hash = {:accsecrd => true}
|
|
70
|
+
ddm.payload.each do |param|
|
|
71
|
+
case param.codepoint
|
|
72
|
+
when Constants::SECMEC
|
|
73
|
+
info_hash[:plaintext_auth] = true if param.payload =~ /\x00\x03/
|
|
74
|
+
when Constants::SECCHKCD
|
|
75
|
+
info_hash[:security_check_code] = param.payload.unpack("C").first
|
|
76
|
+
# A little spurious? This is always nonzero when there's no SECCHKRM DDM.
|
|
77
|
+
info_hash[:db_login_success] = false unless info_hash[:security_check_code].zero?
|
|
78
|
+
else
|
|
79
|
+
next
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
return info_hash
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self._info_rdbnfnrm(ddm)
|
|
86
|
+
info_hash = {:rdbnfnrm => true}
|
|
87
|
+
info_hash[:database_found] = false
|
|
88
|
+
ddm.payload.each do |param|
|
|
89
|
+
case param.codepoint
|
|
90
|
+
when Constants::RDBNAM
|
|
91
|
+
info_hash[:db_name] = Rex::Text.from_ebcdic(param.payload).unpack("A*").first
|
|
92
|
+
when Constants::SRVDGN
|
|
93
|
+
info_hash[:error_message] = Rex::Text.from_ebcdic(param.payload)
|
|
94
|
+
else
|
|
95
|
+
next
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
return info_hash
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def self._info_secchkrm(ddm)
|
|
102
|
+
info_hash = {:secchkrm => true}
|
|
103
|
+
ddm.payload.each do |param|
|
|
104
|
+
case param.codepoint
|
|
105
|
+
when Constants::SRVCOD
|
|
106
|
+
info_hash[:severity_code] = param.payload.unpack("n").first
|
|
107
|
+
when Constants::SECCHKCD
|
|
108
|
+
info_hash[:security_check_code] = param.payload.unpack("C").first
|
|
109
|
+
else
|
|
110
|
+
next
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
if info_hash[:serverity].to_i.zero? and info_hash[:security_check_code].to_i.zero?
|
|
114
|
+
info_hash[:db_login_success] = true
|
|
115
|
+
end
|
|
116
|
+
return info_hash
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|