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,65 @@
1
+ require 'rex/ui'
2
+
3
+ module Rex
4
+ module Ui
5
+ module Text
6
+
7
+ ###
8
+ #
9
+ # This class implements output against a buffer.
10
+ #
11
+ ###
12
+ class Output::Buffer < Rex::Ui::Text::Output
13
+
14
+ #
15
+ # Initializes an output buffer.
16
+ #
17
+ def initialize
18
+ self.buf = ''
19
+ end
20
+
21
+ def supports_color?
22
+ false
23
+ end
24
+
25
+ #
26
+ # Appends the supplied message to the output buffer.
27
+ #
28
+ def print_raw(msg = '')
29
+ self.buf += msg || ''
30
+
31
+ if self.on_print_proc
32
+ self.on_print_proc.call(msg)
33
+ end
34
+
35
+ msg
36
+ end
37
+
38
+
39
+ #
40
+ # Read everything out of the buffer and reset it
41
+ #
42
+ def dump_buffer
43
+ self.buf ||= ''
44
+ buffer = self.buf.dup
45
+ reset()
46
+ buffer
47
+ end
48
+
49
+ #
50
+ # Reset the buffer to an empty string.
51
+ #
52
+ def reset
53
+ self.buf = ''
54
+ end
55
+
56
+ #
57
+ # The underlying buffer state.
58
+ #
59
+ attr_accessor :buf
60
+
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,37 @@
1
+ require 'rex/ui'
2
+
3
+ module Rex
4
+ module Ui
5
+ module Text
6
+
7
+ ###
8
+ #
9
+ # This class implements output against a file
10
+ #
11
+ ###
12
+ class Output::File < Rex::Ui::Text::Output
13
+
14
+ attr_accessor :fd
15
+
16
+ def initialize(path)
17
+ self.fd = ::File.open(path, "wb")
18
+ end
19
+
20
+ def supports_color?
21
+ false
22
+ end
23
+
24
+ #
25
+ # Prints the supplied message to file output.
26
+ #
27
+ def print_raw(msg = '')
28
+ self.fd.write(msg)
29
+ self.fd.flush
30
+ msg
31
+ end
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,43 @@
1
+ require 'rex/ui'
2
+
3
+ module Rex
4
+ module Ui
5
+ module Text
6
+
7
+ ###
8
+ #
9
+ # This class implements the output interface against a socket.
10
+ #
11
+ ###
12
+ class Output::Socket < Rex::Ui::Text::Output
13
+
14
+ def initialize(sock)
15
+ @sock = sock
16
+ super()
17
+ end
18
+
19
+ def supports_color?
20
+ case config[:color]
21
+ when true
22
+ # Allow color if the user forces it on
23
+ return true
24
+ else
25
+ false
26
+ end
27
+ end
28
+
29
+ #
30
+ # Prints the supplied message to the socket.
31
+ #
32
+ def print_raw(msg = '')
33
+ @sock.write(msg)
34
+ @sock.flush
35
+
36
+ msg
37
+ end
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+
@@ -0,0 +1,40 @@
1
+ require 'rex/ui'
2
+
3
+ module Rex
4
+ module Ui
5
+ module Text
6
+
7
+ ###
8
+ #
9
+ # This class implements output against standard out.
10
+ #
11
+ ###
12
+ class Output::Stdio < Rex::Ui::Text::Output
13
+
14
+ def supports_color?
15
+ case config[:color]
16
+ when true
17
+ return true
18
+ when false
19
+ return false
20
+ else # auto
21
+ term = Rex::Compat.getenv('TERM')
22
+ return (term and term.match(/(?:vt10[03]|xterm(?:-color)?|linux|screen|rxvt)/i) != nil)
23
+ end
24
+ end
25
+
26
+ #
27
+ # Prints the supplied message to standard output.
28
+ #
29
+ def print_raw(msg = '')
30
+ $stdout.print(msg)
31
+ $stdout.flush
32
+
33
+ msg
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,56 @@
1
+ require 'rex/ui/progress_tracker'
2
+
3
+ module Rex
4
+ module Ui
5
+ module Text
6
+
7
+ ###
8
+ #
9
+ # This module implements progress tracking against a text interface.
10
+ #
11
+ ###
12
+ class ProgressTracker < Rex::Ui::ProgressTracker
13
+
14
+ def initialize(output)
15
+ self.output = output
16
+ self.start = 0
17
+ self.stop = 0
18
+ self.pos = 0
19
+ end
20
+
21
+ #
22
+ # Passes a generic status message that isn't necessarily associated
23
+ # with a step event.
24
+ #
25
+ def status(msg = '')
26
+ output.print_status(msg)
27
+ end
28
+
29
+ #
30
+ # Updates the status associated with the current step.
31
+ #
32
+ def step_status(msg = '')
33
+ output.print_status("#{pos}: #{msg}") if (msg and msg.length > 0)
34
+ end
35
+
36
+ #
37
+ # An error occurred that may result in aborting the progress.
38
+ #
39
+ def error(msg = '')
40
+ output.print_error(msg)
41
+ end
42
+
43
+ #
44
+ # Progress has been aborted, the reason is supplied in msg.
45
+ #
46
+ def abort(msg = '')
47
+ output.print_error("fatal: #{msg}")
48
+ end
49
+
50
+ attr_accessor :output
51
+
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/ui'
7
+
8
+ class Rex::Ui::Text::ProgressTracker::UnitTest < Test::Unit::TestCase
9
+
10
+ def test_stuff
11
+ output = Rex::Ui::Text::Output::Buffer.new
12
+ pt = Rex::Ui::Text::ProgressTracker.new(output)
13
+
14
+ pt.range = 1..10
15
+
16
+ assert_equal(1, pt.start)
17
+ assert_equal(10, pt.stop)
18
+
19
+ pt.start = 2
20
+ assert_equal(2, pt.start)
21
+ pt.stop = 9
22
+ assert_equal(9, pt.stop)
23
+ assert_equal(2, pt.pos)
24
+ assert_equal('', output.buf)
25
+ assert_equal(3, pt.step)
26
+ assert_equal(4, pt.step("test"))
27
+ assert_equal("[*] 4: test\n", output.buf)
28
+ output.reset
29
+ assert_equal("[-] bad\n", pt.error("bad"))
30
+ output.reset
31
+ assert_equal("[-] fatal: bad\n", pt.abort("bad"))
32
+ end
33
+
34
+ end
@@ -0,0 +1,321 @@
1
+ require 'rex/ui'
2
+
3
+ module Rex
4
+ module Ui
5
+ module Text
6
+
7
+ ###
8
+ #
9
+ # The shell class provides a command-prompt style interface in a
10
+ # generic fashion.
11
+ #
12
+ ###
13
+ module Shell
14
+
15
+ ###
16
+ #
17
+ # This module is meant to be mixed into an input medium class instance as a
18
+ # means of extending it to display a prompt before each call to gets.
19
+ #
20
+ ###
21
+ module InputShell
22
+ attr_accessor :prompt, :output
23
+
24
+ def pgets
25
+ output.print(prompt)
26
+ output.flush
27
+
28
+ output.prompting
29
+ buf = gets
30
+ output.prompting(false)
31
+
32
+ buf
33
+ end
34
+ end
35
+
36
+ #
37
+ # Initializes a shell that has a prompt and can be interacted with.
38
+ #
39
+ def initialize(prompt, prompt_char = '>', histfile = nil)
40
+ # Don't initialize the UI here since it will clobber any existing tab
41
+ # completion routines prematurely. Instead, wait for the user to
42
+ # interact. See bug 1180
43
+
44
+ # Set the stop flag to false
45
+ self.stop_flag = false
46
+ self.disable_output = false
47
+ self.stop_count = 0
48
+
49
+ # Initialize the prompt
50
+ self.init_prompt = prompt
51
+ self.prompt_char = prompt_char
52
+
53
+ self.histfile = histfile
54
+ end
55
+
56
+ #
57
+ # Initializes the user interface input/output classes.
58
+ #
59
+ def init_ui(in_input = nil, in_output = nil)
60
+
61
+ # Initialize the input and output methods
62
+ self.input = in_input
63
+ self.output = in_output
64
+
65
+ if (self.input)
66
+ begin
67
+ if (self.input.supports_readline)
68
+ self.input = Input::Readline.new(lambda { |str| tab_complete(str) })
69
+ if histfile and File.exists?(histfile)
70
+ File.readlines(histfile).each { |e|
71
+ Readline::HISTORY << e.chomp
72
+ }
73
+ end
74
+ end
75
+ rescue
76
+ end
77
+
78
+ # Extend the input medium as an input shell if the input medium
79
+ # isn't intrinsicly a shell.
80
+ if (self.input.intrinsic_shell? == false)
81
+ self.input.extend(InputShell)
82
+ end
83
+
84
+ self.input.output = self.output
85
+ end
86
+
87
+ update_prompt('')
88
+ end
89
+
90
+ #
91
+ # Resets the user interface handles.
92
+ #
93
+ def reset_ui
94
+ init_ui
95
+ end
96
+
97
+ #
98
+ # Sets the log source that should be used for logging input and output.
99
+ #
100
+ def set_log_source(log_source)
101
+ self.log_source = log_source
102
+ end
103
+
104
+ #
105
+ # Unsets the log source so that logging becomes disabled.
106
+ #
107
+ def unset_log_source
108
+ set_log_source(nil)
109
+ end
110
+
111
+ #
112
+ # Performs tab completion on the supplied string.
113
+ #
114
+ def tab_complete(str)
115
+ return tab_complete_proc(str) if (tab_complete_proc)
116
+ end
117
+
118
+ #
119
+ # Run the command processing loop.
120
+ #
121
+ def run(&block)
122
+
123
+ begin
124
+
125
+ while true
126
+ # If the stop flag was set or we've hit EOF, break out
127
+ break if (self.stop_flag or self.stop_count > 1)
128
+
129
+ line = input.pgets
130
+ log_output(input.prompt)
131
+
132
+ # If a block was passed in, pass the line to it. If it returns true,
133
+ # break out of the shell loop.
134
+ if (block)
135
+ break if (line == nil or block.call(line))
136
+ elsif(input.eof? or line == nil)
137
+ # If you have sessions active, this will give you a shot to exit gravefully
138
+ # If you really are ambitious, 2 eofs will kick this out
139
+ self.stop_count += 1
140
+ next if(self.stop_count > 1)
141
+ run_single("quit")
142
+ else
143
+ # Otherwise, call what should be an overriden instance method to
144
+ # process the line.
145
+ ret = run_single(line)
146
+ # don't bother saving lines that couldn't be found as a
147
+ # command, create the file if it doesn't exist
148
+ if ret and self.histfile
149
+ File.open(self.histfile, "a+") { |f|
150
+ f.puts(line)
151
+ }
152
+ end
153
+ self.stop_count = 0
154
+ end
155
+
156
+ end
157
+ # Prevent accidental console quits
158
+ rescue ::Interrupt
159
+ output.print("Interrupt: use the 'exit' command to quit\n")
160
+ retry
161
+ end
162
+ end
163
+
164
+ #
165
+ # Stop processing user input.
166
+ #
167
+ def stop
168
+ self.stop_flag = true
169
+ end
170
+
171
+ #
172
+ # Checks to see if the shell has stopped.
173
+ #
174
+ def stopped?
175
+ self.stop_flag
176
+ end
177
+
178
+ #
179
+ # Change the input prompt.
180
+ #
181
+ def update_prompt(prompt = nil, new_prompt_char = nil)
182
+ if (self.input)
183
+ if (prompt)
184
+ new_prompt = self.init_prompt + ' ' + prompt + prompt_char + ' '
185
+ else
186
+ new_prompt = self.prompt || ''
187
+ end
188
+
189
+ # Save the prompt before any substitutions
190
+ self.prompt = new_prompt
191
+
192
+ # Set the actual prompt to the saved prompt with any substitutions
193
+ # or updates from our output driver, be they color or whatever
194
+ self.input.prompt = self.output.update_prompt(new_prompt)
195
+ self.prompt_char = new_prompt_char if (new_prompt_char)
196
+ end
197
+ end
198
+
199
+ #
200
+ # Output shortcuts
201
+ #
202
+
203
+ #
204
+ # Prints an error message to the output handle.
205
+ #
206
+ def print_error(msg='')
207
+ return if (output.nil?)
208
+
209
+ # Errors are not subject to disabled output
210
+ log_output(output.print_error(msg))
211
+ end
212
+
213
+ #
214
+ # Prints a status message to the output handle.
215
+ #
216
+ def print_status(msg='')
217
+ return if (disable_output == true)
218
+
219
+ log_output(output.print_status(msg))
220
+ end
221
+
222
+ #
223
+ # Prints a good message to the output handle.
224
+ #
225
+ def print_good(msg='')
226
+ return if (disable_output == true)
227
+
228
+ log_output(output.print_good(msg))
229
+ end
230
+
231
+ #
232
+ # Prints a line of text to the output handle.
233
+ #
234
+ def print_line(msg='')
235
+ return if (disable_output == true)
236
+
237
+ log_output(output.print_line(msg))
238
+ end
239
+
240
+ #
241
+ # Prints a raw message to the output handle.
242
+ #
243
+ def print(msg='')
244
+ return if (disable_output == true)
245
+ log_output(output.print(msg))
246
+ end
247
+
248
+ #
249
+ # Whether or not output has been disabled.
250
+ #
251
+ attr_accessor :disable_output
252
+ #
253
+ # The input handle to read user input from.
254
+ #
255
+ attr_reader :input
256
+ #
257
+ # The output handle to write output to.
258
+ #
259
+ attr_reader :output
260
+
261
+ protected
262
+
263
+ #
264
+ # Parse a line into an array of arguments.
265
+ #
266
+ def parse_line(line)
267
+ log_input(line)
268
+
269
+ line.gsub!(/(\r|\n)/, '')
270
+
271
+ begin
272
+ return args = Rex::Parser::Arguments.from_s(line)
273
+ rescue ::ArgumentError
274
+ print_error("Parse error: #{$!}")
275
+ end
276
+
277
+ return []
278
+ end
279
+
280
+ #
281
+ # Print the prompt, but do not log it.
282
+ #
283
+ def _print_prompt(prompt)
284
+ output.print(prompt)
285
+ end
286
+
287
+ #
288
+ # Writes the supplied input to the log source if one has been registered.
289
+ #
290
+ def log_input(buf)
291
+ rlog(buf, log_source) if (log_source)
292
+ end
293
+
294
+ #
295
+ # Writes the supplied output to the log source if one has been registered.
296
+ #
297
+ def log_output(buf)
298
+ rlog(buf, log_source) if (log_source)
299
+ end
300
+
301
+ attr_writer :input, :output # :nodoc:
302
+ attr_accessor :stop_flag, :init_prompt # :nodoc:
303
+ attr_accessor :prompt # :nodoc:
304
+ attr_accessor :prompt_char, :tab_complete_proc # :nodoc:
305
+ attr_accessor :histfile # :nodoc:
306
+ attr_accessor :log_source, :stop_count # :nodoc:
307
+
308
+ end
309
+
310
+ ###
311
+ #
312
+ # Pseudo-shell interface that simply includes the Shell mixin.
313
+ #
314
+ ###
315
+ class PseudoShell
316
+ include Shell
317
+ end
318
+
319
+
320
+ end end end
321
+