librex 0.0.65 → 0.0.66

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 (482) hide show
  1. data/README.markdown +1 -1
  2. data/lib/rex/arch.rb +1 -0
  3. data/lib/rex/arch/sparc.rb +16 -15
  4. data/lib/rex/arch/sparc.rb.ut.rb +2 -1
  5. data/lib/rex/arch/x86.rb +1 -0
  6. data/lib/rex/arch/x86.rb.ut.rb +2 -1
  7. data/lib/rex/assembly/nasm.rb +1 -0
  8. data/lib/rex/assembly/nasm.rb.ut.rb +2 -1
  9. data/lib/rex/compat.rb +13 -0
  10. data/lib/rex/constants.rb +5 -4
  11. data/lib/rex/elfparsey.rb +3 -2
  12. data/lib/rex/elfparsey/elf.rb +2 -1
  13. data/lib/rex/elfparsey/elfbase.rb +8 -7
  14. data/lib/rex/elfparsey/exceptions.rb +3 -2
  15. data/lib/rex/elfscan.rb +3 -2
  16. data/lib/rex/elfscan/scanner.rb +2 -1
  17. data/lib/rex/elfscan/search.rb +2 -1
  18. data/lib/rex/encoder/alpha2.rb +2 -1
  19. data/lib/rex/encoder/alpha2/alpha_mixed.rb +3 -2
  20. data/lib/rex/encoder/alpha2/alpha_upper.rb +5 -4
  21. data/lib/rex/encoder/alpha2/generic.rb +37 -60
  22. data/lib/rex/encoder/alpha2/unicode_mixed.rb +4 -9
  23. data/lib/rex/encoder/alpha2/unicode_upper.rb +4 -9
  24. data/lib/rex/encoder/ndr.rb +1 -0
  25. data/lib/rex/encoder/ndr.rb.ut.rb +2 -1
  26. data/lib/rex/encoder/nonalpha.rb +1 -0
  27. data/lib/rex/encoder/nonupper.rb +1 -0
  28. data/lib/rex/encoder/xdr.rb +9 -8
  29. data/lib/rex/encoder/xdr.rb.ut.rb +2 -1
  30. data/lib/rex/encoder/xor.rb +1 -0
  31. data/lib/rex/encoder/xor/dword.rb +2 -1
  32. data/lib/rex/encoder/xor/dword_additive.rb +2 -1
  33. data/lib/rex/encoders/xor_dword.rb +1 -0
  34. data/lib/rex/encoders/xor_dword_additive.rb +2 -1
  35. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +2 -1
  36. data/lib/rex/encoding/xor.rb +2 -1
  37. data/lib/rex/encoding/xor.rb.ts.rb +2 -1
  38. data/lib/rex/encoding/xor/byte.rb +2 -1
  39. data/lib/rex/encoding/xor/byte.rb.ut.rb +2 -1
  40. data/lib/rex/encoding/xor/dword.rb +2 -1
  41. data/lib/rex/encoding/xor/dword.rb.ut.rb +2 -1
  42. data/lib/rex/encoding/xor/dword_additive.rb +1 -0
  43. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +2 -1
  44. data/lib/rex/encoding/xor/exceptions.rb +1 -0
  45. data/lib/rex/encoding/xor/generic.rb +1 -0
  46. data/lib/rex/encoding/xor/generic.rb.ut.rb +2 -1
  47. data/lib/rex/encoding/xor/qword.rb +2 -1
  48. data/lib/rex/encoding/xor/word.rb +2 -1
  49. data/lib/rex/encoding/xor/word.rb.ut.rb +2 -1
  50. data/lib/rex/exceptions.rb +1 -0
  51. data/lib/rex/exceptions.rb.ut.rb +2 -1
  52. data/lib/rex/exploitation/cmdstager.rb +2 -1
  53. data/lib/rex/exploitation/cmdstager/base.rb +1 -0
  54. data/lib/rex/exploitation/cmdstager/debug_asm.rb +2 -1
  55. data/lib/rex/exploitation/cmdstager/debug_write.rb +2 -1
  56. data/lib/rex/exploitation/cmdstager/tftp.rb +2 -1
  57. data/lib/rex/exploitation/cmdstager/vbs.rb +2 -1
  58. data/lib/rex/exploitation/egghunter.rb +12 -11
  59. data/lib/rex/exploitation/egghunter.rb.ut.rb +2 -1
  60. data/lib/rex/exploitation/encryptjs.rb +1 -0
  61. data/lib/rex/exploitation/heaplib.rb +1 -0
  62. data/lib/rex/exploitation/javascriptosdetect.js +1014 -0
  63. data/lib/rex/exploitation/javascriptosdetect.rb +4 -857
  64. data/lib/rex/exploitation/jsobfu.rb +2 -1
  65. data/lib/rex/exploitation/obfuscatejs.rb +1 -0
  66. data/lib/rex/exploitation/omelet.rb +1 -0
  67. data/lib/rex/exploitation/omelet.rb.ut.rb +1 -0
  68. data/lib/rex/exploitation/opcodedb.rb +12 -11
  69. data/lib/rex/exploitation/opcodedb.rb.ut.rb +2 -1
  70. data/lib/rex/exploitation/seh.rb +3 -2
  71. data/lib/rex/exploitation/seh.rb.ut.rb +2 -1
  72. data/lib/rex/file.rb +4 -3
  73. data/lib/rex/file.rb.ut.rb +2 -1
  74. data/lib/rex/image_source.rb +3 -2
  75. data/lib/rex/image_source/disk.rb +3 -2
  76. data/lib/rex/image_source/image_source.rb +3 -2
  77. data/lib/rex/image_source/memory.rb +3 -2
  78. data/lib/rex/io/bidirectional_pipe.rb +1 -0
  79. data/lib/rex/io/datagram_abstraction.rb +2 -1
  80. data/lib/rex/io/ring_buffer.rb +49 -44
  81. data/lib/rex/io/ring_buffer.rb.ut.rb +4 -3
  82. data/lib/rex/io/stream.rb +1 -0
  83. data/lib/rex/io/stream_abstraction.rb +1 -0
  84. data/lib/rex/io/stream_server.rb +1 -0
  85. data/lib/rex/job_container.rb +1 -0
  86. data/lib/rex/logging.rb +2 -1
  87. data/lib/rex/logging/log_dispatcher.rb +5 -4
  88. data/lib/rex/logging/log_sink.rb +2 -1
  89. data/lib/rex/logging/sinks/flatfile.rb +4 -3
  90. data/lib/rex/logging/sinks/stderr.rb +2 -1
  91. data/lib/rex/machparsey.rb +2 -1
  92. data/lib/rex/machparsey/exceptions.rb +2 -1
  93. data/lib/rex/machparsey/mach.rb +20 -19
  94. data/lib/rex/machparsey/machbase.rb +27 -26
  95. data/lib/rex/machscan.rb +2 -1
  96. data/lib/rex/machscan/scanner.rb +1 -0
  97. data/lib/rex/mime.rb +2 -1
  98. data/lib/rex/mime/header.rb +1 -0
  99. data/lib/rex/mime/message.rb +4 -1
  100. data/lib/rex/mime/part.rb +2 -1
  101. data/lib/rex/nop/opty2.rb +2 -1
  102. data/lib/rex/nop/opty2.rb.ut.rb +2 -1
  103. data/lib/rex/nop/opty2_tables.rb +1 -0
  104. data/lib/rex/ole.rb +3 -2
  105. data/lib/rex/ole/clsid.rb +3 -2
  106. data/lib/rex/ole/difat.rb +3 -2
  107. data/lib/rex/ole/directory.rb +3 -2
  108. data/lib/rex/ole/direntry.rb +3 -2
  109. data/lib/rex/ole/fat.rb +3 -2
  110. data/lib/rex/ole/header.rb +3 -2
  111. data/lib/rex/ole/minifat.rb +3 -2
  112. data/lib/rex/ole/propset.rb +4 -3
  113. data/lib/rex/ole/samples/create_ole.rb +1 -0
  114. data/lib/rex/ole/samples/dir.rb +1 -0
  115. data/lib/rex/ole/samples/dump_stream.rb +1 -0
  116. data/lib/rex/ole/samples/ole_info.rb +1 -0
  117. data/lib/rex/ole/storage.rb +3 -2
  118. data/lib/rex/ole/stream.rb +3 -2
  119. data/lib/rex/ole/substorage.rb +3 -2
  120. data/lib/rex/ole/util.rb +3 -2
  121. data/lib/rex/parser/acunetix_nokogiri.rb +13 -12
  122. data/lib/rex/parser/apple_backup_manifestdb.rb +20 -19
  123. data/lib/rex/parser/appscan_nokogiri.rb +17 -16
  124. data/lib/rex/parser/arguments.rb +2 -1
  125. data/lib/rex/parser/arguments.rb.ut.rb +2 -1
  126. data/lib/rex/parser/burp_session_nokogiri.rb +8 -7
  127. data/lib/rex/parser/ci_nokogiri.rb +4 -3
  128. data/lib/rex/parser/foundstone_nokogiri.rb +18 -17
  129. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  130. data/lib/rex/parser/ini.rb +1 -0
  131. data/lib/rex/parser/ini.rb.ut.rb +2 -1
  132. data/lib/rex/parser/ip360_aspl_xml.rb +1 -0
  133. data/lib/rex/parser/ip360_xml.rb +4 -3
  134. data/lib/rex/parser/mbsa_nokogiri.rb +8 -7
  135. data/lib/rex/parser/nessus_xml.rb +3 -2
  136. data/lib/rex/parser/netsparker_xml.rb +10 -9
  137. data/lib/rex/parser/nexpose_raw_nokogiri.rb +372 -52
  138. data/lib/rex/parser/nexpose_simple_nokogiri.rb +8 -7
  139. data/lib/rex/parser/nexpose_xml.rb +1 -0
  140. data/lib/rex/parser/nmap_nokogiri.rb +63 -33
  141. data/lib/rex/parser/nmap_xml.rb +1 -0
  142. data/lib/rex/parser/nokogiri_doc_mixin.rb +35 -15
  143. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  144. data/lib/rex/parser/retina_xml.rb +1 -0
  145. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  146. data/lib/rex/payloads.rb +2 -1
  147. data/lib/rex/payloads/win32.rb +2 -1
  148. data/lib/rex/payloads/win32/common.rb +2 -1
  149. data/lib/rex/payloads/win32/kernel.rb +2 -1
  150. data/lib/rex/payloads/win32/kernel/common.rb +4 -3
  151. data/lib/rex/payloads/win32/kernel/migration.rb +2 -1
  152. data/lib/rex/payloads/win32/kernel/recovery.rb +2 -1
  153. data/lib/rex/payloads/win32/kernel/stager.rb +21 -20
  154. data/lib/rex/peparsey.rb +3 -2
  155. data/lib/rex/peparsey/exceptions.rb +2 -1
  156. data/lib/rex/peparsey/pe.rb +3 -2
  157. data/lib/rex/peparsey/pe_memdump.rb +2 -1
  158. data/lib/rex/peparsey/pebase.rb +2 -1
  159. data/lib/rex/peparsey/section.rb +2 -1
  160. data/lib/rex/pescan.rb +3 -2
  161. data/lib/rex/pescan/analyze.rb +1 -0
  162. data/lib/rex/pescan/scanner.rb +1 -0
  163. data/lib/rex/pescan/search.rb +1 -0
  164. data/lib/rex/platforms.rb +2 -1
  165. data/lib/rex/platforms/windows.rb +2 -1
  166. data/lib/rex/poly.rb +2 -1
  167. data/lib/rex/poly/block.rb +16 -15
  168. data/lib/rex/poly/register.rb +2 -1
  169. data/lib/rex/poly/register/x86.rb +2 -1
  170. data/lib/rex/post.rb +2 -2
  171. data/lib/rex/post/dir.rb +2 -1
  172. data/lib/rex/post/file.rb +1 -0
  173. data/lib/rex/post/file_stat.rb +1 -0
  174. data/lib/rex/post/io.rb +2 -1
  175. data/lib/rex/post/meterpreter.rb +2 -1
  176. data/lib/rex/post/meterpreter/channel.rb +1 -0
  177. data/lib/rex/post/meterpreter/channel_container.rb +2 -1
  178. data/lib/rex/post/meterpreter/channels/pool.rb +1 -0
  179. data/lib/rex/post/meterpreter/channels/pools/file.rb +1 -0
  180. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +3 -2
  181. data/lib/rex/post/meterpreter/channels/stream.rb +1 -0
  182. data/lib/rex/post/meterpreter/client.rb +23 -1
  183. data/lib/rex/post/meterpreter/client_core.rb +10 -5
  184. data/lib/rex/post/meterpreter/dependencies.rb +2 -1
  185. data/lib/rex/post/meterpreter/extension.rb +2 -1
  186. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +7 -6
  187. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +2 -1
  188. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +5 -4
  189. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +2 -1
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +1 -0
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +1 -0
  192. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +7 -6
  193. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -0
  194. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +2 -1
  195. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +2 -1
  196. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +1 -0
  197. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +2 -1
  198. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +28 -11
  199. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +1 -0
  200. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +6 -5
  201. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +1 -0
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +3 -2
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +1 -0
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +2 -1
  205. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +39 -5
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +75 -18
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +18 -6
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +1 -0
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +1 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +1 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +1 -0
  212. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +4 -1
  213. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +1 -0
  214. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +1 -0
  215. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +1 -0
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +1 -0
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1 -0
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +1 -0
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +1 -0
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +1 -0
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +12 -0
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +1 -0
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +1 -0
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +1 -0
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +1 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +7 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +1 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +1 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +1 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +1 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +1 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +1 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +1 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +1 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +1 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +1 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +29 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +10 -5
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +9 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +1 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +128 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +1 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +27 -6
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +21 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +1 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +1 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +1 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +1 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +2 -1
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +43 -4
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +1 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +2 -1
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +1 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +1 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +1 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +1 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +1 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +1 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +1 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +7 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +14 -13
  264. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +1 -0
  265. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +2 -1
  266. data/lib/rex/post/meterpreter/object_aliases.rb +6 -5
  267. data/lib/rex/post/meterpreter/packet.rb +26 -6
  268. data/lib/rex/post/meterpreter/packet_dispatcher.rb +1 -0
  269. data/lib/rex/post/meterpreter/packet_parser.rb +1 -0
  270. data/lib/rex/post/meterpreter/packet_response_waiter.rb +1 -0
  271. data/lib/rex/post/meterpreter/ui/console.rb +1 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +1 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +103 -28
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +1 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +1 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +1 -0
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +3 -2
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +12 -11
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +2 -1
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +2 -1
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +53 -36
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +3 -2
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +87 -44
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +80 -18
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +77 -48
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +72 -41
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +24 -5
  288. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +2 -1
  289. data/lib/rex/post/permission.rb +2 -1
  290. data/lib/rex/post/process.rb +2 -1
  291. data/lib/rex/post/thread.rb +2 -1
  292. data/lib/rex/post/ui.rb +2 -1
  293. data/lib/rex/proto.rb +1 -0
  294. data/lib/rex/proto.rb.ts.rb +2 -1
  295. data/lib/rex/proto/dcerpc.rb +2 -1
  296. data/lib/rex/proto/dcerpc.rb.ts.rb +2 -1
  297. data/lib/rex/proto/dcerpc/client.rb +1 -0
  298. data/lib/rex/proto/dcerpc/client.rb.ut.rb +1 -0
  299. data/lib/rex/proto/dcerpc/exceptions.rb +2 -1
  300. data/lib/rex/proto/dcerpc/handle.rb +1 -0
  301. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +2 -1
  302. data/lib/rex/proto/dcerpc/ndr.rb +2 -1
  303. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +2 -1
  304. data/lib/rex/proto/dcerpc/packet.rb +52 -45
  305. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +12 -11
  306. data/lib/rex/proto/dcerpc/response.rb +1 -0
  307. data/lib/rex/proto/dcerpc/response.rb.ut.rb +2 -1
  308. data/lib/rex/proto/dcerpc/uuid.rb +13 -12
  309. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +2 -1
  310. data/lib/rex/proto/dhcp.rb +2 -1
  311. data/lib/rex/proto/dhcp/constants.rb +2 -1
  312. data/lib/rex/proto/dhcp/server.rb +4 -3
  313. data/lib/rex/proto/drda.rb +1 -0
  314. data/lib/rex/proto/drda.rb.ts.rb +1 -0
  315. data/lib/rex/proto/drda/constants.rb +1 -0
  316. data/lib/rex/proto/drda/constants.rb.ut.rb +1 -0
  317. data/lib/rex/proto/drda/packet.rb +11 -10
  318. data/lib/rex/proto/drda/packet.rb.ut.rb +5 -4
  319. data/lib/rex/proto/drda/utils.rb +4 -3
  320. data/lib/rex/proto/drda/utils.rb.ut.rb +3 -2
  321. data/lib/rex/proto/http.rb +2 -1
  322. data/lib/rex/proto/http.rb.ts.rb +2 -1
  323. data/lib/rex/proto/http/client.rb +29 -5
  324. data/lib/rex/proto/http/client.rb.ut.rb +1 -0
  325. data/lib/rex/proto/http/handler.rb +2 -1
  326. data/lib/rex/proto/http/handler/erb.rb +5 -4
  327. data/lib/rex/proto/http/handler/erb.rb.ut.rb +2 -1
  328. data/lib/rex/proto/http/handler/proc.rb +1 -0
  329. data/lib/rex/proto/http/handler/proc.rb.ut.rb +2 -1
  330. data/lib/rex/proto/http/header.rb +3 -3
  331. data/lib/rex/proto/http/header.rb.ut.rb +2 -1
  332. data/lib/rex/proto/http/packet.rb +1 -0
  333. data/lib/rex/proto/http/packet.rb.ut.rb +15 -14
  334. data/lib/rex/proto/http/request.rb +23 -22
  335. data/lib/rex/proto/http/request.rb.ut.rb +2 -1
  336. data/lib/rex/proto/http/response.rb +6 -5
  337. data/lib/rex/proto/http/response.rb.ut.rb +7 -6
  338. data/lib/rex/proto/http/server.rb +1 -0
  339. data/lib/rex/proto/http/server.rb.ut.rb +6 -5
  340. data/lib/rex/proto/iax2.rb +1 -0
  341. data/lib/rex/proto/iax2/call.rb +48 -47
  342. data/lib/rex/proto/iax2/client.rb +23 -22
  343. data/lib/rex/proto/iax2/codecs.rb +1 -0
  344. data/lib/rex/proto/iax2/codecs/alaw.rb +1 -0
  345. data/lib/rex/proto/iax2/codecs/g711.rb +4 -3
  346. data/lib/rex/proto/iax2/codecs/mulaw.rb +1 -0
  347. data/lib/rex/proto/iax2/constants.rb +1 -0
  348. data/lib/rex/proto/natpmp.rb +11 -0
  349. data/lib/rex/proto/natpmp/constants.rb +19 -0
  350. data/lib/rex/proto/natpmp/packet.rb +45 -0
  351. data/lib/rex/proto/ntlm.rb +1 -0
  352. data/lib/rex/proto/ntlm.rb.ut.rb +1 -0
  353. data/lib/rex/proto/ntlm/base.rb +38 -37
  354. data/lib/rex/proto/ntlm/constants.rb +1 -0
  355. data/lib/rex/proto/ntlm/crypt.rb +45 -44
  356. data/lib/rex/proto/ntlm/exceptions.rb +1 -0
  357. data/lib/rex/proto/ntlm/message.rb +30 -29
  358. data/lib/rex/proto/ntlm/utils.rb +116 -115
  359. data/lib/rex/proto/proxy/socks4a.rb +1 -0
  360. data/lib/rex/proto/rfb.rb +1 -0
  361. data/lib/rex/proto/rfb.rb.ut.rb +1 -0
  362. data/lib/rex/proto/rfb/cipher.rb +1 -0
  363. data/lib/rex/proto/rfb/client.rb +1 -0
  364. data/lib/rex/proto/rfb/constants.rb +1 -0
  365. data/lib/rex/proto/smb.rb +2 -1
  366. data/lib/rex/proto/smb.rb.ts.rb +2 -1
  367. data/lib/rex/proto/smb/client.rb +23 -22
  368. data/lib/rex/proto/smb/client.rb.ut.rb +1 -0
  369. data/lib/rex/proto/smb/constants.rb +1 -0
  370. data/lib/rex/proto/smb/constants.rb.ut.rb +2 -1
  371. data/lib/rex/proto/smb/crypt.rb +3 -2
  372. data/lib/rex/proto/smb/evasions.rb +1 -0
  373. data/lib/rex/proto/smb/exceptions.rb +6 -5
  374. data/lib/rex/proto/smb/simpleclient.rb +1 -0
  375. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +1 -0
  376. data/lib/rex/proto/smb/utils.rb +1 -0
  377. data/lib/rex/proto/smb/utils.rb.ut.rb +2 -1
  378. data/lib/rex/proto/sunrpc.rb +1 -0
  379. data/lib/rex/proto/sunrpc/client.rb +1 -0
  380. data/lib/rex/proto/tftp.rb +3 -1
  381. data/lib/rex/proto/tftp/client.rb +344 -0
  382. data/lib/rex/proto/tftp/constants.rb +2 -1
  383. data/lib/rex/proto/tftp/server.rb +2 -1
  384. data/lib/rex/proto/tftp/server.rb.ut.rb +3 -2
  385. data/lib/rex/registry.rb +14 -0
  386. data/lib/rex/registry/hive.rb +132 -0
  387. data/lib/rex/registry/lfkey.rb +51 -0
  388. data/lib/rex/registry/nodekey.rb +54 -0
  389. data/lib/rex/registry/regf.rb +25 -0
  390. data/lib/rex/registry/valuekey.rb +67 -0
  391. data/lib/rex/registry/valuelist.rb +29 -0
  392. data/lib/rex/ropbuilder.rb +2 -1
  393. data/lib/rex/ropbuilder/rop.rb +3 -2
  394. data/lib/rex/script.rb +1 -0
  395. data/lib/rex/script/base.rb +1 -0
  396. data/lib/rex/script/meterpreter.rb +1 -0
  397. data/lib/rex/script/shell.rb +1 -0
  398. data/lib/rex/service.rb +2 -1
  399. data/lib/rex/service_manager.rb +6 -5
  400. data/lib/rex/service_manager.rb.ut.rb +2 -1
  401. data/lib/rex/services/local_relay.rb +1 -0
  402. data/lib/rex/socket.rb +72 -36
  403. data/lib/rex/socket.rb.ut.rb +1 -0
  404. data/lib/rex/socket/comm.rb +1 -0
  405. data/lib/rex/socket/comm/local.rb +60 -13
  406. data/lib/rex/socket/comm/local.rb.ut.rb +2 -1
  407. data/lib/rex/socket/ip.rb +1 -0
  408. data/lib/rex/socket/parameters.rb +15 -14
  409. data/lib/rex/socket/parameters.rb.ut.rb +2 -1
  410. data/lib/rex/socket/range_walker.rb +71 -26
  411. data/lib/rex/socket/range_walker.rb.ut.rb +2 -1
  412. data/lib/rex/socket/ssl_tcp.rb +1 -0
  413. data/lib/rex/socket/ssl_tcp.rb.ut.rb +2 -1
  414. data/lib/rex/socket/ssl_tcp_server.rb +1 -0
  415. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +1 -0
  416. data/lib/rex/socket/subnet_walker.rb +1 -0
  417. data/lib/rex/socket/subnet_walker.rb.ut.rb +2 -1
  418. data/lib/rex/socket/switch_board.rb +1 -0
  419. data/lib/rex/socket/switch_board.rb.ut.rb +2 -1
  420. data/lib/rex/socket/tcp.rb +4 -3
  421. data/lib/rex/socket/tcp.rb.ut.rb +2 -1
  422. data/lib/rex/socket/tcp_server.rb +1 -0
  423. data/lib/rex/socket/tcp_server.rb.ut.rb +2 -1
  424. data/lib/rex/socket/udp.rb +2 -1
  425. data/lib/rex/socket/udp.rb.ut.rb +2 -1
  426. data/lib/rex/struct2.rb +2 -1
  427. data/lib/rex/struct2/c_struct.rb +2 -1
  428. data/lib/rex/struct2/c_struct_template.rb +2 -1
  429. data/lib/rex/struct2/constant.rb +2 -1
  430. data/lib/rex/struct2/element.rb +2 -1
  431. data/lib/rex/struct2/generic.rb +1 -0
  432. data/lib/rex/struct2/restraint.rb +2 -1
  433. data/lib/rex/struct2/s_string.rb +1 -0
  434. data/lib/rex/struct2/s_struct.rb +1 -0
  435. data/lib/rex/sync.rb +2 -1
  436. data/lib/rex/sync/event.rb +1 -0
  437. data/lib/rex/sync/read_write_lock.rb +1 -0
  438. data/lib/rex/sync/ref.rb +2 -1
  439. data/lib/rex/sync/thread_safe.rb +2 -1
  440. data/lib/rex/test.rb +2 -1
  441. data/lib/rex/text.rb +136 -19
  442. data/lib/rex/text.rb.ut.rb +1 -0
  443. data/lib/rex/thread_factory.rb +5 -4
  444. data/lib/rex/time.rb +2 -1
  445. data/lib/rex/transformer.rb +1 -0
  446. data/lib/rex/transformer.rb.ut.rb +2 -1
  447. data/lib/rex/ui.rb +2 -1
  448. data/lib/rex/ui/interactive.rb +10 -9
  449. data/lib/rex/ui/output.rb +1 -0
  450. data/lib/rex/ui/output/none.rb +2 -1
  451. data/lib/rex/ui/progress_tracker.rb +2 -1
  452. data/lib/rex/ui/subscriber.rb +9 -8
  453. data/lib/rex/ui/text/color.rb +1 -0
  454. data/lib/rex/ui/text/color.rb.ut.rb +1 -0
  455. data/lib/rex/ui/text/dispatcher_shell.rb +63 -23
  456. data/lib/rex/ui/text/input.rb +1 -0
  457. data/lib/rex/ui/text/input/buffer.rb +7 -6
  458. data/lib/rex/ui/text/input/readline.rb +14 -13
  459. data/lib/rex/ui/text/input/socket.rb +1 -0
  460. data/lib/rex/ui/text/input/stdio.rb +2 -1
  461. data/lib/rex/ui/text/irb_shell.rb +1 -0
  462. data/lib/rex/ui/text/output.rb +1 -0
  463. data/lib/rex/ui/text/output/buffer.rb +1 -0
  464. data/lib/rex/ui/text/output/file.rb +1 -0
  465. data/lib/rex/ui/text/output/socket.rb +1 -0
  466. data/lib/rex/ui/text/output/stdio.rb +1 -0
  467. data/lib/rex/ui/text/output/tee.rb +1 -0
  468. data/lib/rex/ui/text/progress_tracker.rb +2 -1
  469. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +2 -1
  470. data/lib/rex/ui/text/shell.rb +1 -0
  471. data/lib/rex/ui/text/table.rb +20 -14
  472. data/lib/rex/ui/text/table.rb.ut.rb +3 -2
  473. data/lib/rex/zip.rb +1 -0
  474. data/lib/rex/zip/archive.rb +2 -1
  475. data/lib/rex/zip/blocks.rb +3 -2
  476. data/lib/rex/zip/entry.rb +6 -7
  477. data/lib/rex/zip/jar.rb +4 -3
  478. data/lib/rex/zip/samples/comment.rb +1 -0
  479. data/lib/rex/zip/samples/mkwar.rb +1 -0
  480. data/lib/rex/zip/samples/mkzip.rb +1 -0
  481. data/lib/rex/zip/samples/recursive.rb +1 -0
  482. metadata +433 -435
