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,227 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rex/post/ui'
4
+
5
+ module Rex
6
+ module Post
7
+ module Meterpreter
8
+ module Extensions
9
+ module Stdapi
10
+
11
+ ###
12
+ #
13
+ # Allows for interacting with the user interface on the remote machine,
14
+ # such as by disabling the keyboard and mouse.
15
+ #
16
+ # WARNING:
17
+ #
18
+ # Using keyboard and mouse enabling/disabling features will result in
19
+ # a DLL file being written to disk.
20
+ #
21
+ ###
22
+ class UI < Rex::Post::UI
23
+
24
+ include Rex::Post::Meterpreter::ObjectAliasesContainer
25
+
26
+ ##
27
+ #
28
+ # Constructor
29
+ #
30
+ ##
31
+
32
+ #
33
+ # Initializes the post-exploitation user-interface manipulation subsystem.
34
+ #
35
+ def initialize(client)
36
+ self.client = client
37
+ end
38
+
39
+ ##
40
+ #
41
+ # Device enabling/disabling
42
+ #
43
+ ##
44
+
45
+ #
46
+ # Disable keyboard input on the remote machine.
47
+ #
48
+ def disable_keyboard
49
+ return enable_keyboard(false)
50
+ end
51
+
52
+ #
53
+ # Enable keyboard input on the remote machine.
54
+ #
55
+ def enable_keyboard(enable = true)
56
+ request = Packet.create_request('stdapi_ui_enable_keyboard')
57
+
58
+ request.add_tlv(TLV_TYPE_BOOL, enable)
59
+
60
+ response = client.send_request(request)
61
+
62
+ return true
63
+ end
64
+
65
+ #
66
+ # Disable mouse input on the remote machine.
67
+ #
68
+ def disable_mouse
69
+ return enable_mouse(false)
70
+ end
71
+
72
+ #
73
+ # Enable mouse input on the remote machine.
74
+ #
75
+ def enable_mouse(enable = true)
76
+ request = Packet.create_request('stdapi_ui_enable_mouse')
77
+
78
+ request.add_tlv(TLV_TYPE_BOOL, enable)
79
+
80
+ response = client.send_request(request)
81
+
82
+ return true
83
+ end
84
+
85
+ #
86
+ # Returns the number of seconds the remote machine has been idle
87
+ # from user input.
88
+ #
89
+ def idle_time
90
+ request = Packet.create_request('stdapi_ui_get_idle_time')
91
+
92
+ response = client.send_request(request)
93
+
94
+ return response.get_tlv_value(TLV_TYPE_IDLE_TIME);
95
+ end
96
+
97
+ #
98
+ # Enumerate desktops.
99
+ #
100
+ def enum_desktops
101
+ request = Packet.create_request('stdapi_ui_desktop_enum')
102
+ response = client.send_request(request)
103
+ desktopz = []
104
+ if( response.result == 0 )
105
+ response.each( TLV_TYPE_DESKTOP ) { | desktop |
106
+ desktopz << {
107
+ 'session' => desktop.get_tlv_value( TLV_TYPE_DESKTOP_SESSION ),
108
+ 'station' => desktop.get_tlv_value( TLV_TYPE_DESKTOP_STATION ),
109
+ 'name' => desktop.get_tlv_value( TLV_TYPE_DESKTOP_NAME )
110
+ }
111
+ }
112
+ end
113
+ return desktopz
114
+ end
115
+
116
+ #
117
+ # Get the current desktop meterpreter is using.
118
+ #
119
+ def get_desktop
120
+ request = Packet.create_request( 'stdapi_ui_desktop_get' )
121
+ response = client.send_request( request )
122
+ desktop = {}
123
+ if( response.result == 0 )
124
+ desktop = {
125
+ 'session' => response.get_tlv_value( TLV_TYPE_DESKTOP_SESSION ),
126
+ 'station' => response.get_tlv_value( TLV_TYPE_DESKTOP_STATION ),
127
+ 'name' => response.get_tlv_value( TLV_TYPE_DESKTOP_NAME )
128
+ }
129
+ end
130
+ return desktop
131
+ end
132
+
133
+ #
134
+ # Change the meterpreters current desktop. The switch param sets this
135
+ # new desktop as the interactive one (The local users visible desktop
136
+ # with screen/keyboard/mouse control).
137
+ #
138
+ def set_desktop( session=-1, station='WinSta0', name='Default', switch=false )
139
+ request = Packet.create_request( 'stdapi_ui_desktop_set' )
140
+ request.add_tlv( TLV_TYPE_DESKTOP_SESSION, session )
141
+ request.add_tlv( TLV_TYPE_DESKTOP_STATION, station )
142
+ request.add_tlv( TLV_TYPE_DESKTOP_NAME, name )
143
+ request.add_tlv( TLV_TYPE_DESKTOP_SWITCH, switch )
144
+ response = client.send_request( request )
145
+ if( response.result == 0 )
146
+ return true
147
+ end
148
+ return false
149
+ end
150
+
151
+ #
152
+ # Grab a screenshot of the interactive desktop
153
+ #
154
+ def screenshot( quality=50 )
155
+ request = Packet.create_request( 'stdapi_ui_desktop_screenshot' )
156
+ request.add_tlv( TLV_TYPE_DESKTOP_SCREENSHOT_QUALITY, quality )
157
+ # include the x64 screenshot dll if the host OS is x64
158
+ if( client.sys.config.sysinfo['Architecture'] =~ /^\S*x64\S*/ )
159
+ screenshot_path = ::File.join( Msf::Config.install_root, 'data', 'meterpreter', 'screenshot.x64.dll' )
160
+ screenshot_path = ::File.expand_path( screenshot_path )
161
+ screenshot_dll = ''
162
+ ::File.open( screenshot_path, 'rb' ) do |f|
163
+ screenshot_dll += f.read( f.stat.size )
164
+ end
165
+ request.add_tlv( TLV_TYPE_DESKTOP_SCREENSHOT_PE64DLL_BUFFER, screenshot_dll, false, true )
166
+ request.add_tlv( TLV_TYPE_DESKTOP_SCREENSHOT_PE64DLL_LENGTH, screenshot_dll.length )
167
+ end
168
+ # but allways include the x86 screenshot dll as we can use it for wow64 processes if we are on x64
169
+ screenshot_path = ::File.join( Msf::Config.install_root, 'data', 'meterpreter', 'screenshot.dll' )
170
+ screenshot_path = ::File.expand_path( screenshot_path )
171
+ screenshot_dll = ''
172
+ ::File.open( screenshot_path, 'rb' ) do |f|
173
+ screenshot_dll += f.read( f.stat.size )
174
+ end
175
+ request.add_tlv( TLV_TYPE_DESKTOP_SCREENSHOT_PE32DLL_BUFFER, screenshot_dll, false, true )
176
+ request.add_tlv( TLV_TYPE_DESKTOP_SCREENSHOT_PE32DLL_LENGTH, screenshot_dll.length )
177
+ # send the request and return the jpeg image if successfull.
178
+ response = client.send_request( request )
179
+ if( response.result == 0 )
180
+ return response.get_tlv_value( TLV_TYPE_DESKTOP_SCREENSHOT )
181
+ end
182
+ return nil
183
+ end
184
+
185
+ #
186
+ # Unlock or lock the desktop
187
+ #
188
+ def unlock_desktop(unlock=true)
189
+ request = Packet.create_request('stdapi_ui_unlock_desktop')
190
+ request.add_tlv(TLV_TYPE_BOOL, unlock)
191
+ response = client.send_request(request)
192
+ return true
193
+ end
194
+
195
+ #
196
+ # Start the keyboard sniffer
197
+ #
198
+ def keyscan_start
199
+ request = Packet.create_request('stdapi_ui_start_keyscan')
200
+ response = client.send_request(request)
201
+ return true
202
+ end
203
+
204
+ #
205
+ # Stop the keyboard sniffer
206
+ #
207
+ def keyscan_stop
208
+ request = Packet.create_request('stdapi_ui_stop_keyscan')
209
+ response = client.send_request(request)
210
+ return true
211
+ end
212
+
213
+ #
214
+ # Dump the keystroke buffer
215
+ #
216
+ def keyscan_dump
217
+ request = Packet.create_request('stdapi_ui_get_keys')
218
+ response = client.send_request(request)
219
+ return response.get_tlv_value(TLV_TYPE_KEYS_DUMP);
220
+ end
221
+
222
+ protected
223
+ attr_accessor :client # :nodoc:
224
+
225
+ end
226
+
227
+ end; end; end; end; end
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+ module Post
5
+ module Meterpreter
6
+ module Extensions
7
+ module Stdapi
8
+ module Webcam
9
+
10
+ ###
11
+ #
12
+ # This meterpreter extension can list and capture from webcams and/or microphone
13
+ #
14
+ ###
15
+ class Webcam
16
+
17
+ def initialize(client)
18
+ @client = client
19
+ end
20
+
21
+ def webcam_list
22
+ response = client.send_request(Packet.create_request('webcam_list'))
23
+ names = []
24
+ response.get_tlvs( TLV_TYPE_WEBCAM_NAME ).each{ |tlv|
25
+ names << tlv.value
26
+ }
27
+ names
28
+ end
29
+
30
+ # Starts recording video from video source of index #{cam}
31
+ def webcam_start(cam)
32
+ request = Packet.create_request('webcam_start')
33
+ request.add_tlv(TLV_TYPE_WEBCAM_INTERFACE_ID, cam)
34
+ client.send_request(request)
35
+ true
36
+ end
37
+
38
+ def webcam_get_frame(quality)
39
+ request = Packet.create_request('webcam_get_frame')
40
+ request.add_tlv(TLV_TYPE_WEBCAM_QUALITY, quality)
41
+ response = client.send_request(request)
42
+ response.get_tlv( TLV_TYPE_WEBCAM_IMAGE ).value
43
+ end
44
+
45
+ def webcam_stop
46
+ client.send_request( Packet.create_request( 'webcam_stop' ) )
47
+ true
48
+ end
49
+
50
+ # Record from default audio source for #{duration} seconds;
51
+ # returns a low-quality wav file
52
+ def record_mic(duration)
53
+ request = Packet.create_request('webcam_audio_record')
54
+ request.add_tlv(TLV_TYPE_AUDIO_DURATION, duration)
55
+ response = client.send_request(request)
56
+ response.get_tlv( TLV_TYPE_AUDIO_DATA ).value
57
+ end
58
+
59
+ attr_accessor :client
60
+
61
+ end
62
+
63
+ end; end; end; end; end; end
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+ module Post
5
+ module Meterpreter
6
+
7
+ ###
8
+ #
9
+ # Mixin that provides stubs for handling inbound packets
10
+ #
11
+ ###
12
+ module InboundPacketHandler
13
+
14
+ #
15
+ # Stub request handler that returns false by default.
16
+ #
17
+ def request_handler(client, packet)
18
+ return false
19
+ end
20
+
21
+ #
22
+ # Stub response handler that returns false by default.
23
+ #
24
+ def response_handler(client, packet)
25
+ return false
26
+ end
27
+
28
+ end
29
+
30
+ end; end; end
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+ module Post
5
+ module Meterpreter
6
+
7
+ ###
8
+ #
9
+ # Mixin for classes that wish to have object aliases but do not
10
+ # really need to inherit from the ObjectAliases class.
11
+ #
12
+ ###
13
+ module ObjectAliasesContainer
14
+
15
+ #
16
+ # Initialize the instance's aliases.
17
+ #
18
+ def initialize_aliases(aliases = {})
19
+ self.aliases = aliases
20
+ end
21
+
22
+ #
23
+ # Pass-thru aliases.
24
+ #
25
+ def method_missing(symbol, *args)
26
+ self.aliases[symbol.to_s]
27
+ end
28
+
29
+ #
30
+ # Recursively dumps all of the aliases registered with a class that
31
+ # is kind_of? ObjectAliases.
32
+ #
33
+ def dump_alias_tree(parent_path, current = nil)
34
+ items = []
35
+
36
+ if (current == nil)
37
+ current = self
38
+ end
39
+
40
+ # If the current object may have object aliases...
41
+ if (current.kind_of?(Rex::Post::Meterpreter::ObjectAliases))
42
+ current.aliases.each_key { |x|
43
+ current_path = parent_path + '.' + x
44
+
45
+ items << current_path
46
+
47
+ items.concat(dump_alias_tree(current_path,
48
+ current.aliases[x]))
49
+ }
50
+ end
51
+
52
+ return items
53
+ end
54
+
55
+ #
56
+ # The hash of aliases.
57
+ #
58
+ attr_accessor :aliases
59
+ end
60
+
61
+ ###
62
+ #
63
+ # Generic object aliases from a class instance referenced symbol to an
64
+ # associated object of an arbitrary type
65
+ #
66
+ ###
67
+ class ObjectAliases
68
+ include Rex::Post::Meterpreter::ObjectAliasesContainer
69
+
70
+ ##
71
+ #
72
+ # Constructor
73
+ #
74
+ ##
75
+
76
+ # An instance
77
+ def initialize(aliases = {})
78
+ initialize_aliases(aliases)
79
+ end
80
+ end
81
+
82
+
83
+ end; end; end
@@ -0,0 +1,688 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+ module Post
5
+ module Meterpreter
6
+
7
+ #
8
+ # Constants
9
+ #
10
+ PACKET_TYPE_REQUEST = 0
11
+ PACKET_TYPE_RESPONSE = 1
12
+ PACKET_TYPE_PLAIN_REQUEST = 10
13
+ PACKET_TYPE_PLAIN_RESPONSE = 11
14
+
15
+ #
16
+ # TLV Meta Types
17
+ #
18
+ TLV_META_TYPE_NONE = 0
19
+ TLV_META_TYPE_STRING = (1 << 16)
20
+ TLV_META_TYPE_UINT = (1 << 17)
21
+ TLV_META_TYPE_RAW = (1 << 18)
22
+ TLV_META_TYPE_BOOL = (1 << 19)
23
+ TLV_META_TYPE_QWORD = (1 << 20)
24
+ TLV_META_TYPE_COMPRESSED = (1 << 29)
25
+ TLV_META_TYPE_GROUP = (1 << 30)
26
+ TLV_META_TYPE_COMPLEX = (1 << 31)
27
+
28
+ # Exclude compressed from the mask since other meta types (e.g. RAW) can also
29
+ # be compressed
30
+ TLV_META_MASK = (
31
+ TLV_META_TYPE_STRING |
32
+ TLV_META_TYPE_UINT |
33
+ TLV_META_TYPE_RAW |
34
+ TLV_META_TYPE_BOOL |
35
+ TLV_META_TYPE_QWORD |
36
+ TLV_META_TYPE_GROUP |
37
+ TLV_META_TYPE_COMPLEX
38
+ )
39
+
40
+ #
41
+ # TLV base starting points
42
+ #
43
+ TLV_RESERVED = 0
44
+ TLV_EXTENSIONS = 20000
45
+ TLV_USER = 40000
46
+ TLV_TEMP = 60000
47
+
48
+ #
49
+ # TLV Specific Types
50
+ #
51
+ TLV_TYPE_ANY = TLV_META_TYPE_NONE | 0
52
+ TLV_TYPE_METHOD = TLV_META_TYPE_STRING | 1
53
+ TLV_TYPE_REQUEST_ID = TLV_META_TYPE_STRING | 2
54
+ TLV_TYPE_EXCEPTION = TLV_META_TYPE_GROUP | 3
55
+ TLV_TYPE_RESULT = TLV_META_TYPE_UINT | 4
56
+
57
+ TLV_TYPE_STRING = TLV_META_TYPE_STRING | 10
58
+ TLV_TYPE_UINT = TLV_META_TYPE_UINT | 11
59
+ TLV_TYPE_BOOL = TLV_META_TYPE_BOOL | 12
60
+
61
+ TLV_TYPE_LENGTH = TLV_META_TYPE_UINT | 25
62
+ TLV_TYPE_DATA = TLV_META_TYPE_RAW | 26
63
+ TLV_TYPE_FLAGS = TLV_META_TYPE_UINT | 27
64
+
65
+ TLV_TYPE_CHANNEL_ID = TLV_META_TYPE_UINT | 50
66
+ TLV_TYPE_CHANNEL_TYPE = TLV_META_TYPE_STRING | 51
67
+ TLV_TYPE_CHANNEL_DATA = TLV_META_TYPE_RAW | 52
68
+ TLV_TYPE_CHANNEL_DATA_GROUP = TLV_META_TYPE_GROUP | 53
69
+ TLV_TYPE_CHANNEL_CLASS = TLV_META_TYPE_UINT | 54
70
+ TLV_TYPE_CHANNEL_PARENTID = TLV_META_TYPE_UINT | 55
71
+
72
+ TLV_TYPE_SEEK_WHENCE = TLV_META_TYPE_UINT | 70
73
+ TLV_TYPE_SEEK_OFFSET = TLV_META_TYPE_UINT | 71
74
+ TLV_TYPE_SEEK_POS = TLV_META_TYPE_UINT | 72
75
+
76
+ TLV_TYPE_EXCEPTION_CODE = TLV_META_TYPE_UINT | 300
77
+ TLV_TYPE_EXCEPTION_STRING = TLV_META_TYPE_STRING | 301
78
+
79
+ TLV_TYPE_LIBRARY_PATH = TLV_META_TYPE_STRING | 400
80
+ TLV_TYPE_TARGET_PATH = TLV_META_TYPE_STRING | 401
81
+ TLV_TYPE_MIGRATE_PID = TLV_META_TYPE_UINT | 402
82
+ TLV_TYPE_MIGRATE_LEN = TLV_META_TYPE_UINT | 403
83
+ TLV_TYPE_MIGRATE_PAYLOAD = TLV_META_TYPE_STRING | 404
84
+ TLV_TYPE_MIGRATE_ARCH = TLV_META_TYPE_UINT | 405
85
+
86
+ TLV_TYPE_CIPHER_NAME = TLV_META_TYPE_STRING | 500
87
+ TLV_TYPE_CIPHER_PARAMETERS = TLV_META_TYPE_GROUP | 501
88
+
89
+ #
90
+ # Core flags
91
+ #
92
+ LOAD_LIBRARY_FLAG_ON_DISK = (1 << 0)
93
+ LOAD_LIBRARY_FLAG_EXTENSION = (1 << 1)
94
+ LOAD_LIBRARY_FLAG_LOCAL = (1 << 2)
95
+
96
+ ###
97
+ #
98
+ # Base TLV (Type-Length-Value) class
99
+ #
100
+ ###
101
+ class Tlv
102
+ attr_accessor :type, :value, :compress
103
+
104
+ ##
105
+ #
106
+ # Constructor
107
+ #
108
+ ##
109
+
110
+ #
111
+ # Returns an instance of a TLV.
112
+ #
113
+ def initialize(type, value = nil, compress=false)
114
+ @type = type
115
+ @compress = compress
116
+
117
+ if (value != nil)
118
+ if (type & TLV_META_TYPE_STRING == TLV_META_TYPE_STRING)
119
+ if (value.kind_of?(Fixnum))
120
+ @value = value.to_s
121
+ else
122
+ @value = value.dup
123
+ end
124
+ else
125
+ @value = value
126
+ end
127
+ end
128
+ end
129
+
130
+ def inspect
131
+ utype = type ^ TLV_META_TYPE_COMPRESSED
132
+ meta = case (utype & TLV_META_MASK)
133
+ when TLV_META_TYPE_STRING; "STRING"
134
+ when TLV_META_TYPE_UINT; "INT"
135
+ when TLV_META_TYPE_RAW; "RAW"
136
+ when TLV_META_TYPE_BOOL; "BOOL"
137
+ when TLV_META_TYPE_QWORD; "QWORD"
138
+ when TLV_META_TYPE_GROUP; "GROUP"
139
+ when TLV_META_TYPE_COMPLEX; "COMPLEX"
140
+ else; 'unknown-meta-type'
141
+ end
142
+ stype = case type
143
+ when PACKET_TYPE_REQUEST; "Request"
144
+ when PACKET_TYPE_RESPONSE; "Response"
145
+ when TLV_TYPE_REQUEST_ID; "REQUEST-ID"
146
+ when TLV_TYPE_METHOD; "METHOD"
147
+ when TLV_TYPE_RESULT; "RESULT"
148
+ when TLV_TYPE_EXCEPTION; "EXCEPTION"
149
+ when TLV_TYPE_STRING; "STRING"
150
+ when TLV_TYPE_UINT; "UINT"
151
+ when TLV_TYPE_BOOL; "BOOL"
152
+
153
+ when TLV_TYPE_LENGTH; "LENGTH"
154
+ when TLV_TYPE_DATA; "DATA"
155
+ when TLV_TYPE_FLAGS; "FLAGS"
156
+
157
+ when TLV_TYPE_CHANNEL_ID; "CHANNEL-ID"
158
+ when TLV_TYPE_CHANNEL_TYPE; "CHANNEL-TYPE"
159
+ when TLV_TYPE_CHANNEL_DATA; "CHANNEL-DATA"
160
+ when TLV_TYPE_CHANNEL_DATA_GROUP; "CHANNEL-DATA-GROUP"
161
+ when TLV_TYPE_CHANNEL_CLASS; "CHANNEL-CLASS"
162
+ when TLV_TYPE_CHANNEL_PARENTID; "CHANNEL-PARENTID"
163
+
164
+ when TLV_TYPE_SEEK_WHENCE; "SEEK-WHENCE"
165
+ when TLV_TYPE_SEEK_OFFSET; "SEEK-OFFSET"
166
+ when TLV_TYPE_SEEK_POS; "SEEK-POS"
167
+
168
+ when TLV_TYPE_EXCEPTION_CODE; "EXCEPTION-CODE"
169
+ when TLV_TYPE_EXCEPTION_STRING; "EXCEPTION-STRING"
170
+
171
+ when TLV_TYPE_LIBRARY_PATH; "LIBRARY-PATH"
172
+ when TLV_TYPE_TARGET_PATH; "TARGET-PATH"
173
+ when TLV_TYPE_MIGRATE_PID; "MIGRATE-PID"
174
+ when TLV_TYPE_MIGRATE_LEN; "MIGRATE-LEN"
175
+ when TLV_TYPE_MIGRATE_PAYLOAD; "MIGRATE-PAYLOAD"
176
+ when TLV_TYPE_MIGRATE_ARCH; "MIGRATE-ARCH"
177
+
178
+ # Extension classes don't exist yet, so can't use their constants
179
+ # here.
180
+ #when Extensions::Stdapi::TLV_TYPE_IP; 'ip-address'
181
+ else; "unknown-#{type}"
182
+ end
183
+ val = value.inspect
184
+ if val.length > 50
185
+ val = val[0,50] + ' ..."'
186
+ end
187
+ "#<#{self.class} type=#{stype} #{self.class.to_s =~ /Packet/ ? "tlvs=#{@tlvs.inspect}" : "meta=#{meta} value=#{val}"} >"
188
+ end
189
+
190
+ ##
191
+ #
192
+ # Conditionals
193
+ #
194
+ ##
195
+
196
+ #
197
+ # Checks to see if a TLVs meta type is equivalent to the meta type passed.
198
+ #
199
+ def meta_type?(meta)
200
+ return (self.type & meta == meta)
201
+ end
202
+
203
+ #
204
+ # Checks to see if the TLVs type is equivalent to the type passed.
205
+ #
206
+ def type?(type)
207
+ return self.type == type
208
+ end
209
+
210
+ #
211
+ # Checks to see if the TLVs value is equivalent to the value passed.
212
+ #
213
+ def value?(value)
214
+ return self.value == value
215
+ end
216
+
217
+ ##
218
+ #
219
+ # Serializers
220
+ #
221
+ ##
222
+
223
+ #
224
+ # Converts the TLV to raw.
225
+ #
226
+ def to_r
227
+ raw = value.to_s;
228
+
229
+ if (self.type & TLV_META_TYPE_STRING == TLV_META_TYPE_STRING)
230
+ raw += "\x00"
231
+ elsif (self.type & TLV_META_TYPE_UINT == TLV_META_TYPE_UINT)
232
+ raw = [value].pack("N")
233
+ elsif (self.type & TLV_META_TYPE_QWORD == TLV_META_TYPE_QWORD)
234
+ raw = [ self.htonq( value.to_i ) ].pack("Q")
235
+ elsif (self.type & TLV_META_TYPE_BOOL == TLV_META_TYPE_BOOL)
236
+ if (value == true)
237
+ raw = [1].pack("c")
238
+ else
239
+ raw = [0].pack("c")
240
+ end
241
+ end
242
+
243
+ # check if the tlv is to be compressed...
244
+ if( @compress )
245
+ raw_uncompressed = raw
246
+ # compress the raw data
247
+ raw_compressed = Rex::Text.zlib_deflate( raw_uncompressed )
248
+ # check we have actually made the raw data smaller...
249
+ # (small blobs often compress slightly larger then the origional)
250
+ # if the compressed data is not smaller, we dont use the compressed data
251
+ if( raw_compressed.length < raw_uncompressed.length )
252
+ # if so, set the TLV's type to indicate compression is used
253
+ self.type = self.type | TLV_META_TYPE_COMPRESSED
254
+ # update the raw data with the uncompressed data length + compressed data
255
+ # (we include the uncompressed data length as the C side will need to know this for decompression)
256
+ raw = [ raw_uncompressed.length ].pack("N") + raw_compressed
257
+ end
258
+ end
259
+
260
+ return [raw.length + 8, self.type].pack("NN") + raw
261
+ end
262
+
263
+ #
264
+ # Translates the raw format of the TLV into a sanitize version.
265
+ #
266
+ def from_r(raw)
267
+ self.value = nil
268
+
269
+ length, self.type = raw.unpack("NN");
270
+
271
+ # check if the tlv value has been compressed...
272
+ if( self.type & TLV_META_TYPE_COMPRESSED == TLV_META_TYPE_COMPRESSED )
273
+ # set this TLV as using compression
274
+ @compress = true
275
+ # remove the TLV_META_TYPE_COMPRESSED flag from the tlv type to restore the
276
+ # tlv type to its origional, allowing for transparent data compression.
277
+ self.type = self.type ^ TLV_META_TYPE_COMPRESSED
278
+ # decompress the compressed data (skipping the length and type DWORD's)
279
+ raw_decompressed = Rex::Text.zlib_inflate( raw[8..length-1] )
280
+ # update the length to reflect the decompressed data length (+8 for the length and type DWORD's)
281
+ length = raw_decompressed.length + 8
282
+ # update the raw buffer with the new length, decompressed data and updated type.
283
+ raw = [length, self.type].pack("NN") + raw_decompressed
284
+ end
285
+
286
+ if (self.type & TLV_META_TYPE_STRING == TLV_META_TYPE_STRING)
287
+ if (raw.length > 0)
288
+ self.value = raw[8..length-2]
289
+ else
290
+ self.value = nil
291
+ end
292
+ elsif (self.type & TLV_META_TYPE_UINT == TLV_META_TYPE_UINT)
293
+ self.value = raw.unpack("NNN")[2]
294
+ elsif (self.type & TLV_META_TYPE_QWORD == TLV_META_TYPE_QWORD)
295
+ self.value = raw.unpack("NNQ")[2]
296
+ self.value = self.ntohq( self.value )
297
+ elsif (self.type & TLV_META_TYPE_BOOL == TLV_META_TYPE_BOOL)
298
+ self.value = raw.unpack("NNc")[2]
299
+
300
+ if (self.value == 1)
301
+ self.value = true
302
+ else
303
+ self.value = false
304
+ end
305
+ else
306
+ self.value = raw[8..length-1]
307
+ end
308
+
309
+ return length;
310
+ end
311
+
312
+ protected
313
+
314
+ def htonq( value )
315
+ if( [1].pack( 's' ) == [1].pack( 'n' ) )
316
+ return value
317
+ end
318
+ return [ value ].pack( 'Q' ).reverse.unpack( 'Q' ).first
319
+ end
320
+
321
+ def ntohq( value )
322
+ return htonq( value )
323
+ end
324
+
325
+ end
326
+
327
+ ###
328
+ #
329
+ # Group TLVs contain zero or more TLVs
330
+ #
331
+ ###
332
+ class GroupTlv < Tlv
333
+ attr_accessor :tlvs
334
+
335
+ ##
336
+ #
337
+ # Constructor
338
+ #
339
+ ##
340
+
341
+ #
342
+ # Initializes the group TLV container to the supplied type
343
+ # and creates an empty TLV array.
344
+ #
345
+ def initialize(type)
346
+ super(type)
347
+
348
+ self.tlvs = [ ]
349
+ end
350
+
351
+ ##
352
+ #
353
+ # Group-based TLV accessors
354
+ #
355
+ ##
356
+
357
+ #
358
+ # Enumerates TLVs of the supplied type.
359
+ #
360
+ def each(type = TLV_TYPE_ANY, &block)
361
+ get_tlvs(type).each(&block)
362
+ end
363
+
364
+ #
365
+ # Synonym for each.
366
+ #
367
+ def each_tlv(type = TLV_TYPE_ANY, &block)
368
+ each(type, block)
369
+ end
370
+
371
+ #
372
+ # Enumerates TLVs of a supplied type with indexes.
373
+ #
374
+ def each_with_index(type = TLV_TYPE_ANY, &block)
375
+ get_tlvs(type).each_with_index(&block)
376
+ end
377
+
378
+ #
379
+ # Synonym for each_with_index.
380
+ #
381
+ def each_tlv_with_index(type = TLV_TYPE_ANY, &block)
382
+ each_with_index(type, block)
383
+ end
384
+
385
+ #
386
+ # Returns an array of TLVs for the given type.
387
+ #
388
+ def get_tlvs(type)
389
+ if (type == TLV_TYPE_ANY)
390
+ return self.tlvs
391
+ else
392
+ type_tlvs = []
393
+
394
+ self.tlvs.each() { |tlv|
395
+ if (tlv.type?(type))
396
+ type_tlvs << tlv
397
+ end
398
+ }
399
+
400
+ return type_tlvs
401
+ end
402
+ end
403
+
404
+ ##
405
+ #
406
+ # TLV management
407
+ #
408
+ ##
409
+
410
+ #
411
+ # Adds a TLV of a given type and value.
412
+ #
413
+ def add_tlv(type, value = nil, replace = false, compress=false)
414
+
415
+ # If we should replace any TLVs with the same type...remove them first
416
+ if (replace)
417
+ each(type) { |tlv|
418
+ if (tlv.type == type)
419
+ self.tlvs.delete(tlv)
420
+ end
421
+ }
422
+ end
423
+
424
+ if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP)
425
+ tlv = GroupTlv.new(type)
426
+ else
427
+ tlv = Tlv.new(type, value, compress)
428
+ end
429
+
430
+ self.tlvs << tlv
431
+
432
+ return tlv
433
+ end
434
+
435
+ #
436
+ # Adds zero or more TLVs to the packet.
437
+ #
438
+ def add_tlvs(tlvs)
439
+ if (tlvs != nil)
440
+ tlvs.each { |tlv|
441
+ add_tlv(tlv['type'], tlv['value'])
442
+ }
443
+ end
444
+ end
445
+
446
+ #
447
+ # Gets the first TLV of a given type.
448
+ #
449
+ def get_tlv(type, index = 0)
450
+ type_tlvs = get_tlvs(type)
451
+
452
+ if (type_tlvs.length > index)
453
+ return type_tlvs[index]
454
+ end
455
+
456
+ return nil
457
+ end
458
+
459
+ #
460
+ # Returns the value of a TLV if it exists, otherwise nil.
461
+ #
462
+ def get_tlv_value(type, index = 0)
463
+ tlv = get_tlv(type, index)
464
+
465
+ return (tlv != nil) ? tlv.value : nil
466
+ end
467
+
468
+ #
469
+ # Returns an array of values for all tlvs of type type.
470
+ #
471
+ def get_tlv_values(type)
472
+ get_tlvs(type).collect { |a| a.value }
473
+ end
474
+
475
+ #
476
+ # Checks to see if the container has a TLV of a given type.
477
+ #
478
+ def has_tlv?(type)
479
+ return get_tlv(type) != nil
480
+ end
481
+
482
+ #
483
+ # Zeros out the array of TLVs.
484
+ #
485
+ def reset
486
+ self.tlvs = []
487
+ end
488
+
489
+ ##
490
+ #
491
+ # Serializers
492
+ #
493
+ ##
494
+
495
+ #
496
+ # Converts all of the TLVs in the TLV array to raw and prefixes them
497
+ # with a container TLV of this instance's TLV type.
498
+ #
499
+ def to_r
500
+ raw = ''
501
+
502
+ self.each() { |tlv|
503
+ raw << tlv.to_r
504
+ }
505
+
506
+ return [raw.length + 8, self.type].pack("NN") + raw
507
+ end
508
+
509
+ #
510
+ # Converts the TLV group container from raw to all of the individual
511
+ # TLVs.
512
+ #
513
+ def from_r(raw)
514
+ offset = 8
515
+
516
+ # Reset the TLVs array
517
+ self.tlvs = []
518
+ self.type = raw.unpack("NN")[1]
519
+
520
+ # Enumerate all of the TLVs
521
+ while (offset < raw.length-1)
522
+
523
+ tlv = nil
524
+
525
+ # Get the length and type
526
+ length, type = raw[offset..offset+8].unpack("NN")
527
+
528
+ if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP)
529
+ tlv = GroupTlv.new(type)
530
+ else
531
+ tlv = Tlv.new(type)
532
+ end
533
+
534
+ tlv.from_r(raw[offset..offset+length])
535
+
536
+ # Insert it into the list of TLVs
537
+ tlvs << tlv
538
+
539
+ # Move up
540
+ offset += length
541
+ end
542
+ end
543
+
544
+ end
545
+
546
+ ###
547
+ #
548
+ # The logical meterpreter packet class
549
+ #
550
+ ###
551
+ class Packet < GroupTlv
552
+ attr_accessor :created_at
553
+
554
+ ##
555
+ #
556
+ # Factory
557
+ #
558
+ ##
559
+
560
+ #
561
+ # Creates a request with the supplied method.
562
+ #
563
+ def Packet.create_request(method = nil)
564
+ return Packet.new(PACKET_TYPE_REQUEST, method)
565
+ end
566
+
567
+ #
568
+ # Creates a response to a request if one is provided.
569
+ #
570
+ def Packet.create_response(request = nil)
571
+ response_type = PACKET_TYPE_RESPONSE
572
+ method = nil
573
+
574
+ if (request)
575
+ if (request.type?(PACKET_TYPE_PLAIN_REQUEST))
576
+ response_type = PACKET_TYPE_PLAIN_RESPONSE
577
+ end
578
+
579
+ method = request.method
580
+ end
581
+
582
+ return Packet.new(response_type, method)
583
+ end
584
+
585
+ ##
586
+ #
587
+ # Constructor
588
+ #
589
+ ##
590
+
591
+ #
592
+ # Initializes the packet to the supplied packet type and method,
593
+ # if any. If the packet is a request, a request identifier is
594
+ # created.
595
+ #
596
+ def initialize(type = nil, method = nil)
597
+ super(type)
598
+
599
+ if (method)
600
+ self.method = method
601
+ end
602
+
603
+ self.created_at = ::Time.now
604
+
605
+ # If it's a request, generate a random request identifier
606
+ if ((type == PACKET_TYPE_REQUEST) ||
607
+ (type == PACKET_TYPE_PLAIN_REQUEST))
608
+ rid = ''
609
+
610
+ 32.times { |val| rid << rand(10).to_s }
611
+
612
+ add_tlv(TLV_TYPE_REQUEST_ID, rid)
613
+ end
614
+ end
615
+
616
+ ##
617
+ #
618
+ # Conditionals
619
+ #
620
+ ##
621
+
622
+ #
623
+ # Checks to see if the packet is a response.
624
+ #
625
+ def response?
626
+ return ((self.type == PACKET_TYPE_RESPONSE) ||
627
+ (self.type == PACKET_TYPE_PLAIN_RESPONSE))
628
+ end
629
+
630
+ ##
631
+ #
632
+ # Accessors
633
+ #
634
+ ##
635
+
636
+ #
637
+ # Checks to see if the packet's method is equal to the supplied method.
638
+ #
639
+ def method?(method)
640
+ return (get_tlv_value(TLV_TYPE_METHOD) == method)
641
+ end
642
+
643
+ #
644
+ # Sets the packet's method TLV to the method supplied.
645
+ #
646
+ def method=(method)
647
+ add_tlv(TLV_TYPE_METHOD, method, true)
648
+ end
649
+
650
+ #
651
+ # Returns the value of the packet's method TLV.
652
+ #
653
+ def method
654
+ return get_tlv_value(TLV_TYPE_METHOD)
655
+ end
656
+
657
+ #
658
+ # Checks to see if the packet's result value is equal to the supplied
659
+ # result.
660
+ #
661
+ def result?(result)
662
+ return (get_tlv_value(TLV_TYPE_RESULT) == result)
663
+ end
664
+
665
+ #
666
+ # Sets the packet's result TLV.
667
+ #
668
+ def result=(result)
669
+ add_tlv(TLV_TYPE_RESULT, result, true)
670
+ end
671
+
672
+ #
673
+ # Gets the value of the packet's result TLV.
674
+ #
675
+ def result
676
+ return get_tlv_value(TLV_TYPE_RESULT)
677
+ end
678
+
679
+ #
680
+ # Gets the value of the packet's request identifier TLV.
681
+ #
682
+ def rid
683
+ return get_tlv_value(TLV_TYPE_REQUEST_ID)
684
+ end
685
+ end
686
+
687
+ end; end; end
688
+