librex 0.0.20 → 0.0.21
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/Rakefile +1 -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 +104 -0
- data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +311 -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 +258 -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 +114 -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 +9 -0
- data/lib/rex/exploitation/cmdstager/base.rb +175 -0
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +142 -0
- data/lib/rex/exploitation/cmdstager/debug_write.rb +136 -0
- data/lib/rex/exploitation/cmdstager/tftp.rb +63 -0
- data/lib/rex/exploitation/cmdstager/vbs.rb +128 -0
- data/lib/rex/exploitation/egghunter.rb +277 -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 +897 -0
- data/lib/rex/exploitation/obfuscatejs.rb +335 -0
- data/lib/rex/exploitation/omelet.rb +320 -0
- data/lib/rex/exploitation/omelet.rb.ut.rb +13 -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 +112 -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/ring_buffer.rb +364 -0
- data/lib/rex/io/stream.rb +319 -0
- data/lib/rex/io/stream_abstraction.rb +197 -0
- data/lib/rex/io/stream_server.rb +211 -0
- data/lib/rex/job_container.rb +187 -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 +77 -0
- data/lib/rex/mime/message.rb +144 -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 +205 -0
- data/lib/rex/ole/clsid.rb +47 -0
- data/lib/rex/ole/difat.rb +141 -0
- data/lib/rex/ole/directory.rb +231 -0
- data/lib/rex/ole/direntry.rb +240 -0
- data/lib/rex/ole/docs/dependencies.txt +8 -0
- data/lib/rex/ole/docs/references.txt +1 -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/propset.rb +144 -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/ip360_aspl_xml.rb +102 -0
- data/lib/rex/parser/ip360_xml.rb +97 -0
- data/lib/rex/parser/nessus_xml.rb +118 -0
- data/lib/rex/parser/netsparker_xml.rb +94 -0
- data/lib/rex/parser/nexpose_xml.rb +136 -0
- data/lib/rex/parser/nmap_xml.rb +137 -0
- data/lib/rex/parser/retina_xml.rb +109 -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 +194 -0
- data/lib/rex/peparsey.rb +12 -0
- data/lib/rex/peparsey/exceptions.rb +32 -0
- data/lib/rex/peparsey/pe.rb +212 -0
- data/lib/rex/peparsey/pe_memdump.rb +63 -0
- data/lib/rex/peparsey/pebase.rb +1680 -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 +477 -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 +445 -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 +364 -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/networkpug/networkpug.rb +57 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -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 +111 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +101 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +26 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +282 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +266 -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 +180 -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 +208 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +6 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +31 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +47 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +36 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1818 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3848 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +26 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +318 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +42 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +148 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +127 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +309 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +204 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +51 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +630 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +75 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +103 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +149 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -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 +370 -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 +193 -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 +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +211 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +63 -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 +688 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +431 -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 +137 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +730 -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/networkpug.rb +231 -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 +65 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +442 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +298 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +486 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +157 -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 +13 -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 +361 -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 +187 -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/dhcp.rb +7 -0
- data/lib/rex/proto/dhcp/constants.rb +33 -0
- data/lib/rex/proto/dhcp/server.rb +292 -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 +821 -0
- data/lib/rex/proto/http/client.rb.ut.rb +95 -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 +60 -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 +407 -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 +90 -0
- data/lib/rex/proto/http/response.rb.ut.rb +149 -0
- data/lib/rex/proto/http/server.rb +369 -0
- data/lib/rex/proto/http/server.rb.ut.rb +79 -0
- data/lib/rex/proto/ntlm.rb +7 -0
- data/lib/rex/proto/ntlm.rb.ut.rb +177 -0
- data/lib/rex/proto/ntlm/base.rb +326 -0
- data/lib/rex/proto/ntlm/constants.rb +74 -0
- data/lib/rex/proto/ntlm/crypt.rb +415 -0
- data/lib/rex/proto/ntlm/exceptions.rb +16 -0
- data/lib/rex/proto/ntlm/message.rb +536 -0
- data/lib/rex/proto/ntlm/utils.rb +764 -0
- data/lib/rex/proto/proxy/socks4a.rb +440 -0
- data/lib/rex/proto/rfb.rb +19 -0
- data/lib/rex/proto/rfb.rb.ut.rb +37 -0
- data/lib/rex/proto/rfb/cipher.rb +84 -0
- data/lib/rex/proto/rfb/client.rb +207 -0
- data/lib/rex/proto/rfb/constants.rb +52 -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 +1952 -0
- data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
- data/lib/rex/proto/smb/constants.rb +1047 -0
- data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
- data/lib/rex/proto/smb/crypt.rb +36 -0
- data/lib/rex/proto/smb/evasions.rb +66 -0
- data/lib/rex/proto/smb/exceptions.rb +858 -0
- data/lib/rex/proto/smb/simpleclient.rb +306 -0
- data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
- data/lib/rex/proto/smb/utils.rb +103 -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/proto/tftp.rb +12 -0
- data/lib/rex/proto/tftp/constants.rb +39 -0
- data/lib/rex/proto/tftp/server.rb +497 -0
- data/lib/rex/proto/tftp/server.rb.ut.rb +28 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +59 -0
- data/lib/rex/script/meterpreter.rb +15 -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 +684 -0
- data/lib/rex/socket.rb.ut.rb +107 -0
- data/lib/rex/socket/comm.rb +119 -0
- data/lib/rex/socket/comm/local.rb +412 -0
- data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
- data/lib/rex/socket/ip.rb +130 -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 +346 -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 +61 -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 +278 -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 +66 -0
- data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
- data/lib/rex/socket/udp.rb +164 -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 +1163 -0
- data/lib/rex/text.rb.ut.rb +190 -0
- data/lib/rex/thread_factory.rb +42 -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 +298 -0
- data/lib/rex/ui/output.rb +78 -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 +467 -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 +57 -0
- data/lib/rex/ui/text/output.rb +80 -0
- data/lib/rex/ui/text/output/buffer.rb +61 -0
- data/lib/rex/ui/text/output/file.rb +43 -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 +328 -0
- data/lib/rex/ui/text/table.rb +279 -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 +184 -0
- data/lib/rex/zip/blocks.rb +182 -0
- data/lib/rex/zip/entry.rb +104 -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 +434 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'rex/post/meterpreter'
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Post
|
|
5
|
+
module Meterpreter
|
|
6
|
+
module Ui
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# Privilege escalation extension user interface.
|
|
11
|
+
#
|
|
12
|
+
###
|
|
13
|
+
class Console::CommandDispatcher::Priv
|
|
14
|
+
|
|
15
|
+
require 'rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate'
|
|
16
|
+
require 'rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd'
|
|
17
|
+
require 'rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp'
|
|
18
|
+
|
|
19
|
+
Klass = Console::CommandDispatcher::Priv
|
|
20
|
+
|
|
21
|
+
Dispatchers =
|
|
22
|
+
[
|
|
23
|
+
Klass::Elevate,
|
|
24
|
+
Klass::Passwd,
|
|
25
|
+
Klass::Timestomp,
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
include Console::CommandDispatcher
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# Initializes an instance of the priv command interaction.
|
|
32
|
+
#
|
|
33
|
+
def initialize(shell)
|
|
34
|
+
super
|
|
35
|
+
|
|
36
|
+
Dispatchers.each { |d|
|
|
37
|
+
shell.enstack_dispatcher(d)
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# List of supported commands.
|
|
43
|
+
#
|
|
44
|
+
def commands
|
|
45
|
+
{
|
|
46
|
+
}
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# Name for this dispatcher
|
|
51
|
+
#
|
|
52
|
+
def name
|
|
53
|
+
"Privilege Escalation"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require 'rex/post/meterpreter'
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Post
|
|
5
|
+
module Meterpreter
|
|
6
|
+
module Ui
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# The local privilege escalation portion of the extension.
|
|
11
|
+
#
|
|
12
|
+
###
|
|
13
|
+
class Console::CommandDispatcher::Priv::Elevate
|
|
14
|
+
|
|
15
|
+
Klass = Console::CommandDispatcher::Priv::Elevate
|
|
16
|
+
|
|
17
|
+
include Console::CommandDispatcher
|
|
18
|
+
|
|
19
|
+
ELEVATE_TECHNIQUE_NONE = -1
|
|
20
|
+
ELEVATE_TECHNIQUE_ANY = 0
|
|
21
|
+
ELEVATE_TECHNIQUE_SERVICE_NAMEDPIPE = 1
|
|
22
|
+
ELEVATE_TECHNIQUE_SERVICE_NAMEDPIPE2 = 2
|
|
23
|
+
ELEVATE_TECHNIQUE_SERVICE_TOKENDUP = 3
|
|
24
|
+
ELEVATE_TECHNIQUE_VULN_KITRAP0D = 4
|
|
25
|
+
|
|
26
|
+
ELEVATE_TECHNIQUE_DESCRIPTION = [ "All techniques available",
|
|
27
|
+
"Service - Named Pipe Impersonation (In Memory/Admin)",
|
|
28
|
+
"Service - Named Pipe Impersonation (Dropper/Admin)",
|
|
29
|
+
"Service - Token Duplication (In Memory/Admin)",
|
|
30
|
+
"Exploit - KiTrap0D (In Memory/User)"
|
|
31
|
+
]
|
|
32
|
+
#
|
|
33
|
+
# List of supported commands.
|
|
34
|
+
#
|
|
35
|
+
def commands
|
|
36
|
+
{
|
|
37
|
+
"getsystem" => "Attempt to elevate your privilege to that of local system."
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# Name for this dispatcher.
|
|
43
|
+
#
|
|
44
|
+
def name
|
|
45
|
+
"Priv: Elevate"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# Attempt to elevate the meterpreter to that of local system.
|
|
51
|
+
#
|
|
52
|
+
def cmd_getsystem( *args )
|
|
53
|
+
|
|
54
|
+
technique = ELEVATE_TECHNIQUE_ANY
|
|
55
|
+
|
|
56
|
+
desc = ""
|
|
57
|
+
ELEVATE_TECHNIQUE_DESCRIPTION.each_index { |i| desc += "\n\t\t#{i} : #{ELEVATE_TECHNIQUE_DESCRIPTION[i]}" }
|
|
58
|
+
|
|
59
|
+
getsystem_opts = Rex::Parser::Arguments.new(
|
|
60
|
+
"-h" => [ false, "Help Banner." ],
|
|
61
|
+
"-t" => [ true, "The technique to use. (Default to \'#{technique}\')." + desc ]
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
getsystem_opts.parse(args) { | opt, idx, val |
|
|
65
|
+
case opt
|
|
66
|
+
when "-h"
|
|
67
|
+
print_line( "Usage: getsystem [options]\n" )
|
|
68
|
+
print_line( "Attempt to elevate your privilege to that of local system." )
|
|
69
|
+
print_line( getsystem_opts.usage )
|
|
70
|
+
return
|
|
71
|
+
when "-t"
|
|
72
|
+
technique = val.to_i
|
|
73
|
+
end
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if( technique < 0 or technique >= ELEVATE_TECHNIQUE_DESCRIPTION.length )
|
|
77
|
+
print_error( "Technique '#{technique}' is out of range." );
|
|
78
|
+
return false;
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
result = client.priv.getsystem( technique )
|
|
82
|
+
|
|
83
|
+
# got system?
|
|
84
|
+
if result[0]
|
|
85
|
+
print_line( "...got system (via technique #{result[1]})." );
|
|
86
|
+
else
|
|
87
|
+
print_line( "...failed to get system." );
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
return result
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'rex/post/meterpreter'
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Post
|
|
5
|
+
module Meterpreter
|
|
6
|
+
module Ui
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# The password database portion of the privilege escalation extension.
|
|
11
|
+
#
|
|
12
|
+
###
|
|
13
|
+
class Console::CommandDispatcher::Priv::Passwd
|
|
14
|
+
|
|
15
|
+
Klass = Console::CommandDispatcher::Priv::Passwd
|
|
16
|
+
|
|
17
|
+
include Console::CommandDispatcher
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# List of supported commands.
|
|
21
|
+
#
|
|
22
|
+
def commands
|
|
23
|
+
{
|
|
24
|
+
"hashdump" => "Dumps the contents of the SAM database"
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Name for this dispatcher.
|
|
30
|
+
#
|
|
31
|
+
def name
|
|
32
|
+
"Priv: Password database"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Displays the contents of the SAM database
|
|
37
|
+
#
|
|
38
|
+
def cmd_hashdump(*args)
|
|
39
|
+
client.priv.sam_hashes.each { |user|
|
|
40
|
+
print_line("#{user}")
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return true
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
require 'rex/post/meterpreter'
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Post
|
|
5
|
+
module Meterpreter
|
|
6
|
+
module Ui
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# This class provides commands that interact with the timestomp feature set of
|
|
11
|
+
# the privilege escalation extension.
|
|
12
|
+
#
|
|
13
|
+
###
|
|
14
|
+
class Console::CommandDispatcher::Priv::Timestomp
|
|
15
|
+
|
|
16
|
+
Klass = Console::CommandDispatcher::Priv::Timestomp
|
|
17
|
+
|
|
18
|
+
include Console::CommandDispatcher
|
|
19
|
+
|
|
20
|
+
@@timestomp_opts = Rex::Parser::Arguments.new(
|
|
21
|
+
"-m" => [ true, "Set the \"last written\" time of the file" ],
|
|
22
|
+
"-a" => [ true, "Set the \"last accessed\" time of the file" ],
|
|
23
|
+
"-c" => [ true, "Set the \"creation\" time of the file" ],
|
|
24
|
+
"-e" => [ true, "Set the \"mft entry modified\" time of the file" ],
|
|
25
|
+
"-z" => [ true, "Set all four attributes (MACE) of the file" ],
|
|
26
|
+
"-f" => [ true, "Set the MACE of attributes equal to the supplied file" ],
|
|
27
|
+
"-b" => [ false, "Set the MACE timestamps so that EnCase shows blanks" ],
|
|
28
|
+
"-r" => [ false, "Set the MACE timestamps recursively on a directory" ],
|
|
29
|
+
"-v" => [ false, "Display the UTC MACE values of the file" ],
|
|
30
|
+
"-h" => [ false, "Help banner" ])
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
# List of supported commands.
|
|
34
|
+
#
|
|
35
|
+
def commands
|
|
36
|
+
{
|
|
37
|
+
"timestomp" => "Manipulate file MACE attributes"
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# Name for this dispatcher.
|
|
43
|
+
#
|
|
44
|
+
def name
|
|
45
|
+
"Priv: Timestomp"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# This command provides the same level of features that vinnie's command
|
|
50
|
+
# line timestomp interface provides with a similar argument set.
|
|
51
|
+
#
|
|
52
|
+
def cmd_timestomp(*args)
|
|
53
|
+
if (args.length < 2)
|
|
54
|
+
print_line("\nUsage: timestomp file_path OPTIONS\n" +
|
|
55
|
+
@@timestomp_opts.usage)
|
|
56
|
+
return
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
file_path = args.shift
|
|
60
|
+
modified = nil
|
|
61
|
+
accessed = nil
|
|
62
|
+
creation = nil
|
|
63
|
+
emodified = nil
|
|
64
|
+
|
|
65
|
+
@@timestomp_opts.parse(args) { |opt, idx, val|
|
|
66
|
+
case opt
|
|
67
|
+
when "-m"
|
|
68
|
+
modified = str_to_time(val)
|
|
69
|
+
when "-a"
|
|
70
|
+
accessed = str_to_time(val)
|
|
71
|
+
when "-c"
|
|
72
|
+
creation = str_to_time(val)
|
|
73
|
+
when "-e"
|
|
74
|
+
emodified = str_to_time(val)
|
|
75
|
+
when "-z"
|
|
76
|
+
puts "#{val}"
|
|
77
|
+
modified = str_to_time(val)
|
|
78
|
+
accessed = str_to_time(val)
|
|
79
|
+
creation = str_to_time(val)
|
|
80
|
+
emodified = str_to_time(val)
|
|
81
|
+
when "-f"
|
|
82
|
+
print_status("Setting MACE attributes on #{file_path} from #{val}")
|
|
83
|
+
client.priv.fs.set_file_mace_from_file(file_path, val)
|
|
84
|
+
when "-b"
|
|
85
|
+
print_status("Blanking file MACE attributes on #{file_path}")
|
|
86
|
+
client.priv.fs.blank_file_mace(file_path)
|
|
87
|
+
when "-r"
|
|
88
|
+
print_status("Blanking directory MACE attributes on #{file_path}")
|
|
89
|
+
client.priv.fs.blank_directory_mace(file_path)
|
|
90
|
+
when "-v"
|
|
91
|
+
hash = client.priv.fs.get_file_mace(file_path)
|
|
92
|
+
|
|
93
|
+
print_line("Modified : #{hash['Modified']}")
|
|
94
|
+
print_line("Accessed : #{hash['Accessed']}")
|
|
95
|
+
print_line("Created : #{hash['Created']}")
|
|
96
|
+
print_line("Entry Modified: #{hash['Entry Modified']}")
|
|
97
|
+
when "-h"
|
|
98
|
+
print_line("\nUsage: timestomp file_path OPTIONS\n" +
|
|
99
|
+
@@timestomp_opts.usage)
|
|
100
|
+
return
|
|
101
|
+
end
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
# If any one of the four times were specified, change them.
|
|
105
|
+
if (modified or accessed or creation or emodified)
|
|
106
|
+
print_status("Setting specific MACE attributes on #{file_path}")
|
|
107
|
+
client.priv.fs.set_file_mace(file_path, modified, accessed,
|
|
108
|
+
creation, emodified)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
protected
|
|
113
|
+
|
|
114
|
+
#
|
|
115
|
+
# Converts a date/time in the form of MM/DD/YYYY HH24:MI:SS
|
|
116
|
+
#
|
|
117
|
+
def str_to_time(str) # :nodoc:
|
|
118
|
+
r, mon, day, year, hour, min, sec = str.match("^(\\d+?)/(\\d+?)/(\\d+?) (\\d+?):(\\d+?):(\\d+?)$").to_a
|
|
119
|
+
|
|
120
|
+
if (mon == nil)
|
|
121
|
+
raise ArgumentError, "Invalid date format, expected MM/DD/YYYY HH24:MI:SS (got #{str})"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
Time.mktime(year, mon, day, hour, min, sec, 0)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
require 'rex/post/meterpreter'
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Post
|
|
5
|
+
module Meterpreter
|
|
6
|
+
module Ui
|
|
7
|
+
|
|
8
|
+
###
|
|
9
|
+
#
|
|
10
|
+
# Packet sniffer extension user interface.
|
|
11
|
+
#
|
|
12
|
+
###
|
|
13
|
+
class Console::CommandDispatcher::Sniffer
|
|
14
|
+
|
|
15
|
+
Klass = Console::CommandDispatcher::Sniffer
|
|
16
|
+
|
|
17
|
+
include Console::CommandDispatcher
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Initializes an instance of the sniffer command interaction.
|
|
21
|
+
#
|
|
22
|
+
def initialize(shell)
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# List of supported commands.
|
|
28
|
+
#
|
|
29
|
+
def commands
|
|
30
|
+
{
|
|
31
|
+
"sniffer_interfaces" => "Enumerate all sniffable network interfaces",
|
|
32
|
+
"sniffer_start" => "Start packet capture on a specific interface",
|
|
33
|
+
"sniffer_stop" => "Stop packet capture on a specific interface",
|
|
34
|
+
"sniffer_stats" => "View statistics of an active capture",
|
|
35
|
+
"sniffer_dump" => "Retrieve captured packet data to PCAP file",
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def cmd_sniffer_interfaces(*args)
|
|
41
|
+
|
|
42
|
+
ifaces = client.sniffer.interfaces()
|
|
43
|
+
|
|
44
|
+
print_line()
|
|
45
|
+
|
|
46
|
+
ifaces.each do |i|
|
|
47
|
+
print_line(sprintf("%d - '%s' ( type:%d mtu:%d usable:%s dhcp:%s wifi:%s )",
|
|
48
|
+
i['idx'], i['description'],
|
|
49
|
+
i['type'], i['mtu'], i['usable'], i['dhcp'], i['wireless'])
|
|
50
|
+
)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
print_line()
|
|
54
|
+
|
|
55
|
+
return true
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def cmd_sniffer_start(*args)
|
|
59
|
+
intf = args.shift.to_i
|
|
60
|
+
if (intf == 0)
|
|
61
|
+
print_error("Usage: sniffer_start [interface-id] [packet-buffer (1-200000)] [bpf filter (posix meterpreter only)]")
|
|
62
|
+
return
|
|
63
|
+
end
|
|
64
|
+
maxp = (args.shift || 50000).to_i
|
|
65
|
+
bpf = args.join(" ")
|
|
66
|
+
|
|
67
|
+
client.sniffer.capture_start(intf, maxp, bpf)
|
|
68
|
+
print_status("Capture started on interface #{intf} (#{maxp} packet buffer)")
|
|
69
|
+
return true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def cmd_sniffer_stop(*args)
|
|
73
|
+
intf = args[0].to_i
|
|
74
|
+
if (intf == 0)
|
|
75
|
+
print_error("Usage: sniffer_stop [interface-id]")
|
|
76
|
+
return
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
client.sniffer.capture_stop(intf)
|
|
80
|
+
print_status("Capture stopped on interface #{intf}")
|
|
81
|
+
return true
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def cmd_sniffer_stats(*args)
|
|
85
|
+
intf = args[0].to_i
|
|
86
|
+
if (intf == 0)
|
|
87
|
+
print_error("Usage: sniffer_stats [interface-id]")
|
|
88
|
+
return
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
stats = client.sniffer.capture_stats(intf)
|
|
92
|
+
print_status("Capture statistics for interface #{intf}")
|
|
93
|
+
stats.each_key do |k|
|
|
94
|
+
puts "\t#{k}: #{stats[k]}"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
return true
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def cmd_sniffer_dump(*args)
|
|
101
|
+
intf = args[0].to_i
|
|
102
|
+
if (intf == 0 or not args[1])
|
|
103
|
+
print_error("Usage: sniffer_dump [interface-id] [pcap-file]")
|
|
104
|
+
return
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
path_cap = args[1]
|
|
108
|
+
path_raw = args[1] + '.raw'
|
|
109
|
+
|
|
110
|
+
fd = ::File.new(path_raw, 'wb+')
|
|
111
|
+
|
|
112
|
+
print_status("Flushing packet capture buffer for interface #{intf}...")
|
|
113
|
+
res = client.sniffer.capture_dump(intf)
|
|
114
|
+
print_status("Flushed #{res[:packets]} packets (#{res[:bytes]} bytes)")
|
|
115
|
+
|
|
116
|
+
bytes_all = res[:bytes] || 0
|
|
117
|
+
bytes_got = 0
|
|
118
|
+
bytes_pct = 0
|
|
119
|
+
|
|
120
|
+
while (bytes_all > 0)
|
|
121
|
+
res = client.sniffer.capture_dump_read(intf,1024*512)
|
|
122
|
+
|
|
123
|
+
bytes_got += res[:bytes]
|
|
124
|
+
|
|
125
|
+
pct = ((bytes_got.to_f / bytes_all.to_f) * 100).to_i
|
|
126
|
+
if(pct > bytes_pct)
|
|
127
|
+
print_status("Downloaded #{"%.3d" % pct}% (#{bytes_got}/#{bytes_all})...")
|
|
128
|
+
bytes_pct = pct
|
|
129
|
+
end
|
|
130
|
+
break if res[:bytes] == 0
|
|
131
|
+
fd.write(res[:data])
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
fd.close
|
|
135
|
+
|
|
136
|
+
print_status("Download completed, converting to PCAP...")
|
|
137
|
+
|
|
138
|
+
fd = nil
|
|
139
|
+
if(::File.exist?(path_cap))
|
|
140
|
+
fd = ::File.new(path_cap, 'ab+')
|
|
141
|
+
else
|
|
142
|
+
fd = ::File.new(path_cap, 'wb+')
|
|
143
|
+
fd.write([0xa1b2c3d4, 2, 4, 0, 0, 65536, 1].pack('NnnNNNN'))
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
pkts = {}
|
|
147
|
+
od = ::File.new(path_raw, 'rb')
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# TODO: reorder packets based on the ID (only an issue if the buffer wraps)
|
|
151
|
+
while(true)
|
|
152
|
+
buf = od.read(20)
|
|
153
|
+
break if not buf
|
|
154
|
+
|
|
155
|
+
idh,idl,thi,tlo,len = buf.unpack('N5')
|
|
156
|
+
break if not len
|
|
157
|
+
if(len > 10000)
|
|
158
|
+
print_error("Corrupted packet data (length:#{len})")
|
|
159
|
+
break
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
pkt_id = (idh << 32) +idl
|
|
163
|
+
pkt_ts = Rex::Proto::SMB::Utils.time_smb_to_unix(thi,tlo)
|
|
164
|
+
pkt = od.read(len)
|
|
165
|
+
|
|
166
|
+
fd.write([pkt_ts,0,len,len].pack('NNNN')+pkt)
|
|
167
|
+
end
|
|
168
|
+
od.close
|
|
169
|
+
fd.close
|
|
170
|
+
|
|
171
|
+
::File.unlink(path_raw)
|
|
172
|
+
print_status("PCAP file written to #{path_cap}")
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
#
|
|
176
|
+
# Name for this dispatcher
|
|
177
|
+
# sni
|
|
178
|
+
def name
|
|
179
|
+
"Sniffer"
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|