@@ -1,3 +1,4 @@
1
+ # -*- coding: binary -*-
1
2
  require 'rex/post/meterpreter'
2
3
  require 'rex/service_manager'
3
4
 
@@ -54,11 +55,39 @@ class Console::CommandDispatcher::Stdapi::Net
54
55
  # List of supported commands.
55
56
  #
56
57
  def commands
57
- {
58
+ all = {
58
59
  "ipconfig" => "Display interfaces",
60
+ "ifconfig" => "Display interfaces",
59
61
  "route" => "View and modify the routing table",
60
62
  "portfwd" => "Forward a local port to a remote service",
61
63
  }
64
+ reqs = {
65
+ "ipconfig" => [ "stdapi_net_config_get_interfaces" ],
66
+ "ifconfig" => [ "stdapi_net_config_get_interfaces" ],
67
+ "route" => [
68
+ # Also uses these, but we don't want to be unable to list them
69
+ # just because we can't alter them.
70
+ #"stdapi_net_config_add_route",
71
+ #"stdapi_net_config_remove_route",
72
+ "stdapi_net_config_get_routes"
73
+ ],
74
+ # Only creates tcp channels, which is something whose availability
75
+ # we can't check directly at the moment.
76
+ "portfwd" => [ ],
77
+ }
78
+
79
+ all.delete_if do |cmd, desc|
80
+ del = false
81
+ reqs[cmd].each do |req|
82
+ next if client.commands.include? req
83
+ del = true
84
+ break
85
+ end
86
+
87
+ del
88
+ end
89
+
90
+ all
62
91
  end
63
92
 
64
93
  #
@@ -77,12 +106,14 @@ class Console::CommandDispatcher::Stdapi::Net
77
106
  if (ifaces.length == 0)
78
107
  print_line("No interfaces were found.")
79
108
  else
80
- client.net.config.each_interface { |iface|
109
+ ifaces.sort{|a,b| a.index <=> b.index}.each do |iface|
81
110
  print("\n" + iface.pretty + "\n")
82
- }
111
+ end
83
112
  end
84
113
  end
85
114
 
115
+ alias :cmd_ifconfig :cmd_ipconfig
116
+
86
117
  #
87
118
  # Displays or modifies the routing table on the remote machine.
88
119
  #
@@ -114,25 +145,56 @@ class Console::CommandDispatcher::Stdapi::Net
114
145
  when "list"
115
146
  routes = client.net.config.routes
116
147
 
117
- if (routes.length == 0)
118
- print_line("No routes were found.")
148
+ # IPv4
149
+ tbl = Rex::Ui::Text::Table.new(
150
+ 'Header' => "IPv4 network routes",
151
+ 'Indent' => 4,
152
+ 'Columns' =>
153
+ [
154
+ "Subnet",
155
+ "Netmask",
156
+ "Gateway",
157
+ "Metric",
158
+ "Interface"
159
+ ])
160
+
161
+ routes.select {|route|
162
+ Rex::Socket.is_ipv4?(route.netmask)
163
+ }.each { |route|
164
+ tbl << [ route.subnet, route.netmask, route.gateway, route.metric, route.interface ]
165
+ }
166
+
167
+ if tbl.rows.length > 0
168
+ print("\n" + tbl.to_s + "\n")
119
169
  else
120
- tbl = Rex::Ui::Text::Table.new(
121
- 'Header' => "Network routes",
122
- 'Indent' => 4,
123
- 'Columns' =>
124
- [
125
- "Subnet",
126
- "Netmask",
127
- "Gateway"
128
- ])
129
-
130
- routes.each { |route|
131
- tbl << [ route.subnet, route.netmask, route.gateway ]
132
- }
170
+ print_line("No IPv4 routes were found.")
171
+ end
133
172
 
173
+ # IPv6
174
+ tbl = Rex::Ui::Text::Table.new(
175
+ 'Header' => "IPv6 network routes",
176
+ 'Indent' => 4,
177
+ 'Columns' =>
178
+ [
179
+ "Subnet",
180
+ "Netmask",
181
+ "Gateway",
182
+ "Metric",
183
+ "Interface"
184
+ ])
185
+
186
+ routes.select {|route|
187
+ Rex::Socket.is_ipv6?(route.netmask)
188
+ }.each { |route|
189
+ tbl << [ route.subnet, route.netmask, route.gateway, route.metric, route.interface ]
190
+ }
191
+
192
+ if tbl.rows.length > 0
134
193
  print("\n" + tbl.to_s + "\n")
194
+ else
195
+ print_line("No IPv6 routes were found.")
135
196
  end
197
+
136
198
  when "add"
137
199
  # Satisfy check to see that formatting is correct
138
200
  unless Rex::Socket::RangeWalker.new(args[0]).length == 1
@@ -1,3 +1,4 @@
1
+ # -*- coding: binary -*-
1
2
  require 'rex/post/meterpreter'
2
3
 
3
4
  module Rex
@@ -48,23 +49,67 @@ class Console::CommandDispatcher::Stdapi::Sys
48
49
  # List of supported commands.
49
50
  #
50
51
  def commands
51
- {
52
- "clearev" => "Clear the event log",
53
- "execute" => "Execute a command",
54
- "getpid" => "Get the current process identifier",
55
- "getuid" => "Get the user that the server is running as",
56
- "getprivs" => "Attempt to enable all privileges available to the current process",
57
- "kill" => "Terminate a process",
58
- "ps" => "List running processes",
59
- "reboot" => "Reboots the remote computer",
60
- "reg" => "Modify and interact with the remote registry",
61
- "rev2self" => "Calls RevertToSelf() on the remote machine",
62
- "sysinfo" => "Gets information about the remote system, such as OS",
63
- "shell" => "Drop into a system command shell",
64
- "shutdown" => "Shuts down the remote computer",
65
- "steal_token" => "Attempts to steal an impersonation token from the target process",
52
+ all = {
53
+ "clearev" => "Clear the event log",
66
54
  "drop_token" => "Relinquishes any active impersonation token.",
55
+ "execute" => "Execute a command",
56
+ "getpid" => "Get the current process identifier",
57
+ "getprivs" => "Attempt to enable all privileges available to the current process",
58
+ "getuid" => "Get the user that the server is running as",
59
+ "kill" => "Terminate a process",
60
+ "ps" => "List running processes",
61
+ "reboot" => "Reboots the remote computer",
62
+ "reg" => "Modify and interact with the remote registry",
63
+ "rev2self" => "Calls RevertToSelf() on the remote machine",
64
+ "shell" => "Drop into a system command shell",
65
+ "shutdown" => "Shuts down the remote computer",
66
+ "steal_token" => "Attempts to steal an impersonation token from the target process",
67
+ "sysinfo" => "Gets information about the remote system, such as OS",
68
+ }
69
+ reqs = {
70
+ "clearev" => [ "stdapi_sys_eventlog_open", "stdapi_sys_eventlog_clear" ],
71
+ "drop_token" => [ "stdapi_sys_config_drop_token" ],
72
+ "execute" => [ "stdapi_sys_process_execute" ],
73
+ "getpid" => [ "stdapi_sys_process_getpid" ],
74
+ "getprivs" => [ "stdapi_sys_config_getprivs" ],
75
+ "getuid" => [ "stdapi_sys_config_getuid" ],
76
+ "kill" => [ "stdapi_sys_process_kill" ],
77
+ "ps" => [ "stdapi_sys_process_get_processes" ],
78
+ "reboot" => [ "stdapi_sys_power_exitwindows" ],
79
+ "reg" => [
80
+ "stdapi_registry_load_key",
81
+ "stdapi_registry_unload_key",
82
+ "stdapi_registry_open_key",
83
+ "stdapi_registry_open_remote_key",
84
+ "stdapi_registry_create_key",
85
+ "stdapi_registry_delete_key",
86
+ "stdapi_registry_close_key",
87
+ "stdapi_registry_enum_key",
88
+ "stdapi_registry_set_value",
89
+ "stdapi_registry_query_value",
90
+ "stdapi_registry_delete_value",
91
+ "stdapi_registry_query_class",
92
+ "stdapi_registry_enum_value",
93
+ ],
94
+ "rev2self" => [ "stdapi_sys_config_rev2self" ],
95
+ "shell" => [ "stdapi_sys_process_execute" ],
96
+ "shutdown" => [ "stdapi_sys_power_exitwindows" ],
97
+ "steal_token" => [ "stdapi_sys_config_steal_token" ],
98
+ "sysinfo" => [ "stdapi_sys_config_sysinfo" ],
67
99
  }
100
+
101
+ all.delete_if do |cmd, desc|
102
+ del = false
103
+ reqs[cmd].each do |req|
104
+ next if client.commands.include? req
105
+ del = true
106
+ break
107
+ end
108
+
109
+ del
110
+ end
111
+
112
+ all
68
113
  end
69
114
 
70
115
  #
@@ -153,12 +198,21 @@ class Console::CommandDispatcher::Stdapi::Sys
153
198
  # Drop into a system shell as specified by %COMSPEC% or
154
199
  # as appropriate for the host.
155
200
  def cmd_shell(*args)
156
- if client.platform =~/win/
201
+ case client.platform
202
+ when /win/
157
203
  path = client.fs.file.expand_path("%COMSPEC%")
158
204
  path = (path and not path.empty?) ? path : "cmd.exe"
159
205
  cmd_execute("-f", path, "-c", "-H", "-i", "-t")
206
+ when /linux/
207
+ # Don't expand_path() this because it's literal anyway
208
+ path = "/bin/sh"
209
+ cmd_execute("-f", path, "-c", "-i")
160
210
  else
161
- path = client.fs.file.expand_path("/bin/bash")
211
+ # Then this is a multi-platform meterpreter (php or java), which
212
+ # must special-case COMSPEC to return the system-specific shell.
213
+ path = client.fs.file.expand_path("%COMSPEC%")
214
+ # If that failed for whatever reason, guess it's unix
215
+ path = (path and not path.empty?) ? path : "/bin/sh"
162
216
  cmd_execute("-f", path, "-c", "-i")
163
217
  end
164
218
  end
@@ -220,38 +274,13 @@ class Console::CommandDispatcher::Stdapi::Sys
220
274
  #
221
275
  def cmd_ps(*args)
222
276
  processes = client.sys.process.get_processes
223
- tbl = Rex::Ui::Text::Table.new(
224
- 'Header' => "Process list",
225
- 'Indent' => 1,
226
- 'Columns' =>
227
- [
228
- "PID",
229
- "Name",
230
- "Arch",
231
- "Session",
232
- "User",
233
- "Path"
234
- ])
235
-
236
- processes.each { |ent|
237
-
238
- session = ent['session'] == 0xFFFFFFFF ? '' : ent['session'].to_s
239
- arch = ent['arch']
240
-
241
- # for display and consistency with payload naming we switch the internal 'x86_64' value to display 'x64'
242
- if( arch == ARCH_X86_64 )
243
- arch = "x64"
244
- end
245
-
246
- tbl << [ ent['pid'].to_s, ent['name'], arch, session, ent['user'], ent['path'] ]
247
- }
248
-
249
277
  if (processes.length == 0)
250
278
  print_line("No running processes were found.")
251
279
  else
252
- print("\n" + tbl.to_s + "\n")
280
+ print_line
281
+ print_line(processes.to_table("Indent" => 1).to_s)
282
+ print_line
253
283
  end
254
-
255
284
  return true
256
285
  end
257
286
 
@@ -299,7 +328,7 @@ class Console::CommandDispatcher::Stdapi::Sys
299
328
  " queryclass Queries the class of the supplied key [-k <key>]\n" +
300
329
  " setval Set a registry value [-k <key> -v <val> -d <data>]\n" +
301
330
  " deleteval Delete the supplied registry value [-k <key> -v <val>]\n" +
302
- " queryval Queries the data contents of a value [-k <key> -v <val>]\n\n")
331
+ " queryval Queries the data contents of a value [-k <key> -v <val>]\n\n")
303
332
  return false
