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,319 @@
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 'pp'
27
+ require 'enumerator'
28
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/api_constants'
29
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/tlv'
30
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/dll_helper'
31
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/buffer_item'
32
+
33
+ module Rex
34
+ module Post
35
+ module Meterpreter
36
+ module Extensions
37
+ module Stdapi
38
+ module Railgun
39
+
40
+ # A easier way to call multiple functions in a single request
41
+ class MultiCaller
42
+
43
+ include DLLHelper
44
+
45
+ def initialize( client, parent, win_consts )
46
+ @parent = parent
47
+ @client = client
48
+
49
+ # needed by DLL helper
50
+ @win_consts = win_consts
51
+
52
+ if( @client.platform =~ /x64/i )
53
+ @native = 'Q<'
54
+ else
55
+ @native = 'V'
56
+ end
57
+ end
58
+
59
+ def call(functions)
60
+
61
+ request = Packet.create_request('stdapi_railgun_api_multi')
62
+ function_results = []
63
+ layouts = []
64
+ functions.each do |f|
65
+ dll_name,funcname,args = f
66
+ dll_host = @parent.get_dll( dll_name )
67
+
68
+ if not dll_host
69
+ raise "DLL #{dll_name} has not been loaded"
70
+ end
71
+
72
+ function = dll_host.functions[funcname]
73
+ if not function
74
+ raise "DLL #{dll_name} function #{funcname} has not been defined"
75
+ end
76
+
77
+ raise "#{function.params.length} arguments expected. #{args.length} arguments provided." unless args.length == function.params.length
78
+ #puts "process_function_call(function.windows_name,#{PP.pp(args, "")})"
79
+
80
+ # We transmit the immediate stack and three heap-buffers:
81
+ # in, inout and out. The reason behind the separation is bandwidth.
82
+ # We don't want to transmit uninitialized data in or no-longer-needed data out.
83
+
84
+ # out-only-buffers that are ONLY transmitted on the way BACK
85
+ out_only_layout = {} # paramName => BufferItem
86
+ out_only_size_bytes = 0
87
+ #puts " assembling out-only buffer"
88
+ function.params.each_with_index do |param_desc, param_idx|
89
+ #puts " processing #{param_desc[1]}"
90
+
91
+ # Special case:
92
+ # The user can choose to supply a Null pointer instead of a buffer
93
+ # in this case we don't need space in any heap buffer
94
+ if param_desc[0][0,1] == 'P' # type is a pointer
95
+ if args[param_idx] == nil
96
+ next
97
+ end
98
+ end
99
+
100
+ # we care only about out-only buffers
101
+ if param_desc[2] == "out"
102
+ raise "error in param #{param_desc[1]}: Out-only buffers must be described by a number indicating their size in bytes " unless args[param_idx].class == Fixnum
103
+ buffer_size = args[param_idx]
104
+ # bump up the size for an x64 pointer
105
+ if( @native == 'Q<' and buffer_size == 4 )
106
+ args[param_idx] = 8
107
+ buffer_size = args[param_idx]
108
+ end
109
+
110
+ if( @native == 'Q<' )
111
+ raise "Please pass 8 for 'out' PDWORDS, since they require a buffer of size 8" unless buffer_size == 8
112
+ elsif( @native == 'V' )
113
+ raise "Please pass 4 for 'out' PDWORDS, since they require a buffer of size 4" unless buffer_size == 4
114
+ end
115
+
116
+ out_only_layout[param_desc[1]] = BufferItem.new(param_idx, out_only_size_bytes, buffer_size, param_desc[0])
117
+ out_only_size_bytes += buffer_size
118
+ end
119
+ end
120
+
121
+ tmp = assemble_buffer("in", function, args)
122
+ in_only_layout = tmp[0]
123
+ in_only_buffer = tmp[1]
124
+
125
+ tmp = assemble_buffer("inout", function, args)
126
+ inout_layout = tmp[0]
127
+ inout_buffer = tmp[1]
128
+
129
+
130
+ # now we build the stack
131
+ # every stack dword will be described by two dwords:
132
+ # first dword describes second dword:
133
+ # 0 - literal,
134
+ # 1 = relative to in-only buffer
135
+ # 2 = relative to out-only buffer
136
+ # 3 = relative to inout buffer
137
+
138
+ # (literal numbers and pointers to buffers we have created)
139
+ literal_pairs_blob = ""
140
+ #puts " assembling literal stack"
141
+ function.params.each_with_index do |param_desc, param_idx|
142
+ #puts " processing (#{param_desc[0]}, #{param_desc[1]}, #{param_desc[2]})"
143
+ buffer = nil
144
+ # is it a pointer to a buffer on our stack
145
+ if ["PDWORD", "PWCHAR", "PCHAR", "PBLOB"].include? param_desc[0]
146
+ #puts " pointer"
147
+ if args[param_idx] == nil # null pointer?
148
+ buffer = [0].pack(@native) # type: DWORD (so the dll does not rebase it)
149
+ buffer += [0].pack(@native) # value: 0
150
+ elsif param_desc[2] == "in"
151
+ buffer = [1].pack(@native)
152
+ buffer += [in_only_layout[param_desc[1]].addr].pack(@native)
153
+ elsif param_desc[2] == "out"
154
+ buffer = [2].pack(@native)
155
+ buffer += [out_only_layout[param_desc[1]].addr].pack(@native)
156
+ elsif param_desc[2] == "inout"
157
+ buffer = [3].pack(@native)
158
+ buffer += [inout_layout[param_desc[1]].addr].pack(@native)
159
+ else
160
+ raise "unexpected direction"
161
+ end
162
+ else
163
+ #puts " not a pointer"
164
+ # it's not a pointer
165
+ buffer = [0].pack(@native)
166
+ case param_desc[0]
167
+ when "LPVOID", "HANDLE"
168
+ num = param_to_number(args[param_idx])
169
+ buffer += [num].pack(@native)
170
+ when "DWORD"
171
+ num = param_to_number(args[param_idx])
172
+ buffer += [num % 4294967296].pack(@native)
173
+ when "WORD"
174
+ num = param_to_number(args[param_idx])
175
+ buffer += [num % 65536].pack(@native)
176
+ when "BYTE"
177
+ num = param_to_number(args[param_idx])
178
+ buffer += [num % 256].pack(@native)
179
+ when "BOOL"
180
+ case args[param_idx]
181
+ when true
182
+ buffer += [1].pack('V')
183
+ when false
184
+ buffer += [0].pack('V')
185
+ else
186
+ raise "param #{param_desc[1]}: true or false expected"
187
+ end
188
+ else
189
+ raise "unexpected type for param #{param_desc[1]}"
190
+ end
191
+ end
192
+
193
+ #puts " adding pair to blob"
194
+ literal_pairs_blob += buffer
195
+ #puts " buffer size %X" % buffer.length
196
+ #puts " blob size so far: %X" % literal_pairs_blob.length
197
+ end
198
+
199
+ #puts "\n\nsending Stuff to meterpreter"
200
+
201
+ group = Rex::Post::Meterpreter::GroupTlv.new(TLV_TYPE_RAILGUN_MULTI_GROUP)
202
+ group.add_tlv(TLV_TYPE_RAILGUN_SIZE_OUT, out_only_size_bytes)
203
+ group.add_tlv(TLV_TYPE_RAILGUN_STACKBLOB, literal_pairs_blob)
204
+ group.add_tlv(TLV_TYPE_RAILGUN_BUFFERBLOB_IN, in_only_buffer)
205
+ group.add_tlv(TLV_TYPE_RAILGUN_BUFFERBLOB_INOUT, inout_buffer)
206
+ group.add_tlv(TLV_TYPE_RAILGUN_DLLNAME, dll_name )
207
+ group.add_tlv(TLV_TYPE_RAILGUN_FUNCNAME, function.windows_name)
208
+ request.tlvs << group
209
+
210
+ layouts << [inout_layout, out_only_layout]
211
+ end
212
+
213
+ call_results = []
214
+ res = @client.send_request(request)
215
+ res.each(TLV_TYPE_RAILGUN_MULTI_GROUP) do |val|
216
+ call_results << val
217
+ end
218
+
219
+ functions.each do |f|
220
+ dll_name,funcname,args = f
221
+ dll_host = @parent.get_dll( dll_name )
222
+ function = dll_host.functions[funcname]
223
+ response = call_results.shift
224
+ inout_layout, out_only_layout = layouts.shift
225
+
226
+ rec_inout_buffers = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_INOUT)
227
+ rec_out_only_buffers = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_OUT)
228
+ rec_return_value = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_RET)
229
+ rec_last_error = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_ERR)
230
+ rec_err_msg = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_MSG)
231
+
232
+ # Error messages come back with trailing CRLF, so strip it out
233
+ # if we do get a message.
234
+ rec_err_msg.strip! if not rec_err_msg.nil?
235
+
236
+ # The hash the function returns
237
+ return_hash = {
238
+ "GetLastError" => rec_last_error,
239
+ "ErrorMessage" => rec_err_msg
240
+ }
241
+
242
+ #process return value
243
+ case function.return_type
244
+ when "LPVOID", "HANDLE"
245
+ if( @native == 'Q<' )
246
+ return_hash["return"] = rec_return_value
247
+ else
248
+ return_hash["return"] = rec_return_value % 4294967296
249
+ end
250
+ when "DWORD"
251
+ return_hash["return"] = rec_return_value % 4294967296
252
+ when "WORD"
253
+ return_hash["return"] = rec_return_value % 65536
254
+ when "BYTE"
255
+ return_hash["return"] = rec_return_value % 256
256
+ when "BOOL"
257
+ return_hash["return"] = (rec_return_value != 0)
258
+ when "VOID"
259
+ return_hash["return"] = nil
260
+ else
261
+ raise "unexpected return type: #{function.return_type}"
262
+ end
263
+ #puts return_hash
264
+ #puts "out_only_layout:"
265
+ #puts out_only_layout
266
+
267
+
268
+ # process out-only buffers
269
+ #puts "processing out-only buffers:"
270
+ out_only_layout.each_pair do |param_name, buffer_item|
271
+ #puts " #{param_name}"
272
+ buffer = rec_out_only_buffers[buffer_item.addr, buffer_item.length_in_bytes]
273
+ case buffer_item.datatype
274
+ when "PDWORD"
275
+ return_hash[param_name] = buffer.unpack('V')[0]
276
+ when "PCHAR"
277
+ return_hash[param_name] = asciiz_to_str(buffer)
278
+ when "PWCHAR"
279
+ return_hash[param_name] = uniz_to_str(buffer)
280
+ when "PBLOB"
281
+ return_hash[param_name] = buffer
282
+ else
283
+ raise "unexpected type in out-only buffer of #{param_name}: #{buffer_item.datatype}"
284
+ end
285
+ end
286
+ #puts return_hash
287
+
288
+ # process in-out buffers
289
+ #puts "processing in-out buffers:"
290
+ inout_layout.each_pair do |param_name, buffer_item|
291
+ #puts " #{param_name}"
292
+ buffer = rec_inout_buffers[buffer_item.addr, buffer_item.length_in_bytes]
293
+ case buffer_item.datatype
294
+ when "PDWORD"
295
+ return_hash[param_name] = buffer.unpack('V')[0]
296
+ when "PCHAR"
297
+ return_hash[param_name] = asciiz_to_str(buffer)
298
+ when "PWCHAR"
299
+ return_hash[param_name] = uniz_to_str(buffer)
300
+ when "PBLOB"
301
+ return_hash[param_name] = buffer
302
+ else
303
+ raise "unexpected type in in-out-buffer of #{param_name}: #{buffer_item.datatype}"
304
+ end
305
+ end
306
+ #puts return_hash
307
+ #puts "finished"
308
+
309
+ function_results << return_hash
310
+ end
311
+ function_results
312
+ end
313
+ # process_multi_function_call
314
+
315
+ protected
316
+
317
+ end # MultiCall
318
+
319
+ end; end; end; end; end; end
@@ -0,0 +1,23 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Post
4
+ module Meterpreter
5
+ module Extensions
6
+ module Stdapi
7
+ module Railgun
8
+ module PlatformUtil
9
+
10
+ X86_64 = :x86_64
11
+ X86_32 = :x86_32
12
+
13
+ def self.parse_client_platform(meterp_client_platform)
14
+ meterp_client_platform =~ /win64/ ? X86_64 : X86_32
15
+ end
16
+
17
+ end # PlatformUtil
18
+ end # Railgun
19
+ end # Stdapi
20
+ end # Extensions
21
+ end # Meterpreter
22
+ end # Post
23
+ end # Rex
@@ -0,0 +1,301 @@
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
+ #
27
+ # sf - Sept 2010 - Modified for x64 support and merged into the stdapi extension.
28
+ #
29
+
30
+ #
31
+ # chao - June 2011 - major overhaul of dll lazy loading, caching, and bit of everything
32
+ #
33
+
34
+ require 'pp'
35
+ require 'enumerator'
36
+
37
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/api_constants'
38
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/tlv'
39
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/util'
40
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager'
41
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/multicall'
42
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/dll'
43
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper'
44
+
45
+ module Rex
46
+ module Post
47
+ module Meterpreter
48
+ module Extensions
49
+ module Stdapi
50
+ module Railgun
51
+
52
+
53
+ #
54
+ # The Railgun class to dynamically expose the Windows API.
55
+ #
56
+ class Railgun
57
+
58
+ #
59
+ # Railgun::DLL's that have builtin definitions.
60
+ #
61
+ # If you want to add additional DLL definitions to be preloaded create a
62
+ # definition class 'rex/post/meterpreter/extensions/stdapi/railgun/def/'.
63
+ # Naming is important and should follow convention. For example, if your
64
+ # dll's name was "my_dll"
65
+ # file name: def_my_dll.rb
66
+ # class name: Def_my_dll
67
+ # entry below: 'my_dll'
68
+ #
69
+ BUILTIN_DLLS = [
70
+ 'kernel32',
71
+ 'ntdll',
72
+ 'user32',
73
+ 'ws2_32',
74
+ 'iphlpapi',
75
+ 'advapi32',
76
+ 'shell32',
77
+ 'netapi32',
78
+ 'crypt32',
79
+ 'wlanapi',
80
+ 'wldap32',
81
+ 'version',
82
+ 'psapi'
83
+ ].freeze
84
+
85
+ ##
86
+ # Returns a Hash containing DLLs added to this instance with #add_dll
87
+ # as well as references to any frozen cached dlls added directly in #get_dll
88
+ # and copies of any frozen dlls (added directly with #add_function)
89
+ # that the user attempted to modify with #add_function.
90
+ #
91
+ # Keys are friendly DLL names and values are the corresponding DLL instance
92
+ attr_accessor :dlls
93
+
94
+ ##
95
+ # Contains a reference to the client that corresponds to this instance of railgun
96
+ attr_accessor :client
97
+
98
+ ##
99
+ # These DLLs are loaded lazily and then shared amongst all railgun instances.
100
+ # For safety reasons this variable should only be read/written within #get_dll.
101
+ @@cached_dlls = {}
102
+
103
+ # if you are going to touch @@cached_dlls, wear protection
104
+ @@cache_semaphore = Mutex.new
105
+
106
+ def initialize(client)
107
+ self.client = client
108
+ self.dlls = {}
109
+ end
110
+
111
+ def self.builtin_dlls
112
+ BUILTIN_DLLS
113
+ end
114
+
115
+ #
116
+ # Return this Railgun's Util instance.
117
+ #
118
+ def util
119
+ if @util.nil?
120
+ @util = Util.new(self, client.platform)
121
+ end
122
+
123
+ return @util
124
+ end
125
+
126
+ #
127
+ # Return this Railgun's WinConstManager instance, initially populated with
128
+ # constants defined in ApiConstants.
129
+ #
130
+ def constant_manager
131
+ # Loads lazily
132
+ return ApiConstants.manager
133
+ end
134
+
135
+ #
136
+ # Read data from a memory address on the host (useful for working with
137
+ # LPVOID parameters)
138
+ #
139
+ def memread(address, length)
140
+
141
+ raise "Invalid parameters." if(not address or not length)
142
+
143
+ request = Packet.create_request('stdapi_railgun_memread')
144
+
145
+ request.add_tlv(TLV_TYPE_RAILGUN_MEM_ADDRESS, address)
146
+ request.add_tlv(TLV_TYPE_RAILGUN_MEM_LENGTH, length)
147
+
148
+ response = client.send_request(request)
149
+ if(response.result == 0)
150
+ return response.get_tlv_value(TLV_TYPE_RAILGUN_MEM_DATA)
151
+ end
152
+
153
+ return nil
154
+ end
155
+
156
+ #
157
+ # Write data to a memory address on the host (useful for working with
158
+ # LPVOID parameters)
159
+ #
160
+ def memwrite(address, data, length)
161
+
162
+ raise "Invalid parameters." if(not address or not data or not length)
163
+
164
+ request = Packet.create_request('stdapi_railgun_memwrite')
165
+
166
+ request.add_tlv(TLV_TYPE_RAILGUN_MEM_ADDRESS, address)
167
+ request.add_tlv(TLV_TYPE_RAILGUN_MEM_DATA, data)
168
+ request.add_tlv(TLV_TYPE_RAILGUN_MEM_LENGTH, length)
169
+
170
+ response = client.send_request(request)
171
+ if(response.result == 0)
172
+ return true
173
+ end
174
+
175
+ return false
176
+ end
177
+
178
+ #
179
+ # Adds a function to an existing DLL definition.
180
+ #
181
+ # If the DLL definition is frozen (ideally this should be the case for all
182
+ # cached dlls) an unfrozen copy is created and used henceforth for this
183
+ # instance.
184
+ #
185
+ def add_function(dll_name, function_name, return_type, params, windows_name=nil, calling_conv="stdcall")
186
+
187
+ unless known_dll_names.include?(dll_name)
188
+ raise "DLL #{dll_name} not found. Known DLLs: #{PP.pp(known_dll_names, "")}"
189
+ end
190
+
191
+ dll = get_dll(dll_name)
192
+
193
+ # For backwards compatibility, we ensure the dll is thawed
194
+ if dll.frozen?
195
+ # Duplicate not only the dll, but its functions as well. Frozen status will be lost
196
+ dll = Marshal.load(Marshal.dump(dll))
197
+
198
+ # Update local dlls with the modifiable duplicate
199
+ dlls[dll_name] = dll
200
+ end
201
+
202
+ dll.add_function(function_name, return_type, params, windows_name, calling_conv)
203
+ end
204
+
205
+ #
206
+ # Adds a DLL to this Railgun.
207
+ #
208
+ # The +windows_name+ is the name used on the remote system and should be
209
+ # set appropriately if you want to include a path or the DLL name contains
210
+ # non-ruby-approved characters.
211
+ #
212
+ # Raises an exception if a dll with the given name has already been
213
+ # defined.
214
+ #
215
+ def add_dll(dll_name, windows_name=dll_name)
216
+
217
+ if dlls.has_key? dll_name
218
+ raise "A DLL of name #{dll_name} has already been loaded."
219
+ end
220
+
221
+ dlls[dll_name] = DLL.new(windows_name, constant_manager)
222
+ end
223
+
224
+
225
+ def known_dll_names
226
+ return BUILTIN_DLLS | dlls.keys
227
+ end
228
+
229
+ #
230
+ # Attempts to provide a DLL instance of the given name. Handles lazy
231
+ # loading and caching. Note that if a DLL of the given name does not
232
+ # exist, returns nil
233
+ #
234
+ def get_dll(dll_name)
235
+
236
+ # If the DLL is not local, we now either load it from cache or load it lazily.
237
+ # In either case, a reference to the dll is stored in the collection "dlls"
238
+ # If the DLL can not be found/created, no actions are taken
239
+ unless dlls.has_key? dll_name
240
+ # We read and write to @@cached_dlls and rely on state consistency
241
+ @@cache_semaphore.synchronize do
242
+ if @@cached_dlls.has_key? dll_name
243
+ dlls[dll_name] = @@cached_dlls[dll_name]
244
+ elsif BUILTIN_DLLS.include? dll_name
245
+ # I highly doubt this case will ever occur, but I am paranoid
246
+ if dll_name !~ /^\w+$/
247
+ raise "DLL name #{dll_name} is bad. Correct Railgun::BUILTIN_DLLS"
248
+ end
249
+
250
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/def/def_' << dll_name
251
+ dll = Def.const_get('Def_' << dll_name).create_dll.freeze
252
+
253
+ @@cached_dlls[dll_name] = dll
254
+ dlls[dll_name] = dll
255
+ end
256
+ end
257
+
258
+ end
259
+
260
+ return dlls[dll_name]
261
+ end
262
+
263
+ #
264
+ # Fake having members like user32 and kernel32.
265
+ # reason is that
266
+ # ...user32.MessageBoxW()
267
+ # is prettier than
268
+ # ...dlls["user32"].functions["MessageBoxW"]()
269
+ #
270
+ def method_missing(dll_symbol, *args)
271
+ dll_name = dll_symbol.to_s
272
+
273
+ unless known_dll_names.include? dll_name
274
+ raise "DLL #{dll_name} not found. Known DLLs: #{PP.pp(known_dll_names, '')}"
275
+ end
276
+
277
+ dll = get_dll(dll_name)
278
+
279
+ return DLLWrapper.new(dll, client)
280
+ end
281
+
282
+ #
283
+ # Return a Windows constant matching +str+.
284
+ #
285
+ def const(str)
286
+ return constant_manager.parse(str)
287
+ end
288
+
289
+ #
290
+ # The multi-call shorthand (["kernel32", "ExitProcess", [0]])
291
+ #
292
+ def multi(functions)
293
+ if @multicaller.nil?
294
+ @multicaller = MultiCaller.new(client, self, ApiConstants.manager)
295
+ end
296
+
297
+ return @multicaller.call(functions)
298
+ end
299
+ end
300
+
301
+ end; end; end; end; end; end