librex 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (370) hide show
  1. data/README +4 -0
  2. data/lib/rex.rb +101 -0
  3. data/lib/rex.rb.ts.rb +70 -0
  4. data/lib/rex/LICENSE +29 -0
  5. data/lib/rex/arch.rb +103 -0
  6. data/lib/rex/arch/sparc.rb +75 -0
  7. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  8. data/lib/rex/arch/x86.rb +513 -0
  9. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  10. data/lib/rex/assembly/nasm.rb +100 -0
  11. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  12. data/lib/rex/codepage.map +104 -0
  13. data/lib/rex/compat.rb +281 -0
  14. data/lib/rex/constants.rb +113 -0
  15. data/lib/rex/elfparsey.rb +11 -0
  16. data/lib/rex/elfparsey/elf.rb +123 -0
  17. data/lib/rex/elfparsey/elfbase.rb +260 -0
  18. data/lib/rex/elfparsey/exceptions.rb +27 -0
  19. data/lib/rex/elfscan.rb +12 -0
  20. data/lib/rex/elfscan/scanner.rb +207 -0
  21. data/lib/rex/elfscan/search.rb +46 -0
  22. data/lib/rex/encoder/alpha2.rb +31 -0
  23. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  24. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  25. data/lib/rex/encoder/alpha2/generic.rb +113 -0
  26. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  27. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  28. data/lib/rex/encoder/ndr.rb +89 -0
  29. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  30. data/lib/rex/encoder/nonalpha.rb +61 -0
  31. data/lib/rex/encoder/nonupper.rb +64 -0
  32. data/lib/rex/encoder/xdr.rb +106 -0
  33. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  34. data/lib/rex/encoder/xor.rb +69 -0
  35. data/lib/rex/encoder/xor/dword.rb +13 -0
  36. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  37. data/lib/rex/encoders/xor_dword.rb +35 -0
  38. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  39. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  40. data/lib/rex/encoding/xor.rb +20 -0
  41. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  42. data/lib/rex/encoding/xor/byte.rb +15 -0
  43. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  44. data/lib/rex/encoding/xor/dword.rb +21 -0
  45. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  47. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  48. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  49. data/lib/rex/encoding/xor/generic.rb +146 -0
  50. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  51. data/lib/rex/encoding/xor/qword.rb +15 -0
  52. data/lib/rex/encoding/xor/word.rb +21 -0
  53. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  54. data/lib/rex/exceptions.rb +275 -0
  55. data/lib/rex/exceptions.rb.ut.rb +44 -0
  56. data/lib/rex/exploitation/cmdstager.rb +133 -0
  57. data/lib/rex/exploitation/egghunter.rb +143 -0
  58. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  59. data/lib/rex/exploitation/encryptjs.rb +77 -0
  60. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  61. data/lib/rex/exploitation/heaplib.rb +94 -0
  62. data/lib/rex/exploitation/javascriptosdetect.rb +735 -0
  63. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  64. data/lib/rex/exploitation/opcodedb.rb +818 -0
  65. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  66. data/lib/rex/exploitation/seh.rb +92 -0
  67. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  68. data/lib/rex/file.rb +84 -0
  69. data/lib/rex/file.rb.ut.rb +16 -0
  70. data/lib/rex/image_source.rb +12 -0
  71. data/lib/rex/image_source/disk.rb +60 -0
  72. data/lib/rex/image_source/image_source.rb +46 -0
  73. data/lib/rex/image_source/memory.rb +37 -0
  74. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  75. data/lib/rex/io/datagram_abstraction.rb +35 -0
  76. data/lib/rex/io/stream.rb +313 -0
  77. data/lib/rex/io/stream_abstraction.rb +186 -0
  78. data/lib/rex/io/stream_server.rb +211 -0
  79. data/lib/rex/job_container.rb +202 -0
  80. data/lib/rex/logging.rb +4 -0
  81. data/lib/rex/logging/log_dispatcher.rb +179 -0
  82. data/lib/rex/logging/log_sink.rb +42 -0
  83. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  84. data/lib/rex/logging/sinks/stderr.rb +43 -0
  85. data/lib/rex/machparsey.rb +9 -0
  86. data/lib/rex/machparsey/exceptions.rb +34 -0
  87. data/lib/rex/machparsey/mach.rb +209 -0
  88. data/lib/rex/machparsey/machbase.rb +408 -0
  89. data/lib/rex/machscan.rb +9 -0
  90. data/lib/rex/machscan/scanner.rb +217 -0
  91. data/lib/rex/mime.rb +9 -0
  92. data/lib/rex/mime/header.rb +75 -0
  93. data/lib/rex/mime/message.rb +112 -0
  94. data/lib/rex/mime/part.rb +20 -0
  95. data/lib/rex/nop/opty2.rb +108 -0
  96. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  97. data/lib/rex/nop/opty2_tables.rb +300 -0
  98. data/lib/rex/ole.rb +128 -0
  99. data/lib/rex/ole/clsid.rb +47 -0
  100. data/lib/rex/ole/difat.rb +141 -0
  101. data/lib/rex/ole/directory.rb +230 -0
  102. data/lib/rex/ole/direntry.rb +240 -0
  103. data/lib/rex/ole/fat.rb +99 -0
  104. data/lib/rex/ole/header.rb +204 -0
  105. data/lib/rex/ole/minifat.rb +77 -0
  106. data/lib/rex/ole/samples/create_ole.rb +27 -0
  107. data/lib/rex/ole/samples/dir.rb +35 -0
  108. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  109. data/lib/rex/ole/samples/ole_info.rb +23 -0
  110. data/lib/rex/ole/storage.rb +395 -0
  111. data/lib/rex/ole/stream.rb +53 -0
  112. data/lib/rex/ole/substorage.rb +49 -0
  113. data/lib/rex/ole/util.rb +157 -0
  114. data/lib/rex/parser/arguments.rb +97 -0
  115. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  116. data/lib/rex/parser/ini.rb +185 -0
  117. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  118. data/lib/rex/parser/nmap_xml.rb +111 -0
  119. data/lib/rex/payloads.rb +1 -0
  120. data/lib/rex/payloads/win32.rb +2 -0
  121. data/lib/rex/payloads/win32/common.rb +26 -0
  122. data/lib/rex/payloads/win32/kernel.rb +53 -0
  123. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  124. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  125. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  126. data/lib/rex/payloads/win32/kernel/stager.rb +171 -0
  127. data/lib/rex/peparsey.rb +12 -0
  128. data/lib/rex/peparsey/exceptions.rb +32 -0
  129. data/lib/rex/peparsey/pe.rb +188 -0
  130. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  131. data/lib/rex/peparsey/pebase.rb +1655 -0
  132. data/lib/rex/peparsey/section.rb +136 -0
  133. data/lib/rex/pescan.rb +13 -0
  134. data/lib/rex/pescan/analyze.rb +309 -0
  135. data/lib/rex/pescan/scanner.rb +206 -0
  136. data/lib/rex/pescan/search.rb +56 -0
  137. data/lib/rex/platforms.rb +1 -0
  138. data/lib/rex/platforms/windows.rb +51 -0
  139. data/lib/rex/poly.rb +132 -0
  140. data/lib/rex/poly/block.rb +468 -0
  141. data/lib/rex/poly/register.rb +100 -0
  142. data/lib/rex/poly/register/x86.rb +40 -0
  143. data/lib/rex/post.rb +8 -0
  144. data/lib/rex/post/dir.rb +51 -0
  145. data/lib/rex/post/file.rb +172 -0
  146. data/lib/rex/post/file_stat.rb +220 -0
  147. data/lib/rex/post/gen.pl +13 -0
  148. data/lib/rex/post/io.rb +182 -0
  149. data/lib/rex/post/meterpreter.rb +4 -0
  150. data/lib/rex/post/meterpreter/channel.rb +438 -0
  151. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  152. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  153. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  154. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  155. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  156. data/lib/rex/post/meterpreter/client.rb +335 -0
  157. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  158. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  159. data/lib/rex/post/meterpreter/extension.rb +32 -0
  160. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  161. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  162. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  163. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  164. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  165. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  166. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +104 -0
  167. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  168. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +100 -0
  169. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +24 -0
  170. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  171. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +273 -0
  172. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +235 -0
  173. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  174. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  175. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  176. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  177. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  178. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  179. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +167 -0
  180. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  181. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +192 -0
  182. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +139 -0
  183. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  184. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +184 -0
  185. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  186. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +182 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +174 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +185 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  198. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  199. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  200. data/lib/rex/post/meterpreter/packet.rb +596 -0
  201. data/lib/rex/post/meterpreter/packet_dispatcher.rb +409 -0
  202. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  203. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  204. data/lib/rex/post/meterpreter/ui/console.rb +135 -0
  205. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  206. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +595 -0
  207. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  208. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  209. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  210. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  211. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  212. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  213. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  214. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +63 -0
  215. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +376 -0
  216. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +270 -0
  217. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +484 -0
  218. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  219. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  220. data/lib/rex/post/permission.rb +26 -0
  221. data/lib/rex/post/process.rb +57 -0
  222. data/lib/rex/post/thread.rb +57 -0
  223. data/lib/rex/post/ui.rb +52 -0
  224. data/lib/rex/proto.rb +12 -0
  225. data/lib/rex/proto.rb.ts.rb +8 -0
  226. data/lib/rex/proto/dcerpc.rb +6 -0
  227. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  228. data/lib/rex/proto/dcerpc/client.rb +358 -0
  229. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  230. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  231. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  232. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  233. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  234. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  235. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  236. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  237. data/lib/rex/proto/dcerpc/response.rb +186 -0
  238. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  239. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  240. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  241. data/lib/rex/proto/drda.rb +5 -0
  242. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  243. data/lib/rex/proto/drda/constants.rb +49 -0
  244. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  245. data/lib/rex/proto/drda/packet.rb +252 -0
  246. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  247. data/lib/rex/proto/drda/utils.rb +123 -0
  248. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  249. data/lib/rex/proto/http.rb +5 -0
  250. data/lib/rex/proto/http.rb.ts.rb +12 -0
  251. data/lib/rex/proto/http/client.rb +817 -0
  252. data/lib/rex/proto/http/client.rb.ut.rb +93 -0
  253. data/lib/rex/proto/http/handler.rb +46 -0
  254. data/lib/rex/proto/http/handler/erb.rb +128 -0
  255. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  256. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  257. data/lib/rex/proto/http/handler/proc.rb +54 -0
  258. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  259. data/lib/rex/proto/http/header.rb +161 -0
  260. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  261. data/lib/rex/proto/http/packet.rb +394 -0
  262. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  263. data/lib/rex/proto/http/request.rb +356 -0
  264. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  265. data/lib/rex/proto/http/response.rb +85 -0
  266. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  267. data/lib/rex/proto/http/server.rb +367 -0
  268. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  269. data/lib/rex/proto/smb.rb +7 -0
  270. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  271. data/lib/rex/proto/smb/client.rb +1733 -0
  272. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  273. data/lib/rex/proto/smb/constants.rb +1062 -0
  274. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  275. data/lib/rex/proto/smb/crypt.rb +95 -0
  276. data/lib/rex/proto/smb/crypt.rb.ut.rb +20 -0
  277. data/lib/rex/proto/smb/evasions.rb +65 -0
  278. data/lib/rex/proto/smb/exceptions.rb +846 -0
  279. data/lib/rex/proto/smb/simpleclient.rb +292 -0
  280. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  281. data/lib/rex/proto/smb/utils.rb +514 -0
  282. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  283. data/lib/rex/proto/sunrpc.rb +1 -0
  284. data/lib/rex/proto/sunrpc/client.rb +195 -0
  285. data/lib/rex/script.rb +42 -0
  286. data/lib/rex/script/base.rb +59 -0
  287. data/lib/rex/script/meterpreter.rb +9 -0
  288. data/lib/rex/script/shell.rb +9 -0
  289. data/lib/rex/service.rb +48 -0
  290. data/lib/rex/service_manager.rb +141 -0
  291. data/lib/rex/service_manager.rb.ut.rb +32 -0
  292. data/lib/rex/services/local_relay.rb +423 -0
  293. data/lib/rex/socket.rb +586 -0
  294. data/lib/rex/socket.rb.ut.rb +86 -0
  295. data/lib/rex/socket/comm.rb +119 -0
  296. data/lib/rex/socket/comm/local.rb +409 -0
  297. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  298. data/lib/rex/socket/ip.rb +129 -0
  299. data/lib/rex/socket/parameters.rb +345 -0
  300. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  301. data/lib/rex/socket/range_walker.rb +295 -0
  302. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  303. data/lib/rex/socket/ssl_tcp.rb +184 -0
  304. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  305. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  306. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +51 -0
  307. data/lib/rex/socket/subnet_walker.rb +75 -0
  308. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  309. data/lib/rex/socket/switch_board.rb +272 -0
  310. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  311. data/lib/rex/socket/tcp.rb +76 -0
  312. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  313. data/lib/rex/socket/tcp_server.rb +67 -0
  314. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  315. data/lib/rex/socket/udp.rb +157 -0
  316. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  317. data/lib/rex/struct2.rb +5 -0
  318. data/lib/rex/struct2/c_struct.rb +181 -0
  319. data/lib/rex/struct2/c_struct_template.rb +39 -0
  320. data/lib/rex/struct2/constant.rb +26 -0
  321. data/lib/rex/struct2/element.rb +44 -0
  322. data/lib/rex/struct2/generic.rb +73 -0
  323. data/lib/rex/struct2/restraint.rb +54 -0
  324. data/lib/rex/struct2/s_string.rb +72 -0
  325. data/lib/rex/struct2/s_struct.rb +111 -0
  326. data/lib/rex/sync.rb +6 -0
  327. data/lib/rex/sync/event.rb +94 -0
  328. data/lib/rex/sync/read_write_lock.rb +176 -0
  329. data/lib/rex/sync/ref.rb +57 -0
  330. data/lib/rex/sync/thread_safe.rb +82 -0
  331. data/lib/rex/test.rb +35 -0
  332. data/lib/rex/text.rb +1029 -0
  333. data/lib/rex/text.rb.ut.rb +168 -0
  334. data/lib/rex/time.rb +65 -0
  335. data/lib/rex/transformer.rb +115 -0
  336. data/lib/rex/transformer.rb.ut.rb +38 -0
  337. data/lib/rex/ui.rb +21 -0
  338. data/lib/rex/ui/interactive.rb +252 -0
  339. data/lib/rex/ui/output.rb +80 -0
  340. data/lib/rex/ui/output/none.rb +18 -0
  341. data/lib/rex/ui/progress_tracker.rb +96 -0
  342. data/lib/rex/ui/subscriber.rb +149 -0
  343. data/lib/rex/ui/text/color.rb +97 -0
  344. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  345. data/lib/rex/ui/text/dispatcher_shell.rb +382 -0
  346. data/lib/rex/ui/text/input.rb +117 -0
  347. data/lib/rex/ui/text/input/buffer.rb +75 -0
  348. data/lib/rex/ui/text/input/readline.rb +129 -0
  349. data/lib/rex/ui/text/input/socket.rb +95 -0
  350. data/lib/rex/ui/text/input/stdio.rb +45 -0
  351. data/lib/rex/ui/text/irb_shell.rb +55 -0
  352. data/lib/rex/ui/text/output.rb +80 -0
  353. data/lib/rex/ui/text/output/buffer.rb +65 -0
  354. data/lib/rex/ui/text/output/file.rb +37 -0
  355. data/lib/rex/ui/text/output/socket.rb +43 -0
  356. data/lib/rex/ui/text/output/stdio.rb +40 -0
  357. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  358. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  359. data/lib/rex/ui/text/shell.rb +321 -0
  360. data/lib/rex/ui/text/table.rb +254 -0
  361. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  362. data/lib/rex/zip.rb +93 -0
  363. data/lib/rex/zip/archive.rb +91 -0
  364. data/lib/rex/zip/blocks.rb +182 -0
  365. data/lib/rex/zip/entry.rb +95 -0
  366. data/lib/rex/zip/samples/comment.rb +32 -0
  367. data/lib/rex/zip/samples/mkwar.rb +138 -0
  368. data/lib/rex/zip/samples/mkzip.rb +19 -0
  369. data/lib/rex/zip/samples/recursive.rb +58 -0
  370. metadata +435 -0
@@ -0,0 +1,382 @@
1
+ require 'rex/ui'
2
+
3
+ module Rex
4
+ module Ui
5
+ module Text
6
+
7
+ ###
8
+ #
9
+ # The dispatcher shell class is designed to provide a generic means
10
+ # of processing various shell commands that may be located in
11
+ # different modules or chunks of codes. These chunks are referred
12
+ # to as command dispatchers. The only requirement for command dispatchers is
13
+ # that they prefix every method that they wish to be mirrored as a command
14
+ # with the cmd_ prefix.
15
+ #
16
+ ###
17
+ module DispatcherShell
18
+
19
+ ###
20
+ #
21
+ # Empty template base class for command dispatchers.
22
+ #
23
+ ###
24
+ module CommandDispatcher
25
+
26
+ #
27
+ # Initializes the command dispatcher mixin.
28
+ #
29
+ def initialize(shell)
30
+ self.shell = shell
31
+ self.tab_complete_items = []
32
+ end
33
+
34
+ #
35
+ # Returns nil for an empty set of commands.
36
+ #
37
+ def commands
38
+ end
39
+
40
+ #
41
+ # Wraps shell.print_error
42
+ #
43
+ def print_error(msg = '')
44
+ shell.print_error(msg)
45
+ end
46
+
47
+ #
48
+ # Wraps shell.print_status
49
+ #
50
+ def print_status(msg = '')
51
+ shell.print_status(msg)
52
+ end
53
+
54
+ #
55
+ # Wraps shell.print_line
56
+ #
57
+ def print_line(msg = '')
58
+ shell.print_line(msg)
59
+ end
60
+
61
+ #
62
+ # Wraps shell.print_good
63
+ #
64
+ def print_good(msg = '')
65
+ shell.print_good(msg)
66
+ end
67
+
68
+ #
69
+ # Wraps shell.print
70
+ #
71
+ def print(msg = '')
72
+ shell.print(msg)
73
+ end
74
+
75
+ #
76
+ # Wraps shell.update_prompt
77
+ #
78
+ def update_prompt(prompt=nil)
79
+ shell.update_prompt(prompt)
80
+ end
81
+
82
+ #
83
+ # No tab completion items by default
84
+ #
85
+ attr_accessor :shell, :tab_complete_items
86
+
87
+ end
88
+
89
+ #
90
+ # DispatcherShell derives from shell.
91
+ #
92
+ include Shell
93
+
94
+ attr_accessor :on_command_proc
95
+
96
+ #
97
+ # Initialize the dispatcher shell.
98
+ #
99
+ def initialize(prompt, prompt_char = '>', histfile = nil)
100
+ super
101
+
102
+ # Initialze the dispatcher array
103
+ self.dispatcher_stack = []
104
+
105
+ # Initialize the tab completion array
106
+ self.tab_words = []
107
+ self.on_command_proc = nil
108
+ end
109
+
110
+ #
111
+ # This method accepts the entire line of text from the Readline
112
+ # routine, stores all completed words, and passes the partial
113
+ # word to the real tab completion function. This works around
114
+ # a design problem in the Readline module and depends on the
115
+ # Readline.basic_word_break_characters variable being set to \x00
116
+ #
117
+ def tab_complete(str)
118
+ # Check trailing whitespace so we can tell 'x' from 'x '
119
+ str_match = str.match(/\s+$/)
120
+ str_trail = (str_match.nil?) ? '' : str_match[0]
121
+
122
+ # Split the line up by whitespace into words
123
+ str_words = str.split(/[\s\t\n]+/)
124
+
125
+ # Append an empty word if we had trailing whitespace
126
+ str_words << '' if str_trail.length > 0
127
+
128
+ # Place the word list into an instance variable
129
+ self.tab_words = str_words
130
+
131
+ # Pop the last word and pass it to the real method
132
+ tab_complete_stub(self.tab_words.pop)
133
+ end
134
+
135
+ # Performs tab completion of a command, if supported
136
+ # Current words can be found in self.tab_words
137
+ #
138
+ def tab_complete_stub(str)
139
+ items = []
140
+
141
+ return nil if not str
142
+
143
+ # puts "Words(#{tab_words.join(", ")}) Partial='#{str}'"
144
+
145
+ # Next, try to match internal command or value completion
146
+ # Enumerate each entry in the dispatcher stack
147
+ dispatcher_stack.each { |dispatcher|
148
+
149
+ # If no command is set and it supports commands, add them all
150
+ if (tab_words.empty? and dispatcher.respond_to?('commands'))
151
+ items.concat(dispatcher.commands.to_a.map { |x| x[0] })
152
+ end
153
+
154
+ # If the dispatcher exports a tab completion function, use it
155
+ if(dispatcher.respond_to?('tab_complete_helper'))
156
+ res = dispatcher.tab_complete_helper(str, tab_words)
157
+
158
+ if (res.nil?)
159
+ # A nil response indicates no optional arguments
160
+ return [''] if items.empty?
161
+ else
162
+ # Otherwise we add the completion items to the list
163
+ items.concat(res)
164
+ end
165
+ end
166
+ }
167
+
168
+ # Verify that our search string is a valid regex
169
+ begin
170
+ Regexp.compile(str)
171
+ rescue RegexpError
172
+ str = Regexp.escape(str)
173
+ end
174
+
175
+ # XXX - This still doesn't fix some Regexp warnings:
176
+ # ./lib/rex/ui/text/dispatcher_shell.rb:171: warning: regexp has `]' without escape
177
+
178
+ # Match based on the partial word
179
+ items.find_all { |e|
180
+ e =~ /^#{str}/
181
+ # Prepend the rest of the command (or it gets replaced!)
182
+ }.map { |e|
183
+ tab_words.dup.push(e).join(' ')
184
+ }
185
+ end
186
+
187
+ #
188
+ # Run a single command line.
189
+ #
190
+ def run_single(line)
191
+ arguments = parse_line(line)
192
+ method = arguments.shift
193
+ found = false
194
+ error = false
195
+
196
+ # If output is disabled output will be nil
197
+ output.reset_color if (output)
198
+
199
+ if (method)
200
+ entries = dispatcher_stack.length
201
+
202
+ dispatcher_stack.each { |dispatcher|
203
+ next if not dispatcher.respond_to?('commands')
204
+
205
+ begin
206
+ if (dispatcher.commands.has_key?(method))
207
+ self.on_command_proc.call(line.strip) if self.on_command_proc
208
+ run_command(dispatcher, method, arguments)
209
+ found = true
210
+ end
211
+ rescue
212
+ error = $!
213
+
214
+ print_error(
215
+ "Error while running command #{method}: #{$!}" +
216
+ "\n\nCall stack:\n#{$@.join("\n")}")
217
+ rescue ::Exception
218
+ error = $!
219
+
220
+ print_error(
221
+ "Error while running command #{method}: #{$!}")
222
+ end
223
+
224
+ # If the dispatcher stack changed as a result of this command,
225
+ # break out
226
+ break if (dispatcher_stack.length != entries)
227
+ }
228
+
229
+ if (found == false and error == false)
230
+ unknown_command(method, line)
231
+ end
232
+ end
233
+
234
+ return found
235
+ end
236
+
237
+ #
238
+ # Runs the supplied command on the given dispatcher.
239
+ #
240
+ def run_command(dispatcher, method, arguments)
241
+ self.busy = true
242
+
243
+ if(blocked_command?(method))
244
+ print_error("The #{method} command has been disabled.")
245
+ else
246
+ dispatcher.send('cmd_' + method, *arguments)
247
+ end
248
+ self.busy = false
249
+ end
250
+
251
+ #
252
+ # If the command is unknown...
253
+ #
254
+ def unknown_command(method, line)
255
+ print_error("Unknown command: #{method}.")
256
+ end
257
+
258
+ #
259
+ # Push a dispatcher to the front of the stack.
260
+ #
261
+ def enstack_dispatcher(dispatcher)
262
+ self.dispatcher_stack.unshift(inst = dispatcher.new(self))
263
+
264
+ inst
265
+ end
266
+
267
+ #
268
+ # Pop a dispatcher from the front of the stacker.
269
+ #
270
+ def destack_dispatcher
271
+ self.dispatcher_stack.shift
272
+ end
273
+
274
+ #
275
+ # Adds the supplied dispatcher to the end of the dispatcher stack so that
276
+ # it doesn't affect any enstack'd dispatchers.
277
+ #
278
+ def append_dispatcher(dispatcher)
279
+ inst = dispatcher.new(self)
280
+ self.dispatcher_stack.each { |disp|
281
+ if (disp.name == inst.name)
282
+ raise RuntimeError.new("Attempting to load already loaded dispatcher #{disp.name}")
283
+ end
284
+ }
285
+ self.dispatcher_stack.push(inst)
286
+
287
+ inst
288
+ end
289
+
290
+ #
291
+ # Removes the supplied dispatcher instance.
292
+ #
293
+ def remove_dispatcher(name)
294
+ self.dispatcher_stack.delete_if { |inst|
295
+ (inst.name == name)
296
+ }
297
+ end
298
+
299
+ #
300
+ # Returns the current active dispatcher
301
+ #
302
+ def current_dispatcher
303
+ self.dispatcher_stack[0]
304
+ end
305
+
306
+ #
307
+ # Return a readable version of a help banner for all of the enstacked
308
+ # dispatchers.
309
+ #
310
+ def help_to_s(opts = {})
311
+ str = ''
312
+
313
+ dispatcher_stack.reverse.each { |dispatcher|
314
+ # No commands? Suckage.
315
+ next if ((dispatcher.respond_to?('commands') == false) or
316
+ (dispatcher.commands == nil) or
317
+ (dispatcher.commands.length == 0))
318
+
319
+ # Display the commands
320
+ tbl = Table.new(
321
+ 'Header' => "#{dispatcher.name} Commands",
322
+ 'Indent' => opts['Indent'] || 4,
323
+ 'Columns' =>
324
+ [
325
+ 'Command',
326
+ 'Description'
327
+ ],
328
+ 'ColProps' =>
329
+ {
330
+ 'Command' =>
331
+ {
332
+ 'MaxWidth' => 12
333
+ }
334
+ })
335
+
336
+ dispatcher.commands.sort.each { |c|
337
+ tbl << c
338
+ }
339
+
340
+ str << "\n" + tbl.to_s + "\n"
341
+ }
342
+
343
+ return str
344
+ end
345
+
346
+
347
+
348
+ #
349
+ # Returns nil for an empty set of blocked commands.
350
+ #
351
+ def blocked_command?(cmd)
352
+ return false if not self.blocked
353
+ self.blocked.has_key?(cmd)
354
+ end
355
+
356
+ #
357
+ # Block a specific command
358
+ #
359
+ def block_command(cmd)
360
+ self.blocked ||= {}
361
+ self.blocked[cmd] = true
362
+ end
363
+
364
+ #
365
+ # Unblock a specific command
366
+ #
367
+ def unblock_command(cmd)
368
+ self.blocked || return
369
+ self.blocked.delete(cmd)
370
+ end
371
+
372
+
373
+ attr_accessor :dispatcher_stack # :nodoc:
374
+ attr_accessor :tab_words # :nodoc:
375
+ attr_accessor :busy # :nodoc:
376
+ attr_accessor :blocked # :nodoc:
377
+
378
+ end
379
+
380
+ end
381
+ end
382
+ end
@@ -0,0 +1,117 @@
1
+ require 'rex/ui'
2
+
3
+ module Rex
4
+ module Ui
5
+ module Text
6
+
7
+ ###
8
+ #
9
+ # This class acts as a base for all input mediums. It defines
10
+ # the interface that will be used by anything that wants to
11
+ # interact with a derived class.
12
+ #
13
+ ###
14
+ class Input
15
+
16
+ require 'rex/ui/text/input/stdio'
17
+ require 'rex/ui/text/input/readline'
18
+ require 'rex/ui/text/input/socket'
19
+ require 'rex/ui/text/color'
20
+
21
+ include Rex::Ui::Text::Color
22
+
23
+ def initialize
24
+ self.eof = false
25
+ @config = {
26
+ :color => :auto, # true, false, :auto
27
+ }
28
+ super
29
+ end
30
+
31
+ #
32
+ # Whether or not the input medium supports readline.
33
+ #
34
+ def supports_readline
35
+ true
36
+ end
37
+
38
+ #
39
+ # Stub for tab completion reset
40
+ #
41
+ def reset_tab_completion
42
+ end
43
+
44
+ #
45
+ # Calls the underlying system read.
46
+ #
47
+ def sysread(len)
48
+ raise NotImplementedError
49
+ end
50
+
51
+ #
52
+ # Gets a line of input
53
+ #
54
+ def gets
55
+ raise NotImplementedError
56
+ end
57
+
58
+ #
59
+ # Has the input medium reached end-of-file?
60
+ #
61
+ def eof?
62
+ return eof
63
+ end
64
+
65
+ #
66
+ # Returns a pollable file descriptor that is associated with this
67
+ # input medium.
68
+ #
69
+ def fd
70
+ raise NotImplementedError
71
+ end
72
+
73
+ #
74
+ # Indicates whether or not this input medium is intrinsicly a
75
+ # shell provider. This would indicate whether or not it
76
+ # already expects to have a prompt.
77
+ #
78
+ def intrinsic_shell?
79
+ false
80
+ end
81
+
82
+ def update_prompt(new_prompt = '', new_prompt_char = '')
83
+ self.prompt = new_prompt + new_prompt_char
84
+ end
85
+
86
+ attr_reader :config
87
+
88
+ def disable_color
89
+ return if not @config
90
+ @config[:color] = false
91
+ end
92
+
93
+ def enable_color
94
+ return if not @config
95
+ @config[:color] = true
96
+ end
97
+
98
+ def auto_color
99
+ return if not @config
100
+ @config[:color] = :auto
101
+ end
102
+
103
+ def update_prompt(prompt)
104
+ substitute_colors(prompt, true)
105
+ end
106
+
107
+ def reset_color
108
+ end
109
+
110
+ attr_accessor :eof, :prompt, :prompt_char, :config
111
+
112
+ end
113
+
114
+ end
115
+ end
116
+ end
117
+