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.
Files changed (435) hide show
  1. data/Rakefile +1 -0
  2. data/lib/rex/LICENSE +29 -0
  3. data/lib/rex/arch.rb +103 -0
  4. data/lib/rex/arch/sparc.rb +75 -0
  5. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  6. data/lib/rex/arch/x86.rb +513 -0
  7. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  8. data/lib/rex/assembly/nasm.rb +104 -0
  9. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +311 -0
  12. data/lib/rex/constants.rb +113 -0
  13. data/lib/rex/elfparsey.rb +11 -0
  14. data/lib/rex/elfparsey/elf.rb +123 -0
  15. data/lib/rex/elfparsey/elfbase.rb +258 -0
  16. data/lib/rex/elfparsey/exceptions.rb +27 -0
  17. data/lib/rex/elfscan.rb +12 -0
  18. data/lib/rex/elfscan/scanner.rb +207 -0
  19. data/lib/rex/elfscan/search.rb +46 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +114 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  26. data/lib/rex/encoder/ndr.rb +89 -0
  27. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +106 -0
  31. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  32. data/lib/rex/encoder/xor.rb +69 -0
  33. data/lib/rex/encoder/xor/dword.rb +13 -0
  34. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  35. data/lib/rex/encoders/xor_dword.rb +35 -0
  36. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  37. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  38. data/lib/rex/encoding/xor.rb +20 -0
  39. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  40. data/lib/rex/encoding/xor/byte.rb +15 -0
  41. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  42. data/lib/rex/encoding/xor/dword.rb +21 -0
  43. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  44. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  45. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  47. data/lib/rex/encoding/xor/generic.rb +146 -0
  48. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  49. data/lib/rex/encoding/xor/qword.rb +15 -0
  50. data/lib/rex/encoding/xor/word.rb +21 -0
  51. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  52. data/lib/rex/exceptions.rb +275 -0
  53. data/lib/rex/exceptions.rb.ut.rb +44 -0
  54. data/lib/rex/exploitation/cmdstager.rb +9 -0
  55. data/lib/rex/exploitation/cmdstager/base.rb +175 -0
  56. data/lib/rex/exploitation/cmdstager/debug_asm.rb +142 -0
  57. data/lib/rex/exploitation/cmdstager/debug_write.rb +136 -0
  58. data/lib/rex/exploitation/cmdstager/tftp.rb +63 -0
  59. data/lib/rex/exploitation/cmdstager/vbs.rb +128 -0
  60. data/lib/rex/exploitation/egghunter.rb +277 -0
  61. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  62. data/lib/rex/exploitation/encryptjs.rb +77 -0
  63. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  64. data/lib/rex/exploitation/heaplib.rb +94 -0
  65. data/lib/rex/exploitation/javascriptosdetect.rb +897 -0
  66. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  67. data/lib/rex/exploitation/omelet.rb +320 -0
  68. data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
  69. data/lib/rex/exploitation/opcodedb.rb +818 -0
  70. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  71. data/lib/rex/exploitation/seh.rb +92 -0
  72. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  73. data/lib/rex/file.rb +112 -0
  74. data/lib/rex/file.rb.ut.rb +16 -0
  75. data/lib/rex/image_source.rb +12 -0
  76. data/lib/rex/image_source/disk.rb +60 -0
  77. data/lib/rex/image_source/image_source.rb +46 -0
  78. data/lib/rex/image_source/memory.rb +37 -0
  79. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  80. data/lib/rex/io/datagram_abstraction.rb +35 -0
  81. data/lib/rex/io/ring_buffer.rb +364 -0
  82. data/lib/rex/io/stream.rb +319 -0
  83. data/lib/rex/io/stream_abstraction.rb +197 -0
  84. data/lib/rex/io/stream_server.rb +211 -0
  85. data/lib/rex/job_container.rb +187 -0
  86. data/lib/rex/logging.rb +4 -0
  87. data/lib/rex/logging/log_dispatcher.rb +179 -0
  88. data/lib/rex/logging/log_sink.rb +42 -0
  89. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  90. data/lib/rex/logging/sinks/stderr.rb +43 -0
  91. data/lib/rex/machparsey.rb +9 -0
  92. data/lib/rex/machparsey/exceptions.rb +34 -0
  93. data/lib/rex/machparsey/mach.rb +209 -0
  94. data/lib/rex/machparsey/machbase.rb +408 -0
  95. data/lib/rex/machscan.rb +9 -0
  96. data/lib/rex/machscan/scanner.rb +217 -0
  97. data/lib/rex/mime.rb +9 -0
  98. data/lib/rex/mime/header.rb +77 -0
  99. data/lib/rex/mime/message.rb +144 -0
  100. data/lib/rex/mime/part.rb +20 -0
  101. data/lib/rex/nop/opty2.rb +108 -0
  102. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  103. data/lib/rex/nop/opty2_tables.rb +300 -0
  104. data/lib/rex/ole.rb +205 -0
  105. data/lib/rex/ole/clsid.rb +47 -0
  106. data/lib/rex/ole/difat.rb +141 -0
  107. data/lib/rex/ole/directory.rb +231 -0
  108. data/lib/rex/ole/direntry.rb +240 -0
  109. data/lib/rex/ole/docs/dependencies.txt +8 -0
  110. data/lib/rex/ole/docs/references.txt +1 -0
  111. data/lib/rex/ole/fat.rb +99 -0
  112. data/lib/rex/ole/header.rb +204 -0
  113. data/lib/rex/ole/minifat.rb +77 -0
  114. data/lib/rex/ole/propset.rb +144 -0
  115. data/lib/rex/ole/samples/create_ole.rb +27 -0
  116. data/lib/rex/ole/samples/dir.rb +35 -0
  117. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  118. data/lib/rex/ole/samples/ole_info.rb +23 -0
  119. data/lib/rex/ole/storage.rb +395 -0
  120. data/lib/rex/ole/stream.rb +53 -0
  121. data/lib/rex/ole/substorage.rb +49 -0
  122. data/lib/rex/ole/util.rb +157 -0
  123. data/lib/rex/parser/arguments.rb +97 -0
  124. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  125. data/lib/rex/parser/ini.rb +185 -0
  126. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  127. data/lib/rex/parser/ip360_aspl_xml.rb +102 -0
  128. data/lib/rex/parser/ip360_xml.rb +97 -0
  129. data/lib/rex/parser/nessus_xml.rb +118 -0
  130. data/lib/rex/parser/netsparker_xml.rb +94 -0
  131. data/lib/rex/parser/nexpose_xml.rb +136 -0
  132. data/lib/rex/parser/nmap_xml.rb +137 -0
  133. data/lib/rex/parser/retina_xml.rb +109 -0
  134. data/lib/rex/payloads.rb +1 -0
  135. data/lib/rex/payloads/win32.rb +2 -0
  136. data/lib/rex/payloads/win32/common.rb +26 -0
  137. data/lib/rex/payloads/win32/kernel.rb +53 -0
  138. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  139. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  140. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  141. data/lib/rex/payloads/win32/kernel/stager.rb +194 -0
  142. data/lib/rex/peparsey.rb +12 -0
  143. data/lib/rex/peparsey/exceptions.rb +32 -0
  144. data/lib/rex/peparsey/pe.rb +212 -0
  145. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  146. data/lib/rex/peparsey/pebase.rb +1680 -0
  147. data/lib/rex/peparsey/section.rb +136 -0
  148. data/lib/rex/pescan.rb +13 -0
  149. data/lib/rex/pescan/analyze.rb +309 -0
  150. data/lib/rex/pescan/scanner.rb +206 -0
  151. data/lib/rex/pescan/search.rb +56 -0
  152. data/lib/rex/platforms.rb +1 -0
  153. data/lib/rex/platforms/windows.rb +51 -0
  154. data/lib/rex/poly.rb +132 -0
  155. data/lib/rex/poly/block.rb +477 -0
  156. data/lib/rex/poly/register.rb +100 -0
  157. data/lib/rex/poly/register/x86.rb +40 -0
  158. data/lib/rex/post.rb +8 -0
  159. data/lib/rex/post/dir.rb +51 -0
  160. data/lib/rex/post/file.rb +172 -0
  161. data/lib/rex/post/file_stat.rb +220 -0
  162. data/lib/rex/post/gen.pl +13 -0
  163. data/lib/rex/post/io.rb +182 -0
  164. data/lib/rex/post/meterpreter.rb +4 -0
  165. data/lib/rex/post/meterpreter/channel.rb +445 -0
  166. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  167. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  168. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  169. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  170. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  171. data/lib/rex/post/meterpreter/client.rb +364 -0
  172. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  173. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  174. data/lib/rex/post/meterpreter/extension.rb +32 -0
  175. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  176. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  177. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  178. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  179. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  180. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
  181. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  182. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  183. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +111 -0
  184. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  185. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +101 -0
  186. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +26 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +282 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +266 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  198. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +208 -0
  199. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +6 -0
  200. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38106 -0
  201. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +31 -0
  202. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +47 -0
  203. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +36 -0
  204. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1818 -0
  205. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
  206. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3848 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +26 -0
  208. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
  209. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
  212. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +318 -0
  213. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +100 -0
  214. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +42 -0
  215. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +148 -0
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +127 -0
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +309 -0
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +204 -0
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +51 -0
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +630 -0
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +75 -0
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +103 -0
  223. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +149 -0
  224. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  225. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +370 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +211 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +63 -0
  240. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  241. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  242. data/lib/rex/post/meterpreter/packet.rb +688 -0
  243. data/lib/rex/post/meterpreter/packet_dispatcher.rb +431 -0
  244. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  245. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  246. data/lib/rex/post/meterpreter/ui/console.rb +137 -0
  247. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  248. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +730 -0
  249. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  250. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  251. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +231 -0
  252. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  253. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  254. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  255. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  256. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  257. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +65 -0
  258. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +442 -0
  259. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +298 -0
  260. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +486 -0
  261. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  262. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +157 -0
  263. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  264. data/lib/rex/post/permission.rb +26 -0
  265. data/lib/rex/post/process.rb +57 -0
  266. data/lib/rex/post/thread.rb +57 -0
  267. data/lib/rex/post/ui.rb +52 -0
  268. data/lib/rex/proto.rb +13 -0
  269. data/lib/rex/proto.rb.ts.rb +8 -0
  270. data/lib/rex/proto/dcerpc.rb +6 -0
  271. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  272. data/lib/rex/proto/dcerpc/client.rb +361 -0
  273. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  274. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  275. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  276. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  277. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  278. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  279. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  280. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  281. data/lib/rex/proto/dcerpc/response.rb +187 -0
  282. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  283. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  284. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  285. data/lib/rex/proto/dhcp.rb +7 -0
  286. data/lib/rex/proto/dhcp/constants.rb +33 -0
  287. data/lib/rex/proto/dhcp/server.rb +292 -0
  288. data/lib/rex/proto/drda.rb +5 -0
  289. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  290. data/lib/rex/proto/drda/constants.rb +49 -0
  291. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  292. data/lib/rex/proto/drda/packet.rb +252 -0
  293. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  294. data/lib/rex/proto/drda/utils.rb +123 -0
  295. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  296. data/lib/rex/proto/http.rb +5 -0
  297. data/lib/rex/proto/http.rb.ts.rb +12 -0
  298. data/lib/rex/proto/http/client.rb +821 -0
  299. data/lib/rex/proto/http/client.rb.ut.rb +95 -0
  300. data/lib/rex/proto/http/handler.rb +46 -0
  301. data/lib/rex/proto/http/handler/erb.rb +128 -0
  302. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  303. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  304. data/lib/rex/proto/http/handler/proc.rb +60 -0
  305. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  306. data/lib/rex/proto/http/header.rb +161 -0
  307. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  308. data/lib/rex/proto/http/packet.rb +407 -0
  309. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  310. data/lib/rex/proto/http/request.rb +356 -0
  311. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  312. data/lib/rex/proto/http/response.rb +90 -0
  313. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  314. data/lib/rex/proto/http/server.rb +369 -0
  315. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  316. data/lib/rex/proto/ntlm.rb +7 -0
  317. data/lib/rex/proto/ntlm.rb.ut.rb +177 -0
  318. data/lib/rex/proto/ntlm/base.rb +326 -0
  319. data/lib/rex/proto/ntlm/constants.rb +74 -0
  320. data/lib/rex/proto/ntlm/crypt.rb +415 -0
  321. data/lib/rex/proto/ntlm/exceptions.rb +16 -0
  322. data/lib/rex/proto/ntlm/message.rb +536 -0
  323. data/lib/rex/proto/ntlm/utils.rb +764 -0
  324. data/lib/rex/proto/proxy/socks4a.rb +440 -0
  325. data/lib/rex/proto/rfb.rb +19 -0
  326. data/lib/rex/proto/rfb.rb.ut.rb +37 -0
  327. data/lib/rex/proto/rfb/cipher.rb +84 -0
  328. data/lib/rex/proto/rfb/client.rb +207 -0
  329. data/lib/rex/proto/rfb/constants.rb +52 -0
  330. data/lib/rex/proto/smb.rb +7 -0
  331. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  332. data/lib/rex/proto/smb/client.rb +1952 -0
  333. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  334. data/lib/rex/proto/smb/constants.rb +1047 -0
  335. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  336. data/lib/rex/proto/smb/crypt.rb +36 -0
  337. data/lib/rex/proto/smb/evasions.rb +66 -0
  338. data/lib/rex/proto/smb/exceptions.rb +858 -0
  339. data/lib/rex/proto/smb/simpleclient.rb +306 -0
  340. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  341. data/lib/rex/proto/smb/utils.rb +103 -0
  342. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  343. data/lib/rex/proto/sunrpc.rb +1 -0
  344. data/lib/rex/proto/sunrpc/client.rb +195 -0
  345. data/lib/rex/proto/tftp.rb +12 -0
  346. data/lib/rex/proto/tftp/constants.rb +39 -0
  347. data/lib/rex/proto/tftp/server.rb +497 -0
  348. data/lib/rex/proto/tftp/server.rb.ut.rb +28 -0
  349. data/lib/rex/script.rb +42 -0
  350. data/lib/rex/script/base.rb +59 -0
  351. data/lib/rex/script/meterpreter.rb +15 -0
  352. data/lib/rex/script/shell.rb +9 -0
  353. data/lib/rex/service.rb +48 -0
  354. data/lib/rex/service_manager.rb +141 -0
  355. data/lib/rex/service_manager.rb.ut.rb +32 -0
  356. data/lib/rex/services/local_relay.rb +423 -0
  357. data/lib/rex/socket.rb +684 -0
  358. data/lib/rex/socket.rb.ut.rb +107 -0
  359. data/lib/rex/socket/comm.rb +119 -0
  360. data/lib/rex/socket/comm/local.rb +412 -0
  361. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  362. data/lib/rex/socket/ip.rb +130 -0
  363. data/lib/rex/socket/parameters.rb +345 -0
  364. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  365. data/lib/rex/socket/range_walker.rb +346 -0
  366. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  367. data/lib/rex/socket/ssl_tcp.rb +184 -0
  368. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  369. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  370. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +61 -0
  371. data/lib/rex/socket/subnet_walker.rb +75 -0
  372. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  373. data/lib/rex/socket/switch_board.rb +278 -0
  374. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  375. data/lib/rex/socket/tcp.rb +76 -0
  376. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  377. data/lib/rex/socket/tcp_server.rb +66 -0
  378. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  379. data/lib/rex/socket/udp.rb +164 -0
  380. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  381. data/lib/rex/struct2.rb +5 -0
  382. data/lib/rex/struct2/c_struct.rb +181 -0
  383. data/lib/rex/struct2/c_struct_template.rb +39 -0
  384. data/lib/rex/struct2/constant.rb +26 -0
  385. data/lib/rex/struct2/element.rb +44 -0
  386. data/lib/rex/struct2/generic.rb +73 -0
  387. data/lib/rex/struct2/restraint.rb +54 -0
  388. data/lib/rex/struct2/s_string.rb +72 -0
  389. data/lib/rex/struct2/s_struct.rb +111 -0
  390. data/lib/rex/sync.rb +6 -0
  391. data/lib/rex/sync/event.rb +94 -0
  392. data/lib/rex/sync/read_write_lock.rb +176 -0
  393. data/lib/rex/sync/ref.rb +57 -0
  394. data/lib/rex/sync/thread_safe.rb +82 -0
  395. data/lib/rex/test.rb +35 -0
  396. data/lib/rex/text.rb +1163 -0
  397. data/lib/rex/text.rb.ut.rb +190 -0
  398. data/lib/rex/thread_factory.rb +42 -0
  399. data/lib/rex/time.rb +65 -0
  400. data/lib/rex/transformer.rb +115 -0
  401. data/lib/rex/transformer.rb.ut.rb +38 -0
  402. data/lib/rex/ui.rb +21 -0
  403. data/lib/rex/ui/interactive.rb +298 -0
  404. data/lib/rex/ui/output.rb +78 -0
  405. data/lib/rex/ui/output/none.rb +18 -0
  406. data/lib/rex/ui/progress_tracker.rb +96 -0
  407. data/lib/rex/ui/subscriber.rb +149 -0
  408. data/lib/rex/ui/text/color.rb +97 -0
  409. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  410. data/lib/rex/ui/text/dispatcher_shell.rb +467 -0
  411. data/lib/rex/ui/text/input.rb +117 -0
  412. data/lib/rex/ui/text/input/buffer.rb +75 -0
  413. data/lib/rex/ui/text/input/readline.rb +129 -0
  414. data/lib/rex/ui/text/input/socket.rb +95 -0
  415. data/lib/rex/ui/text/input/stdio.rb +45 -0
  416. data/lib/rex/ui/text/irb_shell.rb +57 -0
  417. data/lib/rex/ui/text/output.rb +80 -0
  418. data/lib/rex/ui/text/output/buffer.rb +61 -0
  419. data/lib/rex/ui/text/output/file.rb +43 -0
  420. data/lib/rex/ui/text/output/socket.rb +43 -0
  421. data/lib/rex/ui/text/output/stdio.rb +40 -0
  422. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  423. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  424. data/lib/rex/ui/text/shell.rb +328 -0
  425. data/lib/rex/ui/text/table.rb +279 -0
  426. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  427. data/lib/rex/zip.rb +93 -0
  428. data/lib/rex/zip/archive.rb +184 -0
  429. data/lib/rex/zip/blocks.rb +182 -0
  430. data/lib/rex/zip/entry.rb +104 -0
  431. data/lib/rex/zip/samples/comment.rb +32 -0
  432. data/lib/rex/zip/samples/mkwar.rb +138 -0
  433. data/lib/rex/zip/samples/mkzip.rb +19 -0
  434. data/lib/rex/zip/samples/recursive.rb +58 -0
  435. metadata +434 -1