304
333
  when "-k"
305
334
  key = val
@@ -333,7 +362,7 @@ class Console::CommandDispatcher::Stdapi::Sys
333
362
  # Rock it
334
363
  case cmd
335
364
  when "enumkey"
336
-
365
+
337
366
  open_key = nil
338
367
  if not rem
339
368
  open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
@@ -383,7 +412,7 @@ class Console::CommandDispatcher::Stdapi::Sys
383
412
  if remote_key
384
413
  open_key = remote_key.create_key(base_key, KEY_WRITE + wowflag)
385
414
  end
386
- end
415
+ end
387
416
 
388
417
  print_line("Successfully created key: #{key}")
389
418
 
@@ -1,3 +1,4 @@
1
+ # -*- coding: binary -*-
1
2
  require 'rex/post/meterpreter'
2
3
 
3
4
  module Rex
@@ -20,20 +21,50 @@ class Console::CommandDispatcher::Stdapi::Ui
20
21
  # List of supported commands.
21
22
  #
22
23
  def commands
23
- {
24
- "idletime" => "Returns the number of seconds the remote user has been idle",
25
- "uictl" => "Control some of the user interface components",
24
+ all = {
26
25
  "enumdesktops" => "List all accessible desktops and window stations",
27
26
  "getdesktop" => "Get the current meterpreter desktop",
28
- "setdesktop" => "Change the meterpreters current desktop",
27
+ "idletime" => "Returns the number of seconds the remote user has been idle",
28
+ "keyscan_dump" => "Dump the keystroke buffer",
29
29
  "keyscan_start" => "Start capturing keystrokes",
30
30
  "keyscan_stop" => "Stop capturing keystrokes",
31
- "keyscan_dump" => "Dump the keystroke buffer",
32
31
  "screenshot" => "Grab a screenshot of the interactive desktop",
32
+ "setdesktop" => "Change the meterpreters current desktop",
33
+ "uictl" => "Control some of the user interface components",
33
34
 
34
35
  # not working yet
35
36
  # "unlockdesktop" => "Unlock or lock the workstation (must be inside winlogon.exe)",
36
37
  }
38
+
39
+ reqs = {
40
+ "enumdesktops" => [ "stdapi_ui_desktop_enum" ],
41
+ "getdesktop" => [ "stdapi_ui_desktop_get" ],
42
+ "idletime" => [ "stdapi_ui_get_idle_time" ],
43
+ "keyscan_dump" => [ "stdapi_ui_get_keys" ],
44
+ "keyscan_start" => [ "stdapi_ui_start_keyscan" ],
45
+ "keyscan_stop" => [ "stdapi_ui_stop_keyscan" ],
46
+ "screenshot" => [ "stdapi_ui_desktop_screenshot" ],
47
+ "setdesktop" => [ "stdapi_ui_desktop_set" ],
48
+ "uictl" => [
49
+ "stdapi_ui_enable_mouse",
50
+ "stdapi_ui_disable_mouse",
51
+ "stdapi_ui_enable_keyboard",
52
+ "stdapi_ui_disable_keyboard",
53
+ ],
54
+ }
55
+
56
+ all.delete_if do |cmd, desc|
57
+ del = false
58
+ reqs[cmd].each do |req|
59
+ next if client.commands.include? req
60
+ del = true
61
+ break
62
+ end
63
+
64
+ del
65
+ end
66
+
67
+ all
37
68
  end
38
69
 
39
70
  #
@@ -51,7 +82,7 @@ class Console::CommandDispatcher::Stdapi::Ui
51
82
 
52
83
  print_line(
53
84
  "User has been idle for: #{Rex::ExtTime.sec_to_s(seconds)}")
54
-
85
+
55
86
  return true
56
87
  end
57
88
 
@@ -94,7 +125,7 @@ class Console::CommandDispatcher::Stdapi::Ui
94
125
 
95
126
  return true
96
127
  end
97
-
128
+
98
129
  #
99
130
  # Grab a screenshot of the current interactive desktop.
100
131
  #
@@ -102,14 +133,14 @@ class Console::CommandDispatcher::Stdapi::Ui
102
133
  path = Rex::Text.rand_text_alpha(8) + ".jpeg"
103
134
  quality = 50
104
135
  view = true
105
-
136
+
106
137
  screenshot_opts = Rex::Parser::Arguments.new(
107
138
  "-h" => [ false, "Help Banner." ],
108
139
  "-q" => [ true, "The JPEG image quality (Default: '#{quality}')" ],
109
140
  "-p" => [ true, "The JPEG image path (Default: '#{path}')" ],
110
141
  "-v" => [ true, "Automatically view the JPEG image (Default: '#{view}')" ]
111
142
  )
112
-
143
+
113
144
  screenshot_opts.parse( args ) { | opt, idx, val |
114
145
  case opt
115
146
  when "-h"
@@ -125,32 +156,32 @@ class Console::CommandDispatcher::Stdapi::Ui
125
156
  view = false if ( val =~ /^(f|n|0)/i )
126
157
  end
127
158
  }
128
-
159
+
129
160
  data = client.ui.screenshot( quality )
130
-
161
+
131
162
  if( data )
132
163
  ::File.open( path, 'wb' ) do |fd|
133
164
  fd.write( data )
134
165
  end
135
-
166
+
136
167
  path = ::File.expand_path( path )
137
-
168
+
138
169
  print_line( "Screenshot saved to: #{path}" )
139
-
170
+
140
171
  Rex::Compat.open_file( path ) if view
141
172
  end
142
-
173
+
143
174
  return true
144
175
  end
145
-
176
+
146
177
  #
147
178
  # Enumerate desktops
148
179
  #
149
180
  def cmd_enumdesktops(*args)
150
181
  print_line( "Enumerating all accessible desktops" )
151
-
182
+
152
183
  desktops = client.ui.enum_desktops
153
-
184
+
154
185
  desktopstable = Rex::Ui::Text::Table.new(
155
186
  'Header' => "Desktops",
156
187
  'Indent' => 4,
@@ -159,18 +190,18 @@ class Console::CommandDispatcher::Stdapi::Ui
159
190
  "Name"
160
191
  ]
161
192
  )
