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,32 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/service_manager'
7
+
8
+ class Rex::ServiceManager::UnitTest < Test::Unit::TestCase
9
+
10
+ Klass = Rex::ServiceManager
11
+
12
+ def test_svcm
13
+ begin
14
+ c = Klass
15
+ s = c.start(Rex::Proto::Http::Server, 8090)
16
+ assert_not_nil(s)
17
+ t = c.start(Rex::Proto::Http::Server, 8090)
18
+ assert_not_nil(t)
19
+ assert_equal(s, t)
20
+ z = c.start(Rex::Proto::Http::Server, 8091)
21
+ assert_not_equal(t, z)
22
+ assert_equal("HTTP Server", s.alias)
23
+ assert_equal("HTTP Server 1", z.alias)
24
+ ensure
25
+ c.stop_by_alias(s.alias) if (s)
26
+ c.stop_by_alias(z.alias) if (z)
27
+ c.stop_by_alias(t.alias) if (t)
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,423 @@
1
+ require 'thread'
2
+ require 'rex/socket'
3
+
4
+ module Rex
5
+ module Services
6
+
7
+ ###
8
+ #
9
+ # This service acts as a local TCP relay whereby clients can connect to a
10
+ # local listener that forwards to an arbitrary remote endpoint. Interaction
11
+ # with the remote endpoint socket requires that it implement the
12
+ # Rex::IO::Stream interface.
13
+ #
14
+ ###
15
+ class LocalRelay
16
+
17
+ include Rex::Service
18
+
19
+ ###
20
+ #
21
+ # This module is used to extend streams such that they can be associated
22
+ # with a relay context and the other side of the stream.
23
+ #
24
+ ###
25
+ module Stream
26
+
27
+ #
28
+ # This method is called when the other side has data that has been read
29
+ # in.
30
+ #
31
+ def on_other_data(data)
32
+ if (relay.on_other_data_proc)
33
+ relay.on_other_data_proc.call(relay, self, data)
34
+ else
35
+ put(data)
36
+ end
37
+ end
38
+
39
+ attr_accessor :relay
40
+ attr_accessor :other_stream
41
+ end
42
+
43
+ ###
44
+ #
45
+ # This module is used to extend stream servers such that they can be
46
+ # associated with a relay context.
47
+ #
48
+ ###
49
+ module StreamServer
50
+
51
+ #
52
+ # This method is called when the stream server receives a local
53
+ # connection such that the remote half can be allocated. The return
54
+ # value of the callback should be a Stream instance.
55
+ #
56
+ def on_local_connection(relay, lfd)
57
+ if (relay.on_local_connection_proc)
58
+ relay.on_local_connection_proc.call(relay, lfd)
59
+ end
60
+ end
61
+
62
+ attr_accessor :relay
63
+ end
64
+
65
+
66
+ ###
67
+ #
68
+ # This class acts as an instance of a given local relay.
69
+ #
70
+ ###
71
+ class Relay
72
+
73
+ def initialize(name, listener, opts = {})
74
+ self.name = name
75
+ self.listener = listener
76
+ self.opts = opts
77
+ self.on_local_connection_proc = opts['OnLocalConnection']
78
+ self.on_conn_close_proc = opts['OnConnectionClose']
79
+ self.on_other_data_proc = opts['OnOtherData']
80
+ if (not $dispatcher['rex'])
81
+ register_log_source('rex', $dispatcher['core'], get_log_level('core'))
82
+ end
83
+ end
84
+
85
+ def shutdown
86
+ begin
87
+ listener.shutdown if (listener)
88
+ rescue ::Exception
89
+ end
90
+ end
91
+
92
+ def close
93
+ begin
94
+ listener.close if (listener)
95
+ rescue ::Exception
96
+ end
97
+ listener = nil
98
+ end
99
+
100
+ attr_reader :name, :listener, :opts
101
+ attr_accessor :on_local_connection_proc
102
+ attr_accessor :on_conn_close_proc
103
+ attr_accessor :on_other_data_proc
104
+ protected
105
+ attr_writer :name, :listener, :opts
106
+
107
+ end
108
+
109
+ #
110
+ # Initializes the local tcp relay monitor.
111
+ #
112
+ def initialize
113
+ self.relays = Hash.new
114
+ self.rfds = Array.new
115
+ self.relay_thread = nil
116
+ self.relay_mutex = Mutex.new
117
+ end
118
+
119
+ ##
120
+ #
121
+ # Service interface implementors
122
+ #
123
+ ##
124
+
125
+ #
126
+ # Returns the hardcore alias for the local relay service.
127
+ #
128
+ def self.hardcore_alias(*args)
129
+ "__#{args}"
130
+ end
131
+
132
+ #
133
+ # Returns the alias for this service.
134
+ #
135
+ def alias
136
+ super || "Local Relay"
137
+ end
138
+
139
+ #
140
+ # Starts the thread that monitors the local relays.
141
+ #
142
+ def start
143
+ if (!self.relay_thread)
144
+ self.relay_thread = Thread.new {
145
+ begin
146
+ monitor_relays
147
+ rescue ::Exception
148
+ elog("Error in #{self} monitor_relays: #{$!}", 'rex')
149
+ end
150
+ }
151
+ end
152
+ end
153
+
154
+ #
155
+ # Stops the thread that monitors the local relays and destroys all local
156
+ # listeners.
157
+ #
158
+ def stop
159
+ if (self.relay_thread)
160
+ self.relay_thread.kill
161
+ self.relay_thread = nil
162
+ end
163
+
164
+ self.relay_mutex.synchronize {
165
+ self.relays.delete_if { |k, v|
166
+ v.shutdown
167
+ v.close
168
+ true
169
+ }
170
+ }
171
+
172
+ # Flush the relay list and read fd list
173
+ self.relays.clear
174
+ self.rfds.clear
175
+ end
176
+
177
+ ##
178
+ #
179
+ # Adding/removing local tcp relays
180
+ #
181
+ ##
182
+
183
+ #
184
+ # Starts a local TCP relay.
185
+ #
186
+ def start_tcp_relay(lport, opts = {})
187
+ # Make sure our options are valid
188
+ if ((opts['PeerHost'] == nil or opts['PeerPort'] == nil) and (opts['Stream'] != true))
189
+ raise ArgumentError, "Missing peer host or peer port.", caller
190
+ end
191
+
192
+ listener = Rex::Socket.create_tcp_server(
193
+ 'LocalHost' => opts['LocalHost'],
194
+ 'LocalPort' => lport)
195
+
196
+ opts['LocalPort'] = lport
197
+ opts['__RelayType'] = 'tcp'
198
+
199
+ start_relay(listener, lport.to_s + (opts['LocalHost'] || '0.0.0.0'), opts)
200
+ end
201
+
202
+ #
203
+ # Starts a local relay on the supplied local port. This listener will call
204
+ # the supplied callback procedures when various events occur.
205
+ #
206
+ def start_relay(stream_server, name, opts = {})
207
+ # Create a Relay instance with the local stream and remote stream
208
+ relay = Relay.new(name, stream_server, opts)
209
+
210
+ # Extend the stream_server so that we can associate it with this relay
211
+ stream_server.extend(StreamServer)
212
+ stream_server.relay = relay
213
+
214
+ # Add the stream associations the appropriate lists and hashes
215
+ self.relay_mutex.synchronize {
216
+ self.relays[name] = relay
217
+
218
+ self.rfds << stream_server
219
+ }
220
+ end
221
+
222
+ #
223
+ # Stops relaying on a given local port.
224
+ #
225
+ def stop_tcp_relay(lport, lhost = nil)
226
+ stop_relay(lport.to_s + (lhost || '0.0.0.0'))
227
+ end
228
+
229
+ #
230
+ # Stops a relay with a given name.
231
+ #
232
+ def stop_relay(name)
233
+ rv = false
234
+
235
+ self.relay_mutex.synchronize {
236
+ relay = self.relays[name]
237
+
238
+ if (relay)
239
+ close_relay(relay)
240
+ rv = true
241
+ end
242
+ }
243
+
244
+ rv
245
+ end
246
+
247
+ #
248
+ # Enumerate each TCP relay
249
+ #
250
+ def each_tcp_relay(&block)
251
+ self.relays.each_pair { |name, relay|
252
+ next if (relay.opts['__RelayType'] != 'tcp')
253
+
254
+ yield(
255
+ relay.opts['LocalHost'] || '0.0.0.0',
256
+ relay.opts['LocalPort'],
257
+ relay.opts['PeerHost'],
258
+ relay.opts['PeerPort'],
259
+ relay.opts)
260
+ }
261
+ end
262
+
263
+ protected
264
+
265
+ attr_accessor :relays, :relay_thread, :relay_mutex
266
+ attr_accessor :rfds
267
+
268
+ #
269
+ # Closes an cleans up a specific relay
270
+ #
271
+ def close_relay(relay)
272
+ self.rfds.delete(relay.listener)
273
+ self.relays.delete(relay.name)
274
+
275
+ begin
276
+ relay.shutdown
277
+ relay.close
278
+ rescue IOError
279
+ end
280
+ end
281
+
282
+ #
283
+ # Closes a specific relay connection without tearing down the actual relay
284
+ # itself.
285
+ #
286
+ def close_relay_conn(fd)
287
+ relay = fd.relay
288
+ ofd = fd.other_stream
289
+
290
+ self.rfds.delete(fd)
291
+
292
+ begin
293
+ if (relay.on_conn_close_proc)
294
+ relay.on_conn_close_proc.call(fd)
295
+ end
296
+
297
+ fd.shutdown
298
+ fd.close
299
+ rescue IOError
300
+ end
301
+
302
+ if (ofd)
303
+ self.rfds.delete(ofd)
304
+
305
+ begin
306
+ if (relay.on_conn_close_proc)
307
+ relay.on_conn_close_proc.call(ofd)
308
+ end
309
+
310
+ ofd.shutdown
311
+ ofd.close
312
+ rescue IOError
313
+ end
314
+ end
315
+ end
316
+
317
+ #
318
+ # Accepts a client connection on a local relay.
319
+ #
320
+ def accept_relay_conn(srvfd)
321
+ relay = srvfd.relay
322
+
323
+ begin
324
+ dlog("Accepting relay client connection...", 'rex', LEV_3)
325
+
326
+ # Accept the child connection
327
+ lfd = srvfd.accept
328
+ dlog("Got left side of relay: #{lfd}", 'rex', LEV_3)
329
+
330
+ # Call the relay's on_local_connection method which should return a
331
+ # remote connection on success
332
+ rfd = srvfd.on_local_connection(relay, lfd)
333
+
334
+ dlog("Got right side of relay: #{rfd}", 'rex', LEV_3)
335
+ rescue
336
+ wlog("Failed to get remote half of local connection on relay #{relay.name}: #{$!}", 'rex')
337
+ lfd.close
338
+ return
339
+ end
340
+
341
+ # If we have both sides, then we rock. Extend the instances, associate
342
+ # them with the relay, associate them with each other, and add them to
343
+ # the list of polling file descriptors
344
+ if (lfd and rfd)
345
+ lfd.extend(Stream)
346
+ rfd.extend(Stream)
347
+
348
+ lfd.relay = relay
349
+ rfd.relay = relay
350
+
351
+ lfd.other_stream = rfd
352
+ rfd.other_stream = lfd
353
+
354
+ self.rfds << lfd
355
+ self.rfds << rfd
356
+
357
+ # Otherwise, we don't have both sides, we'll close them.
358
+ else
359
+ close_relay_conn(lfd)
360
+ end
361
+ end
362
+
363
+ #
364
+ # Monitors the relays for data and passes it in both directions.
365
+ #
366
+ def monitor_relays
367
+ begin
368
+ # Helps with latency
369
+ Thread.current.priority = 2
370
+
371
+ # Poll all the streams...
372
+ begin
373
+ socks = select(rfds, nil, nil, 0.25)
374
+ rescue StreamClosedError => e
375
+ dlog("monitor_relays: closing stream #{e.stream}", 'rex', LEV_3)
376
+
377
+ # Close the relay connection that is associated with the stream
378
+ # closed error
379
+ if (e.stream.kind_of?(Stream))
380
+ close_relay_conn(e.stream)
381
+ end
382
+
383
+ dlog("monitor_relays: closed stream #{e.stream}", 'rex', LEV_3)
384
+
385
+ next
386
+ rescue
387
+ elog("Error in #{self} monitor_relays select: #{$!}", 'rex')
388
+ return
389
+ end
390
+
391
+ # If socks is nil, go again.
392
+ next unless socks
393
+
394
+ # Process read-ready file descriptors, if any.
395
+ socks[0].each { |rfd|
396
+
397
+ # If this file descriptor is a server, accept the connection
398
+ if (rfd.kind_of?(StreamServer))
399
+ accept_relay_conn(rfd)
400
+ # Otherwise, it's a relay connection, read data from one side
401
+ # and write it to the other
402
+ else
403
+ begin
404
+ # Pass the data onto the other fd, most likely writing it.
405
+ data = rfd.sysread(65536)
406
+ rfd.other_stream.on_other_data(data)
407
+ # If we catch an error, close the connection
408
+ rescue ::Exception
409
+ elog("Error in #{self} monitor_relays read: #{$!}", 'rex')
410
+ close_relay_conn(rfd)
411
+ end
412
+ end
413
+
414
+ } if (socks[0])
415
+
416
+ end while true
417
+ end
418
+
419
+ end
420
+
421
+ end
422
+ end
423
+