librex 0.0.68 → 0.0.70

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 (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  require 'rex/io/stream_abstraction'
@@ -19,68 +18,68 @@ module Meterpreter
19
18
  ###
20
19
  class Stream < Rex::Post::Meterpreter::Channel
21
20
 
22
- include Rex::IO::StreamAbstraction
23
-
24
- class << self
25
- def cls
26
- return CHANNEL_CLASS_STREAM
27
- end
28
- end
29
-
30
- ##
31
- #
32
- # Constructor
33
- #
34
- ##
35
-
36
- #
37
- # Passes the initialization information up to the base class
38
- #
39
- def initialize(client, cid, type, flags)
40
- # sf: initialize_abstraction() before super() as we can get a scenario where dio_write_handler() is called
41
- # with data to write to the rsock but rsock has not yet been initialized. This happens if the channel
42
- # is registered (client.add_channel(self) in Channel.initialize) to a session and a 'core_channel_write'
43
- # request comes in before we have called self.initialize_abstraction()
44
- initialize_abstraction
45
- super(client, cid, type, flags)
46
- end
47
-
48
- ##
49
- #
50
- # Remote I/O handlers
51
- #
52
- ##
53
-
54
- #
55
- # Performs a write operation on the right side of the local stream.
56
- #
57
- def dio_write_handler(packet, data)
58
- rv = Rex::ThreadSafe.select(nil, [rsock], nil, 0.01)
59
- if(rv)
60
- rsock.write(data)
61
- return true
62
- else
63
- return false
64
- end
65
- end
66
-
67
- #
68
- # Performs a close operation on the right side of the local stream.
69
- #
70
- def dio_close_handler(packet)
71
- rsock.close
72
-
73
- return super(packet)
74
- end
75
-
76
- #
77
- # Cleans up the stream abstraction.
78
- #
79
- def cleanup
80
- super
81
-
82
- cleanup_abstraction
83
- end
21
+ include Rex::IO::StreamAbstraction
22
+
23
+ class << self
24
+ def cls
25
+ return CHANNEL_CLASS_STREAM
26
+ end
27
+ end
28
+
29
+ ##
30
+ #
31
+ # Constructor
32
+ #
33
+ ##
34
+
35
+ #
36
+ # Passes the initialization information up to the base class
37
+ #
38
+ def initialize(client, cid, type, flags)
39
+ # sf: initialize_abstraction() before super() as we can get a scenario where dio_write_handler() is called
40
+ # with data to write to the rsock but rsock has not yet been initialized. This happens if the channel
41
+ # is registered (client.add_channel(self) in Channel.initialize) to a session and a 'core_channel_write'
42
+ # request comes in before we have called self.initialize_abstraction()
43
+ initialize_abstraction
44
+ super(client, cid, type, flags)
45
+ end
46
+
47
+ ##
48
+ #
49
+ # Remote I/O handlers
50
+ #
51
+ ##
52
+
53
+ #
54
+ # Performs a write operation on the right side of the local stream.
55
+ #
56
+ def dio_write_handler(packet, data)
57
+ rv = Rex::ThreadSafe.select(nil, [rsock], nil, 0.01)
58
+ if(rv)
59
+ rsock.write(data)
60
+ return true
61
+ else
62
+ return false
63
+ end
64
+ end
65
+
66
+ #
67
+ # Performs a close operation on the right side of the local stream.
68
+ #
69
+ def dio_close_handler(packet)
70
+ rsock.close
71
+
72
+ return super(packet)
73
+ end
74
+
75
+ #
76
+ # Cleans up the stream abstraction.
77
+ #
78
+ def cleanup
79
+ super
80
+
81
+ cleanup_abstraction
82
+ end
84
83
 
85
84
  end
86
85
 
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  require 'socket'
@@ -34,443 +33,450 @@ end
34
33
  ###
35
34
  class Client
36
35
 
37
- include Rex::Post::Meterpreter::PacketDispatcher
38
- include Rex::Post::Meterpreter::ChannelContainer
39
-
40
- #
41
- # Extension name to class hash.
42
- #
43
- @@ext_hash = {}
44
-
45
- #
46
- # Cached SSL certificate (required to scale)
47
- #
48
- @@ssl_ctx = nil
49
-
50
- #
51
- # Mutex to synchronize class-wide operations
52
- #
53
- @@ssl_mutex = ::Mutex.new
54
-
55
- #
56
- # Lookup the error that occurred
57
- #
58
- def self.lookup_error(code)
59
- code
60
- end
61
-
62
- #
63
- # Checks the extension hash to see if a class has already been associated
64
- # with the supplied extension name.
65
- #
66
- def self.check_ext_hash(name)
67
- @@ext_hash[name]
68
- end
69
-
70
- #
71
- # Stores the name to class association for the supplied extension name.
72
- #
73
- def self.set_ext_hash(name, klass)
74
- @@ext_hash[name] = klass
75
- end
76
-
77
- #
78
- # Initializes the client context with the supplied socket through
79
- # which communication with the server will be performed.
80
- #
81
- def initialize(sock,opts={})
82
- init_meterpreter(sock, opts)
83
- end
84
-
85
- #
86
- # Cleans up the meterpreter instance, terminating the dispatcher thread.
87
- #
88
- def cleanup_meterpreter
89
- ext.aliases.each_value do | extension |
90
- extension.cleanup if extension.respond_to?( 'cleanup' )
91
- end
92
- dispatcher_thread.kill if dispatcher_thread
93
- core.shutdown rescue nil
94
- shutdown_passive_dispatcher
95
- end
96
-
97
- #
98
- # Initializes the meterpreter client instance
99
- #
100
- def init_meterpreter(sock,opts={})
101
- self.sock = sock
102
- self.parser = PacketParser.new
103
- self.ext = ObjectAliases.new
104
- self.ext_aliases = ObjectAliases.new
105
- self.alive = true
106
- self.target_id = opts[:target_id]
107
- self.capabilities = opts[:capabilities] || {}
108
- self.commands = []
109
-
110
-
111
- self.conn_id = opts[:conn_id]
112
- self.url = opts[:url]
113
- self.ssl = opts[:ssl]
114
- self.expiration = opts[:expiration]
115
- self.comm_timeout = opts[:comm_timeout]
116
- self.passive_dispatcher = opts[:passive_dispatcher]
117
-
118
- self.response_timeout = opts[:timeout] || self.class.default_timeout
119
- self.send_keepalives = true
120
- # self.encode_unicode = opts.has_key?(:encode_unicode) ? opts[:encode_unicode] : true
121
- self.encode_unicode = false
122
-
123
- if opts[:passive_dispatcher]
124
- initialize_passive_dispatcher
125
-
126
- register_extension_alias('core', ClientCore.new(self))
127
-
128
- initialize_inbound_handlers
129
- initialize_channels
130
-
131
- # Register the channel inbound packet handler
132
- register_inbound_handler(Rex::Post::Meterpreter::Channel)
133
- else
134
- # Switch the socket to SSL mode and receive the hello if needed
135
- if capabilities[:ssl] and not opts[:skip_ssl]
136
- swap_sock_plain_to_ssl()
137
- end
138
-
139
- register_extension_alias('core', ClientCore.new(self))
140
-
141
- initialize_inbound_handlers
142
- initialize_channels
143
-
144
- # Register the channel inbound packet handler
145
- register_inbound_handler(Rex::Post::Meterpreter::Channel)
146
-
147
- monitor_socket
148
- end
149
- end
150
-
151
- def swap_sock_plain_to_ssl
152
- # Create a new SSL session on the existing socket
153
- ctx = generate_ssl_context()
154
- ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
155
-
156
- # Use non-blocking OpenSSL operations on Windows
157
- if not ( ssl.respond_to?(:accept_nonblock) and Rex::Compat.is_windows )
158
- ssl.accept
159
- else
160
- begin
161
- ssl.accept_nonblock
162
-
163
- # Ruby 1.8.7 and 1.9.0/1.9.1 uses a standard Errno
164
- rescue ::Errno::EAGAIN, ::Errno::EWOULDBLOCK
165
- IO::select(nil, nil, nil, 0.10)
166
- retry
167
-
168
- # Ruby 1.9.2+ uses IO::WaitReadable/IO::WaitWritable
169
- rescue ::Exception => e
170
- if ::IO.const_defined?('WaitReadable') and e.kind_of?(::IO::WaitReadable)
171
- IO::select( [ ssl ], nil, nil, 0.10 )
172
- retry
173
- end
174
-
175
- if ::IO.const_defined?('WaitWritable') and e.kind_of?(::IO::WaitWritable)
176
- IO::select( nil, [ ssl ], nil, 0.10 )
177
- retry
178
- end
179
-
180
- raise e
181
- end
182
- end
183
-
184
- self.sock.extend(Rex::Socket::SslTcp)
185
- self.sock.sslsock = ssl
186
- self.sock.sslctx = ctx
187
-
188
- tag = self.sock.get_once(-1, 30)
189
- if(not tag or tag !~ /^GET \//)
190
- raise RuntimeError, "Could not read the HTTP hello token"
191
- end
192
- end
193
-
194
- def swap_sock_ssl_to_plain
195
- # Remove references to the SSLSocket and Context
196
- self.sock.sslsock.close
197
- self.sock.sslsock = nil
198
- self.sock.sslctx = nil
199
- self.sock = self.sock.fd
200
- self.sock.extend(::Rex::Socket::Tcp)
201
- end
202
-
203
- def generate_ssl_context
204
- @@ssl_mutex.synchronize do
205
- if not @@ssl_ctx
206
-
207
- wlog("Generating SSL certificate for Meterpreter sessions")
208
-
209
- key = OpenSSL::PKey::RSA.new(1024){ }
210
- cert = OpenSSL::X509::Certificate.new
211
- cert.version = 2
212
- cert.serial = rand(0xFFFFFFFF)
213
-
214
- subject = OpenSSL::X509::Name.new([
215
- ["C","US"],
216
- ['ST', Rex::Text.rand_state()],
217
- ["L", Rex::Text.rand_text_alpha(rand(20) + 10)],
218
- ["O", Rex::Text.rand_text_alpha(rand(20) + 10)],
219
- ["CN", self.sock.getsockname[1] || Rex::Text.rand_hostname],
220
- ])
221
- issuer = OpenSSL::X509::Name.new([
222
- ["C","US"],
223
- ['ST', Rex::Text.rand_state()],
224
- ["L", Rex::Text.rand_text_alpha(rand(20) + 10)],
225
- ["O", Rex::Text.rand_text_alpha(rand(20) + 10)],
226
- ["CN", Rex::Text.rand_text_alpha(rand(20) + 10)],
227
- ])
228
-
229
- cert.subject = subject
230
- cert.issuer = issuer
231
- cert.not_before = Time.now - (3600 * 365) + rand(3600 * 14)
232
- cert.not_after = Time.now + (3600 * 365) + rand(3600 * 14)
233
- cert.public_key = key.public_key
234
- ef = OpenSSL::X509::ExtensionFactory.new(nil,cert)
235
- cert.extensions = [
236
- ef.create_extension("basicConstraints","CA:FALSE"),
237
- ef.create_extension("subjectKeyIdentifier","hash"),
238
- ef.create_extension("extendedKeyUsage","serverAuth"),
239
- ef.create_extension("keyUsage","keyEncipherment,dataEncipherment,digitalSignature")
240
- ]
241
- ef.issuer_certificate = cert
242
- cert.add_extension ef.create_extension("authorityKeyIdentifier", "keyid:always,issuer:always")
243
- cert.sign(key, OpenSSL::Digest::SHA1.new)
244
-
245
- ctx = OpenSSL::SSL::SSLContext.new(:SSLv3)
246
- ctx.key = key
247
- ctx.cert = cert
248
-
249
- ctx.session_id_context = Rex::Text.rand_text(16)
250
-
251
- wlog("Generated SSL certificate for Meterpreter sessions")
252
-
253
- @@ssl_ctx = ctx
254
-
255
- end # End of if not @ssl_ctx
256
- end # End of mutex.synchronize
257
-
258
- @@ssl_ctx
259
- end
260
-
261
- ##
262
- #
263
- # Accessors
264
- #
265
- ##
266
-
267
- #
268
- # Returns the default timeout that request packets will use when
269
- # waiting for a response.
270
- #
271
- def Client.default_timeout
272
- return 300
273
- end
274
-
275
- ##
276
- #
277
- # Alias processor
278
- #
279
- ##
280
-
281
- #
282
- # Translates unhandled methods into registered extension aliases
283
- # if a matching extension alias exists for the supplied symbol.
284
- #
285
- def method_missing(symbol, *args)
286
- #$stdout.puts("method_missing: #{symbol}")
287
- self.ext_aliases.aliases[symbol.to_s]
288
- end
289
-
290
- ##
291
- #
292
- # Extension registration
293
- #
294
- ##
295
-
296
- #
297
- # Loads the client half of the supplied extension and initializes it as a
298
- # registered extension that can be reached through client.ext.[extension].
299
- #
300
- def add_extension(name, commands=[])
301
- self.commands |= commands
302
-
303
- # Check to see if this extension has already been loaded.
304
- if ((klass = self.class.check_ext_hash(name.downcase)) == nil)
305
- old = Rex::Post::Meterpreter::Extensions.constants
306
- require("rex/post/meterpreter/extensions/#{name.downcase}/#{name.downcase}")
307
- new = Rex::Post::Meterpreter::Extensions.constants
308
-
309
- # No new constants added?
310
- if ((diff = new - old).empty?)
311
- diff = [ name.capitalize ]
312
- end
313
-
314
- klass = Rex::Post::Meterpreter::Extensions.const_get(diff[0]).const_get(diff[0])
315
-
316
- # Save the module name to class association now that the code is
317
- # loaded.
318
- self.class.set_ext_hash(name.downcase, klass)
319
- end
320
-
321
- # Create a new instance of the extension
322
- inst = klass.new(self)
323
-
324
- self.ext.aliases[inst.name] = inst
325
-
326
- return true
327
- end
328
-
329
- #
330
- # Deregisters an extension alias of the supplied name.
331
- #
332
- def deregister_extension(name)
333
- self.ext.aliases.delete(name)
334
- end
335
-
336
- #
337
- # Enumerates all of the loaded extensions.
338
- #
339
- def each_extension(&block)
340
- self.ext.aliases.each(block)
341
- end
342
-
343
- #
344
- # Registers an aliased extension that can be referenced through
345
- # client.name.
346
- #
347
- def register_extension_alias(name, ext)
348
- self.ext_aliases.aliases[name] = ext
349
- # Whee! Syntactic sugar, where art thou?
350
- #
351
- # Create an instance method on this object called +name+ that returns
352
- # +ext+. We have to do it this way instead of simply
353
- # self.class.class_eval so that other meterpreter sessions don't get
354
- # extension methods when this one does
355
- (class << self; self; end).class_eval do
356
- define_method(name.to_sym) do
357
- ext
358
- end
359
- end
360
- ext
361
- end
362
-
363
- #
364
- # Registers zero or more aliases that are provided in an array.
365
- #
366
- def register_extension_aliases(aliases)
367
- aliases.each { |a|
368
- register_extension_alias(a['name'], a['ext'])
369
- }
370
- end
371
-
372
- #
373
- # Deregisters a previously registered extension alias.
374
- #
375
- def deregister_extension_alias(name)
376
- self.ext_aliases.aliases.delete(name)
377
- end
378
-
379
- #
380
- # Dumps the extension tree.
381
- #
382
- def dump_extension_tree()
383
- items = []
384
- items.concat(self.ext.dump_alias_tree('client.ext'))
385
- items.concat(self.ext_aliases.dump_alias_tree('client'))
386
-
387
- return items.sort
388
- end
389
-
390
- #
391
- # Encodes (or not) a UTF-8 string
392
- #
393
- def unicode_filter_encode(str)
394
- self.encode_unicode ? Rex::Text.unicode_filter_encode(str) : str
395
- end
396
-
397
- #
398
- # Decodes (or not) a UTF-8 string
399
- #
400
- def unicode_filter_decode(str)
401
- self.encode_unicode ? Rex::Text.unicode_filter_decode(str) : str
402
- end
403
-
404
- #
405
- # The extension alias under which all extensions can be accessed by name.
406
- # For example:
407
- #
408
- # client.ext.stdapi
409
- #
410
- #
411
- attr_reader :ext
412
- #
413
- # The socket the client is communicating over.
414
- #
415
- attr_reader :sock
416
- #
417
- # The timeout value to use when waiting for responses.
418
- #
419
- attr_accessor :response_timeout
420
- #
421
- # Whether to send pings every so often to determine liveness.
422
- #
423
- attr_accessor :send_keepalives
424
- #
425
- # Whether this session is alive. If the socket is disconnected or broken,
426
- # this will be false
427
- #
428
- attr_accessor :alive
429
- #
430
- # The unique target identifier for this payload
431
- #
432
- attr_accessor :target_id
433
- #
434
- # The libraries available to this meterpreter server
435
- #
436
- attr_accessor :capabilities
437
- #
438
- # The Connection ID
439
- #
440
- attr_accessor :conn_id
441
- #
442
- # The Connect URL
443
- #
444
- attr_accessor :url
445
- #
446
- # Use SSL (HTTPS)
447
- #
448
- attr_accessor :ssl
449
- #
450
- # The Session Expiration Timeout
451
- #
452
- attr_accessor :expiration
453
- #
454
- # The Communication Timeout
455
- #
456
- attr_accessor :comm_timeout
457
- #
458
- # The Passive Dispatcher
459
- #
460
- attr_accessor :passive_dispatcher
461
- #
462
- # Flag indicating whether to hex-encode UTF-8 file names and other strings
463
- #
464
- attr_accessor :encode_unicode
465
- #
466
- # A list of the commands
467
- #
468
- attr_reader :commands
36
+ include Rex::Post::Meterpreter::PacketDispatcher
37
+ include Rex::Post::Meterpreter::ChannelContainer
38
+
39
+ #
40
+ # Extension name to class hash.
41
+ #
42
+ @@ext_hash = {}
43
+
44
+ #
45
+ # Cached SSL certificate (required to scale)
46
+ #
47
+ @@ssl_ctx = nil
48
+
49
+ #
50
+ # Mutex to synchronize class-wide operations
51
+ #
52
+ @@ssl_mutex = ::Mutex.new
53
+
54
+ #
55
+ # Lookup the error that occurred
56
+ #
57
+ def self.lookup_error(code)
58
+ code
59
+ end
60
+
61
+ #
62
+ # Checks the extension hash to see if a class has already been associated
63
+ # with the supplied extension name.
64
+ #
65
+ def self.check_ext_hash(name)
66
+ @@ext_hash[name]
67
+ end
68
+
69
+ #
70
+ # Stores the name to class association for the supplied extension name.
71
+ #
72
+ def self.set_ext_hash(name, klass)
73
+ @@ext_hash[name] = klass
74
+ end
75
+
76
+ #
77
+ # Initializes the client context with the supplied socket through
78
+ # which communication with the server will be performed.
79
+ #
80
+ def initialize(sock,opts={})
81
+ init_meterpreter(sock, opts)
82
+ end
83
+
84
+ #
85
+ # Cleans up the meterpreter instance, terminating the dispatcher thread.
86
+ #
87
+ def cleanup_meterpreter
88
+ ext.aliases.each_value do | extension |
89
+ extension.cleanup if extension.respond_to?( 'cleanup' )
90
+ end
91
+ dispatcher_thread.kill if dispatcher_thread
92
+ core.shutdown rescue nil
93
+ shutdown_passive_dispatcher
94
+ end
95
+
96
+ #
97
+ # Initializes the meterpreter client instance
98
+ #
99
+ def init_meterpreter(sock,opts={})
100
+ self.sock = sock
101
+ self.parser = PacketParser.new
102
+ self.ext = ObjectAliases.new
103
+ self.ext_aliases = ObjectAliases.new
104
+ self.alive = true
105
+ self.target_id = opts[:target_id]
106
+ self.capabilities = opts[:capabilities] || {}
107
+ self.commands = []
108
+
109
+
110
+ self.conn_id = opts[:conn_id]
111
+ self.url = opts[:url]
112
+ self.ssl = opts[:ssl]
113
+ self.expiration = opts[:expiration]
114
+ self.comm_timeout = opts[:comm_timeout]
115
+ self.passive_dispatcher = opts[:passive_dispatcher]
116
+
117
+ self.response_timeout = opts[:timeout] || self.class.default_timeout
118
+ self.send_keepalives = true
119
+ # self.encode_unicode = opts.has_key?(:encode_unicode) ? opts[:encode_unicode] : true
120
+ self.encode_unicode = false
121
+
122
+ if opts[:passive_dispatcher]
123
+ initialize_passive_dispatcher
124
+
125
+ register_extension_alias('core', ClientCore.new(self))
126
+
127
+ initialize_inbound_handlers
128
+ initialize_channels
129
+
130
+ # Register the channel inbound packet handler
131
+ register_inbound_handler(Rex::Post::Meterpreter::Channel)
132
+ else
133
+ # Switch the socket to SSL mode and receive the hello if needed
134
+ if capabilities[:ssl] and not opts[:skip_ssl]
135
+ swap_sock_plain_to_ssl()
136
+ end
137
+
138
+ register_extension_alias('core', ClientCore.new(self))
139
+
140
+ initialize_inbound_handlers
141
+ initialize_channels
142
+
143
+ # Register the channel inbound packet handler
144
+ register_inbound_handler(Rex::Post::Meterpreter::Channel)
145
+
146
+ monitor_socket
147
+ end
148
+ end
149
+
150
+ def swap_sock_plain_to_ssl
151
+ # Create a new SSL session on the existing socket
152
+ ctx = generate_ssl_context()
153
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
154
+
155
+ # Use non-blocking OpenSSL operations on Windows
156
+ if !( ssl.respond_to?(:accept_nonblock) and Rex::Compat.is_windows )
157
+ ssl.accept
158
+ else
159
+ begin
160
+ ssl.accept_nonblock
161
+
162
+ # Ruby 1.8.7 and 1.9.0/1.9.1 uses a standard Errno
163
+ rescue ::Errno::EAGAIN, ::Errno::EWOULDBLOCK
164
+ IO::select(nil, nil, nil, 0.10)
165
+ retry
166
+
167
+ # Ruby 1.9.2+ uses IO::WaitReadable/IO::WaitWritable
168
+ rescue ::Exception => e
169
+ if ::IO.const_defined?('WaitReadable') and e.kind_of?(::IO::WaitReadable)
170
+ IO::select( [ ssl ], nil, nil, 0.10 )
171
+ retry
172
+ end
173
+
174
+ if ::IO.const_defined?('WaitWritable') and e.kind_of?(::IO::WaitWritable)
175
+ IO::select( nil, [ ssl ], nil, 0.10 )
176
+ retry
177
+ end
178
+
179
+ raise e
180
+ end
181
+ end
182
+
183
+ self.sock.extend(Rex::Socket::SslTcp)
184
+ self.sock.sslsock = ssl
185
+ self.sock.sslctx = ctx
186
+
187
+ tag = self.sock.get_once(-1, 30)
188
+ if(not tag or tag !~ /^GET \//)
189
+ raise RuntimeError, "Could not read the HTTP hello token"
190
+ end
191
+ end
192
+
193
+ def swap_sock_ssl_to_plain
194
+ # Remove references to the SSLSocket and Context
195
+ self.sock.sslsock.close
196
+ self.sock.sslsock = nil
197
+ self.sock.sslctx = nil
198
+ self.sock = self.sock.fd
199
+ self.sock.extend(::Rex::Socket::Tcp)
200
+ end
201
+
202
+ def generate_ssl_context
203
+ @@ssl_mutex.synchronize do
204
+ if not @@ssl_ctx
205
+
206
+ wlog("Generating SSL certificate for Meterpreter sessions")
207
+
208
+ key = OpenSSL::PKey::RSA.new(1024){ }
209
+ cert = OpenSSL::X509::Certificate.new
210
+ cert.version = 2
211
+ cert.serial = rand(0xFFFFFFFF)
212
+
213
+ # Depending on how the socket was created, getsockname will
214
+ # return either a struct sockaddr as a String (the default ruby
215
+ # Socket behavior) or an Array (the extend'd Rex::Socket::Tcp
216
+ # behavior). Avoid the ambiguity by always picking a random
217
+ # hostname. See #7350.
218
+ subject_cn = Rex::Text.rand_hostname
219
+
220
+ subject = OpenSSL::X509::Name.new([
221
+ ["C","US"],
222
+ ['ST', Rex::Text.rand_state()],
223
+ ["L", Rex::Text.rand_text_alpha(rand(20) + 10)],
224
+ ["O", Rex::Text.rand_text_alpha(rand(20) + 10)],
225
+ ["CN", subject_cn],
226
+ ])
227
+ issuer = OpenSSL::X509::Name.new([
228
+ ["C","US"],
229
+ ['ST', Rex::Text.rand_state()],
230
+ ["L", Rex::Text.rand_text_alpha(rand(20) + 10)],
231
+ ["O", Rex::Text.rand_text_alpha(rand(20) + 10)],
232
+ ["CN", Rex::Text.rand_text_alpha(rand(20) + 10)],
233
+ ])
234
+
235
+ cert.subject = subject
236
+ cert.issuer = issuer
237
+ cert.not_before = Time.now - (3600 * 365) + rand(3600 * 14)
238
+ cert.not_after = Time.now + (3600 * 365) + rand(3600 * 14)
239
+ cert.public_key = key.public_key
240
+ ef = OpenSSL::X509::ExtensionFactory.new(nil,cert)
241
+ cert.extensions = [
242
+ ef.create_extension("basicConstraints","CA:FALSE"),
243
+ ef.create_extension("subjectKeyIdentifier","hash"),
244
+ ef.create_extension("extendedKeyUsage","serverAuth"),
245
+ ef.create_extension("keyUsage","keyEncipherment,dataEncipherment,digitalSignature")
246
+ ]
247
+ ef.issuer_certificate = cert
248
+ cert.add_extension ef.create_extension("authorityKeyIdentifier", "keyid:always,issuer:always")
249
+ cert.sign(key, OpenSSL::Digest::SHA1.new)
250
+
251
+ ctx = OpenSSL::SSL::SSLContext.new(:SSLv3)
252
+ ctx.key = key
253
+ ctx.cert = cert
254
+
255
+ ctx.session_id_context = Rex::Text.rand_text(16)
256
+
257
+ wlog("Generated SSL certificate for Meterpreter sessions")
258
+
259
+ @@ssl_ctx = ctx
260
+
261
+ end # End of if not @ssl_ctx
262
+ end # End of mutex.synchronize
263
+
264
+ @@ssl_ctx
265
+ end
266
+
267
+ ##
268
+ #
269
+ # Accessors
270
+ #
271
+ ##
272
+
273
+ #
274
+ # Returns the default timeout that request packets will use when
275
+ # waiting for a response.
276
+ #
277
+ def Client.default_timeout
278
+ return 300
279
+ end
280
+
281
+ ##
282
+ #
283
+ # Alias processor
284
+ #
285
+ ##
286
+
287
+ #
288
+ # Translates unhandled methods into registered extension aliases
289
+ # if a matching extension alias exists for the supplied symbol.
290
+ #
291
+ def method_missing(symbol, *args)
292
+ #$stdout.puts("method_missing: #{symbol}")
293
+ self.ext_aliases.aliases[symbol.to_s]
294
+ end
295
+
296
+ ##
297
+ #
298
+ # Extension registration
299
+ #
300
+ ##
301
+
302
+ #
303
+ # Loads the client half of the supplied extension and initializes it as a
304
+ # registered extension that can be reached through client.ext.[extension].
305
+ #
306
+ def add_extension(name, commands=[])
307
+ self.commands |= commands
308
+
309
+ # Check to see if this extension has already been loaded.
310
+ if ((klass = self.class.check_ext_hash(name.downcase)) == nil)
311
+ old = Rex::Post::Meterpreter::Extensions.constants
312
+ require("rex/post/meterpreter/extensions/#{name.downcase}/#{name.downcase}")
313
+ new = Rex::Post::Meterpreter::Extensions.constants
314
+
315
+ # No new constants added?
316
+ if ((diff = new - old).empty?)
317
+ diff = [ name.capitalize ]
318
+ end
319
+
320
+ klass = Rex::Post::Meterpreter::Extensions.const_get(diff[0]).const_get(diff[0])
321
+
322
+ # Save the module name to class association now that the code is
323
+ # loaded.
324
+ self.class.set_ext_hash(name.downcase, klass)
325
+ end
326
+
327
+ # Create a new instance of the extension
328
+ inst = klass.new(self)
329
+
330
+ self.ext.aliases[inst.name] = inst
331
+
332
+ return true
333
+ end
334
+
335
+ #
336
+ # Deregisters an extension alias of the supplied name.
337
+ #
338
+ def deregister_extension(name)
339
+ self.ext.aliases.delete(name)
340
+ end
341
+
342
+ #
343
+ # Enumerates all of the loaded extensions.
344
+ #
345
+ def each_extension(&block)
346
+ self.ext.aliases.each(block)
347
+ end
348
+
349
+ #
350
+ # Registers an aliased extension that can be referenced through
351
+ # client.name.
352
+ #
353
+ def register_extension_alias(name, ext)
354
+ self.ext_aliases.aliases[name] = ext
355
+ # Whee! Syntactic sugar, where art thou?
356
+ #
357
+ # Create an instance method on this object called +name+ that returns
358
+ # +ext+. We have to do it this way instead of simply
359
+ # self.class.class_eval so that other meterpreter sessions don't get
360
+ # extension methods when this one does
361
+ (class << self; self; end).class_eval do
362
+ define_method(name.to_sym) do
363
+ ext
364
+ end
365
+ end
366
+ ext
367
+ end
368
+
369
+ #
370
+ # Registers zero or more aliases that are provided in an array.
371
+ #
372
+ def register_extension_aliases(aliases)
373
+ aliases.each { |a|
374
+ register_extension_alias(a['name'], a['ext'])
375
+ }
376
+ end
377
+
378
+ #
379
+ # Deregisters a previously registered extension alias.
380
+ #
381
+ def deregister_extension_alias(name)
382
+ self.ext_aliases.aliases.delete(name)
383
+ end
384
+
385
+ #
386
+ # Dumps the extension tree.
387
+ #
388
+ def dump_extension_tree()
389
+ items = []
390
+ items.concat(self.ext.dump_alias_tree('client.ext'))
391
+ items.concat(self.ext_aliases.dump_alias_tree('client'))
392
+
393
+ return items.sort
394
+ end
395
+
396
+ #
397
+ # Encodes (or not) a UTF-8 string
398
+ #
399
+ def unicode_filter_encode(str)
400
+ self.encode_unicode ? Rex::Text.unicode_filter_encode(str) : str
401
+ end
402
+
403
+ #
404
+ # Decodes (or not) a UTF-8 string
405
+ #
406
+ def unicode_filter_decode(str)
407
+ self.encode_unicode ? Rex::Text.unicode_filter_decode(str) : str
408
+ end
409
+
410
+ #
411
+ # The extension alias under which all extensions can be accessed by name.
412
+ # For example:
413
+ #
414
+ # client.ext.stdapi
415
+ #
416
+ #
417
+ attr_reader :ext
418
+ #
419
+ # The socket the client is communicating over.
420
+ #
421
+ attr_reader :sock
422
+ #
423
+ # The timeout value to use when waiting for responses.
424
+ #
425
+ attr_accessor :response_timeout
426
+ #
427
+ # Whether to send pings every so often to determine liveness.
428
+ #
429
+ attr_accessor :send_keepalives
430
+ #
431
+ # Whether this session is alive. If the socket is disconnected or broken,
432
+ # this will be false
433
+ #
434
+ attr_accessor :alive
435
+ #
436
+ # The unique target identifier for this payload
437
+ #
438
+ attr_accessor :target_id
439
+ #
440
+ # The libraries available to this meterpreter server
441
+ #
442
+ attr_accessor :capabilities
443
+ #
444
+ # The Connection ID
445
+ #
446
+ attr_accessor :conn_id
447
+ #
448
+ # The Connect URL
449
+ #
450
+ attr_accessor :url
451
+ #
452
+ # Use SSL (HTTPS)
453
+ #
454
+ attr_accessor :ssl
455
+ #
456
+ # The Session Expiration Timeout
457
+ #
458
+ attr_accessor :expiration
459
+ #
460
+ # The Communication Timeout
461
+ #
462
+ attr_accessor :comm_timeout
463
+ #
464
+ # The Passive Dispatcher
465
+ #
466
+ attr_accessor :passive_dispatcher
467
+ #
468
+ # Flag indicating whether to hex-encode UTF-8 file names and other strings
469
+ #
470
+ attr_accessor :encode_unicode
471
+ #
472
+ # A list of the commands
473
+ #
474
+ attr_reader :commands
469
475
 
470
476
  protected
471
- attr_accessor :parser, :ext_aliases # :nodoc:
472
- attr_writer :ext, :sock # :nodoc:
473
- attr_writer :commands # :nodoc:
477
+ attr_accessor :parser, :ext_aliases # :nodoc:
478
+ attr_writer :ext, :sock # :nodoc:
479
+ attr_writer :commands # :nodoc:
474
480
  end
475
481
 
476
482
  end; end; end