librex 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -0
- data/lib/rex/LICENSE +29 -0
- data/lib/rex/arch.rb +103 -0
- data/lib/rex/arch/sparc.rb +75 -0
- data/lib/rex/arch/sparc.rb.ut.rb +18 -0
- data/lib/rex/arch/x86.rb +513 -0
- data/lib/rex/arch/x86.rb.ut.rb +93 -0
- data/lib/rex/assembly/nasm.rb +104 -0
- data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +311 -0
- data/lib/rex/constants.rb +113 -0
- data/lib/rex/elfparsey.rb +11 -0
- data/lib/rex/elfparsey/elf.rb +123 -0
- data/lib/rex/elfparsey/elfbase.rb +258 -0
- data/lib/rex/elfparsey/exceptions.rb +27 -0
- data/lib/rex/elfscan.rb +12 -0
- data/lib/rex/elfscan/scanner.rb +207 -0
- data/lib/rex/elfscan/search.rb +46 -0
- data/lib/rex/encoder/alpha2.rb +31 -0
- data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
- data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
- data/lib/rex/encoder/alpha2/generic.rb +114 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
- data/lib/rex/encoder/ndr.rb +89 -0
- data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
- data/lib/rex/encoder/nonalpha.rb +61 -0
- data/lib/rex/encoder/nonupper.rb +64 -0
- data/lib/rex/encoder/xdr.rb +106 -0
- data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
- data/lib/rex/encoder/xor.rb +69 -0
- data/lib/rex/encoder/xor/dword.rb +13 -0
- data/lib/rex/encoder/xor/dword_additive.rb +13 -0
- data/lib/rex/encoders/xor_dword.rb +35 -0
- data/lib/rex/encoders/xor_dword_additive.rb +53 -0
- data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
- data/lib/rex/encoding/xor.rb +20 -0
- data/lib/rex/encoding/xor.rb.ts.rb +14 -0
- data/lib/rex/encoding/xor/byte.rb +15 -0
- data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/dword_additive.rb +92 -0
- data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/exceptions.rb +17 -0
- data/lib/rex/encoding/xor/generic.rb +146 -0
- data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
- data/lib/rex/encoding/xor/qword.rb +15 -0
- data/lib/rex/encoding/xor/word.rb +21 -0
- data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
- data/lib/rex/exceptions.rb +275 -0
- data/lib/rex/exceptions.rb.ut.rb +44 -0
- data/lib/rex/exploitation/cmdstager.rb +9 -0
- data/lib/rex/exploitation/cmdstager/base.rb +175 -0
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +142 -0
- data/lib/rex/exploitation/cmdstager/debug_write.rb +136 -0
- data/lib/rex/exploitation/cmdstager/tftp.rb +63 -0
- data/lib/rex/exploitation/cmdstager/vbs.rb +128 -0
- data/lib/rex/exploitation/egghunter.rb +277 -0
- data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
- data/lib/rex/exploitation/encryptjs.rb +77 -0
- data/lib/rex/exploitation/heaplib.js.b64 +331 -0
- data/lib/rex/exploitation/heaplib.rb +94 -0
- data/lib/rex/exploitation/javascriptosdetect.rb +897 -0
- data/lib/rex/exploitation/obfuscatejs.rb +335 -0
- data/lib/rex/exploitation/omelet.rb +320 -0
- data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
- data/lib/rex/exploitation/opcodedb.rb +818 -0
- data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
- data/lib/rex/exploitation/seh.rb +92 -0
- data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
- data/lib/rex/file.rb +112 -0
- data/lib/rex/file.rb.ut.rb +16 -0
- data/lib/rex/image_source.rb +12 -0
- data/lib/rex/image_source/disk.rb +60 -0
- data/lib/rex/image_source/image_source.rb +46 -0
- data/lib/rex/image_source/memory.rb +37 -0
- data/lib/rex/io/bidirectional_pipe.rb +157 -0
- data/lib/rex/io/datagram_abstraction.rb +35 -0
- data/lib/rex/io/ring_buffer.rb +364 -0
- data/lib/rex/io/stream.rb +319 -0
- data/lib/rex/io/stream_abstraction.rb +197 -0
- data/lib/rex/io/stream_server.rb +211 -0
- data/lib/rex/job_container.rb +187 -0
- data/lib/rex/logging.rb +4 -0
- data/lib/rex/logging/log_dispatcher.rb +179 -0
- data/lib/rex/logging/log_sink.rb +42 -0
- data/lib/rex/logging/sinks/flatfile.rb +55 -0
- data/lib/rex/logging/sinks/stderr.rb +43 -0
- data/lib/rex/machparsey.rb +9 -0
- data/lib/rex/machparsey/exceptions.rb +34 -0
- data/lib/rex/machparsey/mach.rb +209 -0
- data/lib/rex/machparsey/machbase.rb +408 -0
- data/lib/rex/machscan.rb +9 -0
- data/lib/rex/machscan/scanner.rb +217 -0
- data/lib/rex/mime.rb +9 -0
- data/lib/rex/mime/header.rb +77 -0
- data/lib/rex/mime/message.rb +144 -0
- data/lib/rex/mime/part.rb +20 -0
- data/lib/rex/nop/opty2.rb +108 -0
- data/lib/rex/nop/opty2.rb.ut.rb +23 -0
- data/lib/rex/nop/opty2_tables.rb +300 -0
- data/lib/rex/ole.rb +205 -0
- data/lib/rex/ole/clsid.rb +47 -0
- data/lib/rex/ole/difat.rb +141 -0
- data/lib/rex/ole/directory.rb +231 -0
- data/lib/rex/ole/direntry.rb +240 -0
- data/lib/rex/ole/docs/dependencies.txt +8 -0
- data/lib/rex/ole/docs/references.txt +1 -0
- data/lib/rex/ole/fat.rb +99 -0
- data/lib/rex/ole/header.rb +204 -0
- data/lib/rex/ole/minifat.rb +77 -0
- data/lib/rex/ole/propset.rb +144 -0
- data/lib/rex/ole/samples/create_ole.rb +27 -0
- data/lib/rex/ole/samples/dir.rb +35 -0
- data/lib/rex/ole/samples/dump_stream.rb +34 -0
- data/lib/rex/ole/samples/ole_info.rb +23 -0
- data/lib/rex/ole/storage.rb +395 -0
- data/lib/rex/ole/stream.rb +53 -0
- data/lib/rex/ole/substorage.rb +49 -0
- data/lib/rex/ole/util.rb +157 -0
- data/lib/rex/parser/arguments.rb +97 -0
- data/lib/rex/parser/arguments.rb.ut.rb +67 -0
- data/lib/rex/parser/ini.rb +185 -0
- data/lib/rex/parser/ini.rb.ut.rb +29 -0
- data/lib/rex/parser/ip360_aspl_xml.rb +102 -0
- data/lib/rex/parser/ip360_xml.rb +97 -0
- data/lib/rex/parser/nessus_xml.rb +118 -0
- data/lib/rex/parser/netsparker_xml.rb +94 -0
- data/lib/rex/parser/nexpose_xml.rb +136 -0
- data/lib/rex/parser/nmap_xml.rb +137 -0
- data/lib/rex/parser/retina_xml.rb +109 -0
- data/lib/rex/payloads.rb +1 -0
- data/lib/rex/payloads/win32.rb +2 -0
- data/lib/rex/payloads/win32/common.rb +26 -0
- data/lib/rex/payloads/win32/kernel.rb +53 -0
- data/lib/rex/payloads/win32/kernel/common.rb +54 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
- data/lib/rex/payloads/win32/kernel/stager.rb +194 -0
- data/lib/rex/peparsey.rb +12 -0
- data/lib/rex/peparsey/exceptions.rb +32 -0
- data/lib/rex/peparsey/pe.rb +212 -0
- data/lib/rex/peparsey/pe_memdump.rb +63 -0
- data/lib/rex/peparsey/pebase.rb +1680 -0
- data/lib/rex/peparsey/section.rb +136 -0
- data/lib/rex/pescan.rb +13 -0
- data/lib/rex/pescan/analyze.rb +309 -0
- data/lib/rex/pescan/scanner.rb +206 -0
- data/lib/rex/pescan/search.rb +56 -0
- data/lib/rex/platforms.rb +1 -0
- data/lib/rex/platforms/windows.rb +51 -0
- data/lib/rex/poly.rb +132 -0
- data/lib/rex/poly/block.rb +477 -0
- data/lib/rex/poly/register.rb +100 -0
- data/lib/rex/poly/register/x86.rb +40 -0
- data/lib/rex/post.rb +8 -0
- data/lib/rex/post/dir.rb +51 -0
- data/lib/rex/post/file.rb +172 -0
- data/lib/rex/post/file_stat.rb +220 -0
- data/lib/rex/post/gen.pl +13 -0
- data/lib/rex/post/io.rb +182 -0
- data/lib/rex/post/meterpreter.rb +4 -0
- data/lib/rex/post/meterpreter/channel.rb +445 -0
- data/lib/rex/post/meterpreter/channel_container.rb +54 -0
- data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
- data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
- data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
- data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
- data/lib/rex/post/meterpreter/client.rb +364 -0
- data/lib/rex/post/meterpreter/client_core.rb +274 -0
- data/lib/rex/post/meterpreter/dependencies.rb +3 -0
- data/lib/rex/post/meterpreter/extension.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
- data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
- data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
- data/lib/rex/post/meterpreter/extensions/priv/priv.rb +111 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +101 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +26 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +282 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +266 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +208 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +6 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +31 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +47 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +36 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1818 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3848 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +26 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +318 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +42 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +148 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +127 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +309 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +204 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +51 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +630 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +75 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +103 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +149 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +370 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +211 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +63 -0
- data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
- data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
- data/lib/rex/post/meterpreter/packet.rb +688 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +431 -0
- data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
- data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
- data/lib/rex/post/meterpreter/ui/console.rb +137 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +730 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +231 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +65 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +442 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +298 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +486 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +157 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
- data/lib/rex/post/permission.rb +26 -0
- data/lib/rex/post/process.rb +57 -0
- data/lib/rex/post/thread.rb +57 -0
- data/lib/rex/post/ui.rb +52 -0
- data/lib/rex/proto.rb +13 -0
- data/lib/rex/proto.rb.ts.rb +8 -0
- data/lib/rex/proto/dcerpc.rb +6 -0
- data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
- data/lib/rex/proto/dcerpc/client.rb +361 -0
- data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
- data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
- data/lib/rex/proto/dcerpc/handle.rb +47 -0
- data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
- data/lib/rex/proto/dcerpc/ndr.rb +72 -0
- data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
- data/lib/rex/proto/dcerpc/packet.rb +253 -0
- data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
- data/lib/rex/proto/dcerpc/response.rb +187 -0
- data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
- data/lib/rex/proto/dcerpc/uuid.rb +84 -0
- data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
- data/lib/rex/proto/dhcp.rb +7 -0
- data/lib/rex/proto/dhcp/constants.rb +33 -0
- data/lib/rex/proto/dhcp/server.rb +292 -0
- data/lib/rex/proto/drda.rb +5 -0
- data/lib/rex/proto/drda.rb.ts.rb +17 -0
- data/lib/rex/proto/drda/constants.rb +49 -0
- data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
- data/lib/rex/proto/drda/packet.rb +252 -0
- data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
- data/lib/rex/proto/drda/utils.rb +123 -0
- data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
- data/lib/rex/proto/http.rb +5 -0
- data/lib/rex/proto/http.rb.ts.rb +12 -0
- data/lib/rex/proto/http/client.rb +821 -0
- data/lib/rex/proto/http/client.rb.ut.rb +95 -0
- data/lib/rex/proto/http/handler.rb +46 -0
- data/lib/rex/proto/http/handler/erb.rb +128 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
- data/lib/rex/proto/http/handler/proc.rb +60 -0
- data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
- data/lib/rex/proto/http/header.rb +161 -0
- data/lib/rex/proto/http/header.rb.ut.rb +46 -0
- data/lib/rex/proto/http/packet.rb +407 -0
- data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
- data/lib/rex/proto/http/request.rb +356 -0
- data/lib/rex/proto/http/request.rb.ut.rb +214 -0
- data/lib/rex/proto/http/response.rb +90 -0
- data/lib/rex/proto/http/response.rb.ut.rb +149 -0
- data/lib/rex/proto/http/server.rb +369 -0
- data/lib/rex/proto/http/server.rb.ut.rb +79 -0
- data/lib/rex/proto/ntlm.rb +7 -0
- data/lib/rex/proto/ntlm.rb.ut.rb +177 -0
- data/lib/rex/proto/ntlm/base.rb +326 -0
- data/lib/rex/proto/ntlm/constants.rb +74 -0
- data/lib/rex/proto/ntlm/crypt.rb +415 -0
- data/lib/rex/proto/ntlm/exceptions.rb +16 -0
- data/lib/rex/proto/ntlm/message.rb +536 -0
- data/lib/rex/proto/ntlm/utils.rb +764 -0
- data/lib/rex/proto/proxy/socks4a.rb +440 -0
- data/lib/rex/proto/rfb.rb +19 -0
- data/lib/rex/proto/rfb.rb.ut.rb +37 -0
- data/lib/rex/proto/rfb/cipher.rb +84 -0
- data/lib/rex/proto/rfb/client.rb +207 -0
- data/lib/rex/proto/rfb/constants.rb +52 -0
- data/lib/rex/proto/smb.rb +7 -0
- data/lib/rex/proto/smb.rb.ts.rb +8 -0
- data/lib/rex/proto/smb/client.rb +1952 -0
- data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
- data/lib/rex/proto/smb/constants.rb +1047 -0
- data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
- data/lib/rex/proto/smb/crypt.rb +36 -0
- data/lib/rex/proto/smb/evasions.rb +66 -0
- data/lib/rex/proto/smb/exceptions.rb +858 -0
- data/lib/rex/proto/smb/simpleclient.rb +306 -0
- data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
- data/lib/rex/proto/smb/utils.rb +103 -0
- data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
- data/lib/rex/proto/sunrpc.rb +1 -0
- data/lib/rex/proto/sunrpc/client.rb +195 -0
- data/lib/rex/proto/tftp.rb +12 -0
- data/lib/rex/proto/tftp/constants.rb +39 -0
- data/lib/rex/proto/tftp/server.rb +497 -0
- data/lib/rex/proto/tftp/server.rb.ut.rb +28 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +59 -0
- data/lib/rex/script/meterpreter.rb +15 -0
- data/lib/rex/script/shell.rb +9 -0
- data/lib/rex/service.rb +48 -0
- data/lib/rex/service_manager.rb +141 -0
- data/lib/rex/service_manager.rb.ut.rb +32 -0
- data/lib/rex/services/local_relay.rb +423 -0
- data/lib/rex/socket.rb +684 -0
- data/lib/rex/socket.rb.ut.rb +107 -0
- data/lib/rex/socket/comm.rb +119 -0
- data/lib/rex/socket/comm/local.rb +412 -0
- data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
- data/lib/rex/socket/ip.rb +130 -0
- data/lib/rex/socket/parameters.rb +345 -0
- data/lib/rex/socket/parameters.rb.ut.rb +51 -0
- data/lib/rex/socket/range_walker.rb +346 -0
- data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
- data/lib/rex/socket/ssl_tcp.rb +184 -0
- data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
- data/lib/rex/socket/ssl_tcp_server.rb +122 -0
- data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +61 -0
- data/lib/rex/socket/subnet_walker.rb +75 -0
- data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
- data/lib/rex/socket/switch_board.rb +278 -0
- data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
- data/lib/rex/socket/tcp.rb +76 -0
- data/lib/rex/socket/tcp.rb.ut.rb +64 -0
- data/lib/rex/socket/tcp_server.rb +66 -0
- data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
- data/lib/rex/socket/udp.rb +164 -0
- data/lib/rex/socket/udp.rb.ut.rb +44 -0
- data/lib/rex/struct2.rb +5 -0
- data/lib/rex/struct2/c_struct.rb +181 -0
- data/lib/rex/struct2/c_struct_template.rb +39 -0
- data/lib/rex/struct2/constant.rb +26 -0
- data/lib/rex/struct2/element.rb +44 -0
- data/lib/rex/struct2/generic.rb +73 -0
- data/lib/rex/struct2/restraint.rb +54 -0
- data/lib/rex/struct2/s_string.rb +72 -0
- data/lib/rex/struct2/s_struct.rb +111 -0
- data/lib/rex/sync.rb +6 -0
- data/lib/rex/sync/event.rb +94 -0
- data/lib/rex/sync/read_write_lock.rb +176 -0
- data/lib/rex/sync/ref.rb +57 -0
- data/lib/rex/sync/thread_safe.rb +82 -0
- data/lib/rex/test.rb +35 -0
- data/lib/rex/text.rb +1163 -0
- data/lib/rex/text.rb.ut.rb +190 -0
- data/lib/rex/thread_factory.rb +42 -0
- data/lib/rex/time.rb +65 -0
- data/lib/rex/transformer.rb +115 -0
- data/lib/rex/transformer.rb.ut.rb +38 -0
- data/lib/rex/ui.rb +21 -0
- data/lib/rex/ui/interactive.rb +298 -0
- data/lib/rex/ui/output.rb +78 -0
- data/lib/rex/ui/output/none.rb +18 -0
- data/lib/rex/ui/progress_tracker.rb +96 -0
- data/lib/rex/ui/subscriber.rb +149 -0
- data/lib/rex/ui/text/color.rb +97 -0
- data/lib/rex/ui/text/color.rb.ut.rb +18 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +467 -0
- data/lib/rex/ui/text/input.rb +117 -0
- data/lib/rex/ui/text/input/buffer.rb +75 -0
- data/lib/rex/ui/text/input/readline.rb +129 -0
- data/lib/rex/ui/text/input/socket.rb +95 -0
- data/lib/rex/ui/text/input/stdio.rb +45 -0
- data/lib/rex/ui/text/irb_shell.rb +57 -0
- data/lib/rex/ui/text/output.rb +80 -0
- data/lib/rex/ui/text/output/buffer.rb +61 -0
- data/lib/rex/ui/text/output/file.rb +43 -0
- data/lib/rex/ui/text/output/socket.rb +43 -0
- data/lib/rex/ui/text/output/stdio.rb +40 -0
- data/lib/rex/ui/text/progress_tracker.rb +56 -0
- data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
- data/lib/rex/ui/text/shell.rb +328 -0
- data/lib/rex/ui/text/table.rb +279 -0
- data/lib/rex/ui/text/table.rb.ut.rb +55 -0
- data/lib/rex/zip.rb +93 -0
- data/lib/rex/zip/archive.rb +184 -0
- data/lib/rex/zip/blocks.rb +182 -0
- data/lib/rex/zip/entry.rb +104 -0
- data/lib/rex/zip/samples/comment.rb +32 -0
- data/lib/rex/zip/samples/mkwar.rb +138 -0
- data/lib/rex/zip/samples/mkzip.rb +19 -0
- data/lib/rex/zip/samples/recursive.rb +58 -0
- metadata +434 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
4
|
+
|
|
5
|
+
require 'test/unit'
|
|
6
|
+
require 'rex/proto/http'
|
|
7
|
+
|
|
8
|
+
class Rex::Proto::Http::Packet::Header::UnitTest < Test::Unit::TestCase
|
|
9
|
+
|
|
10
|
+
Klass = Rex::Proto::Http::Packet::Header
|
|
11
|
+
|
|
12
|
+
def test_to_s
|
|
13
|
+
h = Klass.new
|
|
14
|
+
|
|
15
|
+
h['Foo'] = 'Fishing'
|
|
16
|
+
h['Chicken'] = 47
|
|
17
|
+
|
|
18
|
+
assert_equal(
|
|
19
|
+
"Foo: Fishing\r\n" +
|
|
20
|
+
"Chicken: 47\r\n\r\n", h.to_s)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_from_s
|
|
24
|
+
h = Klass.new
|
|
25
|
+
|
|
26
|
+
h.from_s(
|
|
27
|
+
"POST /foo HTTP/1.0\r\n" +
|
|
28
|
+
"Lucifer: Beast\r\n" +
|
|
29
|
+
"HoHo: Satan\r\n" +
|
|
30
|
+
"Eat: Babies\r\n" +
|
|
31
|
+
"\r\n")
|
|
32
|
+
|
|
33
|
+
assert_equal('Babies', h['Eat'], 'header')
|
|
34
|
+
assert_equal('Satan', h['HoHo'], 'header')
|
|
35
|
+
assert_equal('Satan', h['hOhO'], 'header')
|
|
36
|
+
|
|
37
|
+
assert_equal("POST /foo HTTP/1.0\r\n", h.cmd_string, 'cmd_string')
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_just_cmdstring
|
|
41
|
+
h = Klass.new
|
|
42
|
+
|
|
43
|
+
h.from_s("POST /foo HTTP/1.0")
|
|
44
|
+
assert_equal("POST /foo HTTP/1.0\r\n", h.cmd_string, 'just cmd_string')
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
require 'rex/proto/http'
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Proto
|
|
5
|
+
module Http
|
|
6
|
+
|
|
7
|
+
DefaultProtocol = '1.1'
|
|
8
|
+
|
|
9
|
+
###
|
|
10
|
+
#
|
|
11
|
+
# This class represents an HTTP packet.
|
|
12
|
+
#
|
|
13
|
+
###
|
|
14
|
+
class Packet
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# Parser processing codes
|
|
18
|
+
#
|
|
19
|
+
module ParseCode
|
|
20
|
+
Completed = 1
|
|
21
|
+
Partial = 2
|
|
22
|
+
Error = 3
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Parser states
|
|
27
|
+
#
|
|
28
|
+
module ParseState
|
|
29
|
+
ProcessingHeader = 1
|
|
30
|
+
ProcessingBody = 2
|
|
31
|
+
Completed = 3
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
require 'rex/proto/http/header'
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# Initializes an instance of an HTTP packet.
|
|
38
|
+
#
|
|
39
|
+
def initialize()
|
|
40
|
+
self.headers = Header.new
|
|
41
|
+
self.auto_cl = true
|
|
42
|
+
|
|
43
|
+
reset
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# Return the associated header value, if any.
|
|
48
|
+
#
|
|
49
|
+
def [](key)
|
|
50
|
+
if (self.headers.include?(key))
|
|
51
|
+
return self.headers[key]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
self.headers.each_pair do |k,v|
|
|
55
|
+
if (k.downcase == key.downcase)
|
|
56
|
+
return v
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
return nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Set the associated header value.
|
|
65
|
+
#
|
|
66
|
+
def []=(key, value)
|
|
67
|
+
self.headers[key] = value
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# Parses the supplied buffer. Returns one of the two parser processing
|
|
72
|
+
# codes (Completed, Partial, or Error).
|
|
73
|
+
#
|
|
74
|
+
def parse(buf)
|
|
75
|
+
|
|
76
|
+
# Append the incoming buffer to the buffer queue.
|
|
77
|
+
self.bufq += buf.to_s
|
|
78
|
+
|
|
79
|
+
begin
|
|
80
|
+
|
|
81
|
+
# Process the header
|
|
82
|
+
if(self.state == ParseState::ProcessingHeader)
|
|
83
|
+
parse_header
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Continue on to the body if the header was processed
|
|
87
|
+
if(self.state == ParseState::ProcessingBody)
|
|
88
|
+
# Chunked encoding sets the parsing state on its own
|
|
89
|
+
if (self.body_bytes_left == 0 and not self.transfer_chunked)
|
|
90
|
+
self.state = ParseState::Completed
|
|
91
|
+
else
|
|
92
|
+
parse_body
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
rescue
|
|
96
|
+
# XXX: BUG: This rescue might be a problem because it will swallow TimeoutError
|
|
97
|
+
self.error = $!
|
|
98
|
+
return ParseCode::Error
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Return completed or partial to the parsing status to the caller
|
|
102
|
+
(self.state == ParseState::Completed) ? ParseCode::Completed : ParseCode::Partial
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
#
|
|
106
|
+
# Reset the parsing state and buffers.
|
|
107
|
+
#
|
|
108
|
+
def reset
|
|
109
|
+
self.state = ParseState::ProcessingHeader
|
|
110
|
+
self.transfer_chunked = false
|
|
111
|
+
self.inside_chunk = false
|
|
112
|
+
self.headers.reset
|
|
113
|
+
self.bufq = ''
|
|
114
|
+
self.body = ''
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
#
|
|
118
|
+
# Reset the parsing state but leave the buffers.
|
|
119
|
+
#
|
|
120
|
+
def reset_except_queue
|
|
121
|
+
self.state = ParseState::ProcessingHeader
|
|
122
|
+
self.transfer_chunked = false
|
|
123
|
+
self.inside_chunk = false
|
|
124
|
+
self.headers.reset
|
|
125
|
+
self.body = ''
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
#
|
|
129
|
+
# Returns whether or not parsing has completed.
|
|
130
|
+
#
|
|
131
|
+
def completed?
|
|
132
|
+
|
|
133
|
+
return true if self.state == ParseState::Completed
|
|
134
|
+
|
|
135
|
+
# If the parser state is processing the body and there are an
|
|
136
|
+
# undetermined number of bytes left to read, we just need to say that
|
|
137
|
+
# things are completed as it's hard to tell whether or not they really
|
|
138
|
+
# are.
|
|
139
|
+
if (self.state == ParseState::ProcessingBody and self.body_bytes_left < 0)
|
|
140
|
+
return true
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
false
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
#
|
|
147
|
+
# Build a 'Transfer-Encoding: chunked' payload with random chunk sizes
|
|
148
|
+
#
|
|
149
|
+
def chunk(str, min_size = 1, max_size = 1000)
|
|
150
|
+
chunked = ''
|
|
151
|
+
|
|
152
|
+
# min chunk size is 1 byte
|
|
153
|
+
if (min_size < 1); min_size = 1; end
|
|
154
|
+
|
|
155
|
+
# don't be dumb
|
|
156
|
+
if (max_size < min_size); max_size = min_size; end
|
|
157
|
+
|
|
158
|
+
while (str.size > 0)
|
|
159
|
+
chunk = str.slice!(0, rand(max_size - min_size) + min_size)
|
|
160
|
+
chunked += sprintf("%x", chunk.size) + "\r\n" + chunk + "\r\n"
|
|
161
|
+
end
|
|
162
|
+
chunked += "0\r\n\r\n"
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
#
|
|
166
|
+
# Converts the packet to a string.
|
|
167
|
+
#
|
|
168
|
+
def to_s
|
|
169
|
+
content = self.body.dup
|
|
170
|
+
|
|
171
|
+
# Update the content length field in the header with the body length.
|
|
172
|
+
if (content)
|
|
173
|
+
if !self.compress.nil?
|
|
174
|
+
case self.compress
|
|
175
|
+
when 'gzip'
|
|
176
|
+
self.headers['Content-Encoding'] = 'gzip'
|
|
177
|
+
content = Rex::Text.gzip(content)
|
|
178
|
+
when 'deflate'
|
|
179
|
+
self.headers['Content-Encoding'] = 'deflate'
|
|
180
|
+
content = Rex::Text.zlib_deflate(content)
|
|
181
|
+
when 'none'
|
|
182
|
+
# this one is fine...
|
|
183
|
+
# when 'compress'
|
|
184
|
+
else
|
|
185
|
+
raise RuntimeError, 'Invalid Content-Encoding'
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
if (self.auto_cl == true && self.transfer_chunked == true)
|
|
190
|
+
raise RuntimeError, "'Content-Length' and 'Transfer-Encoding: chunked' are incompatible"
|
|
191
|
+
elsif self.auto_cl == true
|
|
192
|
+
self.headers['Content-Length'] = content.length
|
|
193
|
+
elsif self.transfer_chunked == true
|
|
194
|
+
if self.proto != '1.1'
|
|
195
|
+
raise RuntimeError, 'Chunked encoding is only available via 1.1'
|
|
196
|
+
end
|
|
197
|
+
self.headers['Transfer-Encoding'] = 'chunked'
|
|
198
|
+
content = self.chunk(content, self.chunk_min_size, self.chunk_max_size)
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
str = self.headers.to_s(cmd_string)
|
|
203
|
+
str += content || ''
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
#
|
|
207
|
+
# Converts the packet from a string.
|
|
208
|
+
#
|
|
209
|
+
def from_s(str)
|
|
210
|
+
reset
|
|
211
|
+
parse(str)
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
#
|
|
215
|
+
# Returns the command string, such as:
|
|
216
|
+
#
|
|
217
|
+
# HTTP/1.0 200 OK for a response
|
|
218
|
+
#
|
|
219
|
+
# or
|
|
220
|
+
#
|
|
221
|
+
# GET /foo HTTP/1.0 for a request
|
|
222
|
+
#
|
|
223
|
+
def cmd_string
|
|
224
|
+
self.headers.cmd_string
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
attr_accessor :headers
|
|
228
|
+
attr_accessor :error
|
|
229
|
+
attr_accessor :state
|
|
230
|
+
attr_accessor :bufq
|
|
231
|
+
attr_accessor :body
|
|
232
|
+
attr_accessor :auto_cl
|
|
233
|
+
attr_accessor :max_data
|
|
234
|
+
attr_accessor :transfer_chunked
|
|
235
|
+
attr_accessor :compress
|
|
236
|
+
attr_reader :incomplete
|
|
237
|
+
|
|
238
|
+
attr_accessor :chunk_min_size
|
|
239
|
+
attr_accessor :chunk_max_size
|
|
240
|
+
|
|
241
|
+
protected
|
|
242
|
+
|
|
243
|
+
attr_writer :incomplete
|
|
244
|
+
attr_accessor :body_bytes_left
|
|
245
|
+
attr_accessor :inside_chunk
|
|
246
|
+
attr_accessor :keepalive
|
|
247
|
+
|
|
248
|
+
##
|
|
249
|
+
#
|
|
250
|
+
# Overridable methods
|
|
251
|
+
#
|
|
252
|
+
##
|
|
253
|
+
|
|
254
|
+
#
|
|
255
|
+
# Allows derived classes to split apart the command string.
|
|
256
|
+
#
|
|
257
|
+
def update_cmd_parts(str)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
##
|
|
261
|
+
#
|
|
262
|
+
# Parsing
|
|
263
|
+
#
|
|
264
|
+
##
|
|
265
|
+
|
|
266
|
+
def parse_header
|
|
267
|
+
|
|
268
|
+
head,data = self.bufq.split(/\r?\n\r?\n/, 2)
|
|
269
|
+
|
|
270
|
+
return if not data
|
|
271
|
+
|
|
272
|
+
self.headers.from_s(head)
|
|
273
|
+
self.bufq = data || ""
|
|
274
|
+
|
|
275
|
+
# Set the content-length to -1 as a placeholder (read until EOF)
|
|
276
|
+
self.body_bytes_left = -1
|
|
277
|
+
|
|
278
|
+
# Extract the content length if it was specified
|
|
279
|
+
if (self.headers['Content-Length'])
|
|
280
|
+
self.body_bytes_left = self.headers['Content-Length'].to_i
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
# Look for a chunked transfer header
|
|
284
|
+
if (self.headers['Transfer-Encoding'].to_s.downcase == 'chunked')
|
|
285
|
+
self.transfer_chunked = true
|
|
286
|
+
self.auto_cl = false
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Determine how to handle data when there is no length header
|
|
290
|
+
if (self.body_bytes_left == -1)
|
|
291
|
+
if (not self.transfer_chunked)
|
|
292
|
+
if (self.headers['Connection'].to_s.downcase.include?('keep-alive'))
|
|
293
|
+
# If we are using keep-alive, but have no content-length and
|
|
294
|
+
# no chunked transfer header, pretend this is the entire
|
|
295
|
+
# buffer and call it done
|
|
296
|
+
self.body_bytes_left = self.bufq.length
|
|
297
|
+
elsif (not self.headers['Content-Length'] and self.class == Rex::Proto::Http::Request)
|
|
298
|
+
# RFC 2616 says: "The presence of a message-body in a request
|
|
299
|
+
# is signaled by the inclusion of a Content-Length or
|
|
300
|
+
# Transfer-Encoding header field in the request's
|
|
301
|
+
# message-headers."
|
|
302
|
+
#
|
|
303
|
+
# So if we haven't seen either a Content-Length or a
|
|
304
|
+
# Transfer-Encoding header, there shouldn't be a message body.
|
|
305
|
+
self.body_bytes_left = 0
|
|
306
|
+
#else
|
|
307
|
+
# Otherwise we need to keep reading until EOF
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# Throw an error if we didnt parse the header properly
|
|
313
|
+
if !self.headers.cmd_string
|
|
314
|
+
raise RuntimeError, "Invalid command string", caller
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
# Move the state into body processing
|
|
318
|
+
self.state = ParseState::ProcessingBody
|
|
319
|
+
|
|
320
|
+
# Allow derived classes to update the parts of the command string
|
|
321
|
+
self.update_cmd_parts(self.headers.cmd_string)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
#
|
|
325
|
+
# Parses the body portion of the request.
|
|
326
|
+
#
|
|
327
|
+
def parse_body
|
|
328
|
+
# Just return if the buffer is empty
|
|
329
|
+
if (self.bufq.length == 0)
|
|
330
|
+
return
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
# Handle chunked transfer-encoding responses
|
|
334
|
+
if (self.transfer_chunked and self.inside_chunk != 1 and self.bufq.length)
|
|
335
|
+
|
|
336
|
+
# Remove any leading newlines or spaces
|
|
337
|
+
self.bufq.lstrip!
|
|
338
|
+
|
|
339
|
+
# If we didn't get a newline, then this might not be the full
|
|
340
|
+
# length, go back and get more.
|
|
341
|
+
# e.g.
|
|
342
|
+
# first packet: "200"
|
|
343
|
+
# second packet: "0\r\n\r\n<html>..."
|
|
344
|
+
if not bufq.index("\n")
|
|
345
|
+
return
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
# Extract the actual hexadecimal length value
|
|
349
|
+
clen = self.bufq.slice!(/^[a-fA-F0-9]+\r?\n/)
|
|
350
|
+
|
|
351
|
+
clen.rstrip! if (clen)
|
|
352
|
+
|
|
353
|
+
# if we happen to fall upon the end of the buffer for the next chunk len and have no data left, go get some more...
|
|
354
|
+
if clen.nil? and self.bufq.length == 0
|
|
355
|
+
return
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
# Invalid chunk length, exit out early
|
|
359
|
+
if clen.nil?
|
|
360
|
+
self.state = ParseState::Completed
|
|
361
|
+
return
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
self.body_bytes_left = clen.to_i(16)
|
|
365
|
+
|
|
366
|
+
if (self.body_bytes_left == 0)
|
|
367
|
+
self.bufq.sub!(/^\r?\n/s,'')
|
|
368
|
+
self.state = ParseState::Completed
|
|
369
|
+
return
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
self.inside_chunk = 1
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
# If there are bytes remaining, slice as many as we can and append them
|
|
376
|
+
# to our body state.
|
|
377
|
+
if (self.body_bytes_left > 0)
|
|
378
|
+
part = self.bufq.slice!(0, self.body_bytes_left)
|
|
379
|
+
self.body += part
|
|
380
|
+
self.body_bytes_left -= part.length
|
|
381
|
+
# Otherwise, just read it all.
|
|
382
|
+
else
|
|
383
|
+
self.body += self.bufq
|
|
384
|
+
self.bufq = ''
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
# Finish this chunk and move on to the next one
|
|
388
|
+
if (self.transfer_chunked and self.body_bytes_left == 0)
|
|
389
|
+
self.inside_chunk = 0
|
|
390
|
+
self.parse_body
|
|
391
|
+
return
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
# If there are no more bytes left, then parsing has completed and we're
|
|
395
|
+
# ready to go.
|
|
396
|
+
if (not self.transfer_chunked and self.body_bytes_left == 0)
|
|
397
|
+
self.state = ParseState::Completed
|
|
398
|
+
return
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
|