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,684 @@
1
+ require 'socket'
2
+ require 'thread'
3
+ require 'resolv'
4
+ require 'rex/exceptions'
5
+
6
+ module Rex
7
+
8
+ ###
9
+ #
10
+ # Base class for all sockets.
11
+ #
12
+ ###
13
+ module Socket
14
+
15
+ module Comm
16
+ end
17
+
18
+ require 'rex/socket/parameters'
19
+ require 'rex/socket/tcp'
20
+ require 'rex/socket/tcp_server'
21
+
22
+ require 'rex/socket/comm'
23
+ require 'rex/socket/comm/local'
24
+
25
+ require 'rex/socket/switch_board'
26
+ require 'rex/socket/subnet_walker'
27
+ require 'rex/socket/range_walker'
28
+
29
+ ##
30
+ #
31
+ # Factory methods
32
+ #
33
+ ##
34
+
35
+ #
36
+ # Create a socket instance using the supplied parameter hash.
37
+ #
38
+ def self.create(opts = {})
39
+ return create_param(Rex::Socket::Parameters.from_hash(opts))
40
+ end
41
+
42
+ #
43
+ # Create a socket using the supplied Rex::Socket::Parameter instance.
44
+ #
45
+ def self.create_param(param)
46
+ return param.comm.create(param)
47
+ end
48
+
49
+ #
50
+ # Create a TCP socket using the supplied parameter hash.
51
+ #
52
+ def self.create_tcp(opts = {})
53
+ return create_param(Rex::Socket::Parameters.from_hash(opts.merge('Proto' => 'tcp')))
54
+ end
55
+
56
+ #
57
+ # Create a TCP server socket using the supplied parameter hash.
58
+ #
59
+ def self.create_tcp_server(opts = {})
60
+ return create_tcp(opts.merge('Server' => true))
61
+ end
62
+
63
+ #
64
+ # Create a UDP socket using the supplied parameter hash.
65
+ #
66
+ def self.create_udp(opts = {})
67
+ return create_param(Rex::Socket::Parameters.from_hash(opts.merge('Proto' => 'udp')))
68
+ end
69
+
70
+ #
71
+ # Create a IP socket using the supplied parameter hash.
72
+ #
73
+ def self.create_ip(opts = {})
74
+ return create_param(Rex::Socket::Parameters.from_hash(opts.merge('Proto' => 'ip')))
75
+ end
76
+
77
+ ##
78
+ #
79
+ # Serialization
80
+ #
81
+ ##
82
+
83
+
84
+ # Cache our IPv6 support flag
85
+ @@support_ipv6 = nil
86
+
87
+ #
88
+ # Determine whether we support IPv6
89
+ #
90
+ def self.support_ipv6?
91
+ return @@support_ipv6 if not @@support_ipv6.nil?
92
+
93
+ @@support_ipv6 = false
94
+
95
+ if (::Socket.const_defined?('AF_INET6'))
96
+ begin
97
+ s = ::Socket.new(::Socket::AF_INET6, ::Socket::SOCK_DGRAM, ::Socket::IPPROTO_UDP)
98
+ s.close
99
+ @@support_ipv6 = true
100
+ rescue
101
+ end
102
+ end
103
+
104
+ return @@support_ipv6
105
+ end
106
+
107
+ #
108
+ # Determine whether this is an IPv4 address
109
+ #
110
+ def self.is_ipv4?(addr)
111
+ res = Rex::Socket.getaddress(addr)
112
+ res.match(/:/) ? false : true
113
+ end
114
+
115
+ #
116
+ # Determine whether this is an IPv6 address
117
+ #
118
+ def self.is_ipv6?(addr)
119
+ res = Rex::Socket.getaddress(addr)
120
+ res.match(/:/) ? true : false
121
+ end
122
+
123
+ #
124
+ # Checks to see if the supplied address is a dotted quad.
125
+ #
126
+ def self.dotted_ip?(addr)
127
+ # Assume anything with a colon is IPv6
128
+ return true if (support_ipv6? and addr =~ /:/)
129
+
130
+ # Otherwise assume this is IPv4
131
+ (addr =~ /^(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))$/) ? true : false
132
+ end
133
+
134
+ #
135
+ # Return true if +addr+ is within the ranges specified in RFC1918, or
136
+ # RFC5735/RFC3927
137
+ #
138
+ def self.is_internal?(addr)
139
+ if self.dotted_ip?(addr)
140
+ addr =~ /^(?:10\.|192\.168|172.(?:1[6-9]|2[0-9]|3[01])\.|169\.254)/
141
+ else
142
+ false
143
+ end
144
+ end
145
+
146
+ #
147
+ # Wrapper for Resolv.getaddress that takes special care to see if the
148
+ # supplied address is already a dotted quad, for instance. This is
149
+ # necessary to prevent calls to gethostbyaddr (which occurs on windows).
150
+ # These calls can be quite slow. This also fixes an issue with the
151
+ # Resolv.getaddress() call being non-functional on Ruby 1.9.1 (Win32).
152
+ #
153
+ def self.getaddress(addr, accept_ipv6 = true)
154
+ begin
155
+
156
+ if dotted_ip?(addr)
157
+ return addr
158
+ end
159
+
160
+ res = ::Socket.gethostbyname(addr)
161
+ return nil if not res
162
+
163
+ # Shift the first three elements out
164
+ rname = res.shift
165
+ ralias = res.shift
166
+ rtype = res.shift
167
+
168
+ # Reject IPv6 addresses if we don't accept them
169
+ if not accept_ipv6
170
+ res.reject!{|nbo| nbo.length != 4}
171
+ end
172
+
173
+ # Make sure we have at least one name
174
+ return nil if res.length == 0
175
+
176
+ # Return the first address of the result
177
+ self.addr_ntoa( res[0] )
178
+ rescue ::ArgumentError # Win32 bug
179
+ nil
180
+ end
181
+ end
182
+
183
+ #
184
+ # Wrapper for Socket.gethostbyname which takes into account whether or not
185
+ # an IP address is supplied. If it is, then reverse DNS resolution does
186
+ # not occur. This is done in order to prevent delays, such as would occur
187
+ # on Windows.
188
+ #
189
+ def self.gethostbyname(host)
190
+ if (dotted_ip?(host))
191
+ if (is_ipv4?(host))
192
+ return [ host, host, 2, host.split('.').map{ |c| c.to_i }.pack("C4") ]
193
+ end
194
+ end
195
+
196
+ ::Socket.gethostbyname(host)
197
+ end
198
+
199
+ #
200
+ # Create a sockaddr structure using the supplied IP address, port, and
201
+ # address family
202
+ #
203
+ def self.to_sockaddr(ip, port)
204
+
205
+ if (ip == '::ffff:0.0.0.0')
206
+ ip = support_ipv6?() ? '::' : '0.0.0.0'
207
+ end
208
+
209
+ return ::Socket.pack_sockaddr_in(port, ip)
210
+ end
211
+
212
+ #
213
+ # Returns the address family, host, and port of the supplied sockaddr as
214
+ # [ af, host, port ]
215
+ #
216
+ def self.from_sockaddr(saddr)
217
+ port, host = ::Socket::unpack_sockaddr_in(saddr)
218
+ af = ::Socket::AF_INET
219
+ if (support_ipv6?() and is_ipv6?(host))
220
+ af = ::Socket::AF_INET6
221
+ end
222
+ return [ af, host, port ]
223
+ end
224
+
225
+ #
226
+ # Resolves a host to raw network-byte order.
227
+ #
228
+ def self.resolv_nbo(host)
229
+ self.gethostbyname(Rex::Socket.getaddress(host))[3]
230
+ end
231
+
232
+ #
233
+ # Resolves a host to a network-byte order ruby integer.
234
+ #
235
+ def self.resolv_nbo_i(host)
236
+ addr_ntoi(resolv_nbo(host))
237
+ end
238
+
239
+ #
240
+ # Converts an ASCII IP address to a CIDR mask. Returns
241
+ # nil if it's not convertable.
242
+ #
243
+ def self.addr_atoc(mask)
244
+ mask_i = resolv_nbo_i(mask)
245
+ cidr = nil
246
+ 0.upto(32) do |i|
247
+ if ((1 << i)-1) << (32-i) == mask_i
248
+ cidr = i
249
+ break
250
+ end
251
+ end
252
+ return cidr
253
+ end
254
+
255
+ #
256
+ # Resolves a CIDR bitmask into a dotted-quad. Returns
257
+ # nil if it's not convertable.
258
+ #
259
+ def self.addr_ctoa(cidr)
260
+ return nil unless (0..32) === cidr.to_i
261
+ addr_itoa(((1 << cidr)-1) << 32-cidr)
262
+ end
263
+
264
+ #
265
+ # Resolves a host to a dotted address.
266
+ #
267
+ def self.resolv_to_dotted(host)
268
+ addr_ntoa(addr_aton(host))
269
+ end
270
+
271
+ #
272
+ # Converts a ascii address into an integer
273
+ #
274
+ def self.addr_atoi(addr)
275
+ resolv_nbo_i(addr)
276
+ end
277
+
278
+ #
279
+ # Converts an integer address into ascii
280
+ #
281
+ def self.addr_itoa(addr, v6=false)
282
+
283
+ nboa = addr_iton(addr, v6)
284
+
285
+ # IPv4
286
+ if (addr < 0x100000000 and not v6)
287
+ nboa.unpack('C4').join('.')
288
+ # IPv6
289
+ else
290
+ nboa.unpack('n8').map{ |c| "%.4x" % c }.join(":")
291
+ end
292
+ end
293
+
294
+ #
295
+ # Converts a ascii address to network byte order
296
+ #
297
+ def self.addr_aton(addr)
298
+ resolv_nbo(addr)
299
+ end
300
+
301
+ #
302
+ # Converts a network byte order address to ascii
303
+ #
304
+ def self.addr_ntoa(addr)
305
+
306
+ # IPv4
307
+ if (addr.length == 4)
308
+ return addr.unpack('C4').join('.')
309
+ end
310
+
311
+ # IPv6
312
+ if (addr.length == 16)
313
+ return addr.unpack('n8').map{ |c| "%.4x" % c }.join(":")
314
+ end
315
+
316
+ raise RuntimeError, "Invalid address format"
317
+ end
318
+
319
+ #
320
+ # Converts a network byte order address to an integer
321
+ #
322
+ def self.addr_ntoi(addr)
323
+
324
+ bits = addr.unpack("N*")
325
+
326
+ if (bits.length == 1)
327
+ return bits[0]
328
+ end
329
+
330
+ if (bits.length == 4)
331
+ val = 0
332
+ bits.each_index { |i| val += ( bits[i] << (96 - (i * 32)) ) }
333
+ return val
334
+ end
335
+
336
+ raise RuntimeError, "Invalid address format"
337
+ end
338
+
339
+ #
340
+ # Converts an integer into a network byte order address
341
+ #
342
+ def self.addr_iton(addr, v6=false)
343
+ if(addr < 0x100000000 and not v6)
344
+ return [addr].pack('N')
345
+ else
346
+ w = []
347
+ w[0] = (addr >> 96) & 0xffffffff
348
+ w[1] = (addr >> 64) & 0xffffffff
349
+ w[2] = (addr >> 32) & 0xffffffff
350
+ w[3] = addr & 0xffffffff
351
+ return w.pack('N4')
352
+ end
353
+ end
354
+
355
+ #
356
+ # Converts a CIDR subnet into an array (base, bcast)
357
+ #
358
+ def self.cidr_crack(cidr, v6=false)
359
+ tmp = cidr.split('/')
360
+
361
+ tst,scope = tmp[0].split("%",2)
362
+ scope = "%" + scope if scope
363
+ scope ||= ""
364
+
365
+ addr = addr_atoi(tst)
366
+
367
+ bits = 32
368
+ mask = 0
369
+ use6 = false
370
+
371
+ if (addr > 0xffffffff or v6 or cidr =~ /:/)
372
+ use6 = true
373
+ bits = 128
374
+ end
375
+
376
+ mask = (2 ** bits) - (2 ** (bits - tmp[1].to_i))
377
+ base = addr & mask
378
+
379
+ stop = base + (2 ** (bits - tmp[1].to_i)) - 1
380
+ return [self.addr_itoa(base, use6) + scope, self.addr_itoa(stop, use6) + scope]
381
+ end
382
+
383
+ #
384
+ # Converts a netmask (255.255.255.240) into a bitmask (28). This is the
385
+ # lame kid way of doing it.
386
+ #
387
+ def self.net2bitmask(netmask)
388
+
389
+ nmask = resolv_nbo(netmask)
390
+ imask = addr_ntoi(nmask)
391
+ bits = 32
392
+
393
+ if (imask > 0xffffffff)
394
+ bits = 128
395
+ end
396
+
397
+ 0.upto(bits-1) do |bit|
398
+ p = 2 ** bit
399
+ return (bits - bit) if ((imask & p) == p)
400
+ end
401
+
402
+ 0
403
+ end
404
+
405
+ #
406
+ # Converts a bitmask (28) into a netmask (255.255.255.240)
407
+ # TODO: IPv6 (use is ambiguous right now)
408
+ #
409
+ def self.bit2netmask(bitmask)
410
+ [ (~((2 ** (32 - bitmask)) - 1)) & 0xffffffff ].pack('N').unpack('CCCC').join('.')
411
+ end
412
+
413
+
414
+ def self.portspec_crack(pspec)
415
+ portspec_to_portlist(pspec)
416
+ end
417
+
418
+ #
419
+ # Converts a port specification like "80,21-23,443" into a sorted,
420
+ # unique array of valid port numbers like [21,22,23,80,443]
421
+ #
422
+ def self.portspec_to_portlist(pspec)
423
+ ports = []
424
+
425
+ # Build ports array from port specification
426
+ pspec.split(/,/).each do |item|
427
+ start, stop = item.split(/-/).map { |p| p.to_i }
428
+
429
+ start ||= 0
430
+ stop ||= item.match(/-/) ? 65535 : start
431
+
432
+ start, stop = stop, start if stop < start
433
+
434
+ start.upto(stop) { |p| ports << p }
435
+ end
436
+
437
+ # Sort, and remove dups and invalid ports
438
+ ports.sort.uniq.delete_if { |p| p < 1 or p > 65535 }
439
+ end
440
+
441
+ #
442
+ # Converts a port list like [1,2,3,4,5,100] into a
443
+ # range specification like "1-5,100"
444
+ #
445
+ def self.portlist_to_portspec(parr)
446
+ ranges = []
447
+ range = []
448
+ lastp = nil
449
+
450
+ parr.uniq.sort{|a,b| a<=>b}.map{|a| a.to_i}.each do |n|
451
+ next if (n < 1 or n > 65535)
452
+ if not lastp
453
+ range = [n]
454
+ lastp = n
455
+ next
456
+ end
457
+
458
+ if lastp == n - 1
459
+ range << n
460
+ else
461
+ ranges << range
462
+ range = [n]
463
+ end
464
+ lastp = n
465
+ end
466
+
467
+ ranges << range
468
+ ranges.delete(nil)
469
+ ranges.uniq.map{|x| x.length == 1 ? "#{x[0]}" : "#{x[0]}-#{x[-1]}"}.join(",")
470
+ end
471
+
472
+ ##
473
+ #
474
+ # Utility class methods
475
+ #
476
+ ##
477
+
478
+ #
479
+ # This method does NOT send any traffic to the destination, instead, it uses a
480
+ # "bound" UDP socket to determine what source address we would use to
481
+ # communicate with the specified destination. The destination defaults to
482
+ # Google's DNS server to make the standard behavior determine which IP
483
+ # we would use to communicate with the internet.
484
+ #
485
+ def self.source_address(dest='8.8.8.8', comm = ::Rex::Socket::Comm::Local)
486
+ begin
487
+ s = self.create_udp(
488
+ 'PeerHost' => dest,
489
+ 'PeerPort' => 31337,
490
+ 'Comm' => comm
491
+ )
492
+ r = s.getsockname[1]
493
+ s.close
494
+
495
+ # Trim off the trailing interface ID for link-local IPv6
496
+ return r.split('%').first
497
+ rescue ::Exception
498
+ return '127.0.0.1'
499
+ end
500
+ end
501
+
502
+ #
503
+ # Identifies the link-local address of a given interface (if IPv6 is enabled)
504
+ #
505
+ def self.ipv6_link_address(intf)
506
+ r = source_address("FF02::1%#{intf}")
507
+ return if not (r and r =~ /^fe80/i)
508
+ r
509
+ end
510
+
511
+ #
512
+ # Identifies the mac address of a given interface (if IPv6 is enabled)
513
+ #
514
+ def self.ipv6_mac(intf)
515
+ r = ipv6_link_address(intf)
516
+ return if not r
517
+ raw = addr_aton(r)[-8, 8]
518
+ (raw[0,3] + raw[5,3]).unpack("C*").map{|c| "%.2x" % c}.join(":")
519
+ end
520
+
521
+ #
522
+ # Create a TCP socket pair.
523
+ #
524
+ # sf: This create a socket pair using native ruby sockets and will work
525
+ # on Windows where ::Socket.pair is not implemented.
526
+ # Note: OpenSSL requires native ruby sockets for its io.
527
+ #
528
+ # Note: Even though sub-threads are smashing the parent threads local, there
529
+ # is no concurrent use of the same locals and this is safe.
530
+ def self.tcp_socket_pair
531
+ lsock = nil
532
+ rsock = nil
533
+ laddr = '127.0.0.1'
534
+ lport = 0
535
+ threads = []
536
+ mutex = ::Mutex.new
537
+
538
+ threads << Rex::ThreadFactory.spawn('TcpSocketPair', false) {
539
+ server = nil
540
+ mutex.synchronize {
541
+ threads << Rex::ThreadFactory.spawn('TcpSocketPairClient', false) {
542
+ mutex.synchronize {
543
+ rsock = ::TCPSocket.new( laddr, lport )
544
+ }
545
+ }
546
+ server = ::TCPServer.new(laddr, 0)
547
+ if (server.getsockname =~ /127\.0\.0\.1:/)
548
+ # JRuby ridiculousness
549
+ caddr, lport = server.getsockname.split(":")
550
+ caddr = caddr[1,caddr.length]
551
+ lport = lport.to_i
552
+ else
553
+ # Sane implementations where Socket#getsockname returns a
554
+ # sockaddr
555
+ lport, caddr = ::Socket.unpack_sockaddr_in( server.getsockname )
556
+ end
557
+ }
558
+ lsock, saddr = server.accept
559
+ server.close
560
+ }
561
+
562
+ threads.each { |t| t.join }
563
+
564
+ return [lsock, rsock]
565
+ end
566
+
567
+ #
568
+ # Create a UDP socket pair using native ruby UDP sockets.
569
+ #
570
+ def self.udp_socket_pair
571
+ laddr = '127.0.0.1'
572
+
573
+ lsock = ::UDPSocket.new
574
+ lsock.bind( laddr, 0 )
575
+
576
+ rsock = ::UDPSocket.new
577
+ rsock.bind( laddr, 0 )
578
+
579
+ rsock.connect( *lsock.addr.values_at(3,1) )
580
+
581
+ lsock.connect( *rsock.addr.values_at(3,1) )
582
+
583
+ return [lsock, rsock]
584
+ end
585
+
586
+ ##
587
+ #
588
+ # Class initialization
589
+ #
590
+ ##
591
+
592
+ #
593
+ # Initialize general socket parameters.
594
+ #
595
+ def initsock(params = nil)
596
+ if (params)
597
+ self.peerhost = params.peerhost
598
+ self.peerport = params.peerport
599
+ self.localhost = params.localhost
600
+ self.localport = params.localport
601
+ self.context = params.context || {}
602
+ self.ipv = params.v6 ? 6 : 4
603
+ end
604
+ end
605
+
606
+ #
607
+ # By default, all sockets are themselves selectable file descriptors.
608
+ #
609
+ def fd
610
+ self
611
+ end
612
+
613
+ #
614
+ # Returns local connection information.
615
+ #
616
+ def getsockname
617
+ Socket.from_sockaddr(super)
618
+ end
619
+
620
+ #
621
+ # Wrapper around getsockname
622
+ #
623
+ def getlocalname
624
+ getsockname
625
+ end
626
+
627
+ #
628
+ # Return peer connection information.
629
+ #
630
+ def getpeername
631
+ return Socket.from_sockaddr(super)
632
+ end
633
+
634
+ #
635
+ # Returns a string that indicates the type of the socket, such as 'tcp'.
636
+ #
637
+ def type?
638
+ raise NotImplementedError, "Socket type is not supported."
639
+ end
640
+
641
+ #
642
+ # The peer host of the connected socket.
643
+ #
644
+ attr_reader :peerhost
645
+ #
646
+ # The peer port of the connected socket.
647
+ #
648
+ attr_reader :peerport
649
+ #
650
+ # The local host of the connected socket.
651
+ #
652
+ attr_reader :localhost
653
+ #
654
+ # The local port of the connected socket.
655
+ #
656
+ attr_reader :localport
657
+ #
658
+ # The IP version of the socket
659
+ #
660
+ attr_reader :ipv
661
+ #
662
+ # Contextual information that describes the source and other
663
+ # instance-specific attributes. This comes from the param.context
664
+ # attribute.
665
+ #
666
+ attr_reader :context
667
+
668
+ protected
669
+
670
+ attr_writer :peerhost, :peerport, :localhost, :localport # :nodoc:
671
+ attr_writer :context # :nodoc:
672
+ attr_writer :ipv # :nodoc:
673
+
674
+ end
675
+
676
+ end
677
+
678
+ #
679
+ # Globalized socket constants
680
+ #
681
+ SHUT_RDWR = ::Socket::SHUT_RDWR
682
+ SHUT_RD = ::Socket::SHUT_RD
683
+ SHUT_WR = ::Socket::SHUT_WR
684
+