162
-
193
+
163
194
  desktops.each { | desktop |
164
195
  session = desktop['session'] == 0xFFFFFFFF ? '' : desktop['session'].to_s
165
196
  desktopstable << [ session, desktop['station'], desktop['name'] ]
166
197
  }
167
-
198
+
168
199
  if( desktops.length == 0 )
169
200
  print_line( "No accessible desktops were found." )
170
201
  else
171
202
  print( "\n" + desktopstable.to_s + "\n" )
172
203
  end
173
-
204
+
174
205
  return true
175
206
  end
176
207
 
@@ -178,26 +209,26 @@ class Console::CommandDispatcher::Stdapi::Ui
178
209
  # Get the current meterpreter desktop.
179
210
  #
180
211
  def cmd_getdesktop(*args)
181
-
212
+
182
213
  desktop = client.ui.get_desktop
183
-
214
+
184
215
  session = desktop['session'] == 0xFFFFFFFF ? '' : "Session #{desktop['session'].to_s}\\"
185
-
216
+
186
217
  print_line( "#{session}#{desktop['station']}\\#{desktop['name']}" )
187
-
218
+
188
219
  return true
189
220
  end
190
-
221
+
191
222
  #
192
223
  # Change the meterpreters current desktop.
193
224
  #
194
225
  def cmd_setdesktop( *args )
