librex 0.0.68 → 0.0.70

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.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -1,4 +1,5 @@
1
1
  # -*- coding: binary -*-
2
+ require 'uri'
2
3
  require 'rex/proto/http'
3
4
 
4
5
  module Rex
@@ -12,78 +13,137 @@ module Http
12
13
  ###
13
14
  class Response < Packet
14
15
 
15
- ##
16
- #
17
- # Builtin response class wrappers.
18
- #
19
- ##
20
-
21
- #
22
- # HTTP 200/OK response class wrapper.
23
- #
24
- class OK < Response
25
- def initialize(message = 'OK', proto = DefaultProtocol)
26
- super(200, message, proto)
27
- end
28
- end
29
-
30
- #
31
- # HTTP 404/File not found response class wrapper.
32
- #
33
- class E404 < Response
34
- def initialize(message = 'File not found', proto = DefaultProtocol)
35
- super(404, message, proto)
36
- end
37
- end
38
-
39
- #
40
- # Constructage of the HTTP response with the supplied code, message, and
41
- # protocol.
42
- #
43
- def initialize(code = 200, message = 'OK', proto = DefaultProtocol)
44
- super()
45
-
46
- self.code = code.to_i
47
- self.message = message
48
- self.proto = proto
49
-
50
- # Default responses to auto content length on
51
- self.auto_cl = true
52
-
53
- # default chunk sizes (if chunked is used)
54
- self.chunk_min_size = 1
55
- self.chunk_max_size = 10
56
- end
57
-
58
- #
59
- # Updates the various parts of the HTTP response command string.
60
- #
61
- def update_cmd_parts(str)
62
- if (md = str.match(/HTTP\/(.+?)\s+(\d+)\s?(.+?)\r?\n?$/))
63
- self.message = md[3].gsub(/\r/, '')
64
- self.code = md[2].to_i
65
- self.proto = md[1]
66
- else
67
- raise RuntimeError, "Invalid response command string", caller
68
- end
69
- end
70
-
71
- #
72
- # Returns the response based command string.
73
- #
74
- def cmd_string
75
- "HTTP\/#{proto} #{code}#{(message and message.length > 0) ? ' ' + message : ''}\r\n"
76
- end
77
-
78
- #
79
- # Used to store a copy of the original request
80
- #
81
- attr_accessor :request
82
-
83
-
84
- attr_accessor :code
85
- attr_accessor :message
86
- attr_accessor :proto
16
+ ##
17
+ #
18
+ # Builtin response class wrappers.
19
+ #
20
+ ##
21
+
22
+ #
23
+ # HTTP 200/OK response class wrapper.
24
+ #
25
+ class OK < Response
26
+ def initialize(message = 'OK', proto = DefaultProtocol)
27
+ super(200, message, proto)
28
+ end
29
+ end
30
+
31
+ #
32
+ # HTTP 404/File not found response class wrapper.
33
+ #
34
+ class E404 < Response
35
+ def initialize(message = 'File not found', proto = DefaultProtocol)
36
+ super(404, message, proto)
37
+ end
38
+ end
39
+
40
+ #
41
+ # Constructage of the HTTP response with the supplied code, message, and
42
+ # protocol.
43
+ #
44
+ def initialize(code = 200, message = 'OK', proto = DefaultProtocol)
45
+ super()
46
+
47
+ self.code = code.to_i
48
+ self.message = message
49
+ self.proto = proto
50
+
51
+ # Default responses to auto content length on
52
+ self.auto_cl = true
53
+
54
+ # default chunk sizes (if chunked is used)
55
+ self.chunk_min_size = 1
56
+ self.chunk_max_size = 10
57
+
58
+ # 100 continue counter
59
+ self.count_100 = 0
60
+ end
61
+
62
+ #
63
+ # Gets cookies from the Set-Cookie header in a format to be used
64
+ # in the 'cookie' send_request field
65
+ #
66
+ def get_cookies
67
+ cookies = ""
68
+ if (self.headers.include?('Set-Cookie'))
69
+ set_cookies = self.headers['Set-Cookie']
70
+ key_vals = set_cookies.scan(/\s?([^, ;]+?)=([^, ;]*?)[;,]/)
71
+ key_vals.each do |k, v|
72
+ # Dont downcase actual cookie name as may be case sensitive
73
+ name = k.downcase
74
+ next if name == 'path'
75
+ next if name == 'expires'
76
+ next if name == 'domain'
77
+ next if name == 'max-age'
78
+ cookies << "#{k}=#{v}; "
79
+ end
80
+ end
81
+
82
+ return cookies.strip
83
+ end
84
+
85
+ #
86
+ # Updates the various parts of the HTTP response command string.
87
+ #
88
+ def update_cmd_parts(str)
89
+ if (md = str.match(/HTTP\/(.+?)\s+(\d+)\s?(.+?)\r?\n?$/))
90
+ self.message = md[3].gsub(/\r/, '')
91
+ self.code = md[2].to_i
92
+ self.proto = md[1]
93
+ else
94
+ raise RuntimeError, "Invalid response command string", caller
95
+ end
96
+
97
+ check_100()
98
+ end
99
+
100
+ #
101
+ # Allow 100 Continues to be ignored by the caller
102
+ #
103
+ def check_100
104
+ # If this was a 100 continue with no data, reset
105
+ if self.code == 100 and (self.body_bytes_left == -1 or self.body_bytes_left == 0) and self.count_100 < 5
106
+ self.reset_except_queue
107
+ self.count_100 += 1
108
+ end
109
+ end
110
+
111
+ # Answers if the response is a redirection one.
112
+ #
113
+ # @return [Boolean] true if the response is a redirection, false otherwise.
114
+ def redirect?
115
+ [301, 302, 303, 307, 308].include?(code)
116
+ end
117
+
118
+ # Provides the uri of the redirection location.
119
+ #
120
+ # @return [URI] the uri of the redirection location.
121
+ # @return [nil] if the response hasn't a Location header or it isn't a valid uri.
122
+ def redirection
123
+ begin
124
+ URI(headers['Location'])
125
+ rescue ::URI::InvalidURIError
126
+ nil
127
+ end
128
+ end
129
+
130
+ #
131
+ # Returns the response based command string.
132
+ #
133
+ def cmd_string
134
+ "HTTP\/#{proto} #{code}#{(message and message.length > 0) ? ' ' + message : ''}\r\n"
135
+ end
136
+
137
+ #
138
+ # Used to store a copy of the original request
139
+ #
140
+ attr_accessor :request
141
+
142
+
143
+ attr_accessor :code
144
+ attr_accessor :message
145
+ attr_accessor :proto
146
+ attr_accessor :count_100
87
147
  end
