librex 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. data/README +4 -0
  2. data/lib/rex.rb +101 -0
  3. data/lib/rex.rb.ts.rb +70 -0
  4. data/lib/rex/LICENSE +29 -0
  5. data/lib/rex/arch.rb +103 -0
  6. data/lib/rex/arch/sparc.rb +75 -0
  7. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  8. data/lib/rex/arch/x86.rb +513 -0
  9. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  10. data/lib/rex/assembly/nasm.rb +100 -0
  11. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  12. data/lib/rex/codepage.map +104 -0
  13. data/lib/rex/compat.rb +281 -0
  14. data/lib/rex/constants.rb +113 -0
  15. data/lib/rex/elfparsey.rb +11 -0
  16. data/lib/rex/elfparsey/elf.rb +123 -0
  17. data/lib/rex/elfparsey/elfbase.rb +260 -0
  18. data/lib/rex/elfparsey/exceptions.rb +27 -0
  19. data/lib/rex/elfscan.rb +12 -0
  20. data/lib/rex/elfscan/scanner.rb +207 -0
  21. data/lib/rex/elfscan/search.rb +46 -0
  22. data/lib/rex/encoder/alpha2.rb +31 -0
  23. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  24. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  25. data/lib/rex/encoder/alpha2/generic.rb +113 -0
  26. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  27. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  28. data/lib/rex/encoder/ndr.rb +89 -0
  29. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  30. data/lib/rex/encoder/nonalpha.rb +61 -0
  31. data/lib/rex/encoder/nonupper.rb +64 -0
  32. data/lib/rex/encoder/xdr.rb +106 -0
  33. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  34. data/lib/rex/encoder/xor.rb +69 -0
  35. data/lib/rex/encoder/xor/dword.rb +13 -0
  36. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  37. data/lib/rex/encoders/xor_dword.rb +35 -0
  38. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  39. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  40. data/lib/rex/encoding/xor.rb +20 -0
  41. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  42. data/lib/rex/encoding/xor/byte.rb +15 -0
  43. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  44. data/lib/rex/encoding/xor/dword.rb +21 -0
  45. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  47. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  48. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  49. data/lib/rex/encoding/xor/generic.rb +146 -0
  50. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  51. data/lib/rex/encoding/xor/qword.rb +15 -0
  52. data/lib/rex/encoding/xor/word.rb +21 -0
  53. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  54. data/lib/rex/exceptions.rb +275 -0
  55. data/lib/rex/exceptions.rb.ut.rb +44 -0
  56. data/lib/rex/exploitation/cmdstager.rb +133 -0
  57. data/lib/rex/exploitation/egghunter.rb +143 -0
  58. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  59. data/lib/rex/exploitation/encryptjs.rb +77 -0
  60. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  61. data/lib/rex/exploitation/heaplib.rb +94 -0
  62. data/lib/rex/exploitation/javascriptosdetect.rb +735 -0
  63. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  64. data/lib/rex/exploitation/opcodedb.rb +818 -0
  65. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  66. data/lib/rex/exploitation/seh.rb +92 -0
  67. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  68. data/lib/rex/file.rb +84 -0
  69. data/lib/rex/file.rb.ut.rb +16 -0
  70. data/lib/rex/image_source.rb +12 -0
  71. data/lib/rex/image_source/disk.rb +60 -0
  72. data/lib/rex/image_source/image_source.rb +46 -0
  73. data/lib/rex/image_source/memory.rb +37 -0
  74. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  75. data/lib/rex/io/datagram_abstraction.rb +35 -0
  76. data/lib/rex/io/stream.rb +313 -0
  77. data/lib/rex/io/stream_abstraction.rb +186 -0
  78. data/lib/rex/io/stream_server.rb +211 -0
  79. data/lib/rex/job_container.rb +202 -0
  80. data/lib/rex/logging.rb +4 -0
  81. data/lib/rex/logging/log_dispatcher.rb +179 -0
  82. data/lib/rex/logging/log_sink.rb +42 -0
  83. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  84. data/lib/rex/logging/sinks/stderr.rb +43 -0
  85. data/lib/rex/machparsey.rb +9 -0
  86. data/lib/rex/machparsey/exceptions.rb +34 -0
  87. data/lib/rex/machparsey/mach.rb +209 -0
  88. data/lib/rex/machparsey/machbase.rb +408 -0
  89. data/lib/rex/machscan.rb +9 -0
  90. data/lib/rex/machscan/scanner.rb +217 -0
  91. data/lib/rex/mime.rb +9 -0
  92. data/lib/rex/mime/header.rb +75 -0
  93. data/lib/rex/mime/message.rb +112 -0
  94. data/lib/rex/mime/part.rb +20 -0
  95. data/lib/rex/nop/opty2.rb +108 -0
  96. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  97. data/lib/rex/nop/opty2_tables.rb +300 -0
  98. data/lib/rex/ole.rb +128 -0
  99. data/lib/rex/ole/clsid.rb +47 -0
  100. data/lib/rex/ole/difat.rb +141 -0
  101. data/lib/rex/ole/directory.rb +230 -0
  102. data/lib/rex/ole/direntry.rb +240 -0
  103. data/lib/rex/ole/fat.rb +99 -0
  104. data/lib/rex/ole/header.rb +204 -0
  105. data/lib/rex/ole/minifat.rb +77 -0
  106. data/lib/rex/ole/samples/create_ole.rb +27 -0
  107. data/lib/rex/ole/samples/dir.rb +35 -0
  108. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  109. data/lib/rex/ole/samples/ole_info.rb +23 -0
  110. data/lib/rex/ole/storage.rb +395 -0
  111. data/lib/rex/ole/stream.rb +53 -0
  112. data/lib/rex/ole/substorage.rb +49 -0
  113. data/lib/rex/ole/util.rb +157 -0
  114. data/lib/rex/parser/arguments.rb +97 -0
  115. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  116. data/lib/rex/parser/ini.rb +185 -0
  117. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  118. data/lib/rex/parser/nmap_xml.rb +111 -0
  119. data/lib/rex/payloads.rb +1 -0
  120. data/lib/rex/payloads/win32.rb +2 -0
  121. data/lib/rex/payloads/win32/common.rb +26 -0
  122. data/lib/rex/payloads/win32/kernel.rb +53 -0
  123. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  124. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  125. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  126. data/lib/rex/payloads/win32/kernel/stager.rb +171 -0
  127. data/lib/rex/peparsey.rb +12 -0
  128. data/lib/rex/peparsey/exceptions.rb +32 -0
  129. data/lib/rex/peparsey/pe.rb +188 -0
  130. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  131. data/lib/rex/peparsey/pebase.rb +1655 -0
  132. data/lib/rex/peparsey/section.rb +136 -0
  133. data/lib/rex/pescan.rb +13 -0
  134. data/lib/rex/pescan/analyze.rb +309 -0
  135. data/lib/rex/pescan/scanner.rb +206 -0
  136. data/lib/rex/pescan/search.rb +56 -0
  137. data/lib/rex/platforms.rb +1 -0
  138. data/lib/rex/platforms/windows.rb +51 -0
  139. data/lib/rex/poly.rb +132 -0
  140. data/lib/rex/poly/block.rb +468 -0
  141. data/lib/rex/poly/register.rb +100 -0
  142. data/lib/rex/poly/register/x86.rb +40 -0
  143. data/lib/rex/post.rb +8 -0
  144. data/lib/rex/post/dir.rb +51 -0
  145. data/lib/rex/post/file.rb +172 -0
  146. data/lib/rex/post/file_stat.rb +220 -0
  147. data/lib/rex/post/gen.pl +13 -0
  148. data/lib/rex/post/io.rb +182 -0
  149. data/lib/rex/post/meterpreter.rb +4 -0
  150. data/lib/rex/post/meterpreter/channel.rb +438 -0
  151. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  152. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  153. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  154. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  155. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  156. data/lib/rex/post/meterpreter/client.rb +335 -0
  157. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  158. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  159. data/lib/rex/post/meterpreter/extension.rb +32 -0
  160. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  161. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  162. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  163. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  164. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  165. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  166. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +104 -0
  167. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  168. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +100 -0
  169. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +24 -0
  170. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  171. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +273 -0
  172. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +235 -0
  173. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  174. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  175. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  176. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  177. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  178. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  179. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +167 -0
  180. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  181. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +192 -0
  182. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +139 -0
  183. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  184. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +184 -0
  185. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  186. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +182 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +174 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +185 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  198. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  199. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  200. data/lib/rex/post/meterpreter/packet.rb +596 -0
  201. data/lib/rex/post/meterpreter/packet_dispatcher.rb +409 -0
  202. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  203. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  204. data/lib/rex/post/meterpreter/ui/console.rb +135 -0
  205. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  206. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +595 -0
  207. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  208. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  209. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  210. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  211. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  212. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  213. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  214. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +63 -0
  215. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +376 -0
  216. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +270 -0
  217. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +484 -0
  218. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  219. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  220. data/lib/rex/post/permission.rb +26 -0
  221. data/lib/rex/post/process.rb +57 -0
  222. data/lib/rex/post/thread.rb +57 -0
  223. data/lib/rex/post/ui.rb +52 -0
  224. data/lib/rex/proto.rb +12 -0
  225. data/lib/rex/proto.rb.ts.rb +8 -0
  226. data/lib/rex/proto/dcerpc.rb +6 -0
  227. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  228. data/lib/rex/proto/dcerpc/client.rb +358 -0
  229. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  230. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  231. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  232. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  233. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  234. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  235. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  236. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  237. data/lib/rex/proto/dcerpc/response.rb +186 -0
  238. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  239. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  240. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  241. data/lib/rex/proto/drda.rb +5 -0
  242. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  243. data/lib/rex/proto/drda/constants.rb +49 -0
  244. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  245. data/lib/rex/proto/drda/packet.rb +252 -0
  246. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  247. data/lib/rex/proto/drda/utils.rb +123 -0
  248. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  249. data/lib/rex/proto/http.rb +5 -0
  250. data/lib/rex/proto/http.rb.ts.rb +12 -0
  251. data/lib/rex/proto/http/client.rb +817 -0
  252. data/lib/rex/proto/http/client.rb.ut.rb +93 -0
  253. data/lib/rex/proto/http/handler.rb +46 -0
  254. data/lib/rex/proto/http/handler/erb.rb +128 -0
  255. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  256. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  257. data/lib/rex/proto/http/handler/proc.rb +54 -0
  258. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  259. data/lib/rex/proto/http/header.rb +161 -0
  260. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  261. data/lib/rex/proto/http/packet.rb +394 -0
  262. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  263. data/lib/rex/proto/http/request.rb +356 -0
  264. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  265. data/lib/rex/proto/http/response.rb +85 -0
  266. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  267. data/lib/rex/proto/http/server.rb +367 -0
  268. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  269. data/lib/rex/proto/smb.rb +7 -0
  270. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  271. data/lib/rex/proto/smb/client.rb +1733 -0
  272. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  273. data/lib/rex/proto/smb/constants.rb +1062 -0
  274. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  275. data/lib/rex/proto/smb/crypt.rb +95 -0
  276. data/lib/rex/proto/smb/crypt.rb.ut.rb +20 -0
  277. data/lib/rex/proto/smb/evasions.rb +65 -0
  278. data/lib/rex/proto/smb/exceptions.rb +846 -0
  279. data/lib/rex/proto/smb/simpleclient.rb +292 -0
  280. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  281. data/lib/rex/proto/smb/utils.rb +514 -0
  282. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  283. data/lib/rex/proto/sunrpc.rb +1 -0
  284. data/lib/rex/proto/sunrpc/client.rb +195 -0
  285. data/lib/rex/script.rb +42 -0
  286. data/lib/rex/script/base.rb +59 -0
  287. data/lib/rex/script/meterpreter.rb +9 -0
  288. data/lib/rex/script/shell.rb +9 -0
  289. data/lib/rex/service.rb +48 -0
  290. data/lib/rex/service_manager.rb +141 -0
  291. data/lib/rex/service_manager.rb.ut.rb +32 -0
  292. data/lib/rex/services/local_relay.rb +423 -0
  293. data/lib/rex/socket.rb +586 -0
  294. data/lib/rex/socket.rb.ut.rb +86 -0
  295. data/lib/rex/socket/comm.rb +119 -0
  296. data/lib/rex/socket/comm/local.rb +409 -0
  297. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  298. data/lib/rex/socket/ip.rb +129 -0
  299. data/lib/rex/socket/parameters.rb +345 -0
  300. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  301. data/lib/rex/socket/range_walker.rb +295 -0
  302. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  303. data/lib/rex/socket/ssl_tcp.rb +184 -0
  304. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  305. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  306. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +51 -0
  307. data/lib/rex/socket/subnet_walker.rb +75 -0
  308. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  309. data/lib/rex/socket/switch_board.rb +272 -0
  310. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  311. data/lib/rex/socket/tcp.rb +76 -0
  312. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  313. data/lib/rex/socket/tcp_server.rb +67 -0
  314. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  315. data/lib/rex/socket/udp.rb +157 -0
  316. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  317. data/lib/rex/struct2.rb +5 -0
  318. data/lib/rex/struct2/c_struct.rb +181 -0
  319. data/lib/rex/struct2/c_struct_template.rb +39 -0
  320. data/lib/rex/struct2/constant.rb +26 -0
  321. data/lib/rex/struct2/element.rb +44 -0
  322. data/lib/rex/struct2/generic.rb +73 -0
  323. data/lib/rex/struct2/restraint.rb +54 -0
  324. data/lib/rex/struct2/s_string.rb +72 -0
  325. data/lib/rex/struct2/s_struct.rb +111 -0
  326. data/lib/rex/sync.rb +6 -0
  327. data/lib/rex/sync/event.rb +94 -0
  328. data/lib/rex/sync/read_write_lock.rb +176 -0
  329. data/lib/rex/sync/ref.rb +57 -0
  330. data/lib/rex/sync/thread_safe.rb +82 -0
  331. data/lib/rex/test.rb +35 -0
  332. data/lib/rex/text.rb +1029 -0
  333. data/lib/rex/text.rb.ut.rb +168 -0
  334. data/lib/rex/time.rb +65 -0
  335. data/lib/rex/transformer.rb +115 -0
  336. data/lib/rex/transformer.rb.ut.rb +38 -0
  337. data/lib/rex/ui.rb +21 -0
  338. data/lib/rex/ui/interactive.rb +252 -0
  339. data/lib/rex/ui/output.rb +80 -0
  340. data/lib/rex/ui/output/none.rb +18 -0
  341. data/lib/rex/ui/progress_tracker.rb +96 -0
  342. data/lib/rex/ui/subscriber.rb +149 -0
  343. data/lib/rex/ui/text/color.rb +97 -0
  344. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  345. data/lib/rex/ui/text/dispatcher_shell.rb +382 -0
  346. data/lib/rex/ui/text/input.rb +117 -0
  347. data/lib/rex/ui/text/input/buffer.rb +75 -0
  348. data/lib/rex/ui/text/input/readline.rb +129 -0
  349. data/lib/rex/ui/text/input/socket.rb +95 -0
  350. data/lib/rex/ui/text/input/stdio.rb +45 -0
  351. data/lib/rex/ui/text/irb_shell.rb +55 -0
  352. data/lib/rex/ui/text/output.rb +80 -0
  353. data/lib/rex/ui/text/output/buffer.rb +65 -0
  354. data/lib/rex/ui/text/output/file.rb +37 -0
  355. data/lib/rex/ui/text/output/socket.rb +43 -0
  356. data/lib/rex/ui/text/output/stdio.rb +40 -0
  357. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  358. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  359. data/lib/rex/ui/text/shell.rb +321 -0
  360. data/lib/rex/ui/text/table.rb +254 -0
  361. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  362. data/lib/rex/zip.rb +93 -0
  363. data/lib/rex/zip/archive.rb +91 -0
  364. data/lib/rex/zip/blocks.rb +182 -0
  365. data/lib/rex/zip/entry.rb +95 -0
  366. data/lib/rex/zip/samples/comment.rb +32 -0
  367. data/lib/rex/zip/samples/mkwar.rb +138 -0
  368. data/lib/rex/zip/samples/mkzip.rb +19 -0
  369. data/lib/rex/zip/samples/recursive.rb +58 -0
  370. metadata +435 -0