195
-
226
+
196
227
  switch = false
197
228
  dsession = -1
198
229
  dstation = 'WinSta0'
199
230
  dname = 'Default'
200
-
231
+
201
232
  setdesktop_opts = Rex::Parser::Arguments.new(
202
233
  "-h" => [ false, "Help Banner." ],
203
234
  #"-s" => [ true, "The session (Default: '#{dsession}')" ],
@@ -205,7 +236,7 @@ class Console::CommandDispatcher::Stdapi::Ui
205
236
  "-n" => [ true, "The desktop name (Default: '#{dname}')" ],
206
237
  "-i" => [ true, "Set this desktop as the interactive desktop (Default: '#{switch}')" ]
207
238
  )
208
-
239
+
209
240
  setdesktop_opts.parse( args ) { | opt, idx, val |
210
241
  case opt
211
242
  when "-h"
@@ -223,15 +254,15 @@ class Console::CommandDispatcher::Stdapi::Ui
223
254
  switch = true if ( val =~ /^(t|y|1)/i )
224
255
  end
225
256
  }
226
-
257
+
227
258
  if( client.ui.set_desktop( dsession, dstation, dname, switch ) )
228
259
  print_line( "#{ switch ? 'Switched' : 'Changed' } to desktop #{dstation}\\#{dname}" )
229
260
  else
230
261
  print_line( "Failed to #{ switch ? 'switch' : 'change' } to desktop #{dstation}\\#{dname}" )
231
262
  end
232
-
263
+
233
264
  return true
234
- end
265
+ end
235
266
 
236
267
  #
237
268
  # Unlock or lock the desktop
@@ -241,18 +272,18 @@ class Console::CommandDispatcher::Stdapi::Ui
241
272
  if(args.length > 0)
242
273
  mode = args[0].to_i
243
274
  end
244
-
275
+
245
276
  if(mode == 0)
246
277
  print_line("Unlocking the workstation...")
247
278
  client.ui.unlock_desktop(true)
248
279
  else
249
280
  print_line("Locking the workstation...")
250
- client.ui.unlock_desktop(false)
281
+ client.ui.unlock_desktop(false)
251
282
  end
252
283
 
253
284
  return true
254
- end
255
-
285
+ end
286
+
256
287
  #
257
288
  # Start the keyboard sniffer
258
289
  #
@@ -260,8 +291,8 @@ class Console::CommandDispatcher::Stdapi::Ui
260
291
  print_line("Starting the keystroke sniffer...")
261
292
  client.ui.keyscan_start
262
293
  return true
263
- end
264
-
294
+ end
295
+
265
296
  #
266
297
  # Stop the keyboard sniffer
267
298
  #
@@ -269,7 +300,7 @@ class Console::CommandDispatcher::Stdapi::Ui
269
300
  print_line("Stopping the keystroke sniffer...")
270
301
  client.ui.keyscan_stop
271
302
  return true
272
- end
303
+ end
273
304
 
274
305
  #
275
306
  # Dump captured keystrokes
@@ -278,9 +309,9 @@ class Console::CommandDispatcher::Stdapi::Ui
278
309
  print_line("Dumping captured keystrokes...")
279
310
  data = client.ui.keyscan_dump
280
311
  print_line(client.ui.keyscan_extract(data))
281
-
312
+
282
313
  return true
283
- end
314
+ end
284
315
 
285
316
  end
286
317