dstruct 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.
- checksums.yaml +15 -0
- data/README.markdown +23 -0
- data/examples/smb_example.rb +35 -0
- data/lib/rex.rb +108 -0
- data/lib/rex/LICENSE +29 -0
- data/lib/rex/arch.rb +104 -0
- data/lib/rex/arch/sparc.rb +75 -0
- data/lib/rex/arch/x86.rb +524 -0
- data/lib/rex/assembly/nasm.rb +104 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +389 -0
- data/lib/rex/constants.rb +124 -0
- data/lib/rex/elfparsey.rb +9 -0
- data/lib/rex/elfparsey/elf.rb +121 -0
- data/lib/rex/elfparsey/elfbase.rb +256 -0
- data/lib/rex/elfparsey/exceptions.rb +25 -0
- data/lib/rex/elfscan.rb +10 -0
- data/lib/rex/elfscan/scanner.rb +226 -0
- data/lib/rex/elfscan/search.rb +44 -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 +90 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
- data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
- data/lib/rex/encoder/ndr.rb +90 -0
- data/lib/rex/encoder/nonalpha.rb +61 -0
- data/lib/rex/encoder/nonupper.rb +64 -0
- data/lib/rex/encoder/xdr.rb +107 -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/encoding/xor.rb +20 -0
- data/lib/rex/encoding/xor/byte.rb +15 -0
- data/lib/rex/encoding/xor/dword.rb +21 -0
- data/lib/rex/encoding/xor/dword_additive.rb +92 -0
- data/lib/rex/encoding/xor/exceptions.rb +17 -0
- data/lib/rex/encoding/xor/generic.rb +146 -0
- data/lib/rex/encoding/xor/qword.rb +15 -0
- data/lib/rex/encoding/xor/word.rb +21 -0
- data/lib/rex/exceptions.rb +275 -0
- data/lib/rex/exploitation/cmdstager.rb +10 -0
- data/lib/rex/exploitation/cmdstager/base.rb +190 -0
- data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
- data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
- data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
- data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
- data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
- data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
- data/lib/rex/exploitation/egghunter.rb +425 -0
- data/lib/rex/exploitation/encryptjs.rb +78 -0
- data/lib/rex/exploitation/heaplib.js.b64 +331 -0
- data/lib/rex/exploitation/heaplib.rb +107 -0
- data/lib/rex/exploitation/js.rb +6 -0
- data/lib/rex/exploitation/js/detect.rb +69 -0
- data/lib/rex/exploitation/js/memory.rb +81 -0
- data/lib/rex/exploitation/js/network.rb +84 -0
- data/lib/rex/exploitation/js/utils.rb +33 -0
- data/lib/rex/exploitation/jsobfu.rb +513 -0
- data/lib/rex/exploitation/obfuscatejs.rb +336 -0
- data/lib/rex/exploitation/omelet.rb +321 -0
- data/lib/rex/exploitation/opcodedb.rb +819 -0
- data/lib/rex/exploitation/powershell.rb +62 -0
- data/lib/rex/exploitation/powershell/function.rb +63 -0
- data/lib/rex/exploitation/powershell/obfu.rb +98 -0
- data/lib/rex/exploitation/powershell/output.rb +151 -0
- data/lib/rex/exploitation/powershell/param.rb +23 -0
- data/lib/rex/exploitation/powershell/parser.rb +183 -0
- data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
- data/lib/rex/exploitation/powershell/script.rb +99 -0
- data/lib/rex/exploitation/ropdb.rb +190 -0
- data/lib/rex/exploitation/seh.rb +93 -0
- data/lib/rex/file.rb +160 -0
- data/lib/rex/image_source.rb +10 -0
- data/lib/rex/image_source/disk.rb +58 -0
- data/lib/rex/image_source/image_source.rb +44 -0
- data/lib/rex/image_source/memory.rb +35 -0
- data/lib/rex/io/bidirectional_pipe.rb +161 -0
- data/lib/rex/io/datagram_abstraction.rb +35 -0
- data/lib/rex/io/ring_buffer.rb +369 -0
- data/lib/rex/io/stream.rb +312 -0
- data/lib/rex/io/stream_abstraction.rb +209 -0
- data/lib/rex/io/stream_server.rb +221 -0
- data/lib/rex/job_container.rb +200 -0
- data/lib/rex/logging.rb +4 -0
- data/lib/rex/logging/log_dispatcher.rb +180 -0
- data/lib/rex/logging/log_sink.rb +43 -0
- data/lib/rex/logging/sinks/flatfile.rb +56 -0
- data/lib/rex/logging/sinks/stderr.rb +44 -0
- data/lib/rex/mac_oui.rb +16581 -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 +10 -0
- data/lib/rex/mime/encoding.rb +17 -0
- data/lib/rex/mime/header.rb +78 -0
- data/lib/rex/mime/message.rb +150 -0
- data/lib/rex/mime/part.rb +50 -0
- data/lib/rex/nop/opty2.rb +109 -0
- data/lib/rex/nop/opty2_tables.rb +301 -0
- data/lib/rex/ole.rb +202 -0
- data/lib/rex/ole/clsid.rb +44 -0
- data/lib/rex/ole/difat.rb +138 -0
- data/lib/rex/ole/directory.rb +228 -0
- data/lib/rex/ole/direntry.rb +237 -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 +96 -0
- data/lib/rex/ole/header.rb +201 -0
- data/lib/rex/ole/minifat.rb +74 -0
- data/lib/rex/ole/propset.rb +141 -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 +392 -0
- data/lib/rex/ole/stream.rb +50 -0
- data/lib/rex/ole/substorage.rb +46 -0
- data/lib/rex/ole/util.rb +154 -0
- data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
- data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
- data/lib/rex/parser/appscan_nokogiri.rb +367 -0
- data/lib/rex/parser/arguments.rb +108 -0
- data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
- data/lib/rex/parser/ci_nokogiri.rb +193 -0
- data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
- data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
- data/lib/rex/parser/group_policy_preferences.rb +185 -0
- data/lib/rex/parser/ini.rb +186 -0
- data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
- data/lib/rex/parser/ip360_xml.rb +98 -0
- data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
- data/lib/rex/parser/nessus_xml.rb +121 -0
- data/lib/rex/parser/netsparker_xml.rb +109 -0
- data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
- data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
- data/lib/rex/parser/nexpose_xml.rb +172 -0
- data/lib/rex/parser/nmap_nokogiri.rb +394 -0
- data/lib/rex/parser/nmap_xml.rb +166 -0
- data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
- data/lib/rex/parser/openvas_nokogiri.rb +172 -0
- data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
- data/lib/rex/parser/retina_xml.rb +110 -0
- data/lib/rex/parser/unattend.rb +171 -0
- data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
- data/lib/rex/payloads.rb +2 -0
- data/lib/rex/payloads/win32.rb +3 -0
- data/lib/rex/payloads/win32/common.rb +27 -0
- data/lib/rex/payloads/win32/kernel.rb +54 -0
- data/lib/rex/payloads/win32/kernel/common.rb +55 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
- data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
- data/lib/rex/peparsey.rb +10 -0
- data/lib/rex/peparsey/exceptions.rb +30 -0
- data/lib/rex/peparsey/pe.rb +210 -0
- data/lib/rex/peparsey/pe_memdump.rb +61 -0
- data/lib/rex/peparsey/pebase.rb +1662 -0
- data/lib/rex/peparsey/section.rb +128 -0
- data/lib/rex/pescan.rb +11 -0
- data/lib/rex/pescan/analyze.rb +366 -0
- data/lib/rex/pescan/scanner.rb +230 -0
- data/lib/rex/pescan/search.rb +68 -0
- data/lib/rex/platforms.rb +2 -0
- data/lib/rex/platforms/windows.rb +52 -0
- data/lib/rex/poly.rb +134 -0
- data/lib/rex/poly/block.rb +480 -0
- data/lib/rex/poly/machine.rb +13 -0
- data/lib/rex/poly/machine/machine.rb +830 -0
- data/lib/rex/poly/machine/x86.rb +509 -0
- data/lib/rex/poly/register.rb +101 -0
- data/lib/rex/poly/register/x86.rb +41 -0
- data/lib/rex/post.rb +7 -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 +5 -0
- data/lib/rex/post/meterpreter/channel.rb +446 -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 +483 -0
- data/lib/rex/post/meterpreter/client_core.rb +352 -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/android/android.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
- data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
- data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
- data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
- data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
- data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
- data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
- data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
- data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -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 +109 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -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 +168 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -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 +60 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -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 +328 -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/registry_subsystem/remote_registry_key.rb +188 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -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 +709 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -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 +142 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -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 +15 -0
- data/lib/rex/proto/addp.rb +218 -0
- data/lib/rex/proto/dcerpc.rb +7 -0
- data/lib/rex/proto/dcerpc/client.rb +362 -0
- data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
- data/lib/rex/proto/dcerpc/handle.rb +48 -0
- data/lib/rex/proto/dcerpc/ndr.rb +73 -0
- data/lib/rex/proto/dcerpc/packet.rb +264 -0
- data/lib/rex/proto/dcerpc/response.rb +188 -0
- data/lib/rex/proto/dcerpc/uuid.rb +85 -0
- data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
- data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
- data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
- data/lib/rex/proto/dhcp.rb +7 -0
- data/lib/rex/proto/dhcp/constants.rb +34 -0
- data/lib/rex/proto/dhcp/server.rb +334 -0
- data/lib/rex/proto/drda.rb +6 -0
- data/lib/rex/proto/drda/constants.rb +50 -0
- data/lib/rex/proto/drda/packet.rb +253 -0
- data/lib/rex/proto/drda/utils.rb +124 -0
- data/lib/rex/proto/http.rb +7 -0
- data/lib/rex/proto/http/client.rb +722 -0
- data/lib/rex/proto/http/client_request.rb +472 -0
- data/lib/rex/proto/http/handler.rb +47 -0
- data/lib/rex/proto/http/handler/erb.rb +129 -0
- data/lib/rex/proto/http/handler/proc.rb +61 -0
- data/lib/rex/proto/http/header.rb +173 -0
- data/lib/rex/proto/http/packet.rb +414 -0
- data/lib/rex/proto/http/request.rb +354 -0
- data/lib/rex/proto/http/response.rb +151 -0
- data/lib/rex/proto/http/server.rb +385 -0
- data/lib/rex/proto/iax2.rb +2 -0
- data/lib/rex/proto/iax2/call.rb +326 -0
- data/lib/rex/proto/iax2/client.rb +218 -0
- data/lib/rex/proto/iax2/codecs.rb +5 -0
- data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
- data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
- data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
- data/lib/rex/proto/iax2/constants.rb +262 -0
- data/lib/rex/proto/ipmi.rb +57 -0
- data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
- data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
- data/lib/rex/proto/ipmi/rakp2.rb +36 -0
- data/lib/rex/proto/ipmi/utils.rb +125 -0
- data/lib/rex/proto/natpmp.rb +7 -0
- data/lib/rex/proto/natpmp/constants.rb +19 -0
- data/lib/rex/proto/natpmp/packet.rb +45 -0
- data/lib/rex/proto/ntlm.rb +8 -0
- data/lib/rex/proto/ntlm/base.rb +327 -0
- data/lib/rex/proto/ntlm/constants.rb +75 -0
- data/lib/rex/proto/ntlm/crypt.rb +412 -0
- data/lib/rex/proto/ntlm/exceptions.rb +17 -0
- data/lib/rex/proto/ntlm/message.rb +534 -0
- data/lib/rex/proto/ntlm/utils.rb +765 -0
- data/lib/rex/proto/ntp.rb +3 -0
- data/lib/rex/proto/ntp/constants.rb +12 -0
- data/lib/rex/proto/ntp/modes.rb +130 -0
- data/lib/rex/proto/pjl.rb +31 -0
- data/lib/rex/proto/pjl/client.rb +163 -0
- data/lib/rex/proto/proxy/socks4a.rb +441 -0
- data/lib/rex/proto/rfb.rb +13 -0
- data/lib/rex/proto/rfb/cipher.rb +82 -0
- data/lib/rex/proto/rfb/client.rb +205 -0
- data/lib/rex/proto/rfb/constants.rb +50 -0
- data/lib/rex/proto/sip.rb +4 -0
- data/lib/rex/proto/sip/response.rb +61 -0
- data/lib/rex/proto/smb.rb +8 -0
- data/lib/rex/proto/smb/client.rb +2064 -0
- data/lib/rex/proto/smb/constants.rb +1064 -0
- data/lib/rex/proto/smb/crypt.rb +37 -0
- data/lib/rex/proto/smb/evasions.rb +67 -0
- data/lib/rex/proto/smb/exceptions.rb +867 -0
- data/lib/rex/proto/smb/simpleclient.rb +173 -0
- data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
- data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
- data/lib/rex/proto/smb/utils.rb +104 -0
- data/lib/rex/proto/sunrpc.rb +2 -0
- data/lib/rex/proto/sunrpc/client.rb +196 -0
- data/lib/rex/proto/tftp.rb +13 -0
- data/lib/rex/proto/tftp/client.rb +344 -0
- data/lib/rex/proto/tftp/constants.rb +39 -0
- data/lib/rex/proto/tftp/server.rb +497 -0
- data/lib/rex/random_identifier_generator.rb +177 -0
- data/lib/rex/registry.rb +14 -0
- data/lib/rex/registry/hive.rb +132 -0
- data/lib/rex/registry/lfkey.rb +51 -0
- data/lib/rex/registry/nodekey.rb +54 -0
- data/lib/rex/registry/regf.rb +25 -0
- data/lib/rex/registry/valuekey.rb +67 -0
- data/lib/rex/registry/valuelist.rb +29 -0
- data/lib/rex/ropbuilder.rb +8 -0
- data/lib/rex/ropbuilder/rop.rb +271 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +61 -0
- data/lib/rex/script/meterpreter.rb +16 -0
- data/lib/rex/script/shell.rb +10 -0
- data/lib/rex/service.rb +49 -0
- data/lib/rex/service_manager.rb +154 -0
- data/lib/rex/services/local_relay.rb +424 -0
- data/lib/rex/socket.rb +788 -0
- data/lib/rex/socket/comm.rb +120 -0
- data/lib/rex/socket/comm/local.rb +526 -0
- data/lib/rex/socket/ip.rb +132 -0
- data/lib/rex/socket/parameters.rb +363 -0
- data/lib/rex/socket/range_walker.rb +470 -0
- data/lib/rex/socket/ssl_tcp.rb +345 -0
- data/lib/rex/socket/ssl_tcp_server.rb +188 -0
- data/lib/rex/socket/subnet_walker.rb +76 -0
- data/lib/rex/socket/switch_board.rb +289 -0
- data/lib/rex/socket/tcp.rb +79 -0
- data/lib/rex/socket/tcp_server.rb +67 -0
- data/lib/rex/socket/udp.rb +165 -0
- data/lib/rex/sslscan/result.rb +201 -0
- data/lib/rex/sslscan/scanner.rb +206 -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 +85 -0
- data/lib/rex/sync/read_write_lock.rb +177 -0
- data/lib/rex/sync/ref.rb +58 -0
- data/lib/rex/sync/thread_safe.rb +83 -0
- data/lib/rex/text.rb +1813 -0
- data/lib/rex/thread_factory.rb +43 -0
- data/lib/rex/time.rb +66 -0
- data/lib/rex/transformer.rb +116 -0
- data/lib/rex/ui.rb +22 -0
- data/lib/rex/ui/interactive.rb +304 -0
- data/lib/rex/ui/output.rb +85 -0
- data/lib/rex/ui/output/none.rb +19 -0
- data/lib/rex/ui/progress_tracker.rb +97 -0
- data/lib/rex/ui/subscriber.rb +160 -0
- data/lib/rex/ui/text/color.rb +98 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
- data/lib/rex/ui/text/input.rb +119 -0
- data/lib/rex/ui/text/input/buffer.rb +79 -0
- data/lib/rex/ui/text/input/readline.rb +129 -0
- data/lib/rex/ui/text/input/socket.rb +96 -0
- data/lib/rex/ui/text/input/stdio.rb +46 -0
- data/lib/rex/ui/text/irb_shell.rb +62 -0
- data/lib/rex/ui/text/output.rb +86 -0
- data/lib/rex/ui/text/output/buffer.rb +62 -0
- data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
- data/lib/rex/ui/text/output/file.rb +44 -0
- data/lib/rex/ui/text/output/socket.rb +44 -0
- data/lib/rex/ui/text/output/stdio.rb +53 -0
- data/lib/rex/ui/text/output/tee.rb +56 -0
- data/lib/rex/ui/text/progress_tracker.rb +57 -0
- data/lib/rex/ui/text/shell.rb +403 -0
- data/lib/rex/ui/text/table.rb +346 -0
- data/lib/rex/zip.rb +96 -0
- data/lib/rex/zip/archive.rb +130 -0
- data/lib/rex/zip/blocks.rb +184 -0
- data/lib/rex/zip/entry.rb +122 -0
- data/lib/rex/zip/jar.rb +283 -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 +536 -0
@@ -0,0 +1,165 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
require 'rex/socket'
|
3
|
+
|
4
|
+
###
|
5
|
+
#
|
6
|
+
# This class provides methods for interacting with a UDP socket.
|
7
|
+
#
|
8
|
+
###
|
9
|
+
module Rex::Socket::Udp
|
10
|
+
|
11
|
+
include Rex::Socket
|
12
|
+
|
13
|
+
##
|
14
|
+
#
|
15
|
+
# Factory
|
16
|
+
#
|
17
|
+
##
|
18
|
+
|
19
|
+
#
|
20
|
+
# Creates the client using the supplied hash.
|
21
|
+
#
|
22
|
+
def self.create(hash = {})
|
23
|
+
hash['Proto'] = 'udp'
|
24
|
+
# If we have are to bind to a LocalHost we must be a Server to avail of pivoting.
|
25
|
+
# Rex::Socket::Parameters will subsequently turn off the sever flag after the correct
|
26
|
+
# comm has been chosen.
|
27
|
+
if( hash['LocalHost'] )
|
28
|
+
hash['Server'] = true
|
29
|
+
end
|
30
|
+
self.create_param(Rex::Socket::Parameters.from_hash(hash))
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Wrapper around the base socket class' creation method that automatically
|
35
|
+
# sets the parameter's protocol to UDP.
|
36
|
+
#
|
37
|
+
def self.create_param(param)
|
38
|
+
param.proto = 'udp'
|
39
|
+
Rex::Socket.create_param(param)
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
#
|
44
|
+
# UDP connected state methods
|
45
|
+
#
|
46
|
+
##
|
47
|
+
|
48
|
+
#
|
49
|
+
# Write the supplied datagram to the connected UDP socket.
|
50
|
+
#
|
51
|
+
def write(gram)
|
52
|
+
begin
|
53
|
+
return syswrite(gram)
|
54
|
+
rescue ::Errno::EHOSTUNREACH,::Errno::ENETDOWN,::Errno::ENETUNREACH,::Errno::ENETRESET,::Errno::EHOSTDOWN,::Errno::EACCES,::Errno::EINVAL,::Errno::EADDRNOTAVAIL
|
55
|
+
return nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
alias put write
|
60
|
+
|
61
|
+
#
|
62
|
+
# Read a datagram from the UDP socket.
|
63
|
+
#
|
64
|
+
def read(length = 65535)
|
65
|
+
if length < 0
|
66
|
+
length = 65535
|
67
|
+
end
|
68
|
+
return sysread(length)
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# Read a datagram from the UDP socket with a timeout
|
73
|
+
#
|
74
|
+
def timed_read(length = 65535, timeout=def_read_timeout)
|
75
|
+
begin
|
76
|
+
if ((rv = ::IO.select([ fd ], nil, nil, timeout)) and
|
77
|
+
(rv[0]) and (rv[0][0] == fd)
|
78
|
+
)
|
79
|
+
return read(length)
|
80
|
+
else
|
81
|
+
return ''
|
82
|
+
end
|
83
|
+
rescue Exception
|
84
|
+
return ''
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
#alias send write
|
89
|
+
#alias recv read
|
90
|
+
|
91
|
+
##
|
92
|
+
#
|
93
|
+
# UDP non-connected state methods
|
94
|
+
#
|
95
|
+
##
|
96
|
+
|
97
|
+
#
|
98
|
+
# Sends a datagram to the supplied host:port with optional flags.
|
99
|
+
#
|
100
|
+
def sendto(gram, peerhost, peerport, flags = 0)
|
101
|
+
|
102
|
+
# Catch unconnected IPv6 sockets talking to IPv4 addresses
|
103
|
+
peer = Rex::Socket.resolv_nbo(peerhost)
|
104
|
+
if (peer.length == 4 and self.ipv == 6)
|
105
|
+
peerhost = Rex::Socket.getaddress(peerhost, true)
|
106
|
+
if peerhost[0,7].downcase != '::ffff:'
|
107
|
+
peerhost = '::ffff:' + peerhost
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
begin
|
112
|
+
send(gram, flags, Rex::Socket.to_sockaddr(peerhost, peerport))
|
113
|
+
rescue ::Errno::EHOSTUNREACH,::Errno::ENETDOWN,::Errno::ENETUNREACH,::Errno::ENETRESET,::Errno::EHOSTDOWN,::Errno::EACCES,::Errno::EINVAL,::Errno::EADDRNOTAVAIL
|
114
|
+
return nil
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
#
|
120
|
+
# Receives a datagram and returns the data and host:port of the requestor
|
121
|
+
# as [ data, host, port ].
|
122
|
+
#
|
123
|
+
def recvfrom(length = 65535, timeout=def_read_timeout)
|
124
|
+
|
125
|
+
begin
|
126
|
+
if ((rv = ::IO.select([ fd ], nil, nil, timeout)) and
|
127
|
+
(rv[0]) and (rv[0][0] == fd)
|
128
|
+
)
|
129
|
+
data, saddr = recvfrom_nonblock(length)
|
130
|
+
af, host, port = Rex::Socket.from_sockaddr(saddr)
|
131
|
+
|
132
|
+
return [ data, host, port ]
|
133
|
+
else
|
134
|
+
return [ '', nil, nil ]
|
135
|
+
end
|
136
|
+
rescue ::Timeout::Error
|
137
|
+
return [ '', nil, nil ]
|
138
|
+
rescue ::Interrupt
|
139
|
+
raise $!
|
140
|
+
rescue ::Exception
|
141
|
+
return [ '', nil, nil ]
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
#
|
146
|
+
# Calls recvfrom and only returns the data
|
147
|
+
#
|
148
|
+
def get(timeout=nil)
|
149
|
+
data, saddr, sport = recvfrom(65535, timeout)
|
150
|
+
return data
|
151
|
+
end
|
152
|
+
|
153
|
+
#
|
154
|
+
# The default number of seconds to wait for a read operation to timeout.
|
155
|
+
#
|
156
|
+
def def_read_timeout
|
157
|
+
10
|
158
|
+
end
|
159
|
+
|
160
|
+
def type?
|
161
|
+
return 'udp'
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
@@ -0,0 +1,201 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
require 'rex/socket'
|
4
|
+
require 'rex/ui/text/table'
|
5
|
+
|
6
|
+
module Rex::SSLScan
|
7
|
+
class Result
|
8
|
+
|
9
|
+
attr_accessor :openssl_sslv2
|
10
|
+
|
11
|
+
attr_reader :ciphers
|
12
|
+
attr_reader :supported_versions
|
13
|
+
|
14
|
+
def initialize()
|
15
|
+
@cert = nil
|
16
|
+
@ciphers = Set.new
|
17
|
+
@supported_versions = [:SSLv2, :SSLv3, :TLSv1]
|
18
|
+
end
|
19
|
+
|
20
|
+
def cert
|
21
|
+
@cert
|
22
|
+
end
|
23
|
+
|
24
|
+
def cert=(input)
|
25
|
+
unless input.kind_of? OpenSSL::X509::Certificate or input.nil?
|
26
|
+
raise ArgumentError, "Must be an X509 Cert!"
|
27
|
+
end
|
28
|
+
@cert = input
|
29
|
+
end
|
30
|
+
|
31
|
+
def sslv2
|
32
|
+
@ciphers.reject{|cipher| cipher[:version] != :SSLv2 }
|
33
|
+
end
|
34
|
+
|
35
|
+
def sslv3
|
36
|
+
@ciphers.reject{|cipher| cipher[:version] != :SSLv3 }
|
37
|
+
end
|
38
|
+
|
39
|
+
def tlsv1
|
40
|
+
@ciphers.reject{|cipher| cipher[:version] != :TLSv1 }
|
41
|
+
end
|
42
|
+
|
43
|
+
def weak_ciphers
|
44
|
+
accepted.reject{|cipher| cipher[:weak] == false }
|
45
|
+
end
|
46
|
+
|
47
|
+
def strong_ciphers
|
48
|
+
accepted.reject{|cipher| cipher[:weak] }
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns all accepted ciphers matching the supplied version
|
52
|
+
# @param version [Symbol, Array] The SSL Version to filter on
|
53
|
+
# @raise [ArgumentError] if the version supplied is invalid
|
54
|
+
# @return [Array] An array of accepted cipher details matching the supplied versions
|
55
|
+
def accepted(version = :all)
|
56
|
+
enum_ciphers(:accepted, version)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns all rejected ciphers matching the supplied version
|
60
|
+
# @param version [Symbol, Array] The SSL Version to filter on
|
61
|
+
# @raise [ArgumentError] if the version supplied is invalid
|
62
|
+
# @return [Array] An array of rejected cipher details matching the supplied versions
|
63
|
+
def rejected(version = :all)
|
64
|
+
enum_ciphers(:rejected, version)
|
65
|
+
end
|
66
|
+
|
67
|
+
def each_accepted(version = :all)
|
68
|
+
accepted(version).each do |cipher_result|
|
69
|
+
yield cipher_result
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def each_rejected(version = :all)
|
74
|
+
rejected(version).each do |cipher_result|
|
75
|
+
yield cipher_result
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def supports_sslv2?
|
80
|
+
!(accepted(:SSLv2).empty?)
|
81
|
+
end
|
82
|
+
|
83
|
+
def supports_sslv3?
|
84
|
+
!(accepted(:SSLv3).empty?)
|
85
|
+
end
|
86
|
+
|
87
|
+
def supports_tlsv1?
|
88
|
+
!(accepted(:TLSv1).empty?)
|
89
|
+
end
|
90
|
+
|
91
|
+
def supports_ssl?
|
92
|
+
supports_sslv2? or supports_sslv3? or supports_tlsv1?
|
93
|
+
end
|
94
|
+
|
95
|
+
def supports_weak_ciphers?
|
96
|
+
!(weak_ciphers.empty?)
|
97
|
+
end
|
98
|
+
|
99
|
+
def standards_compliant?
|
100
|
+
if supports_ssl?
|
101
|
+
return false if supports_sslv2?
|
102
|
+
return false if supports_weak_ciphers?
|
103
|
+
end
|
104
|
+
true
|
105
|
+
end
|
106
|
+
|
107
|
+
# Adds the details of a cipher test to the Result object.
|
108
|
+
# @param version [Symbol] the SSL Version
|
109
|
+
# @param cipher [String] the SSL cipher
|
110
|
+
# @param key_length [Fixnum] the length of encryption key
|
111
|
+
# @param status [Symbol] :accepted or :rejected
|
112
|
+
def add_cipher(version, cipher, key_length, status)
|
113
|
+
unless @supported_versions.include? version
|
114
|
+
raise ArgumentError, "Must be a supported SSL Version"
|
115
|
+
end
|
116
|
+
unless OpenSSL::SSL::SSLContext.new(version).ciphers.flatten.include? cipher
|
117
|
+
raise ArgumentError, "Must be a valid SSL Cipher for #{version}!"
|
118
|
+
end
|
119
|
+
unless key_length.kind_of? Fixnum
|
120
|
+
raise ArgumentError, "Must supply a valid key length"
|
121
|
+
end
|
122
|
+
unless [:accepted, :rejected].include? status
|
123
|
+
raise ArgumentError, "Status must be either :accepted or :rejected"
|
124
|
+
end
|
125
|
+
|
126
|
+
strong_cipher_ctx = OpenSSL::SSL::SSLContext.new(version)
|
127
|
+
# OpenSSL Directive For Strong Ciphers
|
128
|
+
# See: http://www.rapid7.com/vulndb/lookup/ssl-weak-ciphers
|
129
|
+
strong_cipher_ctx.ciphers = "ALL:!aNULL:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM"
|
130
|
+
|
131
|
+
if strong_cipher_ctx.ciphers.flatten.include? cipher
|
132
|
+
weak = false
|
133
|
+
else
|
134
|
+
weak = true
|
135
|
+
end
|
136
|
+
|
137
|
+
cipher_details = {:version => version, :cipher => cipher, :key_length => key_length, :weak => weak, :status => status}
|
138
|
+
@ciphers << cipher_details
|
139
|
+
end
|
140
|
+
|
141
|
+
def to_s
|
142
|
+
unless supports_ssl?
|
143
|
+
return "Server does not appear to support SSL on this port!"
|
144
|
+
end
|
145
|
+
table = Rex::Ui::Text::Table.new(
|
146
|
+
'Header' => 'SSL Ciphers',
|
147
|
+
'Indent' => 1,
|
148
|
+
'Columns' => ['Status', 'Weak', 'SSL Version', 'Key Length', 'Cipher'],
|
149
|
+
'SortIndex' => -1
|
150
|
+
)
|
151
|
+
ciphers.each do |cipher|
|
152
|
+
if cipher[:weak]
|
153
|
+
weak = '*'
|
154
|
+
else
|
155
|
+
weak = ' '
|
156
|
+
end
|
157
|
+
table << [cipher[:status].to_s.capitalize, weak , cipher[:version], cipher[:key_length], cipher[:cipher]]
|
158
|
+
end
|
159
|
+
|
160
|
+
# Sort by SSL Version, then Key Length, and then Status
|
161
|
+
table.rows.sort_by!{|row| [row[0],row[2],row[3]]}
|
162
|
+
text = "#{table.to_s}"
|
163
|
+
if @cert
|
164
|
+
text << " \n\n #{@cert.to_text}"
|
165
|
+
end
|
166
|
+
if openssl_sslv2 == false
|
167
|
+
text << "\n\n *** WARNING: Your OS hates freedom! Your OpenSSL libs are compiled without SSLv2 support!"
|
168
|
+
end
|
169
|
+
text
|
170
|
+
end
|
171
|
+
|
172
|
+
protected
|
173
|
+
|
174
|
+
# @param state [Symbol] Either :accepted or :rejected
|
175
|
+
# @param version [Symbol, Array] The SSL Version to filter on (:SSLv2, :SSLv3, :TLSv1, :all)
|
176
|
+
# @return [Set] The Set of cipher results matching the filter criteria
|
177
|
+
def enum_ciphers(state, version = :all)
|
178
|
+
case version
|
179
|
+
when Symbol
|
180
|
+
case version
|
181
|
+
when :all
|
182
|
+
return @ciphers.select{|cipher| cipher[:status] == state}
|
183
|
+
when :SSLv2, :SSLv3, :TLSv1
|
184
|
+
return @ciphers.select{|cipher| cipher[:status] == state and cipher[:version] == version}
|
185
|
+
else
|
186
|
+
raise ArgumentError, "Invalid SSL Version Supplied: #{version}"
|
187
|
+
end
|
188
|
+
when Array
|
189
|
+
version = version.reject{|v| !(@supported_versions.include? v)}
|
190
|
+
if version.empty?
|
191
|
+
return @ciphers.select{|cipher| cipher[:status] == state}
|
192
|
+
else
|
193
|
+
return @ciphers.select{|cipher| cipher[:status] == state and version.include? cipher[:version]}
|
194
|
+
end
|
195
|
+
else
|
196
|
+
raise ArgumentError, "Was expecting Symbol or Array and got #{version.class}"
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
require 'rex/socket'
|
3
|
+
require 'rex/sslscan/result'
|
4
|
+
|
5
|
+
module Rex::SSLScan
|
6
|
+
|
7
|
+
class Scanner
|
8
|
+
|
9
|
+
attr_accessor :context
|
10
|
+
attr_accessor :host
|
11
|
+
attr_accessor :port
|
12
|
+
attr_accessor :timeout
|
13
|
+
|
14
|
+
attr_reader :supported_versions
|
15
|
+
attr_reader :sslv2
|
16
|
+
|
17
|
+
# Initializes the scanner object
|
18
|
+
# @param host [String] IP address or hostname to scan
|
19
|
+
# @param port [Fixnum] Port number to scan, default: 443
|
20
|
+
# @param timeout [Fixnum] Timeout for connections, in seconds. default: 5
|
21
|
+
# @raise [StandardError] Raised when the configuration is invalid
|
22
|
+
def initialize(host,port = 443,context = {},timeout=5)
|
23
|
+
@host = host
|
24
|
+
@port = port
|
25
|
+
@timeout = timeout
|
26
|
+
@context = context
|
27
|
+
if check_opensslv2 == true
|
28
|
+
@supported_versions = [:SSLv2, :SSLv3, :TLSv1]
|
29
|
+
@sslv2 = true
|
30
|
+
else
|
31
|
+
@supported_versions = [:SSLv3, :TLSv1]
|
32
|
+
@sslv2 = false
|
33
|
+
end
|
34
|
+
raise StandardError, "The scanner configuration is invalid" unless valid?
|
35
|
+
end
|
36
|
+
|
37
|
+
# Checks whether the scanner option has a valid configuration
|
38
|
+
# @return [Boolean] True or False, the configuration is valid.
|
39
|
+
def valid?
|
40
|
+
begin
|
41
|
+
@host = Rex::Socket.getaddress(@host, true)
|
42
|
+
rescue
|
43
|
+
return false
|
44
|
+
end
|
45
|
+
return false unless @port.kind_of? Fixnum
|
46
|
+
return false unless @port >= 0 and @port <= 65535
|
47
|
+
return false unless @timeout.kind_of? Fixnum
|
48
|
+
return true
|
49
|
+
end
|
50
|
+
|
51
|
+
# Initiate the Scan against the target. Will test each cipher one at a time.
|
52
|
+
# @return [Result] object containing the details of the scan
|
53
|
+
def scan
|
54
|
+
scan_result = Rex::SSLScan::Result.new
|
55
|
+
scan_result.openssl_sslv2 = sslv2
|
56
|
+
# If we can't get any SSL connection, then don't bother testing
|
57
|
+
# individual ciphers.
|
58
|
+
if test_ssl == :rejected and test_tls == :rejected
|
59
|
+
return scan_result
|
60
|
+
end
|
61
|
+
|
62
|
+
@supported_versions.each do |ssl_version|
|
63
|
+
sslctx = OpenSSL::SSL::SSLContext.new(ssl_version)
|
64
|
+
sslctx.ciphers.each do |cipher_name, ssl_ver, key_length, alg_length|
|
65
|
+
status = test_cipher(ssl_version, cipher_name)
|
66
|
+
scan_result.add_cipher(ssl_version, cipher_name, key_length, status)
|
67
|
+
if status == :accepted and scan_result.cert.nil?
|
68
|
+
scan_result.cert = get_cert(ssl_version, cipher_name)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
scan_result
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_ssl
|
76
|
+
begin
|
77
|
+
scan_client = Rex::Socket::Tcp.create(
|
78
|
+
'Context' => @context,
|
79
|
+
'PeerHost' => @host,
|
80
|
+
'PeerPort' => @port,
|
81
|
+
'SSL' => true,
|
82
|
+
'SSLVersion' => :SSLv23,
|
83
|
+
'Timeout' => @timeout
|
84
|
+
)
|
85
|
+
rescue ::Exception => e
|
86
|
+
return :rejected
|
87
|
+
ensure
|
88
|
+
if scan_client
|
89
|
+
scan_client.close
|
90
|
+
end
|
91
|
+
end
|
92
|
+
return :accepted
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_tls
|
96
|
+
begin
|
97
|
+
scan_client = Rex::Socket::Tcp.create(
|
98
|
+
'Context' => @context,
|
99
|
+
'PeerHost' => @host,
|
100
|
+
'PeerPort' => @port,
|
101
|
+
'SSL' => true,
|
102
|
+
'SSLVersion' => :TLSv1,
|
103
|
+
'Timeout' => @timeout
|
104
|
+
)
|
105
|
+
rescue ::Exception => e
|
106
|
+
return :rejected
|
107
|
+
ensure
|
108
|
+
if scan_client
|
109
|
+
scan_client.close
|
110
|
+
end
|
111
|
+
end
|
112
|
+
return :accepted
|
113
|
+
end
|
114
|
+
|
115
|
+
# Tests the specified SSL Version and Cipher against the configured target
|
116
|
+
# @param ssl_version [Symbol] The SSL version to use (:SSLv2, :SSLv3, :TLSv1)
|
117
|
+
# @param cipher [String] The SSL Cipher to use
|
118
|
+
# @return [Symbol] Either :accepted or :rejected
|
119
|
+
def test_cipher(ssl_version, cipher)
|
120
|
+
validate_params(ssl_version,cipher)
|
121
|
+
begin
|
122
|
+
scan_client = Rex::Socket::Tcp.create(
|
123
|
+
'Context' => @context,
|
124
|
+
'PeerHost' => @host,
|
125
|
+
'PeerPort' => @port,
|
126
|
+
'SSL' => true,
|
127
|
+
'SSLVersion' => ssl_version,
|
128
|
+
'SSLCipher' => cipher,
|
129
|
+
'Timeout' => @timeout
|
130
|
+
)
|
131
|
+
rescue ::Exception => e
|
132
|
+
return :rejected
|
133
|
+
ensure
|
134
|
+
if scan_client
|
135
|
+
scan_client.close
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
return :accepted
|
140
|
+
end
|
141
|
+
|
142
|
+
# Retrieve the X509 Cert from the target service,
|
143
|
+
# @param ssl_version [Symbol] The SSL version to use (:SSLv2, :SSLv3, :TLSv1)
|
144
|
+
# @param cipher [String] The SSL Cipher to use
|
145
|
+
# @return [OpenSSL::X509::Certificate] if the certificate was retrieved
|
146
|
+
# @return [Nil] if the cert couldn't be retrieved
|
147
|
+
def get_cert(ssl_version, cipher)
|
148
|
+
validate_params(ssl_version,cipher)
|
149
|
+
begin
|
150
|
+
scan_client = Rex::Socket::Tcp.create(
|
151
|
+
'PeerHost' => @host,
|
152
|
+
'PeerPort' => @port,
|
153
|
+
'SSL' => true,
|
154
|
+
'SSLVersion' => ssl_version,
|
155
|
+
'SSLCipher' => cipher,
|
156
|
+
'Timeout' => @timeout
|
157
|
+
)
|
158
|
+
cert = scan_client.peer_cert
|
159
|
+
if cert.kind_of? OpenSSL::X509::Certificate
|
160
|
+
return cert
|
161
|
+
else
|
162
|
+
return nil
|
163
|
+
end
|
164
|
+
rescue ::Exception => e
|
165
|
+
return nil
|
166
|
+
ensure
|
167
|
+
if scan_client
|
168
|
+
scan_client.close
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
|
174
|
+
protected
|
175
|
+
|
176
|
+
# Validates that the SSL Version and Cipher are valid both seperately and
|
177
|
+
# together as part of an SSL Context.
|
178
|
+
# @param ssl_version [Symbol] The SSL version to use (:SSLv2, :SSLv3, :TLSv1)
|
179
|
+
# @param cipher [String] The SSL Cipher to use
|
180
|
+
# @raise [StandardError] If an invalid or unsupported SSL Version was supplied
|
181
|
+
# @raise [StandardError] If the cipher is not valid for that version of SSL
|
182
|
+
def validate_params(ssl_version, cipher)
|
183
|
+
raise StandardError, "The scanner configuration is invalid" unless valid?
|
184
|
+
unless @supported_versions.include? ssl_version
|
185
|
+
raise StandardError, "SSL Version must be one of: #{@supported_versions.to_s}"
|
186
|
+
end
|
187
|
+
if ssl_version == :SSLv2 and sslv2 == false
|
188
|
+
raise StandardError, "Your OS hates freedom! Your OpenSSL libs are compiled without SSLv2 support!"
|
189
|
+
else
|
190
|
+
unless OpenSSL::SSL::SSLContext.new(ssl_version).ciphers.flatten.include? cipher
|
191
|
+
raise StandardError, "Must be a valid SSL Cipher for #{ssl_version}!"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def check_opensslv2
|
197
|
+
begin
|
198
|
+
OpenSSL::SSL::SSLContext.new(:SSLv2)
|
199
|
+
rescue
|
200
|
+
return false
|
201
|
+
end
|
202
|
+
return true
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
end
|