@@ -0,0 +1,409 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rex/post/meterpreter/packet_response_waiter'
4
+ require 'rex/logging'
5
+ require 'rex/exceptions'
6
+
7
+ module Rex
8
+ module Post
9
+ module Meterpreter
10
+
11
+ ###
12
+ #
13
+ # Exception thrown when a request fails.
14
+ #
15
+ ###
16
+ class RequestError < ArgumentError
17
+ def initialize(method, result)
18
+ @method = method
19
+ @result = result
20
+ end
21
+
22
+ def to_s
23
+ "#{@method}: Operation failed: #{@result}"
24
+ end
25
+
26
+ # The method that failed.
27
+ attr_reader :method
28
+
29
+ # The error result that occurred, typically a windows error code.
30
+ attr_reader :result
31
+ end
32
+
33
+ ###
34
+ #
35
+ # Handles packet transmission, reception, and correlation,
36
+ # and processing
37
+ #
38
+ ###
39
+ module PacketDispatcher
40
+
41
+ PacketTimeout = 30
42
+
43
+ ##
44
+ #
45
+ # Transmission
46
+ #
47
+ ##
48
+
49
+ #
50
+ # Sends a packet without waiting for a response.
51
+ #
52
+ def send_packet(packet, completion_routine = nil, completion_param = nil)
53
+ if (completion_routine)
54
+ add_response_waiter(packet, completion_routine, completion_param)
55
+ end
56
+
57
+ bytes = 0
58
+ raw = packet.to_r
59
+
60
+ if (raw)
61
+ bytes = self.sock.write(raw)
62
+ end
63
+
64
+ return bytes
65
+ end
66
+
67
+ #
68
+ # Sends a packet and waits for a timeout for the given time interval.
69
+ #
70
+ def send_request(packet, t = self.response_timeout)
71
+ response = send_packet_wait_response(packet, t)
72
+
73
+ if (response == nil)
74
+ raise TimeoutError
75
+ elsif (response.result != 0)
76
+ e = RequestError.new(packet.method, response.result)
77
+
78
+ e.set_backtrace(caller)
79
+
80
+ raise e
81
+ end
82
+
83
+ return response
84
+ end
85
+
86
+ #
87
+ # Transmits a packet and waits for a response.
88
+ #
89
+ def send_packet_wait_response(packet, t)
90
+ # First, add the waiter association for the supplied packet
91
+ waiter = add_response_waiter(packet)
92
+
93
+ # Transmit the packet
94
+ if (send_packet(packet) <= 0)
95
+ # Remove the waiter if we failed to send the packet.
96
+ remove_response_waiter(waiter)
97
+ return nil
98
+ end
99
+
100
+ # Wait for the supplied time interval
101
+ waiter.wait(t)
102
+
103
+ # Remove the waiter from the list of waiters in case it wasn't
104
+ # removed
105
+ remove_response_waiter(waiter)
106
+
107
+ # Return the response packet, if any
108
+ return waiter.response
109
+ end
110
+
111
+ ##
112
+ #
113
+ # Reception
114
+ #
115
+ ##
116
+ #
117
+ # Monitors the PacketDispatcher's sock for data in its own
118
+ # thread context and parsers all inbound packets.
119
+ #
120
+ def monitor_socket
121
+ self.waiters = []
122
+
123
+ @pqueue = []
124
+ @finish = false
125
+ @last_recvd = Time.now
126
+ @ping_sent = false
127
+
128
+ self.alive = true
129
+
130
+ # Spawn a thread for receiving packets
131
+ self.receiver_thread = ::Thread.new do
132
+ while (true)
133
+ begin
134
+ rv = Rex::ThreadSafe.select([ self.sock.fd ], nil, nil, 0.25)
135
+ ping_time = 60
136
+ # If there's nothing to read, and it's been awhile since we
137
+ # saw a packet, we need to send a ping. We wait
138
+ # ping_time*2 seconds before deciding a session is dead.
139
+ if (not rv and self.send_keepalives and Time.now - @last_recvd > ping_time)
140
+ # If the queue is empty and we've already sent a
141
+ # keepalive without getting a reply, then this
142
+ # session is hosed, and we should give up on it.
143
+ if @ping_sent and @pqueue.empty? and (Time.now - @last_recvd > ping_time * 2)
144
+ dlog("No response to ping, session #{self.sid} is dead", LEV_3)
145
+ self.alive = false
146
+ @finish = true
147
+ break
148
+ end
149
+ # Let the packet queue processor finish up before
150
+ # we send a ping.
151
+ if not @ping_sent and @pqueue.empty?
152
+ # Our 'ping' is actually just a check for eof on
153
+ # channel id 0. This method has no side effects
154
+ # and always returns an answer (regardless of the
155
+ # existence of chan 0), which is all that's
156
+ # needed for a liveness check. The answer itself
157
+ # is unimportant and is ignored.
158
+ pkt = Packet.create_request('core_channel_eof')
159
+ pkt.add_tlv(TLV_TYPE_CHANNEL_ID, 0)
160
+ waiter = Proc.new { |response, param|
161
+ @ping_sent = false
162
+ @last_recvd = Time.now
163
+ }
164
+ send_packet(pkt, waiter)
165
+ @ping_sent = true
166
+ end
167
+ next
168
+ end
169
+ next if not rv
170
+ packet = receive_packet
171
+ @pqueue << packet if packet
172
+ @last_recvd = Time.now
173
+ rescue ::Exception
174
+ dlog("Exception caught in monitor_socket: #{$!}", 'meterpreter', LEV_1)
175
+ @finish = true
176
+ self.alive = false
177
+ break
178
+ end
179
+ end
180
+ end
181
+
182
+ # Spawn a new thread that monitors the socket
183
+ self.dispatcher_thread = ::Thread.new do
184
+ begin
185
+ # Whether we're finished or not is determined by the receiver
186
+ # thread above.
187
+ while(not @finish)
188
+ if(@pqueue.empty?)
189
+ select(nil, nil, nil, 0.10)
190
+ next
191
+ end
192
+
193
+ incomplete = []
194
+ backlog = []
195
+
196
+ while(@pqueue.length > 0)
197
+ backlog << @pqueue.shift
198
+ end
199
+
200
+ #
201
+ # Prioritize message processing here
202
+ # 1. Close should always be processed at the end
203
+ # 2. Command responses always before channel data
204
+ #
205
+
206
+ tmp_command = []
207
+ tmp_channel = []
208
+ tmp_close = []
209
+ backlog.each do |pkt|
210
+ if(pkt.response?)
211
+ tmp_command << pkt
212
+ next
213
+ end
214
+ if(pkt.method == "core_channel_close")
215
+ tmp_close << pkt
216
+ next
217
+ end
218
+ tmp_channel << pkt
219
+ end
220
+
221
+ backlog = []
222
+ backlog.push(*tmp_command)
223
+ backlog.push(*tmp_channel)
224
+ backlog.push(*tmp_close)
225
+
226
+
227
+ #
228
+ # Process the message queue
229
+ #
230
+
231
+ backlog.each do |pkt|
232
+
233
+ begin
234
+ if ! dispatch_inbound_packet(pkt)
235
+ # Only requeue packets newer than the timeout
236
+ if (::Time.now.to_i - pkt.created_at.to_i < PacketTimeout)
237
+ incomplete << pkt
238
+ end
239
+ end
240
+
241
+ rescue ::Exception => e
242
+ dlog("Dispatching exception with packet #{pkt}: #{e} #{e.backtrace}", 'meterpreter', LEV_1)
243
+ end
244
+ end
245
+
246
+ @pqueue.unshift(*incomplete)
247
+
248
+ if(@pqueue.length > 100)
249
+ dlog("Backlog has grown to over 100 in monitor_socket, dropping older packets: #{@pqueue[0 .. 25].map{|x| x.inspect}.join(" - ")}", 'meterpreter', LEV_1)
250
+ @pqueue = @pqueue[25 .. 100]
251
+ end
252
+ end
253
+ rescue ::Exception => e
254
+ dlog("Exception caught in monitor_socket dispatcher: #{e.class} #{e} #{e.backtrace}", 'meterpreter', LEV_1)
255
+ ensure
256
+ self.receiver_thread.kill if self.receiver_thread
257
+ end
258
+ end
259
+ end
260
+
261
+
262
+ #
263
+ # Parses data from the dispatcher's sock and returns a Packet context
264
+ # once a full packet has been received.
265
+ #
266
+ def receive_packet
267
+ return parser.recv(self.sock)
268
+ end
269
+
270
+ #
271
+ # Stop the monitor
272
+ #
273
+ def monitor_stop
274
+ if(self.receiver_thread)
275
+ self.receiver_thread.kill
276
+ self.receiver_thread = nil
277
+ end
278
+ if(self.dispatcher_thread)
279
+ self.dispatcher_thread.kill
280
+ self.dispatcher_thread = nil
281
+ end
282
+ end
283
+
284
+ ##
285
+ #
286
+ # Waiter registration
287
+ #
288
+ ##
289
+
290
+ #
291
+ # Adds a waiter association with the supplied request packet.
292
+ #
293
+ def add_response_waiter(request, completion_routine = nil, completion_param = nil)
294
+ waiter = PacketResponseWaiter.new(request.rid, completion_routine, completion_param)
295
+
296
+ self.waiters << waiter
297
+
298
+ return waiter
299
+ end
300
+
301
+ #
302
+ # Notifies a whomever is waiting for a the supplied response,
303
+ # if anyone.
304
+ #
305
+ def notify_response_waiter(response)
306
+ self.waiters.each() { |waiter|
307
+ if (waiter.waiting_for?(response))
308
+ waiter.notify(response)
309
+
310
+ remove_response_waiter(waiter)
311
+
312
+ break
313
+ end
314
+ }
315
+ end
316
+
317
+ #
318
+ # Removes a waiter from the list of waiters.
319
+ #
320
+ def remove_response_waiter(waiter)
321
+ self.waiters.delete(waiter)
322
+ end
323
+
324
+ ##
325
+ #
326
+ # Dispatching
327
+ #
328
+ ##
329
+
330
+ #
331
+ # Initializes the inbound handlers.
332
+ #
333
+ def initialize_inbound_handlers
334
+ @inbound_handlers = []
335
+ end
336
+
337
+ #
338
+ # Dispatches and processes an inbound packet. If the packet is a
339
+ # response that has an associated waiter, the waiter is notified.
340
+ # Otherwise, the packet is passed onto any registered dispatch
341
+ # handlers until one returns success.
342
+ #
343
+ def dispatch_inbound_packet(packet, client = nil)
344
+ handled = false
345
+
346
+ # If no client context was provided, return self as PacketDispatcher
347
+ # is a mixin for the Client instance
348
+ if (client == nil)
349
+ client = self
350
+ end
351
+
352
+ # If the packet is a response, try to notify any potential
353
+ # waiters
354
+ if ((resp = packet.response?))
355
+ if (notify_response_waiter(packet))
356
+ return true
357
+ end
358
+ end
359
+
360
+
361
+ # Enumerate all of the inbound packet handlers until one handles
362
+ # the packet
363
+ @inbound_handlers.each { |handler|
364
+
365
+ handled = nil
366
+ begin
367
+
368
+ if ! resp
369
+ handled = handler.request_handler(client, packet)
370
+ else
371
+ handled = handler.response_handler(client, packet)
372
+ end
373
+
374
+ rescue ::Exception => e
375
+ dlog("Exception caught in dispatch_inbound_packet: handler=#{handler} #{e.class} #{e} #{e.backtrace}", 'meterpreter', LEV_1)
376
+ return true
377
+ end
378
+
379
+ if (handled)
380
+ break
381
+ end
382
+ }
383
+ return handled
384
+ end
385
+
386
+ #
387
+ # Registers an inbound packet handler that implements the
388
+ # InboundPacketHandler interface.
389
+ #
390
+ def register_inbound_handler(handler)
391
+ @inbound_handlers << handler
392
+ end
393
+
394
+ #
395
+ # Deregisters a previously registered inbound packet handler.
396
+ #
397
+ def deregister_inbound_handler(handler)
398
+ @inbound_handlers.delete(handler)
399
+ end
400
+
401
+ protected
402
+
403
+ attr_accessor :receiver_thread # :nodoc:
404
+ attr_accessor :dispatcher_thread # :nodoc:
405
+ attr_accessor :waiters # :nodoc:
406
+ end
407
+
408
+ end; end; end
409
+
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+ module Post
5
+ module Meterpreter
6
+
7
+ ###
8
+ #
9
+ # This class is responsible for reading in and decrypting meterpreter
10
+ # packets that arrive on a socket
11
+ #
12
+ ###
13
+ class PacketParser
14
+
15
+ #
16
+ # Initializes the packet parser context with an optional cipher.
17
+ #
18
+ def initialize(cipher = nil)
19
+ self.cipher = cipher
20
+
21
+ reset
22
+ end
23
+
24
+ #
25
+ # Resets the parser state so that a new packet can begin being parsed.
26
+ #
27
+ def reset
28
+ self.raw = ''
29
+ self.hdr_length_left = 8
30
+ self.payload_length_left = 0
31
+ end
32
+
33
+ #
34
+ # Reads data from the wire and parse as much of the packet as possible.
35
+ #
36
+ def recv(sock)
37
+ if (self.hdr_length_left > 0)
38
+ buf = sock.read(self.hdr_length_left)
39
+
40
+ if (buf)
41
+ self.raw << buf
42
+
43
+ self.hdr_length_left -= buf.length
44
+ else
45
+ raise EOFError
46
+ end
47
+
48
+ # If we've finished reading the header, set the
49
+ # payload length left to the number of bytes
50
+ # specified in the length
51
+ if (self.hdr_length_left == 0)
52
+ self.payload_length_left = raw.unpack("N")[0] - 8
53
+ end
54
+ elsif (self.payload_length_left > 0)
55
+ buf = sock.read(self.payload_length_left)
56
+
57
+ if (buf)
58
+ self.raw << buf
59
+
60
+ self.payload_length_left -= buf.length
61
+ else
62
+ raise EOFError
63
+ end
64
+ end
65
+
66
+ # If we've finished reading the entire packet
67
+ if ((self.hdr_length_left == 0) &&
68
+ (self.payload_length_left == 0))
69
+
70
+ # Create a typeless packet
71
+ packet = Packet.new(0)
72
+
73
+ # TODO: cipher decryption
74
+ if (cipher)
75
+ end
76
+
77
+ # Serialize the packet from the raw buffer
78
+ packet.from_r(self.raw)
79
+
80
+ # Reset our state
81
+ reset
82
+
83
+ return packet
84
+ end
85
+ end
86
+
87
+ protected
88
+ attr_accessor :cipher, :raw, :hdr_length_left, :payload_length_left # :nodoc:
89
+
90
+ end
91
+
92
+
93
+ end; end; end
94
+