dstruct 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 (491) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +23 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -0
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -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 +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -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 +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +326 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. metadata +536 -0
@@ -0,0 +1,16 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Script
5
+ class Meterpreter < Base
6
+
7
+ begin
8
+ require 'msf/scripts/meterpreter'
9
+ include Msf::Scripts::Meterpreter::Common
10
+ rescue ::LoadError
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,10 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Script
5
+ class Shell < Base
6
+
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,49 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex'
3
+ require 'rex/proto'
4
+
5
+ module Rex
6
+
7
+ ###
8
+ #
9
+ # The service module is used to extend classes that are passed into the
10
+ # service manager start routine. It provides extra methods, such as reference
11
+ # counting, that are used to track the service instances more uniformly.
12
+ #
13
+ ###
14
+ module Service
15
+ include Ref
16
+
17
+ require 'rex/services/local_relay'
18
+
19
+ #
20
+ # Returns the hardcore, as in porno, alias for this service. This is used
21
+ # by the service manager to manage singleton services.
22
+ #
23
+ def self.hardcore_alias(*args)
24
+ return "__#{args}"
25
+ end
26
+
27
+ def deref
28
+ rv = super
29
+
30
+ # If there's only one reference, then it's the service managers.
31
+ if @_references == 1
32
+ Rex::ServiceManager.stop_service(self)
33
+ end
34
+
35
+ rv
36
+ end
37
+
38
+ #
39
+ # Calls stop on the service once the ref count drops.
40
+ #
41
+ def cleanup
42
+ stop
43
+ end
44
+
45
+ attr_accessor :alias
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,154 @@
1
+ # -*- coding: binary -*-
2
+ require 'singleton'
3
+ require 'rex'
4
+ require 'rex/service'
5
+
6
+ module Rex
7
+
8
+ ###
9
+ #
10
+ # This class manages service allocation and interaction. This class can be
11
+ # used to start HTTP servers and manage them and all that stuff. Yup.
12
+ #
13
+ ###
14
+ class ServiceManager < Hash
15
+
16
+ #
17
+ # This class is a singleton.
18
+ #
19
+ include Singleton
20
+
21
+ #
22
+ # Calls the instance method to start a service.
23
+ #
24
+ def self.start(klass, *args)
25
+ self.instance.start(klass, *args)
26
+ end
27
+
28
+ #
29
+ # Calls the instance method to stop a service.
30
+ #
31
+ def self.stop(klass, *args)
32
+ self.instance.stop(klass, *args)
33
+ end
34
+
35
+ #
36
+ # Stop a service using the alias that's associated with it.
37
+ #
38
+ def self.stop_by_alias(als)
39
+ self.instance.stop_by_alias(als)
40
+ end
41
+
42
+ #
43
+ # Stop the supplied service instance.
44
+ #
45
+ def self.stop_service(service)
46
+ self.instance.stop_service(service)
47
+ end
48
+
49
+ #
50
+ # Starts a service and assigns it a unique name in the service hash.
51
+ #
52
+ def start(klass, *args)
53
+ # Get the hardcore alias.
54
+ hals = "#{klass}" + klass.hardcore_alias(*args)
55
+
56
+ # Has a service already been constructed for this guy? If so, increment
57
+ # its reference count like it aint no thang.
58
+ if (inst = self[hals])
59
+ inst.ref
60
+ return inst
61
+ end
62
+
63
+ inst = klass.new(*args)
64
+ als = inst.alias
65
+
66
+ # Find an alias that isn't taken.
67
+ if (self[als])
68
+ cnt = 1
69
+ cnt += 1 while (self[als + " #{cnt}"])
70
+ als = inst.alias + " #{cnt}"
71
+ end
72
+
73
+ # Extend the instance as a service.
74
+ inst.extend(Rex::Service)
75
+
76
+ # Re-aliases the instance.
77
+ inst.alias = als
78
+
79
+ # Fire up the engines. If an error occurs an exception will be
80
+ # raised.
81
+ inst.start
82
+
83
+ # Alias associate and initialize reference counting
84
+ self[als] = self[hals] = inst.refinit
85
+
86
+ # Pass the caller a reference
87
+ inst.ref
88
+
89
+ inst
90
+ end
91
+
92
+ #
93
+ # Stop a service using a given klass and arguments. These should mirror
94
+ # what was originally passed to start exactly. If the reference count of
95
+ # the service drops to zero the service will be destroyed.
96
+ #
97
+ def stop(klass, *args)
98
+ stop_service(hals[hardcore_alias(klass, *args)])
99
+ end
100
+
101
+ #
102
+ # Stops a service using the provided alias.
103
+ #
104
+ def stop_by_alias(als)
105
+ stop_service(self[als])
106
+ end
107
+
108
+ #
109
+ # Stops a service instance.
110
+ #
111
+ def stop_service(inst)
112
+ # Stop the service and be done wif it, but only if the number of
113
+ # references has dropped to zero
114
+ if (inst)
115
+ # Since the instance may have multiple aliases, scan through
116
+ # all the pairs for matching stuff.
117
+ self.each_pair { |cals, cinst|
118
+ self.delete(cals) if (inst == cinst)
119
+ }
120
+
121
+ # Lose the list-held reference to the instance
122
+ inst.deref
123
+
124
+ return true
125
+ end
126
+
127
+ # Return false if the service isn't there
128
+ return false
129
+ end
130
+
131
+ #
132
+ # Overrides the builtin 'each' operator to avoid the following exception on Ruby 1.9.2+
133
+ # "can't add a new key into hash during iteration"
134
+ #
135
+ def each(&block)
136
+ list = []
137
+ self.keys.sort.each do |sidx|
138
+ list << [sidx, self[sidx]]
139
+ end
140
+ list.each(&block)
141
+ end
142
+
143
+ protected
144
+
145
+ #
146
+ # Returns the alias for a given service instance.
147
+ #
148
+ def hardcore_alias(klass, *args)
149
+ "__#{klass.name}#{args}"
150
+ end
151
+
152
+ end
153
+
154
+ end
@@ -0,0 +1,424 @@
1
+ # -*- coding: binary -*-
2
+ require 'thread'
3
+ require 'rex/socket'
4
+
5
+ module Rex
6
+ module Services
7
+
8
+ ###
9
+ #
10
+ # This service acts as a local TCP relay whereby clients can connect to a
11
+ # local listener that forwards to an arbitrary remote endpoint. Interaction
12
+ # with the remote endpoint socket requires that it implement the
13
+ # Rex::IO::Stream interface.
14
+ #
15
+ ###
16
+ class LocalRelay
17
+
18
+ include Rex::Service
19
+
20
+ ###
21
+ #
22
+ # This module is used to extend streams such that they can be associated
23
+ # with a relay context and the other side of the stream.
24
+ #
25
+ ###
26
+ module Stream
27
+
28
+ #
29
+ # This method is called when the other side has data that has been read
30
+ # in.
31
+ #
32
+ def on_other_data(data)
33
+ if (relay.on_other_data_proc)
34
+ relay.on_other_data_proc.call(relay, self, data)
35
+ else
36
+ put(data)
37
+ end
38
+ end
39
+
40
+ attr_accessor :relay
41
+ attr_accessor :other_stream
42
+ end
43
+
44
+ ###
45
+ #
46
+ # This module is used to extend stream servers such that they can be
47
+ # associated with a relay context.
48
+ #
49
+ ###
50
+ module StreamServer
51
+
52
+ #
53
+ # This method is called when the stream server receives a local
54
+ # connection such that the remote half can be allocated. The return
55
+ # value of the callback should be a Stream instance.
56
+ #
57
+ def on_local_connection(relay, lfd)
58
+ if (relay.on_local_connection_proc)
59
+ relay.on_local_connection_proc.call(relay, lfd)
60
+ end
61
+ end
62
+
63
+ attr_accessor :relay
64
+ end
65
+
66
+
67
+ ###
68
+ #
69
+ # This class acts as an instance of a given local relay.
70
+ #
71
+ ###
72
+ class Relay
73
+
74
+ def initialize(name, listener, opts = {})
75
+ self.name = name
76
+ self.listener = listener
77
+ self.opts = opts
78
+ self.on_local_connection_proc = opts['OnLocalConnection']
79
+ self.on_conn_close_proc = opts['OnConnectionClose']
80
+ self.on_other_data_proc = opts['OnOtherData']
81
+ if (not $dispatcher['rex'])
82
+ register_log_source('rex', $dispatcher['core'], get_log_level('core'))
83
+ end
84
+ end
85
+
86
+ def shutdown
87
+ begin
88
+ listener.shutdown if (listener)
89
+ rescue ::Exception
90
+ end
91
+ end
92
+
93
+ def close
94
+ begin
95
+ listener.close if (listener)
96
+ rescue ::Exception
97
+ end
98
+ listener = nil
99
+ end
100
+
101
+ attr_reader :name, :listener, :opts
102
+ attr_accessor :on_local_connection_proc
103
+ attr_accessor :on_conn_close_proc
104
+ attr_accessor :on_other_data_proc
105
+ protected
106
+ attr_writer :name, :listener, :opts
107
+
108
+ end
109
+
110
+ #
111
+ # Initializes the local tcp relay monitor.
112
+ #
113
+ def initialize
114
+ self.relays = Hash.new
115
+ self.rfds = Array.new
116
+ self.relay_thread = nil
117
+ self.relay_mutex = Mutex.new
118
+ end
119
+
120
+ ##
121
+ #
122
+ # Service interface implementors
123
+ #
124
+ ##
125
+
126
+ #
127
+ # Returns the hardcore alias for the local relay service.
128
+ #
129
+ def self.hardcore_alias(*args)
130
+ "__#{args}"
131
+ end
132
+
133
+ #
134
+ # Returns the alias for this service.
135
+ #
136
+ def alias
137
+ super || "Local Relay"
138
+ end
139
+
140
+ #
141
+ # Starts the thread that monitors the local relays.
142
+ #
143
+ def start
144
+ if (!self.relay_thread)
145
+ self.relay_thread = Rex::ThreadFactory.spawn("LocalRelay", false) {
146
+ begin
147
+ monitor_relays
148
+ rescue ::Exception
149
+ elog("Error in #{self} monitor_relays: #{$!}", 'rex')
150
+ end
151
+ }
152
+ end
153
+ end
154
+
155
+ #
156
+ # Stops the thread that monitors the local relays and destroys all local
157
+ # listeners.
158
+ #
159
+ def stop
160
+ if (self.relay_thread)
161
+ self.relay_thread.kill
162
+ self.relay_thread = nil
163
+ end
164
+
165
+ self.relay_mutex.synchronize {
166
+ self.relays.delete_if { |k, v|
167
+ v.shutdown
168
+ v.close
169
+ true
170
+ }
171
+ }
172
+
173
+ # Flush the relay list and read fd list
174
+ self.relays.clear
175
+ self.rfds.clear
176
+ end
177
+
178
+ ##
179
+ #
180
+ # Adding/removing local tcp relays
181
+ #
182
+ ##
183
+
184
+ #
185
+ # Starts a local TCP relay.
186
+ #
187
+ def start_tcp_relay(lport, opts = {})
188
+ # Make sure our options are valid
189
+ if ((opts['PeerHost'] == nil or opts['PeerPort'] == nil) and (opts['Stream'] != true))
190
+ raise ArgumentError, "Missing peer host or peer port.", caller
191
+ end
192
+
193
+ listener = Rex::Socket.create_tcp_server(
194
+ 'LocalHost' => opts['LocalHost'],
195
+ 'LocalPort' => lport)
196
+
197
+ opts['LocalPort'] = lport
198
+ opts['__RelayType'] = 'tcp'
199
+
200
+ start_relay(listener, lport.to_s + (opts['LocalHost'] || '0.0.0.0'), opts)
201
+ end
202
+
203
+ #
204
+ # Starts a local relay on the supplied local port. This listener will call
205
+ # the supplied callback procedures when various events occur.
206
+ #
207
+ def start_relay(stream_server, name, opts = {})
208
+ # Create a Relay instance with the local stream and remote stream
209
+ relay = Relay.new(name, stream_server, opts)
210
+
211
+ # Extend the stream_server so that we can associate it with this relay
212
+ stream_server.extend(StreamServer)
213
+ stream_server.relay = relay
214
+
215
+ # Add the stream associations the appropriate lists and hashes
216
+ self.relay_mutex.synchronize {
217
+ self.relays[name] = relay
218
+
219
+ self.rfds << stream_server
220
+ }
221
+ end
222
+
223
+ #
224
+ # Stops relaying on a given local port.
225
+ #
226
+ def stop_tcp_relay(lport, lhost = nil)
227
+ stop_relay(lport.to_s + (lhost || '0.0.0.0'))
228
+ end
229
+
230
+ #
231
+ # Stops a relay with a given name.
232
+ #
233
+ def stop_relay(name)
234
+ rv = false
235
+
236
+ self.relay_mutex.synchronize {
237
+ relay = self.relays[name]
238
+
239
+ if (relay)
240
+ close_relay(relay)
241
+ rv = true
242
+ end
243
+ }
244
+
245
+ rv
246
+ end
247
+
248
+ #
249
+ # Enumerate each TCP relay
250
+ #
251
+ def each_tcp_relay(&block)
252
+ self.relays.each_pair { |name, relay|
253
+ next if (relay.opts['__RelayType'] != 'tcp')
254
+
255
+ yield(
256
+ relay.opts['LocalHost'] || '0.0.0.0',
257
+ relay.opts['LocalPort'],
258
+ relay.opts['PeerHost'],
259
+ relay.opts['PeerPort'],
260
+ relay.opts)
261
+ }
262
+ end
263
+
264
+ protected
265
+
266
+ attr_accessor :relays, :relay_thread, :relay_mutex
267
+ attr_accessor :rfds
268
+
269
+ #
270
+ # Closes an cleans up a specific relay
271
+ #
272
+ def close_relay(relay)
273
+ self.rfds.delete(relay.listener)
274
+ self.relays.delete(relay.name)
275
+
276
+ begin
277
+ relay.shutdown
278
+ relay.close
279
+ rescue IOError
280
+ end
281
+ end
282
+
283
+ #
284
+ # Closes a specific relay connection without tearing down the actual relay
285
+ # itself.
286
+ #
287
+ def close_relay_conn(fd)
288
+ relay = fd.relay
289
+ ofd = fd.other_stream
290
+
291
+ self.rfds.delete(fd)
292
+
293
+ begin
294
+ if (relay.on_conn_close_proc)
295
+ relay.on_conn_close_proc.call(fd)
296
+ end
297
+
298
+ fd.shutdown
299
+ fd.close
300
+ rescue IOError
301
+ end
302
+
303
+ if (ofd)
304
+ self.rfds.delete(ofd)
305
+
306
+ begin
307
+ if (relay.on_conn_close_proc)
308
+ relay.on_conn_close_proc.call(ofd)
309
+ end
310
+
311
+ ofd.shutdown
312
+ ofd.close
313
+ rescue IOError
314
+ end
315
+ end
316
+ end
317
+
318
+ #
319
+ # Accepts a client connection on a local relay.
320
+ #
321
+ def accept_relay_conn(srvfd)
322
+ relay = srvfd.relay
323
+
324
+ begin
325
+ dlog("Accepting relay client connection...", 'rex', LEV_3)
326
+
327
+ # Accept the child connection
328
+ lfd = srvfd.accept
329
+ dlog("Got left side of relay: #{lfd}", 'rex', LEV_3)
330
+
331
+ # Call the relay's on_local_connection method which should return a
332
+ # remote connection on success
333
+ rfd = srvfd.on_local_connection(relay, lfd)
334
+
335
+ dlog("Got right side of relay: #{rfd}", 'rex', LEV_3)
336
+ rescue
337
+ wlog("Failed to get remote half of local connection on relay #{relay.name}: #{$!}", 'rex')
338
+ lfd.close
339
+ return
340
+ end
341
+
342
+ # If we have both sides, then we rock. Extend the instances, associate
343
+ # them with the relay, associate them with each other, and add them to
344
+ # the list of polling file descriptors
345
+ if (lfd and rfd)
346
+ lfd.extend(Stream)
347
+ rfd.extend(Stream)
348
+
349
+ lfd.relay = relay
350
+ rfd.relay = relay
351
+
352
+ lfd.other_stream = rfd
353
+ rfd.other_stream = lfd
354
+
355
+ self.rfds << lfd
356
+ self.rfds << rfd
357
+
358
+ # Otherwise, we don't have both sides, we'll close them.
359
+ else
360
+ close_relay_conn(lfd)
361
+ end
362
+ end
363
+
364
+ #
365
+ # Monitors the relays for data and passes it in both directions.
366
+ #
367
+ def monitor_relays
368
+ begin
369
+ # Helps with latency
370
+ Thread.current.priority = 2
371
+
372
+ # Poll all the streams...
373
+ begin
374
+ socks = Rex::ThreadSafe.select(rfds, nil, nil, 0.25)
375
+ rescue StreamClosedError => e
376
+ dlog("monitor_relays: closing stream #{e.stream}", 'rex', LEV_3)
377
+
378
+ # Close the relay connection that is associated with the stream
379
+ # closed error
380
+ if (e.stream.kind_of?(Stream))
381
+ close_relay_conn(e.stream)
382
+ end
383
+
384
+ dlog("monitor_relays: closed stream #{e.stream}", 'rex', LEV_3)
385
+
386
+ next
387
+ rescue
388
+ elog("Error in #{self} monitor_relays select: #{$!.class} #{$!}", 'rex')
389
+ return
390
+ end
391
+
392
+ # If socks is nil, go again.
393
+ next unless socks
394
+
395
+ # Process read-ready file descriptors, if any.
396
+ socks[0].each { |rfd|
397
+
398
+ # If this file descriptor is a server, accept the connection
399
+ if (rfd.kind_of?(StreamServer))
400
+ accept_relay_conn(rfd)
401
+ # Otherwise, it's a relay connection, read data from one side
402
+ # and write it to the other
403
+ else
404
+ begin
405
+ # Pass the data onto the other fd, most likely writing it.
406
+ data = rfd.sysread(65536)
407
+ rfd.other_stream.on_other_data(data)
408
+ # If we catch an error, close the connection
409
+ rescue ::Exception
410
+ elog("Error in #{self} monitor_relays read: #{$!}", 'rex')
411
+ close_relay_conn(rfd)
412
+ end
413
+ end
414
+
415
+ } if (socks[0])
416
+
417
+ end while true
418
+ end
419
+
420
+ end
421
+
422
+ end
423
+ end
424
+