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/post/meterpreter/packet_response_waiter'
@@ -15,24 +14,24 @@ module Meterpreter
15
14
  #
16
15
  ###
17
16
  class RequestError < ArgumentError
18
- def initialize(method, einfo, ecode=nil)
19
- @method = method
20
- @result = einfo
21
- @code = ecode || einfo
22
- end
17
+ def initialize(method, einfo, ecode=nil)
18
+ @method = method
19
+ @result = einfo
20
+ @code = ecode || einfo
21
+ end
23
22
 
24
- def to_s
25
- "#{@method}: Operation failed: #{@result}"
26
- end
23
+ def to_s
24
+ "#{@method}: Operation failed: #{@result}"
25
+ end
27
26
 
28
- # The method that failed.
29
- attr_reader :method
27
+ # The method that failed.
28
+ attr_reader :method
30
29
 
31
- # The error result that occurred, typically a windows error message.
32
- attr_reader :result
30
+ # The error result that occurred, typically a windows error message.
31
+ attr_reader :result
33
32
 
34
- # The error result that occurred, typically a windows error code.
35
- attr_reader :code
33
+ # The error result that occurred, typically a windows error code.
34
+ attr_reader :code
36
35
  end
37
36
 
38
37
  ###
@@ -43,490 +42,501 @@ end
43
42
  ###
44
43
  module PacketDispatcher
45
44
 
46
- PacketTimeout = 600
47
-
48
- ##
49
- #
50
- # Synchronization
51
- #
52
- ##
53
- attr_accessor :comm_mutex
54
-
55
-
56
- ##
57
- #
58
- #
59
- # Passive Dispatching
60
- #
61
- ##
62
- attr_accessor :passive_service, :send_queue, :recv_queue
63
-
64
- def initialize_passive_dispatcher
65
- self.send_queue = []
66
- self.recv_queue = []
67
- self.waiters = []
68
- self.alive = true
69
-
70
- self.passive_service = self.passive_dispatcher
71
- self.passive_service.remove_resource("/" + self.conn_id + "/")
72
- self.passive_service.add_resource("/" + self.conn_id + "/",
73
- 'Proc' => Proc.new { |cli, req| on_passive_request(cli, req) },
74
- 'VirtualDirectory' => true
75
- )
76
- end
77
-
78
- def shutdown_passive_dispatcher
79
- return if not self.passive_service
80
- self.passive_service.remove_resource("/" + self.conn_id + "/")
81
-
82
- self.alive = false
83
- self.send_queue = []
84
- self.recv_queue = []
85
- self.waiters = []
86
-
87
- self.passive_service = nil
88
- end
89
-
90
- def on_passive_request(cli, req)
91
-
92
- begin
93
-
94
- resp = Rex::Proto::Http::Response.new(200, "OK")
95
- resp['Content-Type'] = 'application/octet-stream'
96
- resp['Connection'] = 'close'
97
-
98
- # If the first 4 bytes are "RECV", return the oldest packet from the outbound queue
99
- if req.body[0,4] == "RECV"
100
- rpkt = send_queue.pop
101
- resp.body = rpkt || ''
102
- begin
103
- cli.send_response(resp)
104
- rescue ::Exception => e
105
- send_queue.unshift(rpkt) if rpkt
106
- elog("Exception sending a reply to the reader request: #{cli.inspect} #{e.class} #{e} #{e.backtrace}")
107
- end
108
- else
109
- resp.body = ""
110
- if req.body and req.body.length > 0
111
- packet = Packet.new(0)
112
- packet.from_r(req.body)
113
- dispatch_inbound_packet(packet)
114
- end
115
- cli.send_response(resp)
116
- end
117
-
118
- # Force a closure for older WinInet implementations
119
- self.passive_service.close_client( cli )
120
-
121
- rescue ::Exception => e
122
- elog("Exception handling request: #{cli.inspect} #{req.inspect} #{e.class} #{e} #{e.backtrace}")
123
- end
124
- end
125
-
126
- ##
127
- #
128
- # Transmission
129
- #
130
- ##
131
-
132
- #
133
- # Sends a packet without waiting for a response.
134
- #
135
- def send_packet(packet, completion_routine = nil, completion_param = nil)
136
- if (completion_routine)
137
- add_response_waiter(packet, completion_routine, completion_param)
138
- end
139
-
140
- bytes = 0
141
- raw = packet.to_r
142
- err = nil
143
-
144
- # Short-circuit send when using a passive dispatcher
145
- if self.passive_service
146
- send_queue.push(raw)
147
- return raw.size # Lie!
148
- end
149
-
150
- if (raw)
151
-
152
- # This mutex is used to lock out new commands during an
153
- # active migration.
154
-
155
- self.comm_mutex.synchronize do
156
- begin
157
- bytes = self.sock.write(raw)
158
- rescue ::Exception => e
159
- err = e
160
- end
161
- end
162
-
163
- if bytes.to_i == 0
164
- # Mark the session itself as dead
165
- self.alive = false
166
-
167
- # Indicate that the dispatcher should shut down too
168
- @finish = true
169
-
170
- # Reraise the error to the top-level caller
171
- raise err if err
172
- end
173
- end
174
-
175
- return bytes
176
- end
177
-
178
- #
179
- # Sends a packet and waits for a timeout for the given time interval.
180
- #
181
- def send_request(packet, t = self.response_timeout)
182
-
183
- if not t
184
- send_packet(packet)
185
- return nil
186
- end
187
-
188
- response = send_packet_wait_response(packet, t)
189
-
190
- if (response == nil)
191
- raise TimeoutError.new("Send timed out")
192
- elsif (response.result != 0)
193
- einfo = lookup_error(response.result)
194
- e = RequestError.new(packet.method, einfo, response.result)
195
-
196
- e.set_backtrace(caller)
197
-
198
- raise e
199
- end
200
-
201
- return response
202
- end
203
-
204
- #
205
- # Transmits a packet and waits for a response.
206
- #
207
- def send_packet_wait_response(packet, t)
208
- # First, add the waiter association for the supplied packet
209
- waiter = add_response_waiter(packet)
210
-
211
- # Transmit the packet
212
- if (send_packet(packet).to_i <= 0)
213
- # Remove the waiter if we failed to send the packet.
214
- remove_response_waiter(waiter)
215
- return nil
216
- end
217
-
218
- # Wait for the supplied time interval
219
- waiter.wait(t)
220
-
221
- # Remove the waiter from the list of waiters in case it wasn't
222
- # removed
223
- remove_response_waiter(waiter)
224
-
225
- # Return the response packet, if any
226
- return waiter.response
227
- end
228
-
229
- ##
230
- #
231
- # Reception
232
- #
233
- ##
234
- #
235
- # Monitors the PacketDispatcher's sock for data in its own
236
- # thread context and parsers all inbound packets.
237
- #
238
- def monitor_socket
239
-
240
- # Skip if we are using a passive dispatcher
241
- return if self.passive_service
242
-
243
- self.comm_mutex = ::Mutex.new
244
-
245
- self.waiters = []
246
-
247
- @pqueue = []
248
- @finish = false
249
- @last_recvd = Time.now
250
- @ping_sent = false
251
-
252
- self.alive = true
253
-
254
- # Spawn a thread for receiving packets
255
- self.receiver_thread = Rex::ThreadFactory.spawn("MeterpreterReceiver", false) do
256
- while (self.alive)
257
- begin
258
- rv = Rex::ThreadSafe.select([ self.sock.fd ], nil, nil, 0.25)
259
- ping_time = 60
260
- # If there's nothing to read, and it's been awhile since we
261
- # saw a packet, we need to send a ping. We wait
262
- # ping_time*2 seconds before deciding a session is dead.
263
- if (not rv and self.send_keepalives and Time.now - @last_recvd > ping_time)
264
- # If the queue is empty and we've already sent a
265
- # keepalive without getting a reply, then this
266
- # session is hosed, and we should give up on it.
267
- if @ping_sent and @pqueue.empty? and (Time.now - @last_recvd > ping_time * 2)
268
- dlog("No response to ping, session #{self.sid} is dead", LEV_3)
269
- self.alive = false
270
- @finish = true
271
- break
272
- end
273
- # Let the packet queue processor finish up before
274
- # we send a ping.
275
- if not @ping_sent and @pqueue.empty?
276
- # Our 'ping' is actually just a check for eof on
277
- # channel id 0. This method has no side effects
278
- # and always returns an answer (regardless of the
279
- # existence of chan 0), which is all that's
280
- # needed for a liveness check. The answer itself
281
- # is unimportant and is ignored.
282
- pkt = Packet.create_request('core_channel_eof')
283
- pkt.add_tlv(TLV_TYPE_CHANNEL_ID, 0)
284
- waiter = Proc.new { |response, param|
285
- @ping_sent = false
286
- @last_recvd = Time.now
287
- }
288
- send_packet(pkt, waiter)
289
- @ping_sent = true
290
- end
291
- next
292
- end
293
- next if not rv
294
- packet = receive_packet
295
- @pqueue << packet if packet
296
- @last_recvd = Time.now
297
- rescue ::Exception
298
- dlog("Exception caught in monitor_socket: #{$!}", 'meterpreter', LEV_1)
299
- @finish = true
300
- self.alive = false
301
- break
302
- end
303
- end
304
- end
305
-
306
- # Spawn a new thread that monitors the socket
307
- self.dispatcher_thread = Rex::ThreadFactory.spawn("MeterpreterDispatcher", false) do
308
- begin
309
- # Whether we're finished or not is determined by the receiver
310
- # thread above.
311
- while(not @finish)
312
- if(@pqueue.empty?)
313
- ::IO.select(nil, nil, nil, 0.10)
314
- next
315
- end
316
-
317
- incomplete = []
318
- backlog = []
319
-
320
- while(@pqueue.length > 0)
321
- backlog << @pqueue.shift
322
- end
323
-
324
- #
325
- # Prioritize message processing here
326
- # 1. Close should always be processed at the end
327
- # 2. Command responses always before channel data
328
- #
329
-
330
- tmp_command = []
331
- tmp_channel = []
332
- tmp_close = []
333
- backlog.each do |pkt|
334
- if(pkt.response?)
335
- tmp_command << pkt
336
- next
337
- end
338
- if(pkt.method == "core_channel_close")
339
- tmp_close << pkt
340
- next
341
- end
342
- tmp_channel << pkt
343
- end
344
-
345
- backlog = []
346
- backlog.push(*tmp_command)
347
- backlog.push(*tmp_channel)
348
- backlog.push(*tmp_close)
349
-
350
-
351
- #
352
- # Process the message queue
353
- #
354
-
355
- backlog.each do |pkt|
356
-
357
- begin
358
- if ! dispatch_inbound_packet(pkt)
359
- # Only requeue packets newer than the timeout
360
- if (::Time.now.to_i - pkt.created_at.to_i < PacketTimeout)
361
- incomplete << pkt
362
- end
363
- end
364
-
365
- rescue ::Exception => e
366
- dlog("Dispatching exception with packet #{pkt}: #{e} #{e.backtrace}", 'meterpreter', LEV_1)
367
- end
368
- end
369
-
370
- @pqueue.unshift(*incomplete)
371
-
372
- if(@pqueue.length > 100)
373
- dlog("Backlog has grown to over 100 in monitor_socket, dropping older packets: #{@pqueue[0 .. 25].map{|x| x.inspect}.join(" - ")}", 'meterpreter', LEV_1)
374
- @pqueue = @pqueue[25 .. 100]
375
- end
376
- end
377
- rescue ::Exception => e
378
- dlog("Exception caught in monitor_socket dispatcher: #{e.class} #{e} #{e.backtrace}", 'meterpreter', LEV_1)
379
- ensure
380
- self.receiver_thread.kill if self.receiver_thread
381
- end
382
- end
383
- end
384
-
385
-
386
- #
387
- # Parses data from the dispatcher's sock and returns a Packet context
388
- # once a full packet has been received.
389
- #
390
- def receive_packet
391
- return parser.recv(self.sock)
392
- end
393
-
394
- #
395
- # Stop the monitor
396
- #
397
- def monitor_stop
398
- if(self.receiver_thread)
399
- self.receiver_thread.kill
400
- self.receiver_thread = nil
401
- end
402
-
403
- if(self.dispatcher_thread)
404
- self.dispatcher_thread.kill
405
- self.dispatcher_thread = nil
406
- end
407
- end
408
-
409
- ##
410
- #
411
- # Waiter registration
412
- #
413
- ##
414
-
415
- #
416
- # Adds a waiter association with the supplied request packet.
417
- #
418
- def add_response_waiter(request, completion_routine = nil, completion_param = nil)
419
- waiter = PacketResponseWaiter.new(request.rid, completion_routine, completion_param)
420
-
421
- self.waiters << waiter
422
-
423
- return waiter
424
- end
425
-
426
- #
427
- # Notifies a whomever is waiting for a the supplied response,
428
- # if anyone.
429
- #
430
- def notify_response_waiter(response)
431
- self.waiters.each() { |waiter|
432
- if (waiter.waiting_for?(response))
433
- waiter.notify(response)
434
-
435
- remove_response_waiter(waiter)
436
-
437
- break
438
- end
439
- }
440
- end
441
-
442
- #
443
- # Removes a waiter from the list of waiters.
444
- #
445
- def remove_response_waiter(waiter)
446
- self.waiters.delete(waiter)
447
- end
448
-
449
- ##
450
- #
451
- # Dispatching
452
- #
453
- ##
454
-
455
- #
456
- # Initializes the inbound handlers.
457
- #
458
- def initialize_inbound_handlers
459
- @inbound_handlers = []
460
- end
461
-
462
- #
463
- # Dispatches and processes an inbound packet. If the packet is a
464
- # response that has an associated waiter, the waiter is notified.
465
- # Otherwise, the packet is passed onto any registered dispatch
466
- # handlers until one returns success.
467
- #
468
- def dispatch_inbound_packet(packet, client = nil)
469
- handled = false
470
-
471
- # If no client context was provided, return self as PacketDispatcher
472
- # is a mixin for the Client instance
473
- if (client == nil)
474
- client = self
475
- end
476
-
477
- # If the packet is a response, try to notify any potential
478
- # waiters
479
- if ((resp = packet.response?))
480
- if (notify_response_waiter(packet))
481
- return true
482
- end
483
- end
484
-
485
- # Enumerate all of the inbound packet handlers until one handles
486
- # the packet
487
- @inbound_handlers.each { |handler|
488
-
489
- handled = nil
490
- begin
491
-
492
- if ! resp
493
- handled = handler.request_handler(client, packet)
494
- else
495
- handled = handler.response_handler(client, packet)
496
- end
497
-
498
- rescue ::Exception => e
499
- dlog("Exception caught in dispatch_inbound_packet: handler=#{handler} #{e.class} #{e} #{e.backtrace}", 'meterpreter', LEV_1)
500
- return true
501
- end
502
-
503
- if (handled)
504
- break
505
- end
506
- }
507
- return handled
508
- end
509
-
510
- #
511
- # Registers an inbound packet handler that implements the
512
- # InboundPacketHandler interface.
513
- #
514
- def register_inbound_handler(handler)
515
- @inbound_handlers << handler
516
- end
517
-
518
- #
519
- # Deregisters a previously registered inbound packet handler.
520
- #
521
- def deregister_inbound_handler(handler)
522
- @inbound_handlers.delete(handler)
523
- end
45
+ PacketTimeout = 600
46
+
47
+ ##
48
+ #
49
+ # Synchronization
50
+ #
51
+ ##
52
+ attr_accessor :comm_mutex
53
+
54
+
55
+ ##
56
+ #
57
+ #
58
+ # Passive Dispatching
59
+ #
60
+ ##
61
+ attr_accessor :passive_service, :send_queue, :recv_queue
62
+
63
+ def initialize_passive_dispatcher
64
+ self.send_queue = []
65
+ self.recv_queue = []
66
+ self.waiters = []
67
+ self.alive = true
68
+
69
+ self.passive_service = self.passive_dispatcher
70
+ self.passive_service.remove_resource("/" + self.conn_id + "/")
71
+ self.passive_service.add_resource("/" + self.conn_id + "/",
72
+ 'Proc' => Proc.new { |cli, req| on_passive_request(cli, req) },
73
+ 'VirtualDirectory' => true
74
+ )
75
+ end
76
+
77
+ def shutdown_passive_dispatcher
78
+ return if not self.passive_service
79
+ self.passive_service.remove_resource("/" + self.conn_id + "/")
80
+
81
+ self.alive = false
82
+ self.send_queue = []
83
+ self.recv_queue = []
84
+ self.waiters = []
85
+
86
+ self.passive_service = nil
87
+ end
88
+
89
+ def on_passive_request(cli, req)
90
+
91
+ begin
92
+
93
+ resp = Rex::Proto::Http::Response.new(200, "OK")
94
+ resp['Content-Type'] = 'application/octet-stream'
95
+ resp['Connection'] = 'close'
96
+
97
+ # If the first 4 bytes are "RECV", return the oldest packet from the outbound queue
98
+ if req.body[0,4] == "RECV"
99
+ rpkt = send_queue.pop
100
+ resp.body = rpkt || ''
101
+ begin
102
+ cli.send_response(resp)
103
+ rescue ::Exception => e
104
+ send_queue.unshift(rpkt) if rpkt
105
+ elog("Exception sending a reply to the reader request: #{cli.inspect} #{e.class} #{e} #{e.backtrace}")
106
+ end
107
+ else
108
+ resp.body = ""
109
+ if req.body and req.body.length > 0
110
+ packet = Packet.new(0)
111
+ packet.from_r(req.body)
112
+ dispatch_inbound_packet(packet)
113
+ end
114
+ cli.send_response(resp)
115
+ end
116
+
117
+ # Force a closure for older WinInet implementations
118
+ self.passive_service.close_client( cli )
119
+
120
+ rescue ::Exception => e
121
+ elog("Exception handling request: #{cli.inspect} #{req.inspect} #{e.class} #{e} #{e.backtrace}")
122
+ end
123
+ end
124
+
125
+ ##
126
+ #
127
+ # Transmission
128
+ #
129
+ ##
130
+
131
+ #
132
+ # Sends a packet without waiting for a response.
133
+ #
134
+ def send_packet(packet, completion_routine = nil, completion_param = nil)
135
+ if (completion_routine)
136
+ add_response_waiter(packet, completion_routine, completion_param)
137
+ end
138
+
139
+ bytes = 0
140
+ raw = packet.to_r
141
+ err = nil
142
+
143
+ # Short-circuit send when using a passive dispatcher
144
+ if self.passive_service
145
+ send_queue.push(raw)
146
+ return raw.size # Lie!
147
+ end
148
+
149
+ if (raw)
150
+
151
+ # This mutex is used to lock out new commands during an
152
+ # active migration.
153
+
154
+ self.comm_mutex.synchronize do
155
+ begin
156
+ bytes = self.sock.write(raw)
157
+ rescue ::Exception => e
158
+ err = e
159
+ end
160
+ end
161
+
162
+ if bytes.to_i == 0
163
+ # Mark the session itself as dead
164
+ self.alive = false
165
+
166
+ # Indicate that the dispatcher should shut down too
167
+ @finish = true
168
+
169
+ # Reraise the error to the top-level caller
170
+ raise err if err
171
+ end
172
+ end
173
+
174
+ return bytes
175
+ end
176
+
177
+ #
178
+ # Sends a packet and waits for a timeout for the given time interval.
179
+ #
180
+ def send_request(packet, t = self.response_timeout)
181
+
182
+ if not t
183
+ send_packet(packet)
184
+ return nil
185
+ end
186
+
187
+ response = send_packet_wait_response(packet, t)
188
+
189
+ if (response == nil)
190
+ raise TimeoutError.new("Send timed out")
191
+ elsif (response.result != 0)
192
+ einfo = lookup_error(response.result)
193
+ e = RequestError.new(packet.method, einfo, response.result)
194
+
195
+ e.set_backtrace(caller)
196
+
197
+ raise e
198
+ end
199
+
200
+ return response
201
+ end
202
+
203
+ #
204
+ # Transmits a packet and waits for a response.
205
+ #
206
+ def send_packet_wait_response(packet, t)
207
+ # First, add the waiter association for the supplied packet
208
+ waiter = add_response_waiter(packet)
209
+
210
+ # Transmit the packet
211
+ if (send_packet(packet).to_i <= 0)
212
+ # Remove the waiter if we failed to send the packet.
213
+ remove_response_waiter(waiter)
214
+ return nil
215
+ end
216
+
217
+ # Wait for the supplied time interval
218
+ waiter.wait(t)
219
+
220
+ # Remove the waiter from the list of waiters in case it wasn't
221
+ # removed
222
+ remove_response_waiter(waiter)
223
+
224
+ # Return the response packet, if any
225
+ return waiter.response
226
+ end
227
+
228
+ ##
229
+ #
230
+ # Reception
231
+ #
232
+ ##
233
+ #
234
+ # Monitors the PacketDispatcher's sock for data in its own
235
+ # thread context and parsers all inbound packets.
236
+ #
237
+ def monitor_socket
238
+
239
+ # Skip if we are using a passive dispatcher
240
+ return if self.passive_service
241
+
242
+ self.comm_mutex = ::Mutex.new
243
+
244
+ self.waiters = []
245
+
246
+ @pqueue = []
247
+ @finish = false
248
+ @last_recvd = Time.now
249
+ @ping_sent = false
250
+
251
+ self.alive = true
252
+
253
+ # Spawn a thread for receiving packets
254
+ self.receiver_thread = Rex::ThreadFactory.spawn("MeterpreterReceiver", false) do
255
+ while (self.alive)
256
+ begin
257
+ rv = Rex::ThreadSafe.select([ self.sock.fd ], nil, nil, 0.25)
258
+ ping_time = 60
259
+ # If there's nothing to read, and it's been awhile since we
260
+ # saw a packet, we need to send a ping. We wait
261
+ # ping_time*2 seconds before deciding a session is dead.
262
+ if (not rv and self.send_keepalives and Time.now - @last_recvd > ping_time)
263
+ # If the queue is empty and we've already sent a
264
+ # keepalive without getting a reply, then this
265
+ # session is hosed, and we should give up on it.
266
+ if @ping_sent and @pqueue.empty? and (Time.now - @last_recvd > ping_time * 2)
267
+ dlog("No response to ping, session #{self.sid} is dead", LEV_3)
268
+ self.alive = false
269
+ @finish = true
270
+ break
271
+ end
272
+ # Let the packet queue processor finish up before
273
+ # we send a ping.
274
+ if not @ping_sent and @pqueue.empty?
275
+ # Our 'ping' is actually just a check for eof on
276
+ # channel id 0. This method has no side effects
277
+ # and always returns an answer (regardless of the
278
+ # existence of chan 0), which is all that's
279
+ # needed for a liveness check. The answer itself
280
+ # is unimportant and is ignored.
281
+ pkt = Packet.create_request('core_channel_eof')
282
+ pkt.add_tlv(TLV_TYPE_CHANNEL_ID, 0)
283
+ waiter = Proc.new { |response, param|
284
+ @ping_sent = false
285
+ @last_recvd = Time.now
286
+ }
287
+ send_packet(pkt, waiter)
288
+ @ping_sent = true
289
+ end
290
+ next
291
+ end
292
+ next if not rv
293
+ packet = receive_packet
294
+ @pqueue << packet if packet
295
+ @last_recvd = Time.now
296
+ rescue ::Exception
297
+ dlog("Exception caught in monitor_socket: #{$!}", 'meterpreter', LEV_1)
298
+ @finish = true
299
+ self.alive = false
300
+ break
301
+ end
302
+ end
303
+ end
304
+
305
+ # Spawn a new thread that monitors the socket
306
+ self.dispatcher_thread = Rex::ThreadFactory.spawn("MeterpreterDispatcher", false) do
307
+ begin
308
+ # Whether we're finished or not is determined by the receiver
309
+ # thread above.
310
+ while(not @finish)
311
+ if(@pqueue.empty?)
312
+ ::IO.select(nil, nil, nil, 0.10)
313
+ next
314
+ end
315
+
316
+ incomplete = []
317
+ backlog = []
318
+
319
+ while(@pqueue.length > 0)
320
+ backlog << @pqueue.shift
321
+ end
322
+
323
+ #
324
+ # Prioritize message processing here
325
+ # 1. Close should always be processed at the end
326
+ # 2. Command responses always before channel data
327
+ #
328
+
329
+ tmp_command = []
330
+ tmp_channel = []
331
+ tmp_close = []
332
+ backlog.each do |pkt|
333
+ if(pkt.response?)
334
+ tmp_command << pkt
335
+ next
336
+ end
337
+ if(pkt.method == "core_channel_close")
338
+ tmp_close << pkt
339
+ next
340
+ end
341
+ tmp_channel << pkt
342
+ end
343
+
344
+ backlog = []
345
+ backlog.push(*tmp_command)
346
+ backlog.push(*tmp_channel)
347
+ backlog.push(*tmp_close)
348
+
349
+
350
+ #
351
+ # Process the message queue
352
+ #
353
+
354
+ backlog.each do |pkt|
355
+
356
+ begin
357
+ if ! dispatch_inbound_packet(pkt)
358
+ # Only requeue packets newer than the timeout
359
+ if (::Time.now.to_i - pkt.created_at.to_i < PacketTimeout)
360
+ incomplete << pkt
361
+ end
362
+ end
363
+
364
+ rescue ::Exception => e
365
+ dlog("Dispatching exception with packet #{pkt}: #{e} #{e.backtrace}", 'meterpreter', LEV_1)
366
+ end
367
+ end
368
+
369
+ # If the backlog and incomplete arrays are the same, it means
370
+ # dispatch_inbound_packet wasn't able to handle any of the
371
+ # packets. When that's the case, we can get into a situation
372
+ # where @pqueue is not empty and, since nothing else bounds this
373
+ # loop, we spin CPU trying to handle packets that can't be
374
+ # handled. Sleep here to treat that situation as though the
375
+ # queue is empty.
376
+ if (backlog.length > 0 && backlog.length == incomplete.length)
377
+ ::IO.select(nil, nil, nil, 0.10)
378
+ end
379
+
380
+ @pqueue.unshift(*incomplete)
381
+
382
+ if(@pqueue.length > 100)
383
+ dlog("Backlog has grown to over 100 in monitor_socket, dropping older packets: #{@pqueue[0 .. 25].map{|x| x.inspect}.join(" - ")}", 'meterpreter', LEV_1)
384
+ @pqueue = @pqueue[25 .. 100]
385
+ end
386
+ end
387
+ rescue ::Exception => e
388
+ dlog("Exception caught in monitor_socket dispatcher: #{e.class} #{e} #{e.backtrace}", 'meterpreter', LEV_1)
389
+ ensure
390
+ self.receiver_thread.kill if self.receiver_thread
391
+ end
392
+ end
393
+ end
394
+
395
+
396
+ #
397
+ # Parses data from the dispatcher's sock and returns a Packet context
398
+ # once a full packet has been received.
399
+ #
400
+ def receive_packet
401
+ return parser.recv(self.sock)
402
+ end
403
+
404
+ #
405
+ # Stop the monitor
406
+ #
407
+ def monitor_stop
408
+ if(self.receiver_thread)
409
+ self.receiver_thread.kill
410
+ self.receiver_thread = nil
411
+ end
412
+
413
+ if(self.dispatcher_thread)
414
+ self.dispatcher_thread.kill
415
+ self.dispatcher_thread = nil
416
+ end
417
+ end
418
+
419
+ ##
420
+ #
421
+ # Waiter registration
422
+ #
423
+ ##
424
+
425
+ #
426
+ # Adds a waiter association with the supplied request packet.
427
+ #
428
+ def add_response_waiter(request, completion_routine = nil, completion_param = nil)
429
+ waiter = PacketResponseWaiter.new(request.rid, completion_routine, completion_param)
430
+
431
+ self.waiters << waiter
432
+
433
+ return waiter
434
+ end
435
+
436
+ #
437
+ # Notifies a whomever is waiting for a the supplied response,
438
+ # if anyone.
439
+ #
440
+ def notify_response_waiter(response)
441
+ self.waiters.each() { |waiter|
442
+ if (waiter.waiting_for?(response))
443
+ waiter.notify(response)
444
+
445
+ remove_response_waiter(waiter)
446
+
447
+ break
448
+ end
449
+ }
450
+ end
451
+
452
+ #
453
+ # Removes a waiter from the list of waiters.
454
+ #
455
+ def remove_response_waiter(waiter)
456
+ self.waiters.delete(waiter)
457
+ end
458
+
459
+ ##
460
+ #
461
+ # Dispatching
462
+ #
463
+ ##
464
+
465
+ #
466
+ # Initializes the inbound handlers.
467
+ #
468
+ def initialize_inbound_handlers
469
+ @inbound_handlers = []
470
+ end
471
+
472
+ #
473
+ # Dispatches and processes an inbound packet. If the packet is a
474
+ # response that has an associated waiter, the waiter is notified.
475
+ # Otherwise, the packet is passed onto any registered dispatch
476
+ # handlers until one returns success.
477
+ #
478
+ def dispatch_inbound_packet(packet, client = nil)
479
+ handled = false
480
+
481
+ # If no client context was provided, return self as PacketDispatcher
482
+ # is a mixin for the Client instance
483
+ if (client == nil)
484
+ client = self
485
+ end
486
+
487
+ # If the packet is a response, try to notify any potential
488
+ # waiters
489
+ if ((resp = packet.response?))
490
+ if (notify_response_waiter(packet))
491
+ return true
492
+ end
493
+ end
494
+
495
+ # Enumerate all of the inbound packet handlers until one handles
496
+ # the packet
497
+ @inbound_handlers.each { |handler|
498
+
499
+ handled = nil
500
+ begin
501
+
502
+ if ! resp
503
+ handled = handler.request_handler(client, packet)
504
+ else
505
+ handled = handler.response_handler(client, packet)
506
+ end
507
+
508
+ rescue ::Exception => e
509
+ dlog("Exception caught in dispatch_inbound_packet: handler=#{handler} #{e.class} #{e} #{e.backtrace}", 'meterpreter', LEV_1)
510
+ return true
511
+ end
512
+
513
+ if (handled)
514
+ break
515
+ end
516
+ }
517
+ return handled
518
+ end
519
+
520
+ #
521
+ # Registers an inbound packet handler that implements the
522
+ # InboundPacketHandler interface.
523
+ #
524
+ def register_inbound_handler(handler)
525
+ @inbound_handlers << handler
526
+ end
527
+
528
+ #
529
+ # Deregisters a previously registered inbound packet handler.
530
+ #
531
+ def deregister_inbound_handler(handler)
532
+ @inbound_handlers.delete(handler)
533
+ end
524
534
 
525
535
  protected
526
536
 
527
- attr_accessor :receiver_thread # :nodoc:
528
- attr_accessor :dispatcher_thread # :nodoc:
529
- attr_accessor :waiters # :nodoc:
537
+ attr_accessor :receiver_thread # :nodoc:
538
+ attr_accessor :dispatcher_thread # :nodoc:
539
+ attr_accessor :waiters # :nodoc:
530
540
  end
531
541
 
532
542
  end; end; end