@@ -0,0 +1,149 @@
1
+ module Rex
2
+ module Ui
3
+
4
+ ###
5
+ #
6
+ # This module provides a subscriber interface to input/output.
7
+ #
8
+ ###
9
+ module Subscriber
10
+
11
+ ##
12
+ #
13
+ # Subscribes to the output half of the user interface.
14
+ #
15
+ ##
16
+ module Output
17
+
18
+ #
19
+ # Wraps user_output.print_line
20
+ #
21
+ def print_line(msg='')
22
+ if (user_output)
23
+ print_blank_line if user_output.prompting?
24
+ user_output.print_line(msg)
25
+ end
26
+ end
27
+
28
+ #
29
+ # Wraps user_output.print_status
30
+ #
31
+ def print_status(msg='')
32
+ if (user_output)
33
+ print_blank_line if user_output.prompting?
34
+ user_output.print_status(msg)
35
+ end
36
+ end
37
+
38
+ #
39
+ # Wraps user_output.print_error
40
+ #
41
+ def print_error(msg='')
42
+ if (user_output)
43
+ print_blank_line if user_output.prompting?
44
+ user_output.print_error(msg)
45
+ end
46
+ end
47
+
48
+ #
49
+ # Wraps user_output.print_good
50
+ #
51
+ def print_good(msg='')
52
+ if (user_output)
53
+ print_blank_line if user_output.prompting?
54
+ user_output.print_good(msg)
55
+ end
56
+ end
57
+
58
+ #
59
+ # Wraps user_output.print_debug
60
+ #
61
+ def print_debug(msg='')
62
+ if (user_output)
63
+ print_blank_line if user_output.prompting?
64
+ user_output.print_debug(msg)
65
+ end
66
+ end
67
+
68
+ #
69
+ # Wraps user_output.print
70
+ #
71
+ def print(msg='')
72
+ user_output.print(msg) if (user_output)
73
+ end
74
+
75
+ #
76
+ # Wraps user_output.flush
77
+ #
78
+ def flush
79
+ user_output.flush if (user_output)
80
+ end
81
+
82
+ #
83
+ # The user output handle.
84
+ #
85
+ attr_accessor :user_output
86
+
87
+ protected
88
+
89
+ #
90
+ # Prints a blank line. Used when the input is prompting.
91
+ #
92
+ def print_blank_line
93
+ user_output.prompting(false)
94
+ user_output.print_line
95
+ end
96
+
97
+ end
98
+
99
+ ##
100
+ #
101
+ # Subscribes to the input half of the user interface.
102
+ #
103
+ ##
104
+ module Input
105
+
106
+ #
107
+ # Gets a line of input from the user_input handle by calling gets.
108
+ #
109
+ def gets
110
+ user_input.gets if (user_input)
111
+ end
112
+
113
+ #
114
+ # The user intput handle.
115
+ #
116
+ attr_accessor :user_input
117
+
118
+ end
119
+
120
+ include Output
121
+ include Input
122
+
123
+ #
124
+ # Sets the input and output handles.
125
+ #
126
+ def init_ui(input = nil, output = nil)
127
+ self.user_input = input
128
+ self.user_output = output
129
+ end
130
+
131
+ #
132
+ # Disables input/output
133
+ #
134
+ def reset_ui
135
+ self.user_input = nil
136
+ self.user_output = nil
137
+ end
138
+
139
+ #
140
+ # Copy the user input and output handles from the supplied subscriber.
141
+ #
142
+ def copy_ui(subscriber)
143
+ init_ui(subscriber.user_input, subscriber.user_output)
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+ end
@@ -0,0 +1,97 @@
1
+ module Rex
2
+ module Ui
3
+ module Text
4
+
5
+ ###
6
+ #
7
+ # This module provides an interface to getting ANSI color codes.
8
+ # It's taken mostly from perl's Term::ANSIColor by Russ Allbery
9
+ # <rra@stanford.edu> and Zenin <zenin@best.com>.
10
+ #
11
+ ###
12
+ module Color
13
+
14
+ AnsiAttributes =
15
+ {
16
+ 'clear' => 0,
17
+ 'reset' => 0,
18
+ 'bold' => 1,
19
+ 'dark' => 2,
20
+ 'underline' => 4,
21
+ 'underscore' => 4,
22
+ 'blink' => 5,
23
+ 'reverse' => 7,
24
+ 'concealed' => 8,
25
+ 'black' => 30, 'on_black' => 40,
26
+ 'red' => 31, 'on_red' => 41,
27
+ 'green' => 32, 'on_green' => 42,
28
+ 'yellow' => 33, 'on_yellow' => 43,
29
+ 'blue' => 34, 'on_blue' => 44,
30
+ 'magenta' => 35, 'on_magenta' => 45,
31
+ 'cyan' => 36, 'on_cyan' => 46,
32
+ 'white' => 37, 'on_white' => 47
33
+ }
34
+
35
+ #
36
+ # Return a string with ANSI codes substituted. Derived from code
37
+ # written by The FaerieMUD Consortium.
38
+ #
39
+ def ansi(*attrs)
40
+ attr = attrs.collect {|a| AnsiAttributes[a] ? AnsiAttributes[a] : nil}.compact.join(';')
41
+ attr = "\e[%sm" % attr if (attr.empty? == false)
42
+ return attr
43
+ end
44
+
45
+ #
46
+ # Colorize if this shell supports it
47
+ #
48
+ def colorize(*color)
49
+ supports_color?() ? ansi(*color) : ''
50
+ end
51
+
52
+ def substitute_colors(msg, in_prompt = nil)
53
+ str = msg.dup
54
+ pre_color = post_color = ''
55
+ if (in_prompt)
56
+ pre_color = "\x01" # RL_PROMPT_START_IGNORE
57
+ post_color = "\x02" # RL_PROMPT_END_IGNORE
58
+ end
59
+ str.gsub!(/%cya/, pre_color+colorize('cyan')+post_color)
60
+ str.gsub!(/%red/, pre_color+colorize('red')+post_color)
61
+ str.gsub!(/%grn/, pre_color+colorize('green')+post_color)
62
+ str.gsub!(/%blu/, pre_color+colorize('blue')+post_color)
63
+ str.gsub!(/%yel/, pre_color+colorize('yellow')+post_color)
64
+ str.gsub!(/%whi/, pre_color+colorize('white')+post_color)
65
+ str.gsub!(/%mag/, pre_color+colorize('magenta')+post_color)
66
+ str.gsub!(/%blk/, pre_color+colorize('black')+post_color)
67
+ str.gsub!(/%dred/, pre_color+colorize('dark', 'red')+post_color)
68
+ str.gsub!(/%dgrn/, pre_color+colorize('dark', 'green')+post_color)
69
+ str.gsub!(/%dblu/, pre_color+colorize('dark', 'blue')+post_color)
70
+ str.gsub!(/%dyel/, pre_color+colorize('dark', 'yellow')+post_color)
71
+ str.gsub!(/%dcya/, pre_color+colorize('dark', 'cyan')+post_color)
72
+ str.gsub!(/%dwhi/, pre_color+colorize('dark', 'white')+post_color)
73
+ str.gsub!(/%dmag/, pre_color+colorize('dark', 'magenta')+post_color)
74
+ str.gsub!(/%und/, pre_color+colorize('underline')+post_color)
75
+ str.gsub!(/%bld/, pre_color+colorize('bold')+post_color)
76
+ str.gsub!(/%clr/, pre_color+colorize('clear')+post_color)
77
+
78
+ str
79
+ end
80
+
81
+ #
82
+ # Resets coloring so that it's back to normal.
83
+ #
84
+ def reset_color
85
+ return if not supports_color?
86
+ print(colorize('clear'))
87
+ end
88
+
89
+ #
90
+ # Colorize if this shell supports it
91
+ #
92
+ def do_colorize(*color)
93
+ supports_color?() ? ansi(*color) : ''
94
+ end
95
+ end
96
+
97
+ end end end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/ui/text/color'
7
+
8
+ class Rex::Ui::Text::Color::UnitTest < Test::Unit::TestCase
9
+
10
+ def test_color
11
+ color = Rex::Ui::Text::Color.new.ansi('bold', 'red')
12
+ color += 'hey sup'
13
+ color += Rex::Ui::Text::Color.new.ansi('clear')
14
+
15
+ assert_equal("\e[1;31mhey sup\e[0m", color)
16
+ end
17
+
18
+ end
@@ -0,0 +1,467 @@
1
+ require 'rex/ui'
2
+ require 'pp'
3
+
4
+ module Rex
5
+ module Ui
6
+ module Text
7
+
8
+ ###
9
+ #
10
+ # The dispatcher shell class is designed to provide a generic means
11
+ # of processing various shell commands that may be located in
12
+ # different modules or chunks of codes. These chunks are referred
13
+ # to as command dispatchers. The only requirement for command dispatchers is
14
+ # that they prefix every method that they wish to be mirrored as a command
15
+ # with the cmd_ prefix.
16
+ #
17
+ ###
18
+ module DispatcherShell
19
+
20
+ ###
21
+ #
22
+ # Empty template base class for command dispatchers.
23
+ #
24
+ ###
25
+ module CommandDispatcher
26
+
27
+ #
28
+ # Initializes the command dispatcher mixin.
29
+ #
30
+ def initialize(shell)
31
+ self.shell = shell
32
+ self.tab_complete_items = []
33
+ end
34
+
35
+ #
36
+ # Returns nil for an empty set of commands.
37
+ #
38
+ def commands
39
+ end
40
+
41
+ #
42
+ # Wraps shell.print_error
43
+ #
44
+ def print_error(msg = '')
45
+ shell.print_error(msg)
46
+ end
47
+
48
+ #
49
+ # Wraps shell.print_status
50
+ #
51
+ def print_status(msg = '')
52
+ shell.print_status(msg)
53
+ end
54
+
55
+ #
56
+ # Wraps shell.print_line
57
+ #
58
+ def print_line(msg = '')
59
+ shell.print_line(msg)
60
+ end
61
+
62
+ #
63
+ # Wraps shell.print_good
64
+ #
65
+ def print_good(msg = '')
66
+ shell.print_good(msg)
67
+ end
68
+
69
+ #
70
+ # Wraps shell.print
71
+ #
72
+ def print(msg = '')
73
+ shell.print(msg)
74
+ end
75
+
76
+ #
77
+ # Wraps shell.update_prompt
78
+ #
79
+ def update_prompt(prompt=nil)
80
+ shell.update_prompt(prompt)
81
+ end
82
+
83
+ #
84
+ # Displays the help banner. With no arguments, this is just a list of
85
+ # all commands grouped by dispatcher. Otherwise, tries to use a method
86
+ # named cmd_#{+cmd+}_help for the first dispatcher that has a command
87
+ # named +cmd+.
88
+ #
89
+ def cmd_help(cmd=nil, *ignored)
90
+ if cmd
91
+ help_found = false
92
+ cmd_found = false
93
+ shell.dispatcher_stack.each do |dispatcher|
94
+ next unless dispatcher.respond_to?(:commands)
95
+ next if (dispatcher.commands.nil?)
96
+ next if (dispatcher.commands.length == 0)
97
+
98
+ if dispatcher.respond_to?("cmd_#{cmd}")
99
+ cmd_found = true
100
+ break unless dispatcher.respond_to? "cmd_#{cmd}_help"
101
+ dispatcher.send("cmd_#{cmd}_help")
102
+ help_found = true
103
+ break
104
+ end
105
+ end
106
+ print_error("No help for #{cmd}, try -h") if cmd_found and not help_found
107
+ print_error("No such command") if not cmd_found
108
+ else
109
+ print(shell.help_to_s)
110
+ end
111
+ end
112
+
113
+ #
114
+ # Tab completion for the help command
115
+ #
116
+ # By default just returns a list of all commands in all dispatchers.
117
+ #
118
+ def cmd_help_tabs(str, words)
119
+ return [] if words.length > 1
120
+
121
+ tabs = []
122
+ shell.dispatcher_stack.each { |dispatcher|
123
+ tabs += dispatcher.commands.keys
124
+ }
125
+ return tabs
126
+ end
127
+
128
+ alias cmd_? cmd_help
129
+
130
+
131
+ #
132
+ # No tab completion items by default
133
+ #
134
+ attr_accessor :shell, :tab_complete_items
135
+
136
+ #
137
+ # Provide a generic tab completion for file names.
138
+ #
139
+ # If the only completion is a directory, this descends into that directory
140
+ # and continues completions with filenames contained within.
141
+ #
142
+ def tab_complete_filenames(str, words)
143
+ matches = ::Readline::FILENAME_COMPLETION_PROC.call(str)
144
+ if matches and matches.length == 1 and File.directory?(matches[0])
145
+ dir = matches[0]
146
+ dir += File::SEPARATOR if dir[-1,1] != File::SEPARATOR
147
+ matches = ::Readline::FILENAME_COMPLETION_PROC.call(dir)
148
+ end
149
+ matches
150
+ end
151
+
152
+ end
153
+
154
+ #
155
+ # DispatcherShell derives from shell.
156
+ #
157
+ include Shell
158
+
159
+ #
160
+ # Initialize the dispatcher shell.
161
+ #
162
+ def initialize(prompt, prompt_char = '>', histfile = nil)
163
+ super
164
+
165
+ # Initialze the dispatcher array
166
+ self.dispatcher_stack = []
167
+
168
+ # Initialize the tab completion array
169
+ self.tab_words = []
170
+ self.on_command_proc = nil
171
+ end
172
+
173
+ #
174
+ # This method accepts the entire line of text from the Readline
175
+ # routine, stores all completed words, and passes the partial
176
+ # word to the real tab completion function. This works around
177
+ # a design problem in the Readline module and depends on the
178
+ # Readline.basic_word_break_characters variable being set to \x00
179
+ #
180
+ def tab_complete(str)
181
+ # Check trailing whitespace so we can tell 'x' from 'x '
182
+ str_match = str.match(/\s+$/)
183
+ str_trail = (str_match.nil?) ? '' : str_match[0]
184
+
185
+ # Split the line up by whitespace into words
186
+ str_words = str.split(/[\s\t\n]+/)
187
+
188
+ # Append an empty word if we had trailing whitespace
189
+ str_words << '' if str_trail.length > 0
190
+
191
+ # Place the word list into an instance variable
192
+ self.tab_words = str_words
193
+
194
+ # Pop the last word and pass it to the real method
195
+ tab_complete_stub(self.tab_words.pop)
196
+ end
197
+
198
+ # Performs tab completion of a command, if supported
199
+ # Current words can be found in self.tab_words
200
+ #
201
+ def tab_complete_stub(str)
202
+ items = []
203
+
204
+ return nil if not str
205
+
206
+ # puts "Words(#{tab_words.join(", ")}) Partial='#{str}'"
207
+
208
+ # Next, try to match internal command or value completion
209
+ # Enumerate each entry in the dispatcher stack
210
+ dispatcher_stack.each { |dispatcher|
211
+
212
+ # If no command is set and it supports commands, add them all
213
+ if (tab_words.empty? and dispatcher.respond_to?('commands'))
214
+ items.concat(dispatcher.commands.keys)
215
+ end
216
+
217
+ # If the dispatcher exports a tab completion function, use it
218
+ if(dispatcher.respond_to?('tab_complete_helper'))
219
+ res = dispatcher.tab_complete_helper(str, tab_words)
220
+ else
221
+ res = tab_complete_helper(dispatcher, str, tab_words)
222
+ end
223
+
224
+ if (res.nil?)
225
+ # A nil response indicates no optional arguments
226
+ return [''] if items.empty?
227
+ else
228
+ # Otherwise we add the completion items to the list
229
+ items.concat(res)
230
+ end
231
+ }
232
+
233
+ # Verify that our search string is a valid regex
234
+ begin
235
+ Regexp.compile(str)
236
+ rescue RegexpError
237
+ str = Regexp.escape(str)
238
+ end
239
+
240
+ # XXX - This still doesn't fix some Regexp warnings:
241
+ # ./lib/rex/ui/text/dispatcher_shell.rb:171: warning: regexp has `]' without escape
242
+
243
+ # Match based on the partial word
244
+ items.find_all { |e|
245
+ e =~ /^#{str}/
246
+ # Prepend the rest of the command (or it gets replaced!)
247
+ }.map { |e|
248
+ tab_words.dup.push(e).join(' ')
249
+ }
250
+ end
251
+
252
+ #
253
+ # Provide command-specific tab completion
254
+ #
255
+ def tab_complete_helper(dispatcher, str, words)
256
+ items = []
257
+
258
+ tabs_meth = "cmd_#{words[0]}_tabs"
259
+ # Is the user trying to tab complete one of our commands?
260
+ if (dispatcher.commands.include?(words[0]) and dispatcher.respond_to?(tabs_meth))
261
+ res = dispatcher.send(tabs_meth, str, words)
262
+ return [] if res.nil?
263
+ items.concat(res)
264
+ else
265
+ # Avoid the default completion list for known commands
266
+ return []
267
+ end
268
+
269
+ return items
270
+ end
271
+
272
+ #
273
+ # Run a single command line.
274
+ #
275
+ def run_single(line)
276
+ arguments = parse_line(line)
277
+ method = arguments.shift
278
+ found = false
279
+ error = false
280
+
281
+ # If output is disabled output will be nil
282
+ output.reset_color if (output)
283
+
284
+ if (method)
285
+ entries = dispatcher_stack.length
286
+
287
+ dispatcher_stack.each { |dispatcher|
288
+ next if not dispatcher.respond_to?('commands')
289
+
290
+ begin
291
+ if (dispatcher.commands.has_key?(method))
292
+ self.on_command_proc.call(line.strip) if self.on_command_proc
293
+ run_command(dispatcher, method, arguments)
294
+ found = true
295
+ end
296
+ rescue
297
+ error = $!
298
+
299
+ print_error(
300
+ "Error while running command #{method}: #{$!}" +
301
+ "\n\nCall stack:\n#{$@.join("\n")}")
302
+ rescue ::Exception
303
+ error = $!
304
+
305
+ print_error(
306
+ "Error while running command #{method}: #{$!}")
307
+ end
308
+
309
+ # If the dispatcher stack changed as a result of this command,
310
+ # break out
311
+ break if (dispatcher_stack.length != entries)
312
+ }
313
+
314
+ if (found == false and error == false)
315
+ unknown_command(method, line)
316
+ end
317
+ end
318
+
319
+ return found
320
+ end
321
+
322
+ #
323
+ # Runs the supplied command on the given dispatcher.
324
+ #
325
+ def run_command(dispatcher, method, arguments)
326
+ self.busy = true
327
+
328
+ if(blocked_command?(method))
329
+ print_error("The #{method} command has been disabled.")
330
+ else
331
+ dispatcher.send('cmd_' + method, *arguments)
332
+ end
333
+ self.busy = false
334
+ end
335
+
336
+ #
337
+ # If the command is unknown...
338
+ #
339
+ def unknown_command(method, line)
340
+ print_error("Unknown command: #{method}.")
341
+ end
342
+
343
+ #
344
+ # Push a dispatcher to the front of the stack.
345
+ #
346
+ def enstack_dispatcher(dispatcher)
347
+ self.dispatcher_stack.unshift(inst = dispatcher.new(self))
348
+
349
+ inst
350
+ end
351
+
352
+ #
353
+ # Pop a dispatcher from the front of the stacker.
354
+ #
355
+ def destack_dispatcher
356
+ self.dispatcher_stack.shift
357
+ end
358
+
359
+ #
360
+ # Adds the supplied dispatcher to the end of the dispatcher stack so that
361
+ # it doesn't affect any enstack'd dispatchers.
362
+ #
363
+ def append_dispatcher(dispatcher)
364
+ inst = dispatcher.new(self)
365
+ self.dispatcher_stack.each { |disp|
366
+ if (disp.name == inst.name)
367
+ raise RuntimeError.new("Attempting to load already loaded dispatcher #{disp.name}")
368
+ end
369
+ }
370
+ self.dispatcher_stack.push(inst)
371
+
372
+ inst
373
+ end
374
+
375
+ #
376
+ # Removes the supplied dispatcher instance.
377
+ #
378
+ def remove_dispatcher(name)
379
+ self.dispatcher_stack.delete_if { |inst|
380
+ (inst.name == name)
381
+ }
382
+ end
383
+
384
+ #
385
+ # Returns the current active dispatcher
386
+ #
387
+ def current_dispatcher
388
+ self.dispatcher_stack[0]
389
+ end
390
+
391
+ #
392
+ # Return a readable version of a help banner for all of the enstacked
393
+ # dispatchers.
394
+ #
395
+ def help_to_s(opts = {})
396
+ str = ''
397
+
398
+ dispatcher_stack.reverse.each { |dispatcher|
399
+ # No commands? Suckage.
400
+ next if ((dispatcher.respond_to?('commands') == false) or
401
+ (dispatcher.commands == nil) or
402
+ (dispatcher.commands.length == 0))
403
+
404
+ # Display the commands
405
+ tbl = Table.new(
406
+ 'Header' => "#{dispatcher.name} Commands",
407
+ 'Indent' => opts['Indent'] || 4,
408
+ 'Columns' =>
409
+ [
410
+ 'Command',
411
+ 'Description'
412
+ ],
413
+ 'ColProps' =>
414
+ {
415
+ 'Command' =>
416
+ {
417
+ 'MaxWidth' => 12
418
+ }
419
+ })
420
+
421
+ dispatcher.commands.sort.each { |c|
422
+ tbl << c
423
+ }
424
+
425
+ str << "\n" + tbl.to_s + "\n"
426
+ }
427
+
428
+ return str
429
+ end
430
+
431
+
432
+
433
+ #
434
+ # Returns nil for an empty set of blocked commands.
435
+ #
436
+ def blocked_command?(cmd)
437
+ return false if not self.blocked
438
+ self.blocked.has_key?(cmd)
439
+ end
440
+
441
+ #
442
+ # Block a specific command
443
+ #
444
+ def block_command(cmd)
445
+ self.blocked ||= {}
446
+ self.blocked[cmd] = true
447
+ end
448
+
449
+ #
450
+ # Unblock a specific command
451
+ #
452
+ def unblock_command(cmd)
453
+ self.blocked || return
454
+ self.blocked.delete(cmd)
455
+ end
456
+
457
+
458
+ attr_accessor :dispatcher_stack # :nodoc:
459
+ attr_accessor :tab_words # :nodoc:
460
+ attr_accessor :busy # :nodoc:
461
+ attr_accessor :blocked # :nodoc:
462
+
463
+ end
464
+
465
+ end
466
+ end
467
+ end