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,385 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex/socket'
|
|
3
|
+
require 'rex/proto/http'
|
|
4
|
+
require 'rex/proto/http/handler'
|
|
5
|
+
|
|
6
|
+
module Rex
|
|
7
|
+
module Proto
|
|
8
|
+
module Http
|
|
9
|
+
|
|
10
|
+
###
|
|
11
|
+
#
|
|
12
|
+
# Runtime extension of the HTTP clients that connect to the server.
|
|
13
|
+
#
|
|
14
|
+
###
|
|
15
|
+
module ServerClient
|
|
16
|
+
|
|
17
|
+
#
|
|
18
|
+
# Initialize a new request instance.
|
|
19
|
+
#
|
|
20
|
+
def init_cli(server)
|
|
21
|
+
self.request = Request.new
|
|
22
|
+
self.server = server
|
|
23
|
+
self.keepalive = false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# Resets the parsing state.
|
|
28
|
+
#
|
|
29
|
+
def reset_cli
|
|
30
|
+
self.request.reset
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
#
|
|
34
|
+
# Transmits a response and adds the appropriate headers.
|
|
35
|
+
#
|
|
36
|
+
def send_response(response)
|
|
37
|
+
# Set the connection to close or keep-alive depending on what the client
|
|
38
|
+
# can support.
|
|
39
|
+
response['Connection'] = (keepalive) ? 'Keep-Alive' : 'close'
|
|
40
|
+
|
|
41
|
+
# Add any other standard response headers.
|
|
42
|
+
server.add_response_headers(response)
|
|
43
|
+
|
|
44
|
+
# Send it off.
|
|
45
|
+
put(response.to_s)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# The current request context.
|
|
50
|
+
#
|
|
51
|
+
attr_accessor :request
|
|
52
|
+
#
|
|
53
|
+
# Boolean that indicates whether or not the connection supports keep-alive.
|
|
54
|
+
#
|
|
55
|
+
attr_accessor :keepalive
|
|
56
|
+
#
|
|
57
|
+
# A reference to the server the client is associated with.
|
|
58
|
+
#
|
|
59
|
+
attr_accessor :server
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
###
|
|
64
|
+
#
|
|
65
|
+
# Acts as an HTTP server, processing requests and dispatching them to
|
|
66
|
+
# registered procs. Some of this server was modeled after webrick.
|
|
67
|
+
#
|
|
68
|
+
###
|
|
69
|
+
class Server
|
|
70
|
+
|
|
71
|
+
include Proto
|
|
72
|
+
|
|
73
|
+
#
|
|
74
|
+
# A hash that associated a file extension with a mime type for use as the
|
|
75
|
+
# content type of responses.
|
|
76
|
+
#
|
|
77
|
+
ExtensionMimeTypes =
|
|
78
|
+
{
|
|
79
|
+
"rhtml" => "text/html",
|
|
80
|
+
"html" => "text/html",
|
|
81
|
+
"htm" => "text/htm",
|
|
82
|
+
"jpg" => "image/jpeg",
|
|
83
|
+
"jpeg" => "image/jpeg",
|
|
84
|
+
"jpeg" => "image/jpeg",
|
|
85
|
+
"gif" => "image/gif",
|
|
86
|
+
"png" => "image/png",
|
|
87
|
+
"bmp" => "image/bmp",
|
|
88
|
+
"txt" => "text/plain",
|
|
89
|
+
"css" => "text/css",
|
|
90
|
+
"ico" => "image/x-icon",
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#
|
|
94
|
+
# The default server name that will be returned in the Server attribute of
|
|
95
|
+
# a response.
|
|
96
|
+
#
|
|
97
|
+
DefaultServer = "Rex"
|
|
98
|
+
|
|
99
|
+
#
|
|
100
|
+
# Initializes an HTTP server as listening on the provided port and
|
|
101
|
+
# hostname.
|
|
102
|
+
#
|
|
103
|
+
def initialize(port = 80, listen_host = '0.0.0.0', ssl = false, context = {}, comm = nil, ssl_cert = nil, ssl_compression = false)
|
|
104
|
+
self.listen_host = listen_host
|
|
105
|
+
self.listen_port = port
|
|
106
|
+
self.ssl = ssl
|
|
107
|
+
self.context = context
|
|
108
|
+
self.comm = comm
|
|
109
|
+
self.ssl_cert = ssl_cert
|
|
110
|
+
self.ssl_compression = ssl_compression
|
|
111
|
+
self.listener = nil
|
|
112
|
+
self.resources = {}
|
|
113
|
+
self.server_name = DefaultServer
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# More readable inspect that only shows the url and resources
|
|
117
|
+
# @return [String]
|
|
118
|
+
def inspect
|
|
119
|
+
resources_str = resources.keys.map{|r| r.inspect }.join ", "
|
|
120
|
+
|
|
121
|
+
"#<#{self.class} http#{ssl ? "s" : ""}://#{listen_host}:#{listen_port} [ #{resources_str} ]>"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# Returns the hardcore alias for the HTTP service
|
|
126
|
+
#
|
|
127
|
+
def self.hardcore_alias(*args)
|
|
128
|
+
"#{(args[0] || '')}#{(args[1] || '')}"
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
#
|
|
132
|
+
# HTTP server.
|
|
133
|
+
#
|
|
134
|
+
def alias
|
|
135
|
+
super || "HTTP Server"
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
#
|
|
139
|
+
# Listens on the defined port and host and starts monitoring for clients.
|
|
140
|
+
#
|
|
141
|
+
def start
|
|
142
|
+
|
|
143
|
+
self.listener = Rex::Socket::TcpServer.create(
|
|
144
|
+
'LocalHost' => self.listen_host,
|
|
145
|
+
'LocalPort' => self.listen_port,
|
|
146
|
+
'Context' => self.context,
|
|
147
|
+
'SSL' => self.ssl,
|
|
148
|
+
'SSLCert' => self.ssl_cert,
|
|
149
|
+
'SSLCompression' => self.ssl_compression,
|
|
150
|
+
'Comm' => self.comm
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Register callbacks
|
|
154
|
+
self.listener.on_client_connect_proc = Proc.new { |cli|
|
|
155
|
+
on_client_connect(cli)
|
|
156
|
+
}
|
|
157
|
+
self.listener.on_client_data_proc = Proc.new { |cli|
|
|
158
|
+
on_client_data(cli)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
self.listener.start
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
#
|
|
165
|
+
# Terminates the monitor thread and turns off the listener.
|
|
166
|
+
#
|
|
167
|
+
def stop
|
|
168
|
+
self.listener.stop
|
|
169
|
+
self.listener.close
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
#
|
|
174
|
+
# Waits for the HTTP service to terminate
|
|
175
|
+
#
|
|
176
|
+
def wait
|
|
177
|
+
self.listener.wait if self.listener
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
#
|
|
181
|
+
# Closes the supplied client, if valid.
|
|
182
|
+
#
|
|
183
|
+
def close_client(cli)
|
|
184
|
+
listener.close_client(cli)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
#
|
|
188
|
+
# Mounts a directory or resource as being serviced by the supplied handler.
|
|
189
|
+
#
|
|
190
|
+
def mount(root, handler, long_call = false, *args)
|
|
191
|
+
resources[root] = [ handler, long_call, args ]
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
#
|
|
195
|
+
# Remove the mount point.
|
|
196
|
+
#
|
|
197
|
+
def unmount(root)
|
|
198
|
+
resources.delete(root)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
#
|
|
202
|
+
# Adds a resource handler, such as one for /, which will be called whenever
|
|
203
|
+
# the resource is requested. The ``opts'' parameter can have any of the
|
|
204
|
+
# following:
|
|
205
|
+
#
|
|
206
|
+
# Proc (proc) - The procedure to call when a request comes in for this resource.
|
|
207
|
+
# LongCall (bool) - Hints to the server that this resource may have long
|
|
208
|
+
# request processing times.
|
|
209
|
+
#
|
|
210
|
+
def add_resource(name, opts)
|
|
211
|
+
if (resources[name])
|
|
212
|
+
raise RuntimeError,
|
|
213
|
+
"The supplied resource '#{name}' is already added.", caller
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# If a procedure was passed, mount the resource with it.
|
|
217
|
+
if (opts['Proc'])
|
|
218
|
+
mount(name, Handler::Proc, false, opts['Proc'], opts['VirtualDirectory'])
|
|
219
|
+
else
|
|
220
|
+
raise ArgumentError, "You must specify a procedure."
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
#
|
|
225
|
+
# Removes the supplied resource handler.
|
|
226
|
+
#
|
|
227
|
+
def remove_resource(name)
|
|
228
|
+
self.resources.delete(name)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
#
|
|
232
|
+
# Adds Server headers and stuff.
|
|
233
|
+
#
|
|
234
|
+
def add_response_headers(resp)
|
|
235
|
+
resp['Server'] = self.server_name if not resp['Server']
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
#
|
|
239
|
+
# Returns the mime type associated with the supplied file. Right now the
|
|
240
|
+
# set of mime types is fairly limited.
|
|
241
|
+
#
|
|
242
|
+
def mime_type(file)
|
|
243
|
+
type = nil
|
|
244
|
+
|
|
245
|
+
if (file =~ /\.(.+?)$/)
|
|
246
|
+
type = ExtensionMimeTypes[$1.downcase]
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
type || "text/plain"
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
#
|
|
253
|
+
# Sends a 404 error to the client for a given request.
|
|
254
|
+
#
|
|
255
|
+
def send_e404(cli, request)
|
|
256
|
+
resp = Response::E404.new
|
|
257
|
+
|
|
258
|
+
resp['Content-Type'] = 'text/html'
|
|
259
|
+
|
|
260
|
+
resp.body =
|
|
261
|
+
"<html><head>" +
|
|
262
|
+
"<title>404 Not Found</title>" +
|
|
263
|
+
"</head><body>" +
|
|
264
|
+
"<h1>Not found</h1>" +
|
|
265
|
+
"The requested URL #{html_escape(request.resource)} was not found on this server.<p><hr>" +
|
|
266
|
+
"</body></html>"
|
|
267
|
+
|
|
268
|
+
# Send the response to the client like what
|
|
269
|
+
cli.send_response(resp)
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
attr_accessor :listen_port, :listen_host, :server_name, :context, :comm
|
|
273
|
+
attr_accessor :ssl, :ssl_cert, :ssl_compression
|
|
274
|
+
attr_accessor :listener, :resources
|
|
275
|
+
|
|
276
|
+
protected
|
|
277
|
+
|
|
278
|
+
#
|
|
279
|
+
# Extends new clients with the ServerClient module and initializes them.
|
|
280
|
+
#
|
|
281
|
+
def on_client_connect(cli)
|
|
282
|
+
cli.extend(ServerClient)
|
|
283
|
+
|
|
284
|
+
cli.init_cli(self)
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
#
|
|
288
|
+
# Processes data coming in from a client.
|
|
289
|
+
#
|
|
290
|
+
def on_client_data(cli)
|
|
291
|
+
begin
|
|
292
|
+
data = cli.read(65535)
|
|
293
|
+
|
|
294
|
+
raise ::EOFError if not data
|
|
295
|
+
raise ::EOFError if data.empty?
|
|
296
|
+
|
|
297
|
+
case cli.request.parse(data)
|
|
298
|
+
when Packet::ParseCode::Completed
|
|
299
|
+
dispatch_request(cli, cli.request)
|
|
300
|
+
cli.reset_cli
|
|
301
|
+
|
|
302
|
+
when Packet::ParseCode::Partial
|
|
303
|
+
# Return and wait for the on_client_data handler to be called again
|
|
304
|
+
# The Request object tracks the state of the request for us
|
|
305
|
+
return
|
|
306
|
+
|
|
307
|
+
when Packet::ParseCode::Error
|
|
308
|
+
close_client(cli)
|
|
309
|
+
end
|
|
310
|
+
rescue EOFError
|
|
311
|
+
if (cli.request.completed?)
|
|
312
|
+
dispatch_request(cli, cli.request)
|
|
313
|
+
|
|
314
|
+
cli.reset_cli
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
close_client(cli)
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
#
|
|
322
|
+
# Dispatches the supplied request for a given connection.
|
|
323
|
+
#
|
|
324
|
+
def dispatch_request(cli, request)
|
|
325
|
+
# Is the client requesting keep-alive?
|
|
326
|
+
if ((request['Connection']) and
|
|
327
|
+
(request['Connection'].downcase == 'Keep-Alive'.downcase))
|
|
328
|
+
cli.keepalive = true
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
# Search for the resource handler for the requested URL. This is pretty
|
|
332
|
+
# inefficient right now, but we can spruce it up later.
|
|
333
|
+
p = nil
|
|
334
|
+
len = 0
|
|
335
|
+
root = nil
|
|
336
|
+
|
|
337
|
+
resources.each_pair { |k, val|
|
|
338
|
+
if (request.resource =~ /^#{k}/ and k.length > len)
|
|
339
|
+
p = val
|
|
340
|
+
len = k.length
|
|
341
|
+
root = k
|
|
342
|
+
end
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (p)
|
|
346
|
+
# Create an instance of the handler for this resource
|
|
347
|
+
handler = p[0].new(self, *p[2])
|
|
348
|
+
|
|
349
|
+
# If the handler class requires a relative resource...
|
|
350
|
+
if (handler.relative_resource_required?)
|
|
351
|
+
# Substituted the mount point root in the request to make things
|
|
352
|
+
# relative to the mount point.
|
|
353
|
+
request.relative_resource = request.resource.gsub(/^#{root}/, '')
|
|
354
|
+
request.relative_resource = '/' + request.relative_resource if (request.relative_resource !~ /^\//)
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
# If we found the resource handler for this resource, call its
|
|
359
|
+
# procedure.
|
|
360
|
+
if (p[1] == true)
|
|
361
|
+
Rex::ThreadFactory.spawn("HTTPServerRequestHandler", false) {
|
|
362
|
+
handler.on_request(cli, request)
|
|
363
|
+
}
|
|
364
|
+
else
|
|
365
|
+
handler.on_request(cli, request)
|
|
366
|
+
end
|
|
367
|
+
else
|
|
368
|
+
elog("Failed to find handler for resource: #{request.resource}",
|
|
369
|
+
LogSource)
|
|
370
|
+
|
|
371
|
+
send_e404(cli, request)
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
# If keep-alive isn't enabled for this client, close the connection
|
|
375
|
+
if (cli.keepalive == false)
|
|
376
|
+
close_client(cli)
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
module Rex
|
|
3
|
+
module Proto
|
|
4
|
+
module IAX2
|
|
5
|
+
class Call
|
|
6
|
+
|
|
7
|
+
attr_accessor :client
|
|
8
|
+
attr_accessor :oseq, :iseq
|
|
9
|
+
attr_accessor :scall, :dcall
|
|
10
|
+
attr_accessor :codec, :state
|
|
11
|
+
attr_accessor :ring_start, :ring_finish
|
|
12
|
+
attr_accessor :itime
|
|
13
|
+
attr_accessor :queue
|
|
14
|
+
attr_accessor :audio_hook
|
|
15
|
+
attr_accessor :audio_buff
|
|
16
|
+
attr_accessor :time_limit
|
|
17
|
+
attr_accessor :busy
|
|
18
|
+
|
|
19
|
+
attr_accessor :caller_name
|
|
20
|
+
attr_accessor :caller_number
|
|
21
|
+
attr_accessor :dtmf
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def initialize(client, src_id)
|
|
25
|
+
self.client = client
|
|
26
|
+
self.scall = src_id
|
|
27
|
+
self.dcall = 0
|
|
28
|
+
self.iseq = 0
|
|
29
|
+
self.oseq = 0
|
|
30
|
+
self.state = nil
|
|
31
|
+
|
|
32
|
+
self.itime = ::Time.now
|
|
33
|
+
self.queue = ::Queue.new
|
|
34
|
+
|
|
35
|
+
self.audio_buff = []
|
|
36
|
+
|
|
37
|
+
self.busy = false
|
|
38
|
+
self.dtmf = ''
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def dprint(msg)
|
|
43
|
+
self.client.dprint(msg)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def wait_for(*stypes)
|
|
47
|
+
begin
|
|
48
|
+
::Timeout.timeout( IAX_DEFAULT_TIMEOUT ) do
|
|
49
|
+
while (res = self.queue.pop )
|
|
50
|
+
if stypes.include?(res[1])
|
|
51
|
+
return res
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
rescue ::Timeout::Error
|
|
56
|
+
return nil
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Register with the IAX endpoint
|
|
61
|
+
def register
|
|
62
|
+
self.client.send_regreq(self)
|
|
63
|
+
res = wait_for( IAX_SUBTYPE_REGAUTH, IAX_SUBTYPE_REGREJ )
|
|
64
|
+
return if not res
|
|
65
|
+
|
|
66
|
+
if res[1] == IAX_SUBTYPE_REGREJ
|
|
67
|
+
reason = res[2][IAX_IE_REGREJ_CAUSE] || "Unknown Reason"
|
|
68
|
+
dprint("REGREJ: #{reason}")
|
|
69
|
+
# Acknowledge the REGREJ
|
|
70
|
+
self.client.send_ack(self)
|
|
71
|
+
return
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
chall = nil
|
|
75
|
+
if res[2][14] == "\x00\x03" and res[2][IAX_IE_CHALLENGE_DATA]
|
|
76
|
+
self.dcall = res[0][0]
|
|
77
|
+
chall = res[2][IAX_IE_CHALLENGE_DATA]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
if chall.nil?
|
|
81
|
+
dprint("REGAUTH: No challenge data received")
|
|
82
|
+
return
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
self.client.send_regreq_chall_response(self, chall)
|
|
86
|
+
res = wait_for( IAX_SUBTYPE_REGACK, IAX_SUBTYPE_REGREJ )
|
|
87
|
+
return if not res
|
|
88
|
+
|
|
89
|
+
if res[1] == IAX_SUBTYPE_REGREJ
|
|
90
|
+
reason = res[2][IAX_IE_REGREJ_CAUSE] || "Unknown Reason"
|
|
91
|
+
dprint("REGREJ: #{reason}")
|
|
92
|
+
return
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
if res[2][IAX_IE_APPARENT_ADDR]
|
|
96
|
+
r_fam, r_port, r_addr = res[2][IAX_IE_APPARENT_ADDR].unpack('nnA4')
|
|
97
|
+
r_addr = r_addr.unpack("C*").map{|x| x.to_s }.join(".")
|
|
98
|
+
dprint("REGACK: Registered from address #{r_addr}:#{r_port}")
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Acknowledge the REGACK
|
|
102
|
+
self.client.send_ack(self)
|
|
103
|
+
|
|
104
|
+
self.state = :registered
|
|
105
|
+
|
|
106
|
+
true
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def dial(number)
|
|
110
|
+
self.client.send_new(self, number)
|
|
111
|
+
res = wait_for(IAX_SUBTYPE_AUTHREQ, IAX_SUBTYPE_ACCEPT)
|
|
112
|
+
return if not res
|
|
113
|
+
|
|
114
|
+
# Handle authentication if its requested
|
|
115
|
+
if res[1] == IAX_SUBTYPE_AUTHREQ
|
|
116
|
+
chall = nil
|
|
117
|
+
if res[2][14] == "\x00\x03" and res[1][15]
|
|
118
|
+
self.dcall = res[0][0]
|
|
119
|
+
chall = res[2][15]
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
self.client.send_authrep_chall_response(self, chall)
|
|
123
|
+
res = wait_for( IAX_SUBTYPE_ACCEPT)
|
|
124
|
+
return if not res
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
self.codec = res[2][IAX_IE_DESIRED_CODEC].unpack("N")[0]
|
|
128
|
+
self.state = :ringing
|
|
129
|
+
self.ring_start = ::Time.now.to_i
|
|
130
|
+
self.client.send_ack(self)
|
|
131
|
+
true
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def hangup
|
|
135
|
+
self.client.send_hangup(self)
|
|
136
|
+
self.state = :hangup
|
|
137
|
+
true
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def ring_time
|
|
141
|
+
(self.ring_finish || Time.now).to_i - self.ring_start.to_i
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def timestamp
|
|
145
|
+
(( ::Time.now - self.itime) * 1000.0 ).to_i & 0xffffffff
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def process_elements(data,off=0)
|
|
149
|
+
res = {}
|
|
150
|
+
while( off < data.length )
|
|
151
|
+
ie_type = data[off ,1].unpack("C")[0]
|
|
152
|
+
ie_len = data[off + 1,2].unpack("C")[0]
|
|
153
|
+
res[ie_type] = data[off + 2, ie_len]
|
|
154
|
+
off += ie_len + 2
|
|
155
|
+
end
|
|
156
|
+
res
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Handling incoming control packets
|
|
160
|
+
# TODO: Enforce sequence order to prevent duplicates from breaking our state
|
|
161
|
+
def handle_control(pkt)
|
|
162
|
+
src_call, dst_call, tstamp, out_seq, inp_seq, itype = pkt.unpack('nnNCCC')
|
|
163
|
+
|
|
164
|
+
# Scrub the high bits out of the call IDs
|
|
165
|
+
src_call ^= 0x8000 if (src_call & 0x8000 != 0)
|
|
166
|
+
dst_call ^= 0x8000 if (dst_call & 0x8000 != 0)
|
|
167
|
+
|
|
168
|
+
phdr = [ src_call, dst_call, tstamp, out_seq, inp_seq, itype ]
|
|
169
|
+
|
|
170
|
+
info = nil
|
|
171
|
+
stype = pkt[11,1].unpack("C")[0]
|
|
172
|
+
info = process_elements(pkt, 12) if [IAX_TYPE_IAX, IAX_TYPE_CONTROL].include?(itype)
|
|
173
|
+
|
|
174
|
+
if dst_call != self.scall
|
|
175
|
+
dprint("Incoming packet to inactive call: #{dst_call} vs #{self.scall}: #{phdr.inspect} #{stype.inspect} #{info.inspect}")
|
|
176
|
+
return
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Increment the received sequence number
|
|
180
|
+
self.iseq = (self.iseq + 1) & 0xff
|
|
181
|
+
|
|
182
|
+
if self.state == :hangup
|
|
183
|
+
dprint("Packet received after hangup, replying with invalid")
|
|
184
|
+
self.client.send_invalid(self)
|
|
185
|
+
return
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Technically these all require an ACK reply
|
|
189
|
+
# NEW, HANGUP, REJECT, ACCEPT, PONG, AUTHREP, REGREL, REGACK, REGREJ, TXREL
|
|
190
|
+
|
|
191
|
+
case itype
|
|
192
|
+
when IAX_TYPE_DTMF_BEGIN
|
|
193
|
+
self.dprint("DTMF BEG: #{pkt[11,1]}")
|
|
194
|
+
self.dtmf << pkt[11,1]
|
|
195
|
+
|
|
196
|
+
when IAX_TYPE_DTMF_END
|
|
197
|
+
self.dprint("DTMF END: #{pkt[11,1]}")
|
|
198
|
+
|
|
199
|
+
when IAX_TYPE_CONTROL
|
|
200
|
+
case stype
|
|
201
|
+
when IAX_CTRL_HANGUP
|
|
202
|
+
dprint("HANGUP")
|
|
203
|
+
self.client.send_ack(self)
|
|
204
|
+
self.state = :hangup
|
|
205
|
+
|
|
206
|
+
when IAX_CTRL_RINGING
|
|
207
|
+
dprint("RINGING")
|
|
208
|
+
self.client.send_ack(self)
|
|
209
|
+
|
|
210
|
+
when IAX_CTRL_BUSY
|
|
211
|
+
dprint("BUSY")
|
|
212
|
+
self.busy = true
|
|
213
|
+
self.state = :hangup
|
|
214
|
+
self.client.send_ack(self)
|
|
215
|
+
|
|
216
|
+
when IAX_CTRL_ANSWER
|
|
217
|
+
dprint("ANSWER")
|
|
218
|
+
if self.state == :ringing
|
|
219
|
+
self.state = :answered
|
|
220
|
+
self.ring_finish = ::Time.now.to_i
|
|
221
|
+
end
|
|
222
|
+
self.client.send_ack(self)
|
|
223
|
+
|
|
224
|
+
when IAX_CTRL_PROGRESS
|
|
225
|
+
dprint("PROGRESS")
|
|
226
|
+
|
|
227
|
+
when IAX_CTRL_PROCEED
|
|
228
|
+
dprint("PROCEED")
|
|
229
|
+
|
|
230
|
+
when 255
|
|
231
|
+
dprint("STOP SOUNDS")
|
|
232
|
+
end
|
|
233
|
+
# Acknowledge all control packets
|
|
234
|
+
# self.client.send_ack(self)
|
|
235
|
+
|
|
236
|
+
when IAX_TYPE_IAX
|
|
237
|
+
|
|
238
|
+
dprint( ["RECV", phdr, stype, info].inspect )
|
|
239
|
+
case stype
|
|
240
|
+
when IAX_SUBTYPE_HANGUP
|
|
241
|
+
self.state = :hangup
|
|
242
|
+
self.client.send_ack(self)
|
|
243
|
+
when IAX_SUBTYPE_LAGRQ
|
|
244
|
+
# Lagrps echo the timestamp
|
|
245
|
+
self.client.send_lagrp(self, tstamp)
|
|
246
|
+
when IAX_SUBTYPE_ACK
|
|
247
|
+
# Nothing to do here
|
|
248
|
+
when IAX_SUBTYPE_PING
|
|
249
|
+
# Pongs echo the timestamp
|
|
250
|
+
self.client.send_pong(self, tstamp)
|
|
251
|
+
when IAX_SUBTYPE_PONG
|
|
252
|
+
self.client.send_ack(self)
|
|
253
|
+
else
|
|
254
|
+
dprint( ["RECV-QUEUE", phdr, stype, info].inspect )
|
|
255
|
+
self.queue.push( [phdr, stype, info ] )
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
when IAX_TYPE_VOICE
|
|
259
|
+
v_codec = stype
|
|
260
|
+
if self.state == :answered
|
|
261
|
+
handle_audio(pkt)
|
|
262
|
+
end
|
|
263
|
+
self.client.send_ack(self)
|
|
264
|
+
|
|
265
|
+
when nil
|
|
266
|
+
dprint("Invalid control packet: #{pkt.unpack("H*")[0]}")
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
# Encoded audio from the client
|
|
272
|
+
def handle_audio(pkt)
|
|
273
|
+
# Ignore audio received before the call is answered (ring ring)
|
|
274
|
+
return if self.state != :answered
|
|
275
|
+
|
|
276
|
+
# Extract the data from the packet (full or mini)
|
|
277
|
+
data = audio_packet_data(pkt)
|
|
278
|
+
|
|
279
|
+
# Decode the data into linear PCM frames
|
|
280
|
+
buff = decode_audio_frame(data)
|
|
281
|
+
|
|
282
|
+
# Call the caller-provided hook if its exists
|
|
283
|
+
if self.audio_hook
|
|
284
|
+
self.audio_buff(buff)
|
|
285
|
+
# Otherwise append the frame to the buffer
|
|
286
|
+
else
|
|
287
|
+
self.audio_buff << buff
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
def each_audio_frame(&block)
|
|
292
|
+
self.audio_buff.each do |frame|
|
|
293
|
+
block.call(frame)
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def decode_audio_frame(buff)
|
|
298
|
+
case self.codec
|
|
299
|
+
|
|
300
|
+
# Convert u-law into signed PCM
|
|
301
|
+
when IAX_CODEC_G711_MULAW
|
|
302
|
+
Rex::Proto::IAX2::Codecs::MuLaw.decode(buff)
|
|
303
|
+
|
|
304
|
+
# Convert a-law into signed PCM
|
|
305
|
+
when IAX_CODEC_G711_ALAW
|
|
306
|
+
Rex::Proto::IAX2::Codecs::ALaw.decode(buff)
|
|
307
|
+
|
|
308
|
+
# Linear little-endian signed PCM is our native format
|
|
309
|
+
when IAX_CODEC_LINEAR_PCM
|
|
310
|
+
buff
|
|
311
|
+
|
|
312
|
+
# Unsupported codec, return empty
|
|
313
|
+
else
|
|
314
|
+
dprint("UNKNOWN CODEC: #{self.codec.inspect}")
|
|
315
|
+
''
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def audio_packet_data(pkt)
|
|
320
|
+
(pkt[0,1].unpack("C")[0] & 0x80 == 0) ? pkt[4,pkt.length-4] : pkt[12,pkt.length-12]
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
end
|