librex 0.0.20 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. data/Rakefile +1 -0
  2. data/lib/rex/LICENSE +29 -0
  3. data/lib/rex/arch.rb +103 -0
  4. data/lib/rex/arch/sparc.rb +75 -0
  5. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  6. data/lib/rex/arch/x86.rb +513 -0
  7. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  8. data/lib/rex/assembly/nasm.rb +104 -0
  9. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +311 -0
  12. data/lib/rex/constants.rb +113 -0
  13. data/lib/rex/elfparsey.rb +11 -0
  14. data/lib/rex/elfparsey/elf.rb +123 -0
  15. data/lib/rex/elfparsey/elfbase.rb +258 -0
  16. data/lib/rex/elfparsey/exceptions.rb +27 -0
  17. data/lib/rex/elfscan.rb +12 -0
  18. data/lib/rex/elfscan/scanner.rb +207 -0
  19. data/lib/rex/elfscan/search.rb +46 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +114 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  26. data/lib/rex/encoder/ndr.rb +89 -0
  27. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +106 -0
  31. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  32. data/lib/rex/encoder/xor.rb +69 -0
  33. data/lib/rex/encoder/xor/dword.rb +13 -0
  34. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  35. data/lib/rex/encoders/xor_dword.rb +35 -0
  36. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  37. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  38. data/lib/rex/encoding/xor.rb +20 -0
  39. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  40. data/lib/rex/encoding/xor/byte.rb +15 -0
  41. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  42. data/lib/rex/encoding/xor/dword.rb +21 -0
  43. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  44. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  45. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  47. data/lib/rex/encoding/xor/generic.rb +146 -0
  48. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  49. data/lib/rex/encoding/xor/qword.rb +15 -0
  50. data/lib/rex/encoding/xor/word.rb +21 -0
  51. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  52. data/lib/rex/exceptions.rb +275 -0
  53. data/lib/rex/exceptions.rb.ut.rb +44 -0
  54. data/lib/rex/exploitation/cmdstager.rb +9 -0
  55. data/lib/rex/exploitation/cmdstager/base.rb +175 -0
  56. data/lib/rex/exploitation/cmdstager/debug_asm.rb +142 -0
  57. data/lib/rex/exploitation/cmdstager/debug_write.rb +136 -0
  58. data/lib/rex/exploitation/cmdstager/tftp.rb +63 -0
  59. data/lib/rex/exploitation/cmdstager/vbs.rb +128 -0
  60. data/lib/rex/exploitation/egghunter.rb +277 -0
  61. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  62. data/lib/rex/exploitation/encryptjs.rb +77 -0
  63. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  64. data/lib/rex/exploitation/heaplib.rb +94 -0
  65. data/lib/rex/exploitation/javascriptosdetect.rb +897 -0
  66. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  67. data/lib/rex/exploitation/omelet.rb +320 -0
  68. data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
  69. data/lib/rex/exploitation/opcodedb.rb +818 -0
  70. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  71. data/lib/rex/exploitation/seh.rb +92 -0
  72. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  73. data/lib/rex/file.rb +112 -0
  74. data/lib/rex/file.rb.ut.rb +16 -0
  75. data/lib/rex/image_source.rb +12 -0
  76. data/lib/rex/image_source/disk.rb +60 -0
  77. data/lib/rex/image_source/image_source.rb +46 -0
  78. data/lib/rex/image_source/memory.rb +37 -0
  79. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  80. data/lib/rex/io/datagram_abstraction.rb +35 -0
  81. data/lib/rex/io/ring_buffer.rb +364 -0
  82. data/lib/rex/io/stream.rb +319 -0
  83. data/lib/rex/io/stream_abstraction.rb +197 -0
  84. data/lib/rex/io/stream_server.rb +211 -0
  85. data/lib/rex/job_container.rb +187 -0
  86. data/lib/rex/logging.rb +4 -0
  87. data/lib/rex/logging/log_dispatcher.rb +179 -0
  88. data/lib/rex/logging/log_sink.rb +42 -0
  89. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  90. data/lib/rex/logging/sinks/stderr.rb +43 -0
  91. data/lib/rex/machparsey.rb +9 -0
  92. data/lib/rex/machparsey/exceptions.rb +34 -0
  93. data/lib/rex/machparsey/mach.rb +209 -0
  94. data/lib/rex/machparsey/machbase.rb +408 -0
  95. data/lib/rex/machscan.rb +9 -0
  96. data/lib/rex/machscan/scanner.rb +217 -0
  97. data/lib/rex/mime.rb +9 -0
  98. data/lib/rex/mime/header.rb +77 -0
  99. data/lib/rex/mime/message.rb +144 -0
  100. data/lib/rex/mime/part.rb +20 -0
  101. data/lib/rex/nop/opty2.rb +108 -0
  102. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  103. data/lib/rex/nop/opty2_tables.rb +300 -0
  104. data/lib/rex/ole.rb +205 -0
  105. data/lib/rex/ole/clsid.rb +47 -0
  106. data/lib/rex/ole/difat.rb +141 -0
  107. data/lib/rex/ole/directory.rb +231 -0
  108. data/lib/rex/ole/direntry.rb +240 -0
  109. data/lib/rex/ole/docs/dependencies.txt +8 -0
  110. data/lib/rex/ole/docs/references.txt +1 -0
  111. data/lib/rex/ole/fat.rb +99 -0
  112. data/lib/rex/ole/header.rb +204 -0
  113. data/lib/rex/ole/minifat.rb +77 -0
  114. data/lib/rex/ole/propset.rb +144 -0
  115. data/lib/rex/ole/samples/create_ole.rb +27 -0
  116. data/lib/rex/ole/samples/dir.rb +35 -0
  117. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  118. data/lib/rex/ole/samples/ole_info.rb +23 -0
  119. data/lib/rex/ole/storage.rb +395 -0
  120. data/lib/rex/ole/stream.rb +53 -0
  121. data/lib/rex/ole/substorage.rb +49 -0
  122. data/lib/rex/ole/util.rb +157 -0
  123. data/lib/rex/parser/arguments.rb +97 -0
  124. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  125. data/lib/rex/parser/ini.rb +185 -0
  126. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  127. data/lib/rex/parser/ip360_aspl_xml.rb +102 -0
  128. data/lib/rex/parser/ip360_xml.rb +97 -0
  129. data/lib/rex/parser/nessus_xml.rb +118 -0
  130. data/lib/rex/parser/netsparker_xml.rb +94 -0
  131. data/lib/rex/parser/nexpose_xml.rb +136 -0
  132. data/lib/rex/parser/nmap_xml.rb +137 -0
  133. data/lib/rex/parser/retina_xml.rb +109 -0
  134. data/lib/rex/payloads.rb +1 -0
  135. data/lib/rex/payloads/win32.rb +2 -0
  136. data/lib/rex/payloads/win32/common.rb +26 -0
  137. data/lib/rex/payloads/win32/kernel.rb +53 -0
  138. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  139. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  140. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  141. data/lib/rex/payloads/win32/kernel/stager.rb +194 -0
  142. data/lib/rex/peparsey.rb +12 -0
  143. data/lib/rex/peparsey/exceptions.rb +32 -0
  144. data/lib/rex/peparsey/pe.rb +212 -0
  145. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  146. data/lib/rex/peparsey/pebase.rb +1680 -0
  147. data/lib/rex/peparsey/section.rb +136 -0
  148. data/lib/rex/pescan.rb +13 -0
  149. data/lib/rex/pescan/analyze.rb +309 -0
  150. data/lib/rex/pescan/scanner.rb +206 -0
  151. data/lib/rex/pescan/search.rb +56 -0
  152. data/lib/rex/platforms.rb +1 -0
  153. data/lib/rex/platforms/windows.rb +51 -0
  154. data/lib/rex/poly.rb +132 -0
  155. data/lib/rex/poly/block.rb +477 -0
  156. data/lib/rex/poly/register.rb +100 -0
  157. data/lib/rex/poly/register/x86.rb +40 -0
  158. data/lib/rex/post.rb +8 -0
  159. data/lib/rex/post/dir.rb +51 -0
  160. data/lib/rex/post/file.rb +172 -0
  161. data/lib/rex/post/file_stat.rb +220 -0
  162. data/lib/rex/post/gen.pl +13 -0
  163. data/lib/rex/post/io.rb +182 -0
  164. data/lib/rex/post/meterpreter.rb +4 -0
  165. data/lib/rex/post/meterpreter/channel.rb +445 -0
  166. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  167. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  168. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  169. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  170. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  171. data/lib/rex/post/meterpreter/client.rb +364 -0
  172. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  173. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  174. data/lib/rex/post/meterpreter/extension.rb +32 -0
  175. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  176. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  177. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  178. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  179. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  180. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
  181. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  182. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  183. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +111 -0
  184. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  185. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +101 -0
  186. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +26 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +282 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +266 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  198. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +208 -0
  199. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +6 -0
  200. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38106 -0
  201. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +31 -0
  202. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +47 -0
  203. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +36 -0
  204. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1818 -0
  205. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
  206. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3848 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +26 -0
  208. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
  209. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
  212. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +318 -0
  213. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +100 -0
  214. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +42 -0
  215. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +148 -0
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +127 -0
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +309 -0
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +204 -0
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +51 -0
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +630 -0
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +75 -0
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +103 -0
  223. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +149 -0
  224. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  225. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +370 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +211 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +63 -0
  240. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  241. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  242. data/lib/rex/post/meterpreter/packet.rb +688 -0
  243. data/lib/rex/post/meterpreter/packet_dispatcher.rb +431 -0
  244. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  245. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  246. data/lib/rex/post/meterpreter/ui/console.rb +137 -0
  247. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  248. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +730 -0
  249. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  250. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  251. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +231 -0
  252. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  253. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  254. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  255. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  256. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  257. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +65 -0
  258. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +442 -0
  259. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +298 -0
  260. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +486 -0
  261. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  262. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +157 -0
  263. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  264. data/lib/rex/post/permission.rb +26 -0
  265. data/lib/rex/post/process.rb +57 -0
  266. data/lib/rex/post/thread.rb +57 -0
  267. data/lib/rex/post/ui.rb +52 -0
  268. data/lib/rex/proto.rb +13 -0
  269. data/lib/rex/proto.rb.ts.rb +8 -0
  270. data/lib/rex/proto/dcerpc.rb +6 -0
  271. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  272. data/lib/rex/proto/dcerpc/client.rb +361 -0
  273. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  274. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  275. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  276. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  277. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  278. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  279. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  280. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  281. data/lib/rex/proto/dcerpc/response.rb +187 -0
  282. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  283. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  284. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  285. data/lib/rex/proto/dhcp.rb +7 -0
  286. data/lib/rex/proto/dhcp/constants.rb +33 -0
  287. data/lib/rex/proto/dhcp/server.rb +292 -0
  288. data/lib/rex/proto/drda.rb +5 -0
  289. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  290. data/lib/rex/proto/drda/constants.rb +49 -0
  291. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  292. data/lib/rex/proto/drda/packet.rb +252 -0
  293. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  294. data/lib/rex/proto/drda/utils.rb +123 -0
  295. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  296. data/lib/rex/proto/http.rb +5 -0
  297. data/lib/rex/proto/http.rb.ts.rb +12 -0
  298. data/lib/rex/proto/http/client.rb +821 -0
  299. data/lib/rex/proto/http/client.rb.ut.rb +95 -0
  300. data/lib/rex/proto/http/handler.rb +46 -0
  301. data/lib/rex/proto/http/handler/erb.rb +128 -0
  302. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  303. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  304. data/lib/rex/proto/http/handler/proc.rb +60 -0
  305. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  306. data/lib/rex/proto/http/header.rb +161 -0
  307. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  308. data/lib/rex/proto/http/packet.rb +407 -0
  309. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  310. data/lib/rex/proto/http/request.rb +356 -0
  311. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  312. data/lib/rex/proto/http/response.rb +90 -0
  313. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  314. data/lib/rex/proto/http/server.rb +369 -0
  315. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  316. data/lib/rex/proto/ntlm.rb +7 -0
  317. data/lib/rex/proto/ntlm.rb.ut.rb +177 -0
  318. data/lib/rex/proto/ntlm/base.rb +326 -0
  319. data/lib/rex/proto/ntlm/constants.rb +74 -0
  320. data/lib/rex/proto/ntlm/crypt.rb +415 -0
  321. data/lib/rex/proto/ntlm/exceptions.rb +16 -0
  322. data/lib/rex/proto/ntlm/message.rb +536 -0
  323. data/lib/rex/proto/ntlm/utils.rb +764 -0
  324. data/lib/rex/proto/proxy/socks4a.rb +440 -0
  325. data/lib/rex/proto/rfb.rb +19 -0
  326. data/lib/rex/proto/rfb.rb.ut.rb +37 -0
  327. data/lib/rex/proto/rfb/cipher.rb +84 -0
  328. data/lib/rex/proto/rfb/client.rb +207 -0
  329. data/lib/rex/proto/rfb/constants.rb +52 -0
  330. data/lib/rex/proto/smb.rb +7 -0
  331. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  332. data/lib/rex/proto/smb/client.rb +1952 -0
  333. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  334. data/lib/rex/proto/smb/constants.rb +1047 -0
  335. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  336. data/lib/rex/proto/smb/crypt.rb +36 -0
  337. data/lib/rex/proto/smb/evasions.rb +66 -0
  338. data/lib/rex/proto/smb/exceptions.rb +858 -0
  339. data/lib/rex/proto/smb/simpleclient.rb +306 -0
  340. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  341. data/lib/rex/proto/smb/utils.rb +103 -0
  342. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  343. data/lib/rex/proto/sunrpc.rb +1 -0
  344. data/lib/rex/proto/sunrpc/client.rb +195 -0
  345. data/lib/rex/proto/tftp.rb +12 -0
  346. data/lib/rex/proto/tftp/constants.rb +39 -0
  347. data/lib/rex/proto/tftp/server.rb +497 -0
  348. data/lib/rex/proto/tftp/server.rb.ut.rb +28 -0
  349. data/lib/rex/script.rb +42 -0
  350. data/lib/rex/script/base.rb +59 -0
  351. data/lib/rex/script/meterpreter.rb +15 -0
  352. data/lib/rex/script/shell.rb +9 -0
  353. data/lib/rex/service.rb +48 -0
  354. data/lib/rex/service_manager.rb +141 -0
  355. data/lib/rex/service_manager.rb.ut.rb +32 -0
  356. data/lib/rex/services/local_relay.rb +423 -0
  357. data/lib/rex/socket.rb +684 -0
  358. data/lib/rex/socket.rb.ut.rb +107 -0
  359. data/lib/rex/socket/comm.rb +119 -0
  360. data/lib/rex/socket/comm/local.rb +412 -0
  361. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  362. data/lib/rex/socket/ip.rb +130 -0
  363. data/lib/rex/socket/parameters.rb +345 -0
  364. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  365. data/lib/rex/socket/range_walker.rb +346 -0
  366. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  367. data/lib/rex/socket/ssl_tcp.rb +184 -0
  368. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  369. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  370. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +61 -0
  371. data/lib/rex/socket/subnet_walker.rb +75 -0
  372. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  373. data/lib/rex/socket/switch_board.rb +278 -0
  374. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  375. data/lib/rex/socket/tcp.rb +76 -0
  376. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  377. data/lib/rex/socket/tcp_server.rb +66 -0
  378. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  379. data/lib/rex/socket/udp.rb +164 -0
  380. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  381. data/lib/rex/struct2.rb +5 -0
  382. data/lib/rex/struct2/c_struct.rb +181 -0
  383. data/lib/rex/struct2/c_struct_template.rb +39 -0
  384. data/lib/rex/struct2/constant.rb +26 -0
  385. data/lib/rex/struct2/element.rb +44 -0
  386. data/lib/rex/struct2/generic.rb +73 -0
  387. data/lib/rex/struct2/restraint.rb +54 -0
  388. data/lib/rex/struct2/s_string.rb +72 -0
  389. data/lib/rex/struct2/s_struct.rb +111 -0
  390. data/lib/rex/sync.rb +6 -0
  391. data/lib/rex/sync/event.rb +94 -0
  392. data/lib/rex/sync/read_write_lock.rb +176 -0
  393. data/lib/rex/sync/ref.rb +57 -0
  394. data/lib/rex/sync/thread_safe.rb +82 -0
  395. data/lib/rex/test.rb +35 -0
  396. data/lib/rex/text.rb +1163 -0
  397. data/lib/rex/text.rb.ut.rb +190 -0
  398. data/lib/rex/thread_factory.rb +42 -0
  399. data/lib/rex/time.rb +65 -0
  400. data/lib/rex/transformer.rb +115 -0
  401. data/lib/rex/transformer.rb.ut.rb +38 -0
  402. data/lib/rex/ui.rb +21 -0
  403. data/lib/rex/ui/interactive.rb +298 -0
  404. data/lib/rex/ui/output.rb +78 -0
  405. data/lib/rex/ui/output/none.rb +18 -0
  406. data/lib/rex/ui/progress_tracker.rb +96 -0
  407. data/lib/rex/ui/subscriber.rb +149 -0
  408. data/lib/rex/ui/text/color.rb +97 -0
  409. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  410. data/lib/rex/ui/text/dispatcher_shell.rb +467 -0
  411. data/lib/rex/ui/text/input.rb +117 -0
  412. data/lib/rex/ui/text/input/buffer.rb +75 -0
  413. data/lib/rex/ui/text/input/readline.rb +129 -0
  414. data/lib/rex/ui/text/input/socket.rb +95 -0
  415. data/lib/rex/ui/text/input/stdio.rb +45 -0
  416. data/lib/rex/ui/text/irb_shell.rb +57 -0
  417. data/lib/rex/ui/text/output.rb +80 -0
  418. data/lib/rex/ui/text/output/buffer.rb +61 -0
  419. data/lib/rex/ui/text/output/file.rb +43 -0
  420. data/lib/rex/ui/text/output/socket.rb +43 -0
  421. data/lib/rex/ui/text/output/stdio.rb +40 -0
  422. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  423. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  424. data/lib/rex/ui/text/shell.rb +328 -0
  425. data/lib/rex/ui/text/table.rb +279 -0
  426. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  427. data/lib/rex/zip.rb +93 -0
  428. data/lib/rex/zip/archive.rb +184 -0
  429. data/lib/rex/zip/blocks.rb +182 -0
  430. data/lib/rex/zip/entry.rb +104 -0
  431. data/lib/rex/zip/samples/comment.rb +32 -0
  432. data/lib/rex/zip/samples/mkwar.rb +138 -0
  433. data/lib/rex/zip/samples/mkzip.rb +19 -0
  434. data/lib/rex/zip/samples/recursive.rb +58 -0
  435. metadata +434 -1
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Revision: 9333 $
4
+ #
5
+ # $Id: server.rb.ut.rb 9333 2010-05-21 00:03:04Z jduck $
6
+ #
7
+
8
+ require 'rex/compat'
9
+ require 'rex/proto/tftp'
10
+
11
+ content = nil
12
+
13
+ fn = ARGV.shift
14
+ if (fn and fn.length > 0)
15
+ File.open(fn, "rb") do |fd|
16
+ content = fd.read(fd.stat.size)
17
+ end
18
+ end
19
+
20
+ content ||= "A" * (1024*1024)
21
+
22
+
23
+ tftp = Rex::Proto::TFTP::Server.new
24
+ tftp.register_file("poo", content)
25
+ tftp.start
26
+
27
+ #loop { break if not tftp.thread.alive? }
28
+ tftp.thread.join
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+
5
+ ###
6
+ #
7
+ # This class provides an easy interface for loading and executing ruby
8
+ # scripts.
9
+ #
10
+ ###
11
+ module Script
12
+
13
+ class Completed < ::RuntimeError
14
+ end
15
+
16
+ #
17
+ # Reads the contents of the supplied file and exeutes them.
18
+ #
19
+ def self.execute_file(file, in_binding = nil)
20
+ str = ''
21
+ buf = ::File.read(file, ::File.size(file))
22
+ execute(buf, in_binding)
23
+ end
24
+
25
+ #
26
+ # Executes arbitrary ruby from the supplied string.
27
+ #
28
+ def self.execute(str, in_binding = nil)
29
+ begin
30
+ eval(str, in_binding)
31
+ rescue Completed
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ require 'rex/script/base'
40
+ require 'rex/script/shell'
41
+ require 'rex/script/meterpreter'
42
+
@@ -0,0 +1,59 @@
1
+ module Rex
2
+ module Script
3
+ class Base
4
+
5
+ class OutputSink
6
+ def print(msg); end
7
+ def print_line(msg); end
8
+ def print_status(msg); end
9
+ def print_good(msg); end
10
+ def print_error(msg); end
11
+ end
12
+
13
+ attr_accessor :client, :framework, :path, :error, :args
14
+ attr_accessor :session, :sink, :workspace
15
+
16
+ def initialize(client, path)
17
+ self.client = client
18
+ self.framework = client.framework
19
+ self.path = path
20
+ self.sink = OutputSink.new
21
+
22
+ if(client.framework.db and client.framework.db.active)
23
+ self.workspace = client.framework.db.find_workspace( client.workspace.to_s ) || client.framework.db.workspace
24
+ end
25
+
26
+ # Convenience aliases
27
+ self.session = self.client
28
+ end
29
+
30
+ def output
31
+ client.user_output || self.sink
32
+ end
33
+
34
+ def completed
35
+ raise Rex::Script::Completed
36
+ end
37
+
38
+ def run(args=[])
39
+ self.args = args = args.flatten
40
+ begin
41
+ eval(::File.read(self.path, ::File.size(self.path)), binding )
42
+ rescue ::Interrupt
43
+ rescue ::Rex::Script::Completed
44
+ rescue ::Exception => e
45
+ self.error = e
46
+ raise e
47
+ end
48
+ end
49
+
50
+ def print(*args); output.print(*args); end
51
+ def print_status(*args); output.print_status(*args); end
52
+ def print_error(*args); output.print_error(*args); end
53
+ def print_good(*args); output.print_good(*args); end
54
+ def print_line(*args); output.print_line(*args); end
55
+
56
+ end
57
+ end
58
+ end
59
+
@@ -0,0 +1,15 @@
1
+
2
+ module Rex
3
+ module Script
4
+ class Meterpreter < Base
5
+
6
+ begin
7
+ require 'msf/scripts/meterpreter'
8
+ include Msf::Scripts::Meterpreter::Common
9
+ rescue ::LoadError
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,9 @@
1
+
2
+ module Rex
3
+ module Script
4
+ class Shell < Base
5
+
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,48 @@
1
+ require 'rex'
2
+ require 'rex/proto'
3
+
4
+ module Rex
5
+
6
+ ###
7
+ #
8
+ # The service module is used to extend classes that are passed into the
9
+ # service manager start routine. It provides extra methods, such as reference
10
+ # counting, that are used to track the service instances more uniformly.
11
+ #
12
+ ###
13
+ module Service
14
+ include Ref
15
+
16
+ require 'rex/services/local_relay'
17
+
18
+ #
19
+ # Returns the hardcore, as in porno, alias for this service. This is used
20
+ # by the service manager to manage singleton services.
21
+ #
22
+ def self.hardcore_alias(*args)
23
+ return "__#{args}"
24
+ end
25
+
26
+ def deref
27
+ rv = super
28
+
29
+ # If there's only one reference, then it's the service managers.
30
+ if @_references == 1
31
+ Rex::ServiceManager.stop_service(self)
32
+ end
33
+
34
+ rv
35
+ end
36
+
37
+ #
38
+ # Calls stop on the service once the ref count drops.
39
+ #
40
+ def cleanup
41
+ stop
42
+ end
43
+
44
+ attr_accessor :alias
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,141 @@
1
+ require 'singleton'
2
+ require 'rex'
3
+ require 'rex/service'
4
+
5
+ module Rex
6
+
7
+ ###
8
+ #
9
+ # This class manages service allocation and interaction. This class can be
10
+ # used to start HTTP servers and manage them and all that stuff. Yup.
11
+ #
12
+ ###
13
+ class ServiceManager < Hash
14
+
15
+ #
16
+ # This class is a singleton.
17
+ #
18
+ include Singleton
19
+
20
+ #
21
+ # Calls the instance method to start a service.
22
+ #
23
+ def self.start(klass, *args)
24
+ self.instance.start(klass, *args)
25
+ end
26
+
27
+ #
28
+ # Calls the instance method to stop a service.
29
+ #
30
+ def self.stop(klass, *args)
31
+ self.instance.stop(klass, *args)
32
+ end
33
+
34
+ #
35
+ # Stop a service using the alias that's associated with it.
36
+ #
37
+ def self.stop_by_alias(als)
38
+ self.instance.stop_by_alias(als)
39
+ end
40
+
41
+ #
42
+ # Stop the supplied service instance.
43
+ #
44
+ def self.stop_service(service)
45
+ self.instance.stop_service(service)
46
+ end
47
+
48
+ #
49
+ # Starts a service and assigns it a unique name in the service hash.
50
+ #
51
+ def start(klass, *args)
52
+ # Get the hardcore alias.
53
+ hals = "#{klass}" + klass.hardcore_alias(*args)
54
+
55
+ # Has a service already been constructed for this guy? If so, increment
56
+ # its reference count like it aint no thang.
57
+ if (inst = self[hals])
58
+ inst.ref
59
+ return inst
60
+ end
61
+
62
+ inst = klass.new(*args)
63
+ als = inst.alias
64
+
65
+ # Find an alias that isn't taken.
66
+ if (self[als])
67
+ cnt = 1
68
+ cnt += 1 while (self[als + " #{cnt}"])
69
+ als = inst.alias + " #{cnt}"
70
+ end
71
+
72
+ # Extend the instance as a service.
73
+ inst.extend(Rex::Service)
74
+
75
+ # Re-aliases the instance.
76
+ inst.alias = als
77
+
78
+ # Fire up the engines. If an error occurs an exception will be
79
+ # raised.
80
+ inst.start
81
+
82
+ # Alias associate and initialize reference counting
83
+ self[als] = self[hals] = inst.refinit
84
+
85
+ # Pass the caller a reference
86
+ inst.ref
87
+
88
+ inst
89
+ end
90
+
91
+ #
92
+ # Stop a service using a given klass and arguments. These should mirror
93
+ # what was originally passed to start exactly. If the reference count of
94
+ # the service drops to zero the service will be destroyed.
95
+ #
96
+ def stop(klass, *args)
97
+ stop_service(hals[hardcore_alias(klass, *args)])
98
+ end
99
+
100
+ #
101
+ # Stops a service using the provided alias.
102
+ #
103
+ def stop_by_alias(als)
104
+ stop_service(self[als])
105
+ end
106
+
107
+ #
108
+ # Stops a service instance.
109
+ #
110
+ def stop_service(inst)
111
+ # Stop the service and be done wif it, but only if the number of
112
+ # references has dropped to zero
113
+ if (inst)
114
+ # Since the instance may have multiple aliases, scan through
115
+ # all the pairs for matching stuff.
116
+ self.each_pair { |cals, cinst|
117
+ self.delete(cals) if (inst == cinst)
118
+ }
119
+
120
+ # Lose the list-held reference to the instance
121
+ inst.deref
122
+
123
+ return true
124
+ end
125
+
126
+ # Return false if the service isn't there
127
+ return false
128
+ end
129
+
130
+ protected
131
+
132
+ #
133
+ # Returns the alias for a given service instance.
134
+ #
135
+ def hardcore_alias(klass, *args)
136
+ "__#{klass.name}#{args}"
137
+ end
138
+
139
+ end
140
+
141
+ end
@@ -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 = Rex::ThreadFactory.spawn("LocalRelay", false) {
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 = Rex::ThreadSafe.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: #{$!.class} #{$!}", '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
+