dstruct 0.0.1

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 (491) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +23 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -0
  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 +326 -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. metadata +536 -0
@@ -0,0 +1,62 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/exploitation/powershell/output'
4
+ require 'rex/exploitation/powershell/parser'
5
+ require 'rex/exploitation/powershell/obfu'
6
+ require 'rex/exploitation/powershell/param'
7
+ require 'rex/exploitation/powershell/function'
8
+ require 'rex/exploitation/powershell/script'
9
+ require 'rex/exploitation/powershell/psh_methods'
10
+
11
+ module Rex
12
+ module Exploitation
13
+ module Powershell
14
+ #
15
+ # Reads script into a PowershellScript
16
+ #
17
+ # @param script_path [String] Path to the Script File
18
+ #
19
+ # @return [Script] Powershell Script object
20
+ def self.read_script(script_path)
21
+ Rex::Exploitation::Powershell::Script.new(script_path)
22
+ end
23
+
24
+ #
25
+ # Insert substitutions into the powershell script
26
+ # If script is a path to a file then read the file
27
+ # otherwise treat it as the contents of a file
28
+ #
29
+ # @param script [String] Script file or path to script
30
+ # @param subs [Array] Substitutions to insert
31
+ #
32
+ # @return [String] Modified script file
33
+ def self.make_subs(script, subs)
34
+ if ::File.file?(script)
35
+ script = ::File.read(script)
36
+ end
37
+
38
+ subs.each do |set|
39
+ script.gsub!(set[0], set[1])
40
+ end
41
+
42
+ script
43
+ end
44
+
45
+ #
46
+ # Return an array of substitutions for use in make_subs
47
+ #
48
+ # @param subs [String] A ; seperated list of substitutions
49
+ #
50
+ # @return [Array] An array of substitutions
51
+ def self.process_subs(subs)
52
+ return [] if subs.nil? or subs.empty?
53
+ new_subs = []
54
+ subs.split(';').each do |set|
55
+ new_subs << set.split(',', 2)
56
+ end
57
+
58
+ new_subs
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,63 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Exploitation
5
+ module Powershell
6
+ class Function
7
+ FUNCTION_REGEX = Regexp.new(/\[(\w+\[\])\]\$(\w+)\s?=|\[(\w+)\]\$(\w+)\s?=|\[(\w+\[\])\]\s+?\$(\w+)\s+=|\[(\w+)\]\s+\$(\w+)\s?=/i)
8
+ PARAMETER_REGEX = Regexp.new(/param\s+\(|param\(/im)
9
+ attr_accessor :code, :name, :params
10
+
11
+ include Output
12
+ include Parser
13
+ include Obfu
14
+
15
+ def initialize(name, code)
16
+ @name = name
17
+ @code = code
18
+ populate_params
19
+ end
20
+
21
+ #
22
+ # To String
23
+ #
24
+ # @return [String] Powershell function
25
+ def to_s
26
+ "function #{name} #{code}"
27
+ end
28
+
29
+ #
30
+ # Identify the parameters from the code and
31
+ # store as Param in @params
32
+ #
33
+ def populate_params
34
+ @params = []
35
+ start = code.index(PARAMETER_REGEX)
36
+ return unless start
37
+ # Get start of our block
38
+ idx = scan_with_index('(', code[start..-1]).first.last + start
39
+ pclause = block_extract(idx)
40
+
41
+ matches = pclause.scan(FUNCTION_REGEX)
42
+
43
+ # Ignore assignment, create params with class and variable names
44
+ matches.each do |param|
45
+ klass = nil
46
+ name = nil
47
+ param.each do |value|
48
+ if value
49
+ if klass
50
+ name = value
51
+ @params << Param.new(klass, name)
52
+ break
53
+ else
54
+ klass = value
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,98 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/text'
4
+
5
+ module Rex
6
+ module Exploitation
7
+ module Powershell
8
+ module Obfu
9
+ MULTI_LINE_COMMENTS_REGEX = Regexp.new(/<#(.*?)#>/m)
10
+ SINGLE_LINE_COMMENTS_REGEX = Regexp.new(/^\s*#(?!.*region)(.*$)/i)
11
+ WINDOWS_EOL_REGEX = Regexp.new(/[\r\n]+/)
12
+ UNIX_EOL_REGEX = Regexp.new(/[\n]+/)
13
+ WHITESPACE_REGEX = Regexp.new(/\s+/)
14
+ EMPTY_LINE_REGEX = Regexp.new(/^$|^\s+$/)
15
+
16
+ #
17
+ # Remove comments
18
+ #
19
+ # @return [String] code without comments
20
+ def strip_comments
21
+ # Multi line
22
+ code.gsub!(MULTI_LINE_COMMENTS_REGEX, '')
23
+ # Single line
24
+ code.gsub!(SINGLE_LINE_COMMENTS_REGEX, '')
25
+
26
+ code
27
+ end
28
+
29
+ #
30
+ # Remove empty lines
31
+ #
32
+ # @return [String] code without empty lines
33
+ def strip_empty_lines
34
+ # Windows EOL
35
+ code.gsub!(WINDOWS_EOL_REGEX, "\r\n")
36
+ # UNIX EOL
37
+ code.gsub!(UNIX_EOL_REGEX, "\n")
38
+
39
+ code
40
+ end
41
+
42
+ #
43
+ # Remove whitespace
44
+ # This can break some codes using inline .NET
45
+ #
46
+ # @return [String] code with whitespace stripped
47
+ def strip_whitespace
48
+ code.gsub!(WHITESPACE_REGEX, ' ')
49
+
50
+ code
51
+ end
52
+
53
+ #
54
+ # Identify variables and replace them
55
+ #
56
+ # @return [String] code with variable names replaced with unique values
57
+ def sub_vars
58
+ # Get list of variables, remove reserved
59
+ get_var_names.each do |var, _sub|
60
+ code.gsub!(var, "$#{@rig.init_var(var)}")
61
+ end
62
+
63
+ code
64
+ end
65
+
66
+ #
67
+ # Identify function names and replace them
68
+ #
69
+ # @return [String] code with function names replaced with unique
70
+ # values
71
+ def sub_funcs
72
+ # Find out function names, make map
73
+ get_func_names.each do |var, _sub|
74
+ code.gsub!(var, @rig.init_var(var))
75
+ end
76
+
77
+ code
78
+ end
79
+
80
+ #
81
+ # Perform standard substitutions
82
+ #
83
+ # @return [String] code with standard substitution methods applied
84
+ def standard_subs(subs = %w(strip_comments strip_whitespace sub_funcs sub_vars))
85
+ # Save us the trouble of breaking injected .NET and such
86
+ subs.delete('strip_whitespace') unless get_string_literals.empty?
87
+ # Run selected modifiers
88
+ subs.each do |modifier|
89
+ send(modifier)
90
+ end
91
+ code.gsub!(EMPTY_LINE_REGEX, '')
92
+
93
+ code
94
+ end
95
+ end # Obfu
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,151 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'zlib'
4
+ require 'rex/text'
5
+
6
+ module Rex
7
+ module Exploitation
8
+ module Powershell
9
+ module Output
10
+ #
11
+ # To String
12
+ #
13
+ # @return [String] Code
14
+ def to_s
15
+ code
16
+ end
17
+
18
+ #
19
+ # Returns code size
20
+ #
21
+ # @return [Integer] Code size
22
+ def size
23
+ code.size
24
+ end
25
+
26
+ #
27
+ # Return code with numbered lines
28
+ #
29
+ # @return [String] Powershell code with line numbers
30
+ def to_s_lineno
31
+ numbered = ''
32
+ code.split(/\r\n|\n/).each_with_index do |line, idx|
33
+ numbered << "#{idx}: #{line}"
34
+ end
35
+
36
+ numbered
37
+ end
38
+
39
+ #
40
+ # Return a zlib compressed powershell code wrapped in decode stub
41
+ #
42
+ # @param eof [String] End of file identifier to append to code
43
+ #
44
+ # @return [String] Zlib compressed powershell code wrapped in
45
+ # decompression stub
46
+ def deflate_code(eof = nil)
47
+ # Compress using the Deflate algorithm
48
+ compressed_stream = ::Zlib::Deflate.deflate(code,
49
+ ::Zlib::BEST_COMPRESSION)
50
+
51
+ # Base64 encode the compressed file contents
52
+ encoded_stream = Rex::Text.encode_base64(compressed_stream)
53
+
54
+ # Build the powershell expression
55
+ # Decode base64 encoded command and create a stream object
56
+ psh_expression = '$s=New-Object IO.MemoryStream(,'
57
+ psh_expression << "[Convert]::FromBase64String('#{encoded_stream}'));"
58
+ # Read & delete the first two bytes due to incompatibility with MS
59
+ psh_expression << '$s.ReadByte();'
60
+ psh_expression << '$s.ReadByte();'
61
+ # Uncompress and invoke the expression (execute)
62
+ psh_expression << 'IEX (New-Object IO.StreamReader('
63
+ psh_expression << 'New-Object IO.Compression.DeflateStream('
64
+ psh_expression << '$s,'
65
+ psh_expression << '[IO.Compression.CompressionMode]::Decompress)'
66
+ psh_expression << ')).ReadToEnd();'
67
+
68
+ # If eof is set, add a marker to signify end of code output
69
+ # if (eof && eof.length == 8) then psh_expression += "'#{eof}'" end
70
+ psh_expression << "echo '#{eof}';" if eof
71
+
72
+ @code = psh_expression
73
+ end
74
+
75
+ #
76
+ # Return Base64 encoded powershell code
77
+ #
78
+ # @return [String] Base64 encoded powershell code
79
+ def encode_code
80
+ @code = Rex::Text.encode_base64(Rex::Text.to_unicode(code))
81
+ end
82
+
83
+ #
84
+ # Return a gzip compressed powershell code wrapped in decoder stub
85
+ #
86
+ # @param eof [String] End of file identifier to append to code
87
+ #
88
+ # @return [String] Gzip compressed powershell code wrapped in
89
+ # decompression stub
90
+ def gzip_code(eof = nil)
91
+ # Compress using the Deflate algorithm
92
+ compressed_stream = Rex::Text.gzip(code)
93
+
94
+ # Base64 encode the compressed file contents
95
+ encoded_stream = Rex::Text.encode_base64(compressed_stream)
96
+
97
+ # Build the powershell expression
98
+ # Decode base64 encoded command and create a stream object
99
+ psh_expression = '$s=New-Object IO.MemoryStream(,'
100
+ psh_expression << "[Convert]::FromBase64String('#{encoded_stream}'));"
101
+ # Uncompress and invoke the expression (execute)
102
+ psh_expression << 'IEX (New-Object IO.StreamReader('
103
+ psh_expression << 'New-Object IO.Compression.GzipStream('
104
+ psh_expression << '$s,'
105
+ psh_expression << '[IO.Compression.CompressionMode]::Decompress)'
106
+ psh_expression << ')).ReadToEnd();'
107
+
108
+ # If eof is set, add a marker to signify end of code output
109
+ # if (eof && eof.length == 8) then psh_expression += "'#{eof}'" end
110
+ psh_expression << "echo '#{eof}';" if eof
111
+
112
+ @code = psh_expression
113
+ end
114
+
115
+ #
116
+ # Compresses script contents with gzip (default) or deflate
117
+ #
118
+ # @param eof [String] End of file identifier to append to code
119
+ # @param gzip [Boolean] Whether to use gzip compression or deflate
120
+ #
121
+ # @return [String] Compressed code wrapped in decompression stub
122
+ def compress_code(eof = nil, gzip = true)
123
+ @code = gzip ? gzip_code(eof) : deflate_code(eof)
124
+ end
125
+
126
+ #
127
+ # Reverse the compression process
128
+ # Try gzip, inflate if that fails
129
+ #
130
+ # @return [String] Decompressed powershell code
131
+ def decompress_code
132
+ # Extract substring with payload
133
+ encoded_stream = @code.scan(/FromBase64String\('(.*)'/).flatten.first
134
+ # Decode and decompress the string
135
+ unencoded = Rex::Text.decode_base64(encoded_stream)
136
+ begin
137
+ @code = Rex::Text.ungzip(unencoded) || Rex::Text.zlib_inflate(unencoded)
138
+ rescue Zlib::GzipFile::Error
139
+ begin
140
+ @code = Rex::Text.zlib_inflate(unencoded)
141
+ rescue Zlib::DataError => e
142
+ raise RuntimeError, 'Invalid compression'
143
+ end
144
+ end
145
+
146
+ @code
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,23 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Exploitation
5
+ module Powershell
6
+ class Param
7
+ attr_accessor :klass, :name
8
+ def initialize(klass, name)
9
+ @klass = klass.strip
10
+ @name = name.strip.gsub(/\s|,/, '')
11
+ end
12
+
13
+ #
14
+ # To String
15
+ #
16
+ # @return [String] Powershell param
17
+ def to_s
18
+ "[#{klass}]$#{name}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,183 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Exploitation
5
+ module Powershell
6
+ module Parser
7
+ # Reserved special variables
8
+ # Acquired with: Get-Variable | Format-Table name, value -auto
9
+ RESERVED_VARIABLE_NAMES = [
10
+ '$$',
11
+ '$?',
12
+ '$^',
13
+ '$_',
14
+ '$args',
15
+ '$ConfirmPreference',
16
+ '$ConsoleFileName',
17
+ '$DebugPreference',
18
+ '$Env',
19
+ '$Error',
20
+ '$ErrorActionPreference',
21
+ '$ErrorView',
22
+ '$ExecutionContext',
23
+ '$false',
24
+ '$FormatEnumerationLimit',
25
+ '$HOME',
26
+ '$Host',
27
+ '$input',
28
+ '$LASTEXITCODE',
29
+ '$MaximumAliasCount',
30
+ '$MaximumDriveCount',
31
+ '$MaximumErrorCount',
32
+ '$MaximumFunctionCount',
33
+ '$MaximumHistoryCount',
34
+ '$MaximumVariableCount',
35
+ '$MyInvocation',
36
+ '$NestedPromptLevel',
37
+ '$null',
38
+ '$OutputEncoding',
39
+ '$PID',
40
+ '$PROFILE',
41
+ '$ProgressPreference',
42
+ '$PSBoundParameters',
43
+ '$PSCulture',
44
+ '$PSEmailServer',
45
+ '$PSHOME',
46
+ '$PSSessionApplicationName',
47
+ '$PSSessionConfigurationName',
48
+ '$PSSessionOption',
49
+ '$PSUICulture',
50
+ '$PSVersionTable',
51
+ '$PWD',
52
+ '$ReportErrorShowExceptionClass',
53
+ '$ReportErrorShowInnerException',
54
+ '$ReportErrorShowSource',
55
+ '$ReportErrorShowStackTrace',
56
+ '$ShellId',
57
+ '$StackTrace',
58
+ '$true',
59
+ '$VerbosePreference',
60
+ '$WarningPreference',
61
+ '$WhatIfPreference'
62
+ ].map(&:downcase).freeze
63
+
64
+ #
65
+ # Get variable names from code, removes reserved names from return
66
+ #
67
+ # @return [Array] variable names
68
+ def get_var_names
69
+ our_vars = code.scan(/\$[a-zA-Z\-\_0-9]+/).uniq.flatten.map(&:strip)
70
+ our_vars.select { |v| !RESERVED_VARIABLE_NAMES.include?(v.downcase) }
71
+ end
72
+
73
+ #
74
+ # Get function names from code
75
+ #
76
+ # @return [Array] function names
77
+ def get_func_names
78
+ code.scan(/function\s([a-zA-Z\-\_0-9]+)/).uniq.flatten
79
+ end
80
+
81
+ #
82
+ # Attempt to find string literals in PSH expression
83
+ #
84
+ # @return [Array] string literals
85
+ def get_string_literals
86
+ code.scan(/@"(.+?)"@|@'(.+?)'@/m)
87
+ end
88
+
89
+ #
90
+ # Scan code and return matches with index
91
+ #
92
+ # @param str [String] string to match in code
93
+ # @param source [String] source code to match, defaults to @code
94
+ #
95
+ # @return [Array[String,Integer]] matched items with index
96
+ def scan_with_index(str, source = code)
97
+ ::Enumerator.new do |y|
98
+ source.scan(str) do
99
+ y << ::Regexp.last_match
100
+ end
101
+ end.map { |m| [m.to_s, m.offset(0)[0]] }
102
+ end
103
+
104
+ #
105
+ # Return matching bracket type
106
+ #
107
+ # @param char [String] opening bracket character
108
+ #
109
+ # @return [String] matching closing bracket
110
+ def match_start(char)
111
+ case char
112
+ when '{'
113
+ '}'
114
+ when '('
115
+ ')'
116
+ when '['
117
+ ']'
118
+ when '<'
119
+ '>'
120
+ else
121
+ fail ArgumentError, 'Unknown starting bracket'
122
+ end
123
+ end
124
+
125
+ #
126
+ # Extract block of code inside brackets/parenthesis
127
+ #
128
+ # Attempts to match the bracket at idx, handling nesting manually
129
+ # Once the balanced matching bracket is found, all script content
130
+ # between idx and the index of the matching bracket is returned
131
+ #
132
+ # @param idx [Integer] index of opening bracket
133
+ #
134
+ # @return [String] content between matching brackets
135
+ def block_extract(idx)
136
+ fail ArgumentError unless idx
137
+
138
+ if idx < 0 || idx >= code.length
139
+ fail ArgumentError, 'Invalid index'
140
+ end
141
+
142
+ start = code[idx]
143
+ stop = match_start(start)
144
+ delims = scan_with_index(/#{Regexp.escape(start)}|#{Regexp.escape(stop)}/, code[idx + 1..-1])
145
+ delims.map { |x| x[1] = x[1] + idx + 1 }
146
+ c = 1
147
+ sidx = nil
148
+ # Go through delims till we balance, get idx
149
+ while (c != 0) && (x = delims.shift)
150
+ sidx = x[1]
151
+ x[0] == stop ? c -= 1 : c += 1
152
+ end
153
+
154
+ code[idx..sidx]
155
+ end
156
+
157
+ #
158
+ # Extract a block of function code
159
+ #
160
+ # @param func_name [String] function name
161
+ # @param delete [Boolean] delete the function from the code
162
+ #
163
+ # @return [String] function block
164
+ def get_func(func_name, delete = false)
165
+ start = code.index(func_name)
166
+
167
+ return nil unless start
168
+
169
+ idx = code[start..-1].index('{') + start
170
+ func_txt = block_extract(idx)
171
+
172
+ if delete
173
+ delete_code = code[0..idx]
174
+ delete_code << code[(idx + func_txt.length)..-1]
175
+ @code = delete_code
176
+ end
177
+
178
+ Function.new(func_name, func_txt)
179
+ end
180
+ end # Parser
181
+ end
182
+ end
183
+ end