librex 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+