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,202 @@
1
+ # -*- coding: binary -*-
2
+
3
+ ##
4
+ # Rex::OLE - an OLE implementation
5
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
6
+ #
7
+ # License: MSF_LICENSE
8
+ #
9
+ #
10
+ # This module implements Object-Linking-and-Embedding otherwise known as
11
+ # Compound File Binary File Format or Windows Compound Binary File Format.
12
+ # OLE is the container format for modern Excel, Word, PowerPoint, and many
13
+ # other file formats.
14
+ #
15
+ # NOTE: This implementation is almost fully compliant with [MS-CFB] v1.1
16
+ #
17
+ #
18
+ # SUPPORTS:
19
+ #
20
+ # 1. R/W v3 OLE files (v4 may work, but wasn't tested)
21
+ # 2. RO double-indirect fat sectors
22
+ # 3. RO fat sectors (including those in double-indirect parts)
23
+ # 4. WO support for less than 109 fat sectors :)
24
+ # 5. R/W minifat sectors
25
+ # 6. R/W ministream
26
+ # 7. R/W normal streams
27
+ # 8. R/W substorages (including nesting)
28
+ # 9. full directory support (hierarchal and flattened access)
29
+ # 10. big and little endian files (although only little endian was tested)
30
+ # 11. PropertySet streams (except .to_s)
31
+ #
32
+ #
33
+ # TODO (in order of priority):
34
+ #
35
+ # 1. support deleting storages/streams
36
+ # 2. create copyto and other typical interface functions
37
+ # 3. support writing DIF sectors > 109
38
+ # - may lead to allocating more fat sectors :-/
39
+ # 4. properly support mode params for open_stream/open_storage/etc
40
+ # 5. optimize to prevent unecessary loading/writing
41
+ # 6. support non-committal editing (open, change, close w/o save)
42
+ # 7. support timestamps
43
+ # 8. provide interface to change paramters (endian, etc)
44
+ #
45
+ #
46
+ # TO INVESTIGATE:
47
+ #
48
+ # 1. moving storage interface functions into something used by both
49
+ # the main storage and substorages (unifying the code) (mixin?)
50
+ # 2. eliminating flattening the directory prior to writing it out
51
+ #
52
+ ##
53
+
54
+ require 'rex'
55
+
56
+ module Rex
57
+ module OLE
58
+
59
+ # misc util
60
+ # NOTE: the v1.1 spec says that everything "MUST be stored in little-endian byte order"
61
+ BIG_ENDIAN = 0xfeff
62
+ LITTLE_ENDIAN = 0xfffe
63
+ # defines Util class
64
+ require 'rex/ole/util'
65
+ require 'rex/ole/clsid'
66
+
67
+
68
+ # constants for dealing with the header
69
+ HDR_SZ = 512
70
+ # signatures
71
+ SIG = "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1"
72
+ SIG_BETA = "\x0e\x11\xfc\x0d\xd0\xcf\x11\xe0"
73
+ # defines Header class
74
+ require 'rex/ole/header'
75
+
76
+
77
+ # sector types
78
+ SECT_MAX = 0xfffffffa
79
+ SECT_DIF = 0xfffffffc
80
+ SECT_FAT = 0xfffffffd
81
+ SECT_END = 0xfffffffe
82
+ SECT_FREE = 0xffffffff
83
+ # defines DIFAT class
84
+ require 'rex/ole/difat'
85
+ # defines FAT class
86
+ require 'rex/ole/fat'
87
+ # defines MiniFAT class
88
+ require 'rex/ole/minifat'
89
+
90
+
91
+ # directory entries
92
+ DIRENTRY_SZ = 128
93
+ DIR_NOSTREAM = 0xffffffff
94
+ DIR_MAXREGSID = 0xfffffffa
95
+ # defines Directory class
96
+ require 'rex/ole/directory'
97
+
98
+ # types
99
+ STGTY_INVALID = 0
100
+ STGTY_STORAGE = 1
101
+ STGTY_STREAM = 2
102
+ STGTY_LOCKBYTES = 3
103
+ STGTY_PROPERTY = 4
104
+ STGTY_ROOT = 5
105
+ # for red/black tree
106
+ COLOR_RED = 0
107
+ COLOR_BLACK = 1
108
+ # defines DirEntry base class
109
+ require 'rex/ole/direntry'
110
+
111
+
112
+ # constants for storages
113
+ STGM_READ = 0
114
+ STGM_WRITE = 1
115
+ STGM_READWRITE = 2
116
+ # defines Storage class
117
+ require 'rex/ole/storage'
118
+ # defines SubStorage class
119
+ require 'rex/ole/substorage'
120
+ # defines Stream class
121
+ require 'rex/ole/stream'
122
+
123
+
124
+ # constants for property sets
125
+ # PropertyIds
126
+ PID_DICTIONARY = 0x00000000
127
+ PID_CODEPAGE = 0x00000001
128
+ PID_LOCALE = 0x80000000
129
+ PID_BEHAVIOR = 0x80000003
130
+ # Well-known PropertyIds
131
+ PIDSI_TITLE = 0x02
132
+ PIDSI_SUBJECT = 0x03
133
+ PIDSI_AUTHOR = 0x04
134
+ PIDSI_KEYWORDS = 0x05
135
+ PIDSI_COMMENTS = 0x06
136
+ PIDSI_TEMPLATE = 0x07
137
+ PIDSI_LASTAUTHOR = 0x08
138
+ PIDSI_REVNUMBER = 0x09
139
+ PIDSI_EDITTIME = 0x0a
140
+ PIDSI_LASTPRINTED = 0x0b
141
+ PIDSI_CREATE_DTM = 0x0c
142
+ PIDSI_LASTSAVE_DTM = 0x0d
143
+ PIDSI_PAGECOUNT = 0x0e
144
+ PIDSI_WORDCOUNT = 0x0f
145
+ PIDSI_CHARCOUNT = 0x10
146
+ PIDSI_THUMBNAIL = 0x11
147
+ PIDSI_APPNAME = 0x12
148
+ PIDSI_DOC_SECURITY = 0x13
149
+ # PropertyTypes
150
+ VT_EMPTY = 0x00
151
+ VT_NULL = 0x01
152
+ VT_I2 = 0x02
153
+ VT_I4 = 0x03
154
+ VT_R4 = 0x04
155
+ VT_R8 = 0x05
156
+ VT_CY = 0x06
157
+ VT_DATE = 0x07
158
+ VT_BSTR = 0x08
159
+ VT_ERROR = 0x0a
160
+ VT_BOOL = 0x0b
161
+ VT_VARIANT = 0x0c # used with VT_VECTOR
162
+ # 0xd
163
+ VT_DECIMAL = 0x0e
164
+ # 0xf
165
+ VT_I1 = 0x10
166
+ VT_UI1 = 0x11
167
+ VT_UI2 = 0x12
168
+ VT_UI4 = 0x13
169
+ VT_I8 = 0x14
170
+ VT_UI8 = 0x15
171
+ VT_INT = 0x16
172
+ VT_UINT = 0x17
173
+ VT_LPSTR = 0x1e
174
+ VT_LPWSTR = 0x1f
175
+ # 0x20-0x3f
176
+ VT_FILETIME = 0x40
177
+ VT_BLOB = 0x41
178
+ VT_STREAM = 0x42
179
+ VT_STORAGE = 0x43
180
+ VT_STREAMED_OBJ = 0x44
181
+ VT_STORED_OBJ = 0x45
182
+ VT_BLOB_OBJ = 0x46
183
+ VT_CF = 0x47 # Clipboard Format
184
+ VT_CLSID = 0x48
185
+ VT_VERSIONED_STREAM = 0x49
186
+ # Flags
187
+ VT_VECTOR = 0x1000
188
+ VT_ARRAY = 0x2000 # Requires OLE version >= 1
189
+ # Format IDs
190
+ FMTID_SummaryInformation = "\xe0\x85\x9f\xf2\xf9\x4f\x68\x10\xab\x91\x08\x00\x2b\x27\xb3\xd9"
191
+ FMTID_DocSummaryInformation = "\x02\xd5\xcd\xd5\x9c\x2e\x1b\x10\x93\x97\x08\x00\x2b\x2c\xf9\xae"
192
+ FMTID_UserDefinedProperties = "\x05\xd5\xcd\xd5\x9c\x2e\x1b\x10\x93\x97\x08\x00\x2b\x2c\xf9\xae"
193
+ FMTID_GlobalInfo = "\x00\x6f\x61\x56\x54\xc1\xce\x11\x85\x53\x00\xaa\x00\xa1\xf9\x5b"
194
+ FMTID_ImageContents = "\x00\x64\x61\x56\x54\xc1\xce\x11\x85\x53\x00\xaa\x00\xa1\xf9\x5b"
195
+ FMTID_ImageInfo = "\x00\x65\x61\x56\x54\xc1\xce\x11\x85\x53\x00\xaa\x00\xa1\xf9\x5b"
196
+ FMTID_PropertyBag = "\x01\x18\x00\x20\xe6\x5d\xd1\x11\x8e\x38\x00\xc0\x4f\xb9\x38\x6d"
197
+ # defines PropertySet class
198
+ require 'rex/ole/propset'
199
+
200
+
201
+ end
202
+ end
@@ -0,0 +1,44 @@
1
+ # -*- coding: binary -*-
2
+
3
+ ##
4
+ # Rex::OLE - an OLE implementation
5
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
6
+ ##
7
+
8
+
9
+ module Rex
10
+ module OLE
11
+
12
+ class CLSID
13
+
14
+ def initialize(buf=nil)
15
+ @buf = buf
16
+ @buf ||= "\x00" * 16
17
+ end
18
+
19
+ def pack
20
+ @buf
21
+ end
22
+
23
+ def to_s
24
+ ret = ""
25
+ ret << "%08x" % Util.get32(@buf, 0)
26
+ ret << "-"
27
+ ret << "%04x" % Util.get16(@buf, 4)
28
+ ret << "-"
29
+ ret << "%04x" % Util.get16(@buf, 6)
30
+ ret << "-"
31
+ idx = 0
32
+ last8 = @buf[8,8]
33
+ last8.unpack('C*').each { |byte|
34
+ ret << [byte].pack('C').unpack('H*')[0]
35
+ ret << "-" if (idx == 1)
36
+ idx += 1
37
+ }
38
+ ret
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,138 @@
1
+ # -*- coding: binary -*-
2
+
3
+ ##
4
+ # Rex::OLE - an OLE implementation
5
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
6
+ ##
7
+
8
+ module Rex
9
+ module OLE
10
+
11
+ class DIFAT
12
+
13
+ def initialize stg
14
+ @stg = stg
15
+ @entries = []
16
+ end
17
+
18
+ #
19
+ # convenience access to entries
20
+ #
21
+ def []=(idx,expr)
22
+ @entries[idx] = expr
23
+ end
24
+
25
+ def [](idx)
26
+ @entries[idx]
27
+ end
28
+
29
+ def +(expr)
30
+ @entries += expr
31
+ self
32
+ end
33
+
34
+ def <<(expr)
35
+ @entries << expr
36
+ end
37
+
38
+ def length
39
+ @entries.length
40
+ end
41
+
42
+ def slice!(start,stop)
43
+ @entries.slice!(start,stop)
44
+ end
45
+
46
+ def reset
47
+ @entries = []
48
+ end
49
+
50
+ def each
51
+ @entries.each { |el|
52
+ yield el
53
+ }
54
+ end
55
+
56
+ #
57
+ # woop
58
+ #
59
+ def to_s
60
+ ret = "{ "
61
+ @entries.each { |el|
62
+ ret << ", " if (ret.length > 2)
63
+ case el
64
+ when SECT_END
65
+ ret << "END"
66
+ when SECT_DIF
67
+ ret << "DIF"
68
+ when SECT_FAT
69
+ ret << "FAT"
70
+ when SECT_FREE
71
+ ret << "FREE"
72
+ else
73
+ ret << "0x%x" % el
74
+ end
75
+ }
76
+ ret << " }"
77
+ ret
78
+ end
79
+
80
+ #
81
+ # low-level functions
82
+ #
83
+ def read
84
+ @entries = []
85
+
86
+ # start with the header part
87
+ @entries += @stg.header._sectFat
88
+
89
+ # double indirect fat
90
+ sect = @stg.header._sectDifStart
91
+ while (sect != SECT_END)
92
+ if (@entries.include?(sect))
93
+ raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
94
+ end
95
+
96
+ @entries << sect
97
+ buf = @stg.read_sector(sect, @stg.header.sector_size)
98
+
99
+ # the last sect ptr in the block becomes the next entry
100
+ sect = Util.get32(buf, ((@stg.header.idx_per_sect)-1) * 4)
101
+ end
102
+
103
+ # don't need these free ones, but it doesn't hurt to keep them.
104
+ #@difat.delete(SECT_FREE)
105
+ end
106
+
107
+ def write
108
+ len = @entries.length
109
+ first109 = @entries.dup
110
+
111
+ rest = nil
112
+ if (len > 109)
113
+ rest = first109.slice!(109,len)
114
+ end
115
+
116
+ @stg.header._sectFat = []
117
+ @stg.header._sectFat += first109
118
+ if (len < 109)
119
+ need = 109 - len
120
+ need.times {
121
+ @stg.header._sectFat << SECT_FREE
122
+ }
123
+ end
124
+
125
+ if (rest and rest.length > 0)
126
+ raise RuntimeError, 'TODO: support writing DIF properly!'
127
+ # may require adding more fat sectors :-/
128
+ #@stg.header._csectDif = rest.length
129
+ #@stg.header._sectDifStart = idx
130
+ end
131
+
132
+ @stg.header._csectFat = len
133
+ end
134
+
135
+ end
136
+
137
+ end
138
+ end
@@ -0,0 +1,228 @@
1
+ # -*- coding: binary -*-
2
+
3
+ ##
4
+ # Rex::OLE - an OLE implementation
5
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
6
+ ##
7
+
8
+ module Rex
9
+ module OLE
10
+
11
+ require 'rex/ole/direntry'
12
+
13
+ #
14
+ # This class serves as the root directory entry in addition to
15
+ # an abstraction around the concept of a directory as a whole.
16
+ #
17
+ class Directory < DirEntry
18
+
19
+ # XXX: num_entries is not maintained once a stream/storage is added!
20
+ attr_accessor :num_entries
21
+
22
+ def initialize(stg)
23
+ super
24
+
25
+ @num_entries = 1
26
+ end
27
+
28
+
29
+ # woop, recursive each
30
+ def yield_entries(de, &block)
31
+ block.call(de)
32
+ de.each { |el|
33
+ yield_entries(el, &block)
34
+ }
35
+ end
36
+ def each_entry(&block)
37
+ yield_entries(self, &block)
38
+ end
39
+
40
+
41
+ def set_ministream_params(start, size)
42
+ @_sectStart = start
43
+ @_ulSize = size
44
+ end
45
+
46
+ def link_item(parent, child)
47
+ # set sid, advance count
48
+ child.sid = @num_entries
49
+ @num_entries += 1
50
+
51
+ # link item to siblings and/or parent
52
+ if (parent._sidChild == DIR_NOSTREAM)
53
+ parent._sidChild = child.sid
54
+ dlog("Linking #{child.name} as THE child of #{parent.name} as sid #{child.sid}", 'rex', LEV_3)
55
+ else
56
+ sib = nil
57
+ parent.each { |el|
58
+ if (el._sidLeftSib == DIR_NOSTREAM)
59
+ sib = el
60
+ el._sidLeftSib = child.sid
61
+ dlog("Linking #{child.name} as the LEFT sibling of #{sib.name} as sid #{child.sid}", 'rex', LEV_3)
62
+ break
63
+ end
64
+ if (el._sidRightSib == DIR_NOSTREAM)
65
+ sib = el
66
+ el._sidRightSib = child.sid
67
+ dlog("Linking #{child.name} as the RIGHT sibling of #{sib.name} as sid #{child.sid}", 'rex', LEV_3)
68
+ break
69
+ end
70
+ }
71
+ if (not sib)
72
+ raise RuntimeError, 'Unable to find a sibling to link to in the directory'
73
+ end
74
+ end
75
+ parent << child
76
+ end
77
+
78
+
79
+ #
80
+ # low-level functions
81
+ #
82
+ def from_s(sid, buf)
83
+ super
84
+
85
+ if (@_sidRightSib != DIR_NOSTREAM)
86
+ raise RuntimeError, 'Root Entry is invalid! (has right sibling)'
87
+ end
88
+ if (@_sidLeftSib != DIR_NOSTREAM)
89
+ raise RuntimeError, 'Root Entry is invalid! (has left sibling)'
90
+ end
91
+ end
92
+
93
+ def read
94
+ @children = []
95
+ visited = []
96
+ entries = []
97
+ root_node = nil
98
+ sect = @stg.header._sectDirStart
99
+ while (sect != SECT_END)
100
+
101
+ if (visited.include?(sect))
102
+ raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
103
+ end
104
+ visited << sect
105
+
106
+ sbuf = @stg.read_sector(sect, @stg.header.sector_size)
107
+ while (sbuf.length >= DIRENTRY_SZ)
108
+ debuf = sbuf.slice!(0, DIRENTRY_SZ)
109
+
110
+ type = Util.get8(debuf, 0x42)
111
+ case type
112
+ when STGTY_ROOT
113
+ if (entries.length != 0)
114
+ raise RuntimeError, 'Root Entry found, but not first encountered!'
115
+ end
116
+ if (root_node)
117
+ raise RuntimeError, 'Multiple root directory sectors detected (0x%08x)' % sect
118
+ end
119
+ de = self
120
+ root_node = de
121
+
122
+ when STGTY_STORAGE
123
+ de = SubStorage.new @stg
124
+
125
+ when STGTY_STREAM
126
+ de = Stream.new @stg
127
+
128
+ when STGTY_INVALID
129
+ # skip invalid entries
130
+ next
131
+
132
+ else
133
+ raise RuntimeError, 'Unsupported directory entry type (0x%02x)' % type
134
+ end
135
+
136
+ # read content
137
+ de.from_s(entries.length, debuf)
138
+ entries << de
139
+ end
140
+ sect = @stg.next_sector(sect)
141
+ end
142
+
143
+ @num_entries = entries.length
144
+
145
+ # sort out the tree structure, starting with the root
146
+ if (@_sidChild != DIR_NOSTREAM)
147
+ populate_children(entries, root_node, @_sidChild)
148
+ end
149
+ end
150
+
151
+
152
+ # recursively add entries to their proper parents :)
153
+ def populate_children(entries, parent, sid)
154
+ node = entries[sid]
155
+ dlog("populate_children(entries, \"#{parent.name}\", #{sid}) - node: #{node.name}", 'rex', LEV_3)
156
+ parent << node
157
+ if (node.type == STGTY_STORAGE) and (node._sidChild != DIR_NOSTREAM)
158
+ populate_children(entries, node, node._sidChild)
159
+ end
160
+ if (node._sidLeftSib != DIR_NOSTREAM)
161
+ populate_children(entries, parent, node._sidLeftSib)
162
+ end
163
+ if (node._sidRightSib != DIR_NOSTREAM)
164
+ populate_children(entries, parent, node._sidRightSib)
165
+ end
166
+ end
167
+
168
+ # NOTE: this may not be necessary if we were to use each_entry
169
+ def flatten_tree(entries, parent)
170
+ entries << parent
171
+ parent.each { |el|
172
+ flatten_tree(entries, el)
173
+ }
174
+ end
175
+
176
+
177
+ def write
178
+ # flatten the directory again
179
+ entries = []
180
+ flatten_tree(entries, self)
181
+ dlog("flattened tree has #{entries.length} entries...", 'rex', LEV_3)
182
+
183
+ # count directory sectors
184
+ ds_count = entries.length / 4
185
+ if ((entries.length % 4) > 0)
186
+ # one more sector to hold the rest
187
+ ds_count += 1
188
+ end
189
+
190
+ # put the root entry first
191
+ sbuf = self.pack
192
+
193
+ # add the rest
194
+ prev_sect = nil
195
+ dir_start = nil
196
+ entries.each { |de|
197
+ # we already got the root entry, no more!
198
+ next if (de.type == STGTY_ROOT)
199
+
200
+ dir = de.pack
201
+ dlog("writing dir entry #{de.name}", 'rex', LEV_3)
202
+ sbuf << dir
203
+
204
+ if (sbuf.length == @stg.header.sector_size)
205
+ # we have a full sector, add it!
206
+ sect = @stg.write_sector(sbuf, nil, prev_sect)
207
+ prev_sect = sect
208
+ dir_start ||= sect
209
+ # reset..
210
+ sbuf = ""
211
+ end
212
+ }
213
+
214
+ # still a partial sector left?
215
+ if (sbuf.length > 0)
216
+ # add it! (NOTE: it will get padded with nul bytes if its not sector sized)
217
+ sect = @stg.write_sector(sbuf, nil, prev_sect)
218
+ prev_sect = sect
219
+ dir_start ||= sect
220
+ end
221
+
222
+ @stg.header._sectDirStart = dir_start
223
+ end
224
+
225
+ end
226
+
227
+ end
228
+ end