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,56 @@
1
+ # -*- coding: binary -*-
2
+ # Copyright (c) 2010, patrickHVE@googlemail.com
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ # * Redistributions of source code must retain the above copyright
8
+ # notice, this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright
10
+ # notice, this list of conditions and the following disclaimer in the
11
+ # documentation and/or other materials provided with the distribution.
12
+ # * The names of the author may not be used to endorse or promote products
13
+ # derived from this software without specific prior written permission.
14
+ #
15
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ # DISCLAIMED. IN NO EVENT SHALL patrickHVE@googlemail.com BE LIABLE FOR ANY
19
+ # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+
26
+ require 'rex/post/meterpreter/packet'
27
+
28
+ module Rex
29
+ module Post
30
+ module Meterpreter
31
+ module Extensions
32
+ module Stdapi
33
+ module Railgun
34
+
35
+ TLV_TYPE_EXTENSION_RAILGUN = 0
36
+ TLV_TYPE_RAILGUN_SIZE_OUT = TLV_META_TYPE_UINT | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 1)
37
+ TLV_TYPE_RAILGUN_STACKBLOB = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 2)
38
+ TLV_TYPE_RAILGUN_BUFFERBLOB_IN = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 3)
39
+ TLV_TYPE_RAILGUN_BUFFERBLOB_INOUT = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 4)
40
+
41
+ TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_OUT = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 5)
42
+ TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_INOUT = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 6)
43
+ TLV_TYPE_RAILGUN_BACK_RET = TLV_META_TYPE_QWORD | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 7)
44
+ TLV_TYPE_RAILGUN_BACK_ERR = TLV_META_TYPE_UINT | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 8)
45
+
46
+ TLV_TYPE_RAILGUN_DLLNAME = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 9)
47
+ TLV_TYPE_RAILGUN_FUNCNAME = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 10)
48
+ TLV_TYPE_RAILGUN_MULTI_GROUP = TLV_META_TYPE_GROUP | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 11)
49
+
50
+ TLV_TYPE_RAILGUN_MEM_ADDRESS = TLV_META_TYPE_QWORD | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 12)
51
+ TLV_TYPE_RAILGUN_MEM_DATA = TLV_META_TYPE_RAW | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 13)
52
+ TLV_TYPE_RAILGUN_MEM_LENGTH = TLV_META_TYPE_UINT | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 14)
53
+
54
+ TLV_TYPE_RAILGUN_CALLCONV = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 15)
55
+ TLV_TYPE_RAILGUN_BACK_MSG = TLV_META_TYPE_STRING | (TLV_TYPE_EXTENSION_RAILGUN + TLV_EXTENSIONS + 16)
56
+ end; end; end; end; end; end
@@ -0,0 +1,106 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/platform_util'
3
+
4
+ module Rex
5
+ module Post
6
+ module Meterpreter
7
+ module Extensions
8
+ module Stdapi
9
+ module Railgun
10
+ module Type
11
+ module PointerUtil
12
+
13
+ ARCH_POINTER_SIZE = {
14
+ PlatformUtil::X86_64 => 8,
15
+ PlatformUtil::X86_32 => 4
16
+ }.freeze
17
+
18
+ # Returns the pointer size for this architecture. Should accept client or platform or arch
19
+ def self.pointer_size(platform)
20
+ ARCH_POINTER_SIZE[platform]
21
+ end
22
+
23
+ def self.pack_pointer(pointer, platform)
24
+ if pointer.nil?
25
+ return pack_pointer(0, platform)
26
+ end
27
+
28
+ case platform
29
+ when PlatformUtil::X86_64
30
+ # Assume little endian
31
+ [pointer].pack('Q<')
32
+ when PlatformUtil::X86_32
33
+ [pointer].pack('V')
34
+ else
35
+ raise "platform symbol #{platform.to_s} not supported"
36
+ end
37
+ end
38
+
39
+ # Given a packed pointer, unpack it according to architecture
40
+ def self.unpack_pointer(packed_pointer, platform)
41
+ case platform
42
+ when PlatformUtil::X86_64
43
+ # Assume little endian
44
+ packed_pointer.unpack('Q<').first
45
+ when PlatformUtil::X86_32
46
+ packed_pointer.unpack('V').first
47
+ else
48
+ raise "platform symbol #{platform.to_s} not supported"
49
+ end
50
+ end
51
+
52
+ def self.null_pointer(pointer, platform)
53
+ pack_pointer(0, platform)
54
+ end
55
+
56
+ ###
57
+ # Summary: Returns true if pointer will be considered a 'null' pointer
58
+ #
59
+ # If given nil, returns true
60
+ # If given 0, returns true
61
+ # If given a string, if 0 after unpacking, returns true
62
+ # false otherwise
63
+ ##
64
+ def self.is_null_pointer?(pointer, platform)
65
+ if pointer.kind_of?(String)
66
+ pointer = unpack_pointer(pointer, platform)
67
+ end
68
+
69
+ return pointer.nil? || pointer == 0
70
+ end
71
+ #
72
+ # def self.is_unpacked_pointer?(pointer, platform)
73
+ # # TODO also check that the integer size is appropriate for the platform
74
+ # unless pointer.kind_of?(Fixnum) and pointer > 0 # and pointer <
75
+ # return false
76
+ # end
77
+ #
78
+ # packed_pointer = pack_pointer(pointer, platform)
79
+ # if !packed_pointer.nil? and packed_pointer.length == pointer_size(platform)
80
+ # return true
81
+ # end
82
+ #
83
+ # return false
84
+ # end
85
+ #
86
+ # Returns true if the data type is a pointer, false otherwise
87
+ def self.is_pointer_type?(type)
88
+ if type == :pointer
89
+ return true
90
+ end
91
+
92
+ if type.kind_of?(String) && type =~ /^L?P/
93
+ return true
94
+ end
95
+
96
+ return false
97
+ end
98
+
99
+ end # PointerUtil
100
+ end # Type
101
+ end # Railgun
102
+ end # Stdapi
103
+ end # Extensions
104
+ end # Meterpreter
105
+ end # Post
106
+ end # Rex
@@ -0,0 +1,676 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/dll_helper'
3
+
4
+ module Rex
5
+ module Post
6
+ module Meterpreter
7
+ module Extensions
8
+ module Stdapi
9
+ module Railgun
10
+
11
+ #
12
+ # Utility methods and constants for dealing with most types of variables.
13
+ #
14
+ class Util
15
+
16
+ # Bring in some useful string manipulation utility functions
17
+ include DLLHelper
18
+
19
+ # Data type size info: http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.80).aspx
20
+ PRIMITIVE_TYPE_SIZES = {
21
+ :int => 4,
22
+ :__int8 => 1,
23
+ :__int16 => 2,
24
+ :__int32 => 4,
25
+ :__int64 => 8,
26
+ :bool => 1,
27
+ :char => 1,
28
+ :short => 2,
29
+ :long => 4,
30
+ :long_long => 8,
31
+ :float => 4,
32
+ :double => 8,
33
+ :long_double => 8,
34
+ :wchar_t => 2,
35
+ }
36
+
37
+ #
38
+ # Maps a data type to its corresponding primitive or special type
39
+ # +:pointer+. Note, primitive types are mapped to themselves.
40
+ #
41
+ # typedef info: http://msdn.microsoft.com/en-us/library/aa383751(v=vs.85).aspx
42
+ TYPE_DEFINITIONS = {
43
+ ##
44
+ # Primitives
45
+ ##
46
+ :int => :int,
47
+ :__int8 => :__int8,
48
+ :__int16 => :__int16,
49
+ :__int32 => :__int32,
50
+ :__int64 => :__int64,
51
+ :bool => :bool,
52
+ :char => :char,
53
+ :short => :short,
54
+ :long => :long,
55
+ :long_long => :long_long,
56
+ :float => :float,
57
+ :double => :double,
58
+ :long_double => :long_double,
59
+ :wchar_t => :wchar_t,
60
+ ##
61
+ # Non-pointers
62
+ ##
63
+ #typedef WORD ATOM;
64
+ :ATOM => :short,
65
+ #typedef int BOOL;
66
+ :BOOL => :int,
67
+ #typedef BYTE BOOLEAN;
68
+ :BOOLEAN => :char,
69
+ #typedef unsigned char BYTE;
70
+ :BYTE => :char,
71
+ #typedef char CHAR;
72
+ :CHAR => :char,
73
+ #typedef DWORD COLORREF;
74
+ :COLORREF => :long,
75
+ #typedef unsigned long DWORD;
76
+ :DWORD => :long,
77
+ #typedef unsigned int DWORD32;
78
+ :DWORD32 => :int,
79
+ #typedef unsigned __int64 DWORD64;
80
+ :DWORD64 => :__int64,
81
+ #typedef float FLOAT;
82
+ :FLOAT => :float,
83
+ #typedef int HFILE;
84
+ :HFILE => :int,
85
+ #typedef LONG HRESULT;
86
+ :HRESULT => :long,
87
+ #typedef int INT;
88
+ :INT => :int,
89
+ #typedef signed int INT32;
90
+ :INT32 => :int,
91
+ #typedef signed __int64 INT64;
92
+ :INT64 => :__int64,
93
+ #typedef WORD LANGID;
94
+ :LANGID => :short,
95
+ #typedef DWORD LCID;
96
+ :LCID => :long,
97
+ #typedef DWORD LCTYPE;
98
+ :LCTYPE => :long,
99
+ #typedef DWORD LGRPID;
100
+ :LGRPID => :long,
101
+ #typedef long LONG;
102
+ :LONG => :long,
103
+ #typedef signed int LONG32;
104
+ :LONG32 => :int,
105
+ #typedef __int64 LONG64;
106
+ :LONG64 => :__int64,
107
+ #typedef PDWORD PLCID;
108
+ :PLCID => :pointer,
109
+ #typedef LPVOID SC_LOCK;
110
+ :SC_LOCK => :pointer,
111
+ #typedef short SHORT;
112
+ :SHORT => :short,
113
+ #typedef unsigned char UCHAR;
114
+ :UCHAR => :char,
115
+ #typedef unsigned int UINT;
116
+ :UINT => :int,
117
+ #typedef unsigned int UINT32;
118
+ :UINT32 => :int,
119
+ #typedef unsigned long ULONG;
120
+ :ULONG => :long,
121
+ #typedef unsigned int ULONG32;
122
+ :ULONG32 => :int,
123
+ #typedef unsigned __int64 ULONG64;
124
+ :ULONG64 => :__int64,
125
+ #typedef unsigned short USHORT;
126
+ :USHORT => :short,
127
+ #typedef wchar_t WCHAR;
128
+ :WCHAR => :wchar_t,
129
+ #typedef unsigned short WORD;
130
+ :WORD => :short,
131
+ ##
132
+ # Pointers declared with *
133
+ ##
134
+ #typedef DWORD* LPCOLORREF;
135
+ :LPCOLORREF => :pointer,
136
+ #typedef void* LPCVOID;
137
+ :LPCVOID => :pointer,
138
+ #typedef WCHAR* LPCWSTR;
139
+ :LPCWSTR => :pointer,
140
+ #typedef DWORD* LPDWORD;
141
+ :LPDWORD => :pointer,
142
+ #typedef HANDLE* LPHANDLE;
143
+ :LPHANDLE => :pointer,
144
+ #typedef int* LPINT;
145
+ :LPINT => :pointer,
146
+ #typedef long* LPLONG;
147
+ :LPLONG => :pointer,
148
+ #typedef CHAR* LPSTR;
149
+ :LPSTR => :pointer,
150
+ #typedef void* LPVOID;
151
+ :LPVOID => :pointer,
152
+ #typedef WORD* LPWORD;
153
+ :LPWORD => :pointer,
154
+ #typedef WCHAR* LPWSTR;
155
+ :LPWSTR => :pointer,
156
+ #typedef BOOL* PBOOL;
157
+ :PBOOL => :pointer,
158
+ #typedef BOOLEAN* PBOOLEAN;
159
+ :PBOOLEAN => :pointer,
160
+ #typedef BYTE* PBYTE;
161
+ :PBYTE => :pointer,
162
+ #typedef CHAR* PCHAR;
163
+ :PCHAR => :pointer,
164
+ #typedef CHAR* PCSTR;
165
+ :PCSTR => :pointer,
166
+ #typedef WCHAR* PCWSTR;
167
+ :PCWSTR => :pointer,
168
+ #typedef DWORD* PDWORD;
169
+ :PDWORD => :pointer,
170
+ #typedef DWORDLONG* PDWORDLONG;
171
+ :PDWORDLONG => :pointer,
172
+ #typedef DWORD_PTR* PDWORD_PTR;
173
+ :PDWORD_PTR => :pointer,
174
+ #typedef DWORD32* PDWORD32;
175
+ :PDWORD32 => :pointer,
176
+ #typedef DWORD64* PDWORD64;
177
+ :PDWORD64 => :pointer,
178
+ #typedef FLOAT* PFLOAT;
179
+ :PFLOAT => :pointer,
180
+ #typedef HANDLE* PHANDLE;
181
+ :PHANDLE => :pointer,
182
+ #typedef HKEY* PHKEY;
183
+ :PHKEY => :pointer,
184
+ #typedef int* PINT;
185
+ :PINT => :pointer,
186
+ #typedef INT_PTR* PINT_PTR;
187
+ :PINT_PTR => :pointer,
188
+ #typedef INT32* PINT32;
189
+ :PINT32 => :pointer,
190
+ #typedef INT64* PINT64;
191
+ :PINT64 => :pointer,
192
+ #typedef LONG* PLONG;
193
+ :PLONG => :pointer,
194
+ #typedef LONGLONG* PLONGLONG;
195
+ :PLONGLONG => :pointer,
196
+ #typedef LONG_PTR* PLONG_PTR;
197
+ :PLONG_PTR => :pointer,
198
+ #typedef LONG32* PLONG32;
199
+ :PLONG32 => :pointer,
200
+ #typedef LONG64* PLONG64;
201
+ :PLONG64 => :pointer,
202
+ #typedef SHORT* PSHORT;
203
+ :PSHORT => :pointer,
204
+ #typedef SIZE_T* PSIZE_T;
205
+ :PSIZE_T => :pointer,
206
+ #typedef SSIZE_T* PSSIZE_T;
207
+ :PSSIZE_T => :pointer,
208
+ #typedef CHAR* PSTR;
209
+ :PSTR => :pointer,
210
+ #typedef TBYTE* PTBYTE;
211
+ :PTBYTE => :pointer,
212
+ #typedef TCHAR* PTCHAR;
213
+ :PTCHAR => :pointer,
214
+ #typedef UCHAR* PUCHAR;
215
+ :PUCHAR => :pointer,
216
+ #typedef UINT* PUINT;
217
+ :PUINT => :pointer,
218
+ #typedef UINT_PTR* PUINT_PTR;
219
+ :PUINT_PTR => :pointer,
220
+ #typedef UINT32* PUINT32;
221
+ :PUINT32 => :pointer,
222
+ #typedef UINT64* PUINT64;
223
+ :PUINT64 => :pointer,
224
+ #typedef ULONG* PULONG;
225
+ :PULONG => :pointer,
226
+ #typedef ULONGLONG* PULONGLONG;
227
+ :PULONGLONG => :pointer,
228
+ #typedef ULONG_PTR* PULONG_PTR;
229
+ :PULONG_PTR => :pointer,
230
+ #typedef ULONG32* PULONG32;
231
+ :PULONG32 => :pointer,
232
+ #typedef ULONG64* PULONG64;
233
+ :PULONG64 => :pointer,
234
+ #typedef USHORT* PUSHORT;
235
+ :PUSHORT => :pointer,
236
+ #typedef void* PVOID;
237
+ :PVOID => :pointer,
238
+ #typedef WCHAR* PWCHAR;
239
+ :PWCHAR => :pointer,
240
+ #typedef WORD* PWORD;
241
+ :PWORD => :pointer,
242
+ #typedef WCHAR* PWSTR;
243
+ :PWSTR => :pointer,
244
+ #typedef HANDLE HACCEL;
245
+ :HACCEL => :pointer,
246
+ ##
247
+ # Handles
248
+ ##
249
+ #typedef PVOID HANDLE;
250
+ :HANDLE => :pointer,
251
+ #typedef HANDLE HBITMAP;
252
+ :HBITMAP => :pointer,
253
+ #typedef HANDLE HBRUSH;
254
+ :HBRUSH => :pointer,
255
+ #typedef HANDLE HCOLORSPACE;
256
+ :HCOLORSPACE => :pointer,
257
+ #typedef HANDLE HCONV;
258
+ :HCONV => :pointer,
259
+ #typedef HANDLE HCONVLIST;
260
+ :HCONVLIST => :pointer,
261
+ #typedef HANDLE HDC;
262
+ :HDC => :pointer,
263
+ #typedef HANDLE HDDEDATA;
264
+ :HDDEDATA => :pointer,
265
+ #typedef HANDLE HDESK;
266
+ :HDESK => :pointer,
267
+ #typedef HANDLE HDROP;
268
+ :HDROP => :pointer,
269
+ #typedef HANDLE HDWP;
270
+ :HDWP => :pointer,
271
+ #typedef HANDLE HENHMETAFILE;
272
+ :HENHMETAFILE => :pointer,
273
+ #typedef HANDLE HFONT;
274
+ :HFONT => :pointer,
275
+ #typedef HANDLE HGDIOBJ;
276
+ :HGDIOBJ => :pointer,
277
+ #typedef HANDLE HGLOBAL;
278
+ :HGLOBAL => :pointer,
279
+ #typedef HANDLE HHOOK;
280
+ :HHOOK => :pointer,
281
+ #typedef HANDLE HICON;
282
+ :HICON => :pointer,
283
+ #typedef HANDLE HINSTANCE;
284
+ :HINSTANCE => :pointer,
285
+ #typedef HANDLE HKEY;
286
+ :HKEY => :pointer,
287
+ #typedef HANDLE HKL;
288
+ :HKL => :pointer,
289
+ #typedef HANDLE HLOCAL;
290
+ :HLOCAL => :pointer,
291
+ #typedef HANDLE HMENU;
292
+ :HMENU => :pointer,
293
+ #typedef HANDLE HMETAFILE;
294
+ :HMETAFILE => :pointer,
295
+ #typedef HANDLE HPALETTE;
296
+ :HPALETTE => :pointer,
297
+ #typedef HANDLE HPEN;
298
+ :HPEN => :pointer,
299
+ #typedef HANDLE HRGN;
300
+ :HRGN => :pointer,
301
+ #typedef HANDLE HRSRC;
302
+ :HRSRC => :pointer,
303
+ #typedef HANDLE HSZ;
304
+ :HSZ => :pointer,
305
+ #typedef HANDLE WINSTA;
306
+ :WINSTA => :pointer,
307
+ #typedef HANDLE HWND;
308
+ :HWND => :pointer,
309
+ #typedef HANDLE SC_HANDLE;
310
+ :SC_HANDLE => :pointer,
311
+ #typedef HANDLE SERVICE_STATUS_HANDLE;
312
+ :SERVICE_STATUS_HANDLE => :pointer,
313
+ }
314
+
315
+ # param 'railgun' is a Railgun instance.
316
+ # param 'platform' is a value like client.platform
317
+ def initialize(railgun, platform)
318
+ @railgun = railgun
319
+ @is_64bit = is_64bit_platform?(platform)
320
+ end
321
+
322
+ #
323
+ # Given a packed pointer, unpacks it according to architecture
324
+ #
325
+ def unpack_pointer(packed_pointer)
326
+ if is_64bit
327
+ # Assume little endian
328
+ packed_pointer.unpack('Q<')[0]
329
+ else
330
+ packed_pointer.unpack('V')[0]
331
+ end
332
+ end
333
+
334
+ #
335
+ # Returns true if +pointer+ will be considered a 'null' pointer.
336
+ #
337
+ # If +pointer+ is nil or 0, returns true
338
+ # If +pointer+ is a String, if 0 after unpacking, returns true
339
+ # false otherwise
340
+ #
341
+ # See #unpack_pointer
342
+ #
343
+ def is_null_pointer(pointer)
344
+ if pointer.kind_of? String
345
+ pointer = unpack_pointer(pointer)
346
+ end
347
+
348
+ return pointer.nil? || pointer == 0
349
+ end
350
+
351
+ #
352
+ # Reads null-terminated unicode strings from memory.
353
+ #
354
+ # Given a pointer to a null terminated array of WCHARs, return a ruby
355
+ # String. If +pointer+ is NULL (see #is_null_pointer) returns an empty
356
+ # string.
357
+ #
358
+ def read_wstring(pointer, length = nil)
359
+ # Return an empty string for null pointers
360
+ if is_null_pointer(pointer)
361
+ return ''
362
+ end
363
+
364
+ # If length not provided, use lstrlenW
365
+ if length.nil?
366
+ length = railgun.kernel32.lstrlenW(pointer)['return']
367
+ end
368
+
369
+ # Retrieve the array of characters
370
+ chars = read_array(:WCHAR, length, pointer)
371
+
372
+ # Concatenate the characters and convert to a ruby string
373
+ str = uniz_to_str(chars.join(''))
374
+
375
+ return str
376
+ end
377
+
378
+ #
379
+ # Reads null-terminated ASCII strings from memory.
380
+ #
381
+ # Given a pointer to a null terminated array of CHARs, return a ruby
382
+ # String. If +pointer+ is NULL (see #is_null_pointer) returns an empty
383
+ # string.
384
+ #
385
+ def read_string(pointer, length=nil)
386
+ if is_null_pointer(pointer)
387
+ return ''
388
+ end
389
+
390
+ unless length
391
+ length = railgun.kernel32.lstrlenA(pointer)['return']
392
+ end
393
+
394
+ chars = read_array(:CHAR, length, pointer)
395
+ return chars.join('')
396
+ end
397
+
398
+ #
399
+ # Read a given number of bytes from memory or from a provided buffer.
400
+ #
401
+ # If +buffer+ is not provided, read +size+ bytes from the client's memory.
402
+ # If +buffer+ is provided, reads +size+ characters from the index of +address+.
403
+ #
404
+ def memread(address, size, buffer = nil)
405
+ if buffer.nil?
406
+ return railgun.memread(address, size)
407
+ else
408
+ return buffer[address .. (address + size - 1)]
409
+ end
410
+ end
411
+
412
+ #
413
+ # Read and unpack a pointer from the given buffer at a given offset
414
+ #
415
+ def read_pointer(buffer, offset = 0)
416
+ unpack_pointer(buffer[offset, (offset + pointer_size)])
417
+ end
418
+
419
+ #
420
+ # Reads data structures and several windows data types
421
+ #
422
+ def read_data(type, position, buffer = nil)
423
+ if buffer.nil?
424
+ buffer = memread(position, sizeof_type(type))
425
+ position = 0
426
+ end
427
+
428
+ # If we're asked to read a data structure, deligate to read_struct
429
+ if is_struct_type?(type)
430
+ return read_struct(type, buffer, position)
431
+ end
432
+
433
+ # If the type is an array with a given size...
434
+ # BYTE[3] for example or BYTE[ENCRYPTED_PWLEN] or even PDWORD[23]
435
+ if is_array_type?(type)
436
+ # Separate the element type from the size of the array
437
+ element_type, length = split_array_type(type)
438
+
439
+ # Have read_array take care of the rest
440
+ return read_array(element_type, length, position, buffer)
441
+ end
442
+
443
+ size = sizeof_type(type)
444
+ raw = memread(position, size, buffer)
445
+
446
+ # read/unpack data for the types we have hard-coded support for
447
+ case type
448
+ when :LPWSTR
449
+ # null-terminated string of 16-bit Unicode characters
450
+ return read_wstring(read_pointer(raw))
451
+ when :DWORD
452
+ # Both on x86 and x64, DWORD is 32 bits
453
+ return raw.unpack('V').first
454
+ when :BOOL
455
+ return raw.unpack('V').first == 1
456
+ when :LONG
457
+ return raw.unpack('V').first
458
+ end
459
+
460
+ #If nothing worked thus far, return it raw
461
+ return raw
462
+ end
463
+
464
+ #
465
+ # Read +length+ number of instances of +type+ from +bufptr+ .
466
+ #
467
+ # +bufptr+ is an index in +buffer+ or, if +buffer+ is nil, a memory address
468
+ #
469
+ def read_array(type, length, bufptr, buffer = nil)
470
+ if length <= 0
471
+ return []
472
+ end
473
+
474
+ size = sizeof_type(type)
475
+ # Grab the bytes that the array consists of
476
+ buffer = memread(bufptr, size * length, buffer)
477
+
478
+ offset = 0
479
+
480
+ 1.upto(length).map do |n|
481
+ data = read_data(type, offset, buffer)
482
+
483
+ offset = offset + size
484
+
485
+ data
486
+ end
487
+ end
488
+
489
+ #
490
+ # Construct the data structure described in +definition+ from +buffer+
491
+ # starting from the index +offset+
492
+ #
493
+ def read_struct(definition, buffer, offset = 0)
494
+ data = {}
495
+
496
+ offsets = struct_offsets(definition, offset)
497
+
498
+ definition.each do |mapping|
499
+ key, data_type = mapping
500
+
501
+ data[key] = read_data(data_type, offsets.shift, buffer)
502
+ end
503
+
504
+ data
505
+ end
506
+
507
+
508
+ # Returns true if the data type is a pointer, false otherwise
509
+ def is_pointer_type?(type)
510
+ return TYPE_DEFINITIONS[type] == :pointer
511
+ end
512
+
513
+ # Returns whether the given type represents an array of another type
514
+ # For example BYTE[3], BYTE[ENCRYPTED_PWLEN], or even PDWORD[23]
515
+ def is_array_type?(type)
516
+ return type =~ /^\w+\[\w+\]$/ ? true : false
517
+ end
518
+
519
+ # Returns true if the type passed describes a data structure, false otherwise
520
+ def is_struct_type?(type)
521
+ return type.kind_of? Array
522
+ end
523
+
524
+
525
+ # Returns the pointer size for this architecture
526
+ def pointer_size
527
+ is_64bit ? 8 : 4
528
+ end
529
+
530
+ # Return the size, in bytes, of the given type
531
+ def sizeof_type(type)
532
+ if is_pointer_type?(type)
533
+ return pointer_size
534
+ end
535
+
536
+ if type.kind_of? String
537
+ if is_array_type?(type)
538
+ element_type, length = split_array_type(type)
539
+ return length * sizeof_type(element_type)
540
+ else
541
+ return sizeof_type(type.to_sym)
542
+ end
543
+ end
544
+
545
+ if is_struct_type?(type)
546
+ return sizeof_struct(type)
547
+ end
548
+
549
+ if TYPE_DEFINITIONS.has_key?(type)
550
+ primitive = TYPE_DEFINITIONS[type]
551
+
552
+ if primitive == :pointer
553
+ return pointer_size
554
+ end
555
+
556
+ if PRIMITIVE_TYPE_SIZES.has_key?(primitive)
557
+ return PRIMITIVE_TYPE_SIZES[primitive]
558
+ else
559
+ raise "Type #{type} was mapped to non-existent primitive #{primitive}"
560
+ end
561
+ end
562
+
563
+ raise "Unable to determine size for type #{type}."
564
+ end
565
+
566
+ #
567
+ # Calculates the size of +struct+ after alignment.
568
+ #
569
+ def sizeof_struct(struct)
570
+ offsets = struct_offsets(struct, 0)
571
+ last_data_size = sizeof_type(struct.last[1])
572
+ size_no_padding = offsets.last + last_data_size
573
+
574
+ return size_no_padding + calc_padding(size_no_padding)
575
+ end
576
+
577
+ #
578
+ # Given a description of a data structure, returns an Array containing
579
+ # the offset from the beginning for each subsequent element, taking into
580
+ # consideration alignment and padding.
581
+ #
582
+ def struct_offsets(definition, offset)
583
+ padding = 0
584
+ offsets = []
585
+ definition.each do |mapping|
586
+ key, data_type = mapping
587
+ if sizeof_type(data_type) > padding
588
+ offset = offset + padding
589
+ end
590
+
591
+ offsets.push(offset)
592
+
593
+ offset = offset + sizeof_type(data_type)
594
+ padding = calc_padding(offset)
595
+ end
596
+
597
+ offsets
598
+ end
599
+
600
+ # http://en.wikipedia.org/wiki/Data_structure_alignment
601
+ def required_alignment
602
+ is_64bit ? 8 : 4
603
+ end
604
+
605
+ #
606
+ # Number of bytes that needed to be added to be aligned.
607
+ #
608
+ def calc_padding(offset)
609
+ align = required_alignment
610
+
611
+ # If offset is not aligned...
612
+ if (offset % align) != 0
613
+ # Calculate padding needed to be aligned
614
+ align - (offset & (align - 1))
615
+ else
616
+ 0
617
+ end
618
+ end
619
+
620
+ #
621
+ # Given an explicit array definition (e.g. BYTE[23]) return size (e.g. 23) and
622
+ # and +type+ (e.g. BYTE). If a constant is given, attempt to resolve it
623
+ # that constant.
624
+ #
625
+ def split_array_type(type)
626
+ if type =~ /^(\w+)\[(\w+)\]$/
627
+ element_type = $1
628
+ length = $2
629
+ unless length =~ /^\d+$/
630
+ length = railgun.const(length)
631
+ end
632
+
633
+ return element_type.to_sym, length.to_i
634
+ else
635
+ raise "Can not split non-array type #{type}"
636
+ end
637
+ end
638
+
639
+ # Returns true if given platform has 64bit architecture
640
+ # expects client.platform
641
+ def is_64bit_platform?(platform)
642
+ platform =~ /win64/
643
+ end
644
+
645
+ #
646
+ # Evaluates a bit field, returning a hash representing the meaning and
647
+ # state of each bit.
648
+ #
649
+ # Parameters:
650
+ # +value+:: a bit field represented by a Fixnum
651
+ # +mappings+:: { 'WINAPI_CONSTANT_NAME' => :descriptive_symbol, ... }
652
+ #
653
+ # Returns:
654
+ # { :descriptive_symbol => true/false, ... }
655
+ #
656
+ def judge_bit_field(value, mappings)
657
+ flags = {}
658
+ rg = railgun
659
+
660
+ mappings.each do |constant_name, key|
661
+ flags[key] = (value & rg.const(constant_name)) != 0
662
+ end
663
+
664
+ flags
665
+ end
666
+
667
+ protected
668
+
669
+ attr_accessor :railgun, :is_64bit
670
+ end # Util
671
+ end # Railgun
672
+ end # Stdapi
673
+ end # Extensions
674
+ end # Meterpreter
675
+ end # Post
676
+ end # Rex