88
148
 
89
149
  end
@@ -14,49 +14,49 @@ module Http
14
14
  ###
15
15
  module ServerClient
16
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
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
60
 
61
61
  end
62
62
 
@@ -68,304 +68,314 @@ end
68
68
  ###
69
69
  class Server
70
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)
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
-
111
- self.listener = nil
112
- self.resources = {}
113
- self.server_name = DefaultServer
114
- end
115
-
116
- #
117
- # Returns the hardcore alias for the HTTP service
118
- #
119
- def self.hardcore_alias(*args)
120
- "#{(args[0] || '')}#{(args[1] || '')}"
121
- end
122
-
123
- #
124
- # HTTP server.
125
- #
126
- def alias
127
- super || "HTTP Server"
128
- end
129
-
130
- #
131
- # Listens on the defined port and host and starts monitoring for clients.
132
- #
133
- def start
134
-
135
- self.listener = Rex::Socket::TcpServer.create(
136
- 'LocalHost' => self.listen_host,
137
- 'LocalPort' => self.listen_port,
138
- 'Context' => self.context,
139
- 'SSL' => self.ssl,
140
- 'SSLCert' => self.ssl_cert,
141
- 'Comm' => self.comm
142
- )
143
-
144
- # Register callbacks
145
- self.listener.on_client_connect_proc = Proc.new { |cli|
146
- on_client_connect(cli)
147
- }
148
- self.listener.on_client_data_proc = Proc.new { |cli|
149
- on_client_data(cli)
150
- }
151
-
152
- self.listener.start
153
- end
154
-
155
- #
156
- # Terminates the monitor thread and turns off the listener.
157
- #
158
- def stop
159
- self.listener.stop
160
- self.listener.close
161
- end
162
-
163
-
164
- #
165
- # Waits for the HTTP service to terminate
166
- #
167
- def wait
168
- self.listener.wait if self.listener
169
- end
170
-
171
- #
172
- # Closes the supplied client, if valid.
173
- #
174
- def close_client(cli)
175
- listener.close_client(cli)
176
- end
177
-
178
- #
179
- # Mounts a directory or resource as being serviced by the supplied handler.
180
- #
181
- def mount(root, handler, long_call = false, *args)
182
- resources[root] = [ handler, long_call, args ]
183
- end
184
-
185
- #
186
- # Remove the mount point.
187
- #
188
- def unmount(root)
189
- resources.delete(root)
190
- end
191
-
192
- #
193
- # Adds a resource handler, such as one for /, which will be called whenever
194
- # the resource is requested. The ``opts'' parameter can have any of the
195
- # following:
196
- #
197
- # Proc (proc) - The procedure to call when a request comes in for this resource.
198
- # LongCall (bool) - Hints to the server that this resource may have long
199
- # request processing times.
200
- #
201
- def add_resource(name, opts)
202
- if (resources[name])
203
- raise RuntimeError,
204
- "The supplied resource '#{name}' is already added.", caller
205
- end
206
-
207
- # If a procedure was passed, mount the resource with it.
208
- if (opts['Proc'])
209
- mount(name, Handler::Proc, false, opts['Proc'], opts['VirtualDirectory'])
210
- else
211
- raise ArgumentError, "You must specify a procedure."
212
- end
213
- end
214
-
215
- #
216
- # Removes the supplied resource handler.
217
- #
218
- def remove_resource(name)
219
- self.resources.delete(name)
220
- end
221
-
222
- #
223
- # Adds Server headers and stuff.
224
- #
225
- def add_response_headers(resp)
226
- resp['Server'] = self.server_name if not resp['Server']
227
- end
228
-
229
- #
230
- # Returns the mime type associated with the supplied file. Right now the
231
- # set of mime types is fairly limited.
232
- #
233
- def mime_type(file)
234
- type = nil
235
-
236
- if (file =~ /\.(.+?)$/)
237
- type = ExtensionMimeTypes[$1.downcase]
238
- end
239
-
240
- type || "text/plain"
241
- end
242
-
243
- #
244
- # Sends a 404 error to the client for a given request.
245
- #
246
- def send_e404(cli, request)
247
- resp = Response::E404.new
248
-
249
- resp['Content-Type'] = 'text/html'
250
-
251
- resp.body =
252
- "<html><head>" +
253
- "<title>404 Not Found</title>" +
254
- "</head><body>" +
255
- "<h1>Not found</h1>" +
256
- "The requested URL #{html_escape(request.resource)} was not found on this server.<p><hr>" +
257
- "</body></html>"
258
-
259
- # Send the response to the client like what
260
- cli.send_response(resp)
261
- end
262
-
263
- attr_accessor :listen_port, :listen_host, :server_name, :context, :ssl, :comm, :ssl_cert
264
- attr_accessor :listener, :resources
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
265
275
 
266
276
  protected
267
277
 
268
- #
269
- # Extends new clients with the ServerClient module and initializes them.
270
- #
271
- def on_client_connect(cli)
272
- cli.extend(ServerClient)
273
-
274
- cli.init_cli(self)
275
- end
276
-
277
- #
278
- # Processes data coming in from a client.
279
- #
280
- def on_client_data(cli)
281
- begin
282
- data = cli.read(65535)
283
-
284
- raise ::EOFError if not data
285
- raise ::EOFError if data.empty?
286
-
287
- case cli.request.parse(data)
288
- when Packet::ParseCode::Completed
289
- dispatch_request(cli, cli.request)
290
- cli.reset_cli
291
-
292
- when Packet::ParseCode::Partial
293
- # Return and wait for the on_client_data handler to be called again
294
- # The Request object tracks the state of the request for us
295
- return
296
-
297
- when Packet::ParseCode::Error
298
- close_client(cli)
299
- end
300
- rescue EOFError
301
- if (cli.request.completed?)
302
- dispatch_request(cli, cli.request)
303
-
304
- cli.reset_cli
305
- end
306
-
307
- close_client(cli)
308
- end
309
- end
310
-
311
- #
312
- # Dispatches the supplied request for a given connection.
313
- #
314
- def dispatch_request(cli, request)
315
- # Is the client requesting keep-alive?
316
- if ((request['Connection']) and
317
- (request['Connection'].downcase == 'Keep-Alive'.downcase))
318
- cli.keepalive = true
319
- end
320
-
321
- # Search for the resource handler for the requested URL. This is pretty
322
- # inefficient right now, but we can spruce it up later.
323
- p = nil
324
- len = 0
325
- root = nil
326
-
327
- resources.each_pair { |k, val|
328
- if (request.resource =~ /^#{k}/ and k.length > len)
329
- p = val
330
- len = k.length
331
- root = k
332
- end
333
- }
334
-
335
- if (p)
336
- # Create an instance of the handler for this resource
337
- handler = p[0].new(self, *p[2])
338
-
339
- # If the handler class requires a relative resource...
340
- if (handler.relative_resource_required?)
341
- # Substituted the mount point root in the request to make things
342
- # relative to the mount point.
343
- request.relative_resource = request.resource.gsub(/^#{root}/, '')
344
- request.relative_resource = '/' + request.relative_resource if (request.relative_resource !~ /^\//)
345
- end
346
-
347
-
348
- # If we found the resource handler for this resource, call its
349
- # procedure.
350
- if (p[1] == true)
351
- Rex::ThreadFactory.spawn("HTTPServerRequestHandler", false) {
352
- handler.on_request(cli, request)
353
- }
354
- else
355
- handler.on_request(cli, request)
356
- end
357
- else
358
- elog("Failed to find handler for resource: #{request.resource}",
359
- LogSource)
360
-
361
- send_e404(cli, request)
362
- end
363
-
364
- # If keep-alive isn't enabled for this client, close the connection
365
- if (cli.keepalive == false)
366
- close_client(cli)
367
- end
368
- end
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
369
379
 
370
380
  end
371
381