librex 0.0.20 → 0.0.21

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 (435) hide show
  1. data/Rakefile +1 -0
  2. data/lib/rex/LICENSE +29 -0
  3. data/lib/rex/arch.rb +103 -0
  4. data/lib/rex/arch/sparc.rb +75 -0
  5. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  6. data/lib/rex/arch/x86.rb +513 -0
  7. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  8. data/lib/rex/assembly/nasm.rb +104 -0
  9. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +311 -0
  12. data/lib/rex/constants.rb +113 -0
  13. data/lib/rex/elfparsey.rb +11 -0
  14. data/lib/rex/elfparsey/elf.rb +123 -0
  15. data/lib/rex/elfparsey/elfbase.rb +258 -0
  16. data/lib/rex/elfparsey/exceptions.rb +27 -0
  17. data/lib/rex/elfscan.rb +12 -0
  18. data/lib/rex/elfscan/scanner.rb +207 -0
  19. data/lib/rex/elfscan/search.rb +46 -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 +114 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  26. data/lib/rex/encoder/ndr.rb +89 -0
  27. data/lib/rex/encoder/ndr.rb.ut.rb +44 -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 +106 -0
  31. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  32. data/lib/rex/encoder/xor.rb +69 -0
  33. data/lib/rex/encoder/xor/dword.rb +13 -0
  34. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  35. data/lib/rex/encoders/xor_dword.rb +35 -0
  36. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  37. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  38. data/lib/rex/encoding/xor.rb +20 -0
  39. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  40. data/lib/rex/encoding/xor/byte.rb +15 -0
  41. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  42. data/lib/rex/encoding/xor/dword.rb +21 -0
  43. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  44. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  45. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  47. data/lib/rex/encoding/xor/generic.rb +146 -0
  48. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  49. data/lib/rex/encoding/xor/qword.rb +15 -0
  50. data/lib/rex/encoding/xor/word.rb +21 -0
  51. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  52. data/lib/rex/exceptions.rb +275 -0
  53. data/lib/rex/exceptions.rb.ut.rb +44 -0
  54. data/lib/rex/exploitation/cmdstager.rb +9 -0
  55. data/lib/rex/exploitation/cmdstager/base.rb +175 -0
  56. data/lib/rex/exploitation/cmdstager/debug_asm.rb +142 -0
  57. data/lib/rex/exploitation/cmdstager/debug_write.rb +136 -0
  58. data/lib/rex/exploitation/cmdstager/tftp.rb +63 -0
  59. data/lib/rex/exploitation/cmdstager/vbs.rb +128 -0
  60. data/lib/rex/exploitation/egghunter.rb +277 -0
  61. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  62. data/lib/rex/exploitation/encryptjs.rb +77 -0
  63. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  64. data/lib/rex/exploitation/heaplib.rb +94 -0
  65. data/lib/rex/exploitation/javascriptosdetect.rb +897 -0
  66. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  67. data/lib/rex/exploitation/omelet.rb +320 -0
  68. data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
  69. data/lib/rex/exploitation/opcodedb.rb +818 -0
  70. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  71. data/lib/rex/exploitation/seh.rb +92 -0
  72. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  73. data/lib/rex/file.rb +112 -0
  74. data/lib/rex/file.rb.ut.rb +16 -0
  75. data/lib/rex/image_source.rb +12 -0
  76. data/lib/rex/image_source/disk.rb +60 -0
  77. data/lib/rex/image_source/image_source.rb +46 -0
  78. data/lib/rex/image_source/memory.rb +37 -0
  79. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  80. data/lib/rex/io/datagram_abstraction.rb +35 -0
  81. data/lib/rex/io/ring_buffer.rb +364 -0
  82. data/lib/rex/io/stream.rb +319 -0
  83. data/lib/rex/io/stream_abstraction.rb +197 -0
  84. data/lib/rex/io/stream_server.rb +211 -0
  85. data/lib/rex/job_container.rb +187 -0
  86. data/lib/rex/logging.rb +4 -0
  87. data/lib/rex/logging/log_dispatcher.rb +179 -0
  88. data/lib/rex/logging/log_sink.rb +42 -0
  89. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  90. data/lib/rex/logging/sinks/stderr.rb +43 -0
  91. data/lib/rex/machparsey.rb +9 -0
  92. data/lib/rex/machparsey/exceptions.rb +34 -0
  93. data/lib/rex/machparsey/mach.rb +209 -0
  94. data/lib/rex/machparsey/machbase.rb +408 -0
  95. data/lib/rex/machscan.rb +9 -0
  96. data/lib/rex/machscan/scanner.rb +217 -0
  97. data/lib/rex/mime.rb +9 -0
  98. data/lib/rex/mime/header.rb +77 -0
  99. data/lib/rex/mime/message.rb +144 -0
  100. data/lib/rex/mime/part.rb +20 -0
  101. data/lib/rex/nop/opty2.rb +108 -0
  102. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  103. data/lib/rex/nop/opty2_tables.rb +300 -0
  104. data/lib/rex/ole.rb +205 -0
  105. data/lib/rex/ole/clsid.rb +47 -0
  106. data/lib/rex/ole/difat.rb +141 -0
  107. data/lib/rex/ole/directory.rb +231 -0
  108. data/lib/rex/ole/direntry.rb +240 -0
  109. data/lib/rex/ole/docs/dependencies.txt +8 -0
  110. data/lib/rex/ole/docs/references.txt +1 -0
  111. data/lib/rex/ole/fat.rb +99 -0
  112. data/lib/rex/ole/header.rb +204 -0
  113. data/lib/rex/ole/minifat.rb +77 -0
  114. data/lib/rex/ole/propset.rb +144 -0
  115. data/lib/rex/ole/samples/create_ole.rb +27 -0
  116. data/lib/rex/ole/samples/dir.rb +35 -0
  117. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  118. data/lib/rex/ole/samples/ole_info.rb +23 -0
  119. data/lib/rex/ole/storage.rb +395 -0
  120. data/lib/rex/ole/stream.rb +53 -0
  121. data/lib/rex/ole/substorage.rb +49 -0
  122. data/lib/rex/ole/util.rb +157 -0
  123. data/lib/rex/parser/arguments.rb +97 -0
  124. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  125. data/lib/rex/parser/ini.rb +185 -0
  126. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  127. data/lib/rex/parser/ip360_aspl_xml.rb +102 -0
  128. data/lib/rex/parser/ip360_xml.rb +97 -0
  129. data/lib/rex/parser/nessus_xml.rb +118 -0
  130. data/lib/rex/parser/netsparker_xml.rb +94 -0
  131. data/lib/rex/parser/nexpose_xml.rb +136 -0
  132. data/lib/rex/parser/nmap_xml.rb +137 -0
  133. data/lib/rex/parser/retina_xml.rb +109 -0
  134. data/lib/rex/payloads.rb +1 -0
  135. data/lib/rex/payloads/win32.rb +2 -0
  136. data/lib/rex/payloads/win32/common.rb +26 -0
  137. data/lib/rex/payloads/win32/kernel.rb +53 -0
  138. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  139. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  140. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  141. data/lib/rex/payloads/win32/kernel/stager.rb +194 -0
  142. data/lib/rex/peparsey.rb +12 -0
  143. data/lib/rex/peparsey/exceptions.rb +32 -0
  144. data/lib/rex/peparsey/pe.rb +212 -0
  145. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  146. data/lib/rex/peparsey/pebase.rb +1680 -0
  147. data/lib/rex/peparsey/section.rb +136 -0
  148. data/lib/rex/pescan.rb +13 -0
  149. data/lib/rex/pescan/analyze.rb +309 -0
  150. data/lib/rex/pescan/scanner.rb +206 -0
  151. data/lib/rex/pescan/search.rb +56 -0
  152. data/lib/rex/platforms.rb +1 -0
  153. data/lib/rex/platforms/windows.rb +51 -0
  154. data/lib/rex/poly.rb +132 -0
  155. data/lib/rex/poly/block.rb +477 -0
  156. data/lib/rex/poly/register.rb +100 -0
  157. data/lib/rex/poly/register/x86.rb +40 -0
  158. data/lib/rex/post.rb +8 -0
  159. data/lib/rex/post/dir.rb +51 -0
  160. data/lib/rex/post/file.rb +172 -0
  161. data/lib/rex/post/file_stat.rb +220 -0
  162. data/lib/rex/post/gen.pl +13 -0
  163. data/lib/rex/post/io.rb +182 -0
  164. data/lib/rex/post/meterpreter.rb +4 -0
  165. data/lib/rex/post/meterpreter/channel.rb +445 -0
  166. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  167. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  168. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  169. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  170. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  171. data/lib/rex/post/meterpreter/client.rb +364 -0
  172. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  173. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  174. data/lib/rex/post/meterpreter/extension.rb +32 -0
  175. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  176. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  177. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  178. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  179. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  180. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
  181. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  182. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  183. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +111 -0
  184. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  185. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +101 -0
  186. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +26 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +282 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +266 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  198. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +208 -0
  199. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +6 -0
  200. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38106 -0
  201. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +31 -0
  202. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +47 -0
  203. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +36 -0
  204. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1818 -0
  205. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
  206. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3848 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +26 -0
  208. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
  209. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
  212. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +318 -0
  213. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +100 -0
  214. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +42 -0
  215. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +148 -0
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +127 -0
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +309 -0
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +204 -0
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +51 -0
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +630 -0
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +75 -0
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +103 -0
  223. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +149 -0
  224. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  225. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +370 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +211 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +63 -0
  240. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  241. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  242. data/lib/rex/post/meterpreter/packet.rb +688 -0
  243. data/lib/rex/post/meterpreter/packet_dispatcher.rb +431 -0
  244. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  245. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  246. data/lib/rex/post/meterpreter/ui/console.rb +137 -0
  247. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  248. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +730 -0
  249. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  250. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  251. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +231 -0
  252. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  253. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  254. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  255. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  256. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  257. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +65 -0
  258. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +442 -0
  259. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +298 -0
  260. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +486 -0
  261. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  262. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +157 -0
  263. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  264. data/lib/rex/post/permission.rb +26 -0
  265. data/lib/rex/post/process.rb +57 -0
  266. data/lib/rex/post/thread.rb +57 -0
  267. data/lib/rex/post/ui.rb +52 -0
  268. data/lib/rex/proto.rb +13 -0
  269. data/lib/rex/proto.rb.ts.rb +8 -0
  270. data/lib/rex/proto/dcerpc.rb +6 -0
  271. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  272. data/lib/rex/proto/dcerpc/client.rb +361 -0
  273. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  274. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  275. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  276. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  277. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  278. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  279. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  280. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  281. data/lib/rex/proto/dcerpc/response.rb +187 -0
  282. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  283. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  284. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  285. data/lib/rex/proto/dhcp.rb +7 -0
  286. data/lib/rex/proto/dhcp/constants.rb +33 -0
  287. data/lib/rex/proto/dhcp/server.rb +292 -0
  288. data/lib/rex/proto/drda.rb +5 -0
  289. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  290. data/lib/rex/proto/drda/constants.rb +49 -0
  291. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  292. data/lib/rex/proto/drda/packet.rb +252 -0
  293. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  294. data/lib/rex/proto/drda/utils.rb +123 -0
  295. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  296. data/lib/rex/proto/http.rb +5 -0
  297. data/lib/rex/proto/http.rb.ts.rb +12 -0
  298. data/lib/rex/proto/http/client.rb +821 -0
  299. data/lib/rex/proto/http/client.rb.ut.rb +95 -0
  300. data/lib/rex/proto/http/handler.rb +46 -0
  301. data/lib/rex/proto/http/handler/erb.rb +128 -0
  302. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  303. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  304. data/lib/rex/proto/http/handler/proc.rb +60 -0
  305. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  306. data/lib/rex/proto/http/header.rb +161 -0
  307. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  308. data/lib/rex/proto/http/packet.rb +407 -0
  309. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  310. data/lib/rex/proto/http/request.rb +356 -0
  311. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  312. data/lib/rex/proto/http/response.rb +90 -0
  313. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  314. data/lib/rex/proto/http/server.rb +369 -0
  315. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  316. data/lib/rex/proto/ntlm.rb +7 -0
  317. data/lib/rex/proto/ntlm.rb.ut.rb +177 -0
  318. data/lib/rex/proto/ntlm/base.rb +326 -0
  319. data/lib/rex/proto/ntlm/constants.rb +74 -0
  320. data/lib/rex/proto/ntlm/crypt.rb +415 -0
  321. data/lib/rex/proto/ntlm/exceptions.rb +16 -0
  322. data/lib/rex/proto/ntlm/message.rb +536 -0
  323. data/lib/rex/proto/ntlm/utils.rb +764 -0
  324. data/lib/rex/proto/proxy/socks4a.rb +440 -0
  325. data/lib/rex/proto/rfb.rb +19 -0
  326. data/lib/rex/proto/rfb.rb.ut.rb +37 -0
  327. data/lib/rex/proto/rfb/cipher.rb +84 -0
  328. data/lib/rex/proto/rfb/client.rb +207 -0
  329. data/lib/rex/proto/rfb/constants.rb +52 -0
  330. data/lib/rex/proto/smb.rb +7 -0
  331. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  332. data/lib/rex/proto/smb/client.rb +1952 -0
  333. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  334. data/lib/rex/proto/smb/constants.rb +1047 -0
  335. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  336. data/lib/rex/proto/smb/crypt.rb +36 -0
  337. data/lib/rex/proto/smb/evasions.rb +66 -0
  338. data/lib/rex/proto/smb/exceptions.rb +858 -0
  339. data/lib/rex/proto/smb/simpleclient.rb +306 -0
  340. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  341. data/lib/rex/proto/smb/utils.rb +103 -0
  342. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  343. data/lib/rex/proto/sunrpc.rb +1 -0
  344. data/lib/rex/proto/sunrpc/client.rb +195 -0
  345. data/lib/rex/proto/tftp.rb +12 -0
  346. data/lib/rex/proto/tftp/constants.rb +39 -0
  347. data/lib/rex/proto/tftp/server.rb +497 -0
  348. data/lib/rex/proto/tftp/server.rb.ut.rb +28 -0
  349. data/lib/rex/script.rb +42 -0
  350. data/lib/rex/script/base.rb +59 -0
  351. data/lib/rex/script/meterpreter.rb +15 -0
  352. data/lib/rex/script/shell.rb +9 -0
  353. data/lib/rex/service.rb +48 -0
  354. data/lib/rex/service_manager.rb +141 -0
  355. data/lib/rex/service_manager.rb.ut.rb +32 -0
  356. data/lib/rex/services/local_relay.rb +423 -0
  357. data/lib/rex/socket.rb +684 -0
  358. data/lib/rex/socket.rb.ut.rb +107 -0
  359. data/lib/rex/socket/comm.rb +119 -0
  360. data/lib/rex/socket/comm/local.rb +412 -0
  361. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  362. data/lib/rex/socket/ip.rb +130 -0
  363. data/lib/rex/socket/parameters.rb +345 -0
  364. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  365. data/lib/rex/socket/range_walker.rb +346 -0
  366. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  367. data/lib/rex/socket/ssl_tcp.rb +184 -0
  368. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  369. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  370. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +61 -0
  371. data/lib/rex/socket/subnet_walker.rb +75 -0
  372. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  373. data/lib/rex/socket/switch_board.rb +278 -0
  374. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  375. data/lib/rex/socket/tcp.rb +76 -0
  376. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  377. data/lib/rex/socket/tcp_server.rb +66 -0
  378. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  379. data/lib/rex/socket/udp.rb +164 -0
  380. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  381. data/lib/rex/struct2.rb +5 -0
  382. data/lib/rex/struct2/c_struct.rb +181 -0
  383. data/lib/rex/struct2/c_struct_template.rb +39 -0
  384. data/lib/rex/struct2/constant.rb +26 -0
  385. data/lib/rex/struct2/element.rb +44 -0
  386. data/lib/rex/struct2/generic.rb +73 -0
  387. data/lib/rex/struct2/restraint.rb +54 -0
  388. data/lib/rex/struct2/s_string.rb +72 -0
  389. data/lib/rex/struct2/s_struct.rb +111 -0
  390. data/lib/rex/sync.rb +6 -0
  391. data/lib/rex/sync/event.rb +94 -0
  392. data/lib/rex/sync/read_write_lock.rb +176 -0
  393. data/lib/rex/sync/ref.rb +57 -0
  394. data/lib/rex/sync/thread_safe.rb +82 -0
  395. data/lib/rex/test.rb +35 -0
  396. data/lib/rex/text.rb +1163 -0
  397. data/lib/rex/text.rb.ut.rb +190 -0
  398. data/lib/rex/thread_factory.rb +42 -0
  399. data/lib/rex/time.rb +65 -0
  400. data/lib/rex/transformer.rb +115 -0
  401. data/lib/rex/transformer.rb.ut.rb +38 -0
  402. data/lib/rex/ui.rb +21 -0
  403. data/lib/rex/ui/interactive.rb +298 -0
  404. data/lib/rex/ui/output.rb +78 -0
  405. data/lib/rex/ui/output/none.rb +18 -0
  406. data/lib/rex/ui/progress_tracker.rb +96 -0
  407. data/lib/rex/ui/subscriber.rb +149 -0
  408. data/lib/rex/ui/text/color.rb +97 -0
  409. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  410. data/lib/rex/ui/text/dispatcher_shell.rb +467 -0
  411. data/lib/rex/ui/text/input.rb +117 -0
  412. data/lib/rex/ui/text/input/buffer.rb +75 -0
  413. data/lib/rex/ui/text/input/readline.rb +129 -0
  414. data/lib/rex/ui/text/input/socket.rb +95 -0
  415. data/lib/rex/ui/text/input/stdio.rb +45 -0
  416. data/lib/rex/ui/text/irb_shell.rb +57 -0
  417. data/lib/rex/ui/text/output.rb +80 -0
  418. data/lib/rex/ui/text/output/buffer.rb +61 -0
  419. data/lib/rex/ui/text/output/file.rb +43 -0
  420. data/lib/rex/ui/text/output/socket.rb +43 -0
  421. data/lib/rex/ui/text/output/stdio.rb +40 -0
  422. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  423. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  424. data/lib/rex/ui/text/shell.rb +328 -0
  425. data/lib/rex/ui/text/table.rb +279 -0
  426. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  427. data/lib/rex/zip.rb +93 -0
  428. data/lib/rex/zip/archive.rb +184 -0
  429. data/lib/rex/zip/blocks.rb +182 -0
  430. data/lib/rex/zip/entry.rb +104 -0
  431. data/lib/rex/zip/samples/comment.rb +32 -0
  432. data/lib/rex/zip/samples/mkwar.rb +138 -0
  433. data/lib/rex/zip/samples/mkzip.rb +19 -0
  434. data/lib/rex/zip/samples/recursive.rb +58 -0
  435. metadata +434 -1
@@ -0,0 +1,75 @@
1
+ # Copyright (c) 2010, patrickHVE@googlemail.com
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ # * Redistributions of source code must retain the above copyright
7
+ # notice, this list of conditions and the following disclaimer.
8
+ # * Redistributions in binary form must reproduce the above copyright
9
+ # notice, this list of conditions and the following disclaimer in the
10
+ # documentation and/or other materials provided with the distribution.
11
+ # * The names of the author may not be used to endorse or promote products
12
+ # derived from this software without specific prior written permission.
13
+ #
14
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
+ # DISCLAIMED. IN NO EVENT SHALL patrickHVE@googlemail.com BE LIABLE FOR ANY
18
+ # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21
+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+
25
+ module Rex
26
+ module Post
27
+ module Meterpreter
28
+ module Extensions
29
+ module Stdapi
30
+ module Railgun
31
+
32
+ #
33
+ # Manages our library of windows constants
34
+ #
35
+ class WinConstManager
36
+
37
+ def initialize(initial_consts = {})
38
+ @consts = {}
39
+
40
+ initial_consts.each_pair do |name, value|
41
+ add_const(name, value)
42
+ end
43
+
44
+ # Load utility
45
+ end
46
+
47
+ def add_const(name, value)
48
+ @consts[name] = value
49
+ end
50
+
51
+ # parses a string constaining constants and returns an integer
52
+ # the string can be either "CONST" or "CONST1 | CONST2"
53
+ #
54
+ # this function will NOT throw an exception but return "nil" if it can't parse a string
55
+ def parse(s)
56
+ if s.class != String
57
+ return nil # it's not even a string'
58
+ end
59
+ return_value = 0
60
+ for one_const in s.split('|')
61
+ one_const = one_const.strip()
62
+ if not @consts.has_key? one_const
63
+ return nil # at least one "Constant" is unknown to us
64
+ end
65
+ return_value |= @consts[one_const]
66
+ end
67
+ return return_value
68
+ end
69
+
70
+ def is_parseable(s)
71
+ return parse(s) != nil
72
+ end
73
+ end
74
+
75
+ end; end; end; end; end; end
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..','..','..','..','..', 'lib'))
4
+
5
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager'
6
+ require 'test/unit'
7
+
8
+ module Rex
9
+ module Post
10
+ module Meterpreter
11
+ module Extensions
12
+ module Stdapi
13
+ module Railgun
14
+ class WinConstManager::UnitTest < Test::Unit::TestCase
15
+ def test_is_parseable
16
+ const_manager = WinConstManager.new
17
+
18
+ first_key = 'SOME_NUMBER'
19
+ second_key = 'SOME_OTHER_NUMBER'
20
+ boolean_logic = first_key + ' | ' + second_key
21
+
22
+ # XXX: Should check (un)parseability before adding constants too?
23
+
24
+ const_manager.add_const(first_key, 43123)
25
+ const_manager.add_const(second_key, 234)
26
+
27
+ assert(const_manager.is_parseable(boolean_logic),
28
+ "is_parseable should consider boolean logic statements parseable")
29
+
30
+ assert(const_manager.is_parseable(first_key),
31
+ "is_parseable should consider constants parseable")
32
+
33
+ assert(! const_manager.is_parseable(5),
34
+ "is_parseable should not consider non-string keys as parseable")
35
+
36
+ assert(! const_manager.is_parseable('| FOO |'),
37
+ "is_parseable should not consider malformed boolean expressions parseable")
38
+ end
39
+
40
+ def test_add_const
41
+ target_key = 'VALID_KEY'
42
+ target_value = 23
43
+
44
+ const_manager = WinConstManager.new
45
+
46
+ const_manager.add_const(target_key, target_value)
47
+
48
+ assert_equal(target_value, const_manager.parse(target_key),
49
+ "add_const should add a constant/value pair that can be trieved with parse")
50
+
51
+ end
52
+
53
+ def test_initialization
54
+ target_key = 'VALID_KEY'
55
+ target_value = 23
56
+
57
+ const_manager = WinConstManager.new(target_key => target_value)
58
+
59
+ assert_equal(target_value, const_manager.parse(target_key),
60
+ "upon initialization, should add any provided constants.")
61
+ end
62
+
63
+ def test_parse
64
+ target_key = 'VALID_KEY'
65
+ target_value = 23
66
+ invalid_key = 8
67
+
68
+ const_manager = WinConstManager.new
69
+
70
+ const_manager.add_const(target_key, target_value)
71
+
72
+ assert_equal(target_value, const_manager.parse(target_key),
73
+ "parse should retrieve the corresponding value when a key is provided")
74
+
75
+ # From API: "should not throw an exception given an invalid key"
76
+ assert_nothing_thrown do
77
+ const_manager.parse(invalid_key)
78
+ end
79
+
80
+ assert_equal(nil, const_manager.parse(invalid_key),
81
+ "parse should return nil when an invalid key is provided")
82
+
83
+ x_key = 'X'
84
+ x_value = 228
85
+ y_key = 'Y'
86
+ y_value = 15
87
+
88
+ boolean_logic = x_key + ' | ' + y_key
89
+ target_boolean_logic_result = x_value | y_value
90
+
91
+ const_manager.add_const(x_key, x_value)
92
+ const_manager.add_const(y_key, y_value)
93
+
94
+ assert_equal(target_boolean_logic_result, const_manager.parse(boolean_logic),
95
+ "parse should evaluate boolean expressions consisting of OR")
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rex/post/meterpreter/object_aliases'
4
+ require 'rex/post/meterpreter/extension'
5
+ require 'rex/post/meterpreter/extensions/stdapi/constants'
6
+ require 'rex/post/meterpreter/extensions/stdapi/tlv'
7
+ require 'rex/post/meterpreter/extensions/stdapi/fs/dir'
8
+ require 'rex/post/meterpreter/extensions/stdapi/fs/file'
9
+ require 'rex/post/meterpreter/extensions/stdapi/fs/file_stat'
10
+ require 'rex/post/meterpreter/extensions/stdapi/net/config'
11
+ require 'rex/post/meterpreter/extensions/stdapi/net/socket'
12
+ require 'rex/post/meterpreter/extensions/stdapi/sys/config'
13
+ require 'rex/post/meterpreter/extensions/stdapi/sys/process'
14
+ require 'rex/post/meterpreter/extensions/stdapi/sys/registry'
15
+ require 'rex/post/meterpreter/extensions/stdapi/sys/event_log'
16
+ require 'rex/post/meterpreter/extensions/stdapi/sys/power'
17
+ require 'rex/post/meterpreter/extensions/stdapi/railgun/railgun'
18
+ require 'rex/post/meterpreter/extensions/stdapi/ui'
19
+ require 'rex/post/meterpreter/extensions/stdapi/webcam/webcam'
20
+
21
+ module Rex
22
+ module Post
23
+ module Meterpreter
24
+ module Extensions
25
+ module Stdapi
26
+
27
+ ###
28
+ #
29
+ # Standard ruby interface to remote entities for meterpreter. It provides
30
+ # basic access to files, network, system, and other properties of the remote
31
+ # machine that are fairly universal.
32
+ #
33
+ ###
34
+ class Stdapi < Extension
35
+
36
+ #
37
+ # Initializes an instance of the standard API extension.
38
+ #
39
+ def initialize(client)
40
+ super(client, 'stdapi')
41
+
42
+ # Alias the following things on the client object so that they
43
+ # can be directly referenced
44
+ client.register_extension_aliases(
45
+ [
46
+ {
47
+ 'name' => 'fs',
48
+ 'ext' => ObjectAliases.new(
49
+ {
50
+ 'dir' => self.dir,
51
+ 'file' => self.file,
52
+ 'filestat' => self.filestat
53
+ })
54
+ },
55
+ {
56
+ 'name' => 'sys',
57
+ 'ext' => ObjectAliases.new(
58
+ {
59
+ 'config' => Sys::Config.new(client),
60
+ 'process' => self.process,
61
+ 'registry' => self.registry,
62
+ 'eventlog' => self.eventlog,
63
+ 'power' => self.power
64
+ })
65
+ },
66
+ {
67
+ 'name' => 'net',
68
+ 'ext' => ObjectAliases.new(
69
+ {
70
+ 'config' => Rex::Post::Meterpreter::Extensions::Stdapi::Net::Config.new(client),
71
+ 'socket' => Rex::Post::Meterpreter::Extensions::Stdapi::Net::Socket.new(client)
72
+ })
73
+ },
74
+ {
75
+ 'name' => 'railgun',
76
+ 'ext' => Rex::Post::Meterpreter::Extensions::Stdapi::Railgun::Railgun.new(client)
77
+ },
78
+ {
79
+ 'name' => 'webcam',
80
+ 'ext' => Rex::Post::Meterpreter::Extensions::Stdapi::Webcam::Webcam.new(client)
81
+ },
82
+ {
83
+ 'name' => 'ui',
84
+ 'ext' => UI.new(client)
85
+ }
86
+
87
+ ])
88
+ end
89
+
90
+ #
91
+ # Sets the client instance on a duplicated copy of the supplied class.
92
+ #
93
+ def brand(klass)
94
+ klass = klass.dup
95
+ klass.client = self.client
96
+ return klass
97
+ end
98
+
99
+ #
100
+ # Returns a copy of the Dir class.
101
+ #
102
+ def dir
103
+ brand(Rex::Post::Meterpreter::Extensions::Stdapi::Fs::Dir)
104
+ end
105
+
106
+ #
107
+ # Returns a copy of the File class.
108
+ #
109
+ def file
110
+ brand(Rex::Post::Meterpreter::Extensions::Stdapi::Fs::File)
111
+ end
112
+
113
+ #
114
+ # Returns a copy of the FileStat class.
115
+ #
116
+ def filestat
117
+ brand(Rex::Post::Meterpreter::Extensions::Stdapi::Fs::FileStat)
118
+ end
119
+
120
+ #
121
+ # Returns a copy of the Process class.
122
+ #
123
+ def process
124
+ brand(Rex::Post::Meterpreter::Extensions::Stdapi::Sys::Process)
125
+ end
126
+
127
+ #
128
+ # Returns a copy of the Registry class.
129
+ #
130
+ def registry
131
+ brand(Rex::Post::Meterpreter::Extensions::Stdapi::Sys::Registry)
132
+ end
133
+
134
+ #
135
+ # Returns a copy of the EventLog class.
136
+ #
137
+ def eventlog
138
+ brand(Rex::Post::Meterpreter::Extensions::Stdapi::Sys::EventLog)
139
+ end
140
+
141
+ #
142
+ # Returns a copy of the Power class.
143
+ #
144
+ def power
145
+ brand(Rex::Post::Meterpreter::Extensions::Stdapi::Sys::Power)
146
+ end
147
+ end
148
+
149
+ end; end; end; end; end
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rex/post/process'
4
+ require 'rex/post/meterpreter/packet'
5
+ require 'rex/post/meterpreter/client'
6
+ require 'rex/post/meterpreter/extensions/stdapi/constants'
7
+ require 'rex/post/meterpreter/extensions/stdapi/stdapi'
8
+
9
+ module Rex
10
+ module Post
11
+ module Meterpreter
12
+ module Extensions
13
+ module Stdapi
14
+ module Sys
15
+
16
+ ###
17
+ #
18
+ # This class provides access to remote system configuration and information.
19
+ #
20
+ ###
21
+ class Config
22
+
23
+ def initialize(client)
24
+ self.client = client
25
+ end
26
+
27
+ #
28
+ # Returns the username that the remote side is running as.
29
+ #
30
+ def getuid
31
+ request = Packet.create_request('stdapi_sys_config_getuid')
32
+ response = client.send_request(request)
33
+ return response.get_tlv_value(TLV_TYPE_USER_NAME)
34
+ end
35
+
36
+ #
37
+ # Returns a hash of information about the remote computer.
38
+ #
39
+ def sysinfo
40
+ request = Packet.create_request('stdapi_sys_config_sysinfo')
41
+ response = client.send_request(request)
42
+
43
+ {
44
+ 'Computer' => response.get_tlv_value(TLV_TYPE_COMPUTER_NAME),
45
+ 'OS' => response.get_tlv_value(TLV_TYPE_OS_NAME),
46
+ 'Architecture' => response.get_tlv_value(TLV_TYPE_ARCHITECTURE),
47
+ 'System Language' => response.get_tlv_value(TLV_TYPE_LANG_SYSTEM),
48
+ }
49
+ end
50
+
51
+ #
52
+ # Calls RevertToSelf on the remote machine.
53
+ #
54
+ def revert_to_self
55
+ client.send_request(Packet.create_request('stdapi_sys_config_rev2self'))
56
+ end
57
+
58
+ #
59
+ # Steals the primary token from a target process
60
+ #
61
+ def steal_token(pid)
62
+ req = Packet.create_request('stdapi_sys_config_steal_token')
63
+ req.add_tlv(TLV_TYPE_PID, pid.to_i)
64
+ res = client.send_request(req)
65
+ return res.get_tlv_value(TLV_TYPE_USER_NAME)
66
+ end
67
+
68
+ #
69
+ # Drops any assumed token
70
+ #
71
+ def drop_token
72
+ req = Packet.create_request('stdapi_sys_config_drop_token')
73
+ res = client.send_request(req)
74
+ return res.get_tlv_value(TLV_TYPE_USER_NAME)
75
+ end
76
+
77
+ #
78
+ # Enables all possible privileges
79
+ #
80
+ def getprivs
81
+ req = Packet.create_request('stdapi_sys_config_getprivs')
82
+ ret = []
83
+ res = client.send_request(req)
84
+ res.each(TLV_TYPE_PRIVILEGE) do |p|
85
+ ret << p.value
86
+ end
87
+ return ret
88
+ end
89
+
90
+ protected
91
+
92
+ attr_accessor :client
93
+
94
+ end
95
+
96
+ end; end; end; end; end; end
97
+
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rex/post/process'
4
+ require 'rex/post/meterpreter/packet'
5
+ require 'rex/post/meterpreter/client'
6
+ require 'rex/post/meterpreter/extensions/stdapi/constants'
7
+ require 'rex/post/meterpreter/extensions/stdapi/stdapi'
8
+ require 'rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record'
9
+
10
+ module Rex
11
+ module Post
12
+ module Meterpreter
13
+ module Extensions
14
+ module Stdapi
15
+ module Sys
16
+
17
+ ###
18
+ #
19
+ # This class provides access to the Windows event log on the remote
20
+ # machine.
21
+ #
22
+ ###
23
+ class EventLog
24
+
25
+ class << self
26
+ attr_accessor :client
27
+ end
28
+
29
+ #
30
+ # Opens the supplied event log.
31
+ #
32
+ #--
33
+ # NOTE: should support UNCServerName sometime
34
+ #++
35
+ #
36
+ def EventLog.open(name)
37
+ request = Packet.create_request('stdapi_sys_eventlog_open')
38
+
39
+ request.add_tlv(TLV_TYPE_EVENT_SOURCENAME, name);
40
+
41
+ response = client.send_request(request)
42
+
43
+ return self.new(response.get_tlv_value(TLV_TYPE_EVENT_HANDLE))
44
+ end
45
+
46
+ ##
47
+ #
48
+ # Event Log Instance Stuffs!
49
+ #
50
+ ##
51
+
52
+ attr_accessor :handle # :nodoc:
53
+ attr_accessor :client # :nodoc:
54
+
55
+ public
56
+
57
+ #
58
+ # Initializes an instance of the eventlog manipulator.
59
+ #
60
+ def initialize(hand)
61
+ self.client = self.class.client
62
+ self.handle = hand
63
+ ObjectSpace.define_finalizer( self, self.class.finalize(self.client, self.handle) )
64
+ end
65
+
66
+ def self.finalize(client,handle)
67
+ proc { self.close(client,handle) }
68
+ end
69
+
70
+ #
71
+ # Return the number of records in the event log.
72
+ #
73
+ def length
74
+ request = Packet.create_request('stdapi_sys_eventlog_numrecords')
75
+
76
+ request.add_tlv(TLV_TYPE_EVENT_HANDLE, self.handle);
77
+
78
+ response = client.send_request(request)
79
+
80
+ return response.get_tlv_value(TLV_TYPE_EVENT_NUMRECORDS)
81
+ end
82
+
83
+ #
84
+ # the low level read function (takes flags, not hash, etc).
85
+ #
86
+ def _read(flags, offset = 0)
87
+ request = Packet.create_request('stdapi_sys_eventlog_read')
88
+
89
+ request.add_tlv(TLV_TYPE_EVENT_HANDLE, self.handle)
90
+ request.add_tlv(TLV_TYPE_EVENT_READFLAGS, flags)
91
+ request.add_tlv(TLV_TYPE_EVENT_RECORDOFFSET, offset)
92
+
93
+ response = client.send_request(request)
94
+
95
+ EventLogSubsystem::EventRecord.new(
96
+ response.get_tlv_value(TLV_TYPE_EVENT_RECORDNUMBER),
97
+ response.get_tlv_value(TLV_TYPE_EVENT_TIMEGENERATED),
98
+ response.get_tlv_value(TLV_TYPE_EVENT_TIMEWRITTEN),
99
+ response.get_tlv_value(TLV_TYPE_EVENT_ID),
100
+ response.get_tlv_value(TLV_TYPE_EVENT_TYPE),
101
+ response.get_tlv_value(TLV_TYPE_EVENT_CATEGORY),
102
+ response.get_tlv_values(TLV_TYPE_EVENT_STRING),
103
+ response.get_tlv_value(TLV_TYPE_EVENT_DATA)
104
+ )
105
+ end
106
+
107
+ #
108
+ # Read the eventlog forwards, meaning from oldest to newest.
109
+ # Returns a EventRecord, and throws an exception after no more records.
110
+ #
111
+ def read_forwards
112
+ _read(EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ)
113
+ end
114
+
115
+ #
116
+ # Iterator for read_forwards.
117
+ #
118
+ def each_forwards
119
+ begin
120
+ loop do
121
+ yield(read_forwards)
122
+ end
123
+ rescue ::Exception
124
+ end
125
+ end
126
+
127
+ #
128
+ # Read the eventlog backwards, meaning from newest to oldest.
129
+ # Returns a EventRecord, and throws an exception after no more records.
130
+ #
131
+ def read_backwards
132
+ _read(EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ)
133
+ end
134
+
135
+ #
136
+ # Iterator for read_backwards.
137
+ #
138
+ def each_backwards
139
+ begin
140
+ loop do
141
+ yield(read_backwards)
142
+ end
143
+ rescue ::Exception
144
+ end
145
+ end
146
+
147
+ #
148
+ # Return the record number of the oldest event (not necessarily 1).
149
+ #
150
+ def oldest
151
+ request = Packet.create_request('stdapi_sys_eventlog_oldest')
152
+
153
+ request.add_tlv(TLV_TYPE_EVENT_HANDLE, self.handle);
154
+
155
+ response = client.send_request(request)
156
+
157
+ return response.get_tlv_value(TLV_TYPE_EVENT_RECORDNUMBER)
158
+ end
159
+
160
+ #
161
+ # Clear the specified event log (and return nil).
162
+ #
163
+ #--
164
+ # I should eventually support BackupFile
165
+ #++
166
+ #
167
+ def clear
168
+ request = Packet.create_request('stdapi_sys_eventlog_clear')
169
+
170
+ request.add_tlv(TLV_TYPE_EVENT_HANDLE, self.handle);
171
+
172
+ response = client.send_request(request)
173
+ return self
174
+ end
175
+
176
+ #
177
+ # Close the event log
178
+ #
179
+ def self.close(client, handle)
180
+ request = Packet.create_request('stdapi_sys_eventlog_close')
181
+ request.add_tlv(TLV_TYPE_EVENT_HANDLE, handle);
182
+ response = client.send_request(request, nil)
183
+ return nil
184
+ end
185
+
186
+ # Instance method
187
+ def close
188
+ self.class.close(self.client, self.handle)
189
+ end
190
+ end
191
+
192
+ end end end end end end