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,61 @@
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 the power of the remote machine (reboot, etc).
19
+ #
20
+ ###
21
+ class Power
22
+
23
+ class <<self
24
+ attr_accessor :client
25
+ end
26
+
27
+ #
28
+ # Calls ExitWindows on the remote machine with the supplied parameters.
29
+ #
30
+ def Power._exitwindows(flags, reason = 0) # :nodoc:
31
+ request = Packet.create_request('stdapi_sys_power_exitwindows')
32
+
33
+ request.add_tlv(TLV_TYPE_POWER_FLAGS, flags);
34
+ request.add_tlv(TLV_TYPE_POWER_REASON, reason);
35
+
36
+ response = client.send_request(request)
37
+
38
+ return self
39
+ end
40
+
41
+ #
42
+ # Reboots the remote machine.
43
+ #
44
+ def Power.reboot(reason = 0)
45
+ self._exitwindows(EWX_REBOOT, reason)
46
+ end
47
+
48
+ #
49
+ # Shuts down the remote machine.
50
+ #
51
+ def Power.shutdown(force = 0, reason = 0)
52
+ flags = EWX_POWEROFF
53
+ flags |= EWX_FORCEIFHUNG if force == 1
54
+ flags |= EWX_FORCE if force == 2
55
+
56
+ self._exitwindows(flags, reason)
57
+ end
58
+
59
+ end
60
+
61
+ end end end end end end
@@ -0,0 +1,361 @@
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/channels/pools/stream_pool'
7
+ require 'rex/post/meterpreter/extensions/stdapi/stdapi'
8
+
9
+ require 'rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image'
10
+ require 'rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io'
11
+ require 'rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory'
12
+ require 'rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread'
13
+
14
+ module Rex
15
+ module Post
16
+ module Meterpreter
17
+ module Extensions
18
+ module Stdapi
19
+ module Sys
20
+
21
+ ##
22
+ #
23
+ # This class implements the Rex::Post::Process interface.
24
+ #
25
+ ##
26
+ class Process < Rex::Post::Process
27
+
28
+ include Rex::Post::Meterpreter::ObjectAliasesContainer
29
+
30
+ ##
31
+ #
32
+ # Class methods
33
+ #
34
+ ##
35
+
36
+ class << self
37
+ attr_accessor :client
38
+ end
39
+
40
+ #
41
+ # Returns the process identifier of the process supplied in key if it's
42
+ # valid.
43
+ #
44
+ def Process.[](key)
45
+ each_process { |p|
46
+ if (p['name'].downcase == key.downcase)
47
+ return p['pid']
48
+ end
49
+ }
50
+
51
+ return nil
52
+ end
53
+
54
+ #
55
+ # Attachs to the supplied process with a given set of permissions.
56
+ #
57
+ def Process.open(pid = nil, perms = nil)
58
+ real_perms = 0
59
+
60
+ if (perms == nil)
61
+ perms = PROCESS_ALL
62
+ end
63
+
64
+ if (perms & PROCESS_READ)
65
+ real_perms |= PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_QUERY_INFORMATION
66
+ end
67
+
68
+ if (perms & PROCESS_WRITE)
69
+ real_perms |= PROCESS_SET_SESSIONID | PROCESS_VM_WRITE | PROCESS_DUP_HANDLE | PROCESS_SET_QUOTA | PROCESS_SET_INFORMATION
70
+ end
71
+
72
+ if (perms & PROCESS_EXECUTE)
73
+ real_perms |= PROCESS_TERMINATE | PROCESS_CREATE_THREAD | PROCESS_CREATE_PROCESS | PROCESS_SUSPEND_RESUME
74
+ end
75
+
76
+ return _open(pid, real_perms)
77
+ end
78
+
79
+ #
80
+ # Low-level process open.
81
+ #
82
+ def Process._open(pid, perms, inherit = false)
83
+ request = Packet.create_request('stdapi_sys_process_attach')
84
+
85
+ if (pid == nil)
86
+ pid = 0
87
+ end
88
+
89
+ # Populate the request
90
+ request.add_tlv(TLV_TYPE_PID, pid)
91
+ request.add_tlv(TLV_TYPE_PROCESS_PERMS, perms)
92
+ request.add_tlv(TLV_TYPE_INHERIT, inherit)
93
+
94
+ # Transmit the request
95
+ response = self.client.send_request(request)
96
+ handle = response.get_tlv_value(TLV_TYPE_HANDLE)
97
+
98
+ # If the handle is valid, allocate a process instance and return it
99
+ if (handle != nil)
100
+ return self.new(pid, handle)
101
+ end
102
+
103
+ return nil
104
+ end
105
+
106
+ #
107
+ # Executes an application using the arguments provided
108
+ #
109
+ # Hash arguments supported:
110
+ #
111
+ # Hidden => true/false
112
+ # Channelized => true/false
113
+ # Suspended => true/false
114
+ # InMemory => true/false
115
+ #
116
+ def Process.execute(path, arguments = nil, opts = nil)
117
+ request = Packet.create_request('stdapi_sys_process_execute')
118
+ flags = 0
119
+
120
+ # If we were supplied optional arguments...
121
+ if (opts != nil)
122
+ if (opts['Hidden'])
123
+ flags |= PROCESS_EXECUTE_FLAG_HIDDEN
124
+ end
125
+ if (opts['Channelized'])
126
+ flags |= PROCESS_EXECUTE_FLAG_CHANNELIZED
127
+ end
128
+ if (opts['Suspended'])
129
+ flags |= PROCESS_EXECUTE_FLAG_SUSPENDED
130
+ end
131
+ if (opts['UseThreadToken'])
132
+ flags |= PROCESS_EXECUTE_FLAG_USE_THREAD_TOKEN
133
+ end
134
+ if (opts['Desktop'])
135
+ flags |= PROCESS_EXECUTE_FLAG_DESKTOP
136
+ end
137
+ if (opts['Session'])
138
+ flags |= PROCESS_EXECUTE_FLAG_SESSION
139
+ request.add_tlv( TLV_TYPE_PROCESS_SESSION, opts['Session'] )
140
+ end
141
+ inmem = opts['InMemory']
142
+ if inmem
143
+
144
+ # add the file contents into the tlv
145
+ f = ::File.new(path, 'rb')
146
+ request.add_tlv(TLV_TYPE_VALUE_DATA, f.read(f.stat.size))
147
+ f.close
148
+
149
+ # replace the path with the "dummy"
150
+ path = inmem.kind_of?(String) ? inmem : 'cmd'
151
+ end
152
+ end
153
+
154
+ request.add_tlv(TLV_TYPE_PROCESS_PATH, path);
155
+
156
+ # If process arguments were supplied
157
+ if (arguments != nil)
158
+ request.add_tlv(TLV_TYPE_PROCESS_ARGUMENTS, arguments);
159
+ end
160
+
161
+ request.add_tlv(TLV_TYPE_PROCESS_FLAGS, flags);
162
+
163
+ response = client.send_request(request)
164
+
165
+ # Get the response parameters
166
+ pid = response.get_tlv_value(TLV_TYPE_PID)
167
+ handle = response.get_tlv_value(TLV_TYPE_PROCESS_HANDLE)
168
+ channel_id = response.get_tlv_value(TLV_TYPE_CHANNEL_ID)
169
+ channel = nil
170
+
171
+ # If we were creating a channel out of this
172
+ if (channel_id != nil)
173
+ channel = Rex::Post::Meterpreter::Channels::Pools::StreamPool.new(client,
174
+ channel_id, "stdapi_process", CHANNEL_FLAG_SYNCHRONOUS)
175
+ end
176
+
177
+ # Return a process instance
178
+ return self.new(pid, handle, channel)
179
+ end
180
+
181
+ #
182
+ # Kills one or more processes.
183
+ #
184
+ def Process.kill(*args)
185
+ request = Packet.create_request('stdapi_sys_process_kill')
186
+
187
+ args.each { |id|
188
+ request.add_tlv(TLV_TYPE_PID, id)
189
+ }
190
+
191
+ client.send_request(request)
192
+
193
+ return true
194
+ end
195
+
196
+ #
197
+ # Gets the process id that the remote side is executing under.
198
+ #
199
+ def Process.getpid
200
+ request = Packet.create_request('stdapi_sys_process_getpid')
201
+
202
+ response = client.send_request(request)
203
+
204
+ return response.get_tlv_value(TLV_TYPE_PID)
205
+ end
206
+
207
+ #
208
+ # Enumerates all of the elements in the array returned by get_processes.
209
+ #
210
+ def Process.each_process(&block)
211
+ self.get_processes.each(&block)
212
+ end
213
+
214
+ #
215
+ # Returns an array of processes with hash objects that have
216
+ # keys for 'pid', 'parentid', 'name', 'path', 'user' and 'arch'.
217
+ #
218
+ def Process.get_processes
219
+ request = Packet.create_request('stdapi_sys_process_get_processes')
220
+ processes = []
221
+
222
+ response = client.send_request(request)
223
+
224
+ response.each(TLV_TYPE_PROCESS_GROUP) { |p|
225
+ arch = ""
226
+
227
+ pa = p.get_tlv_value( TLV_TYPE_PROCESS_ARCH )
228
+ if( pa != nil )
229
+ if pa == 1 # PROCESS_ARCH_X86
230
+ arch = ARCH_X86
231
+ elsif pa == 2 # PROCESS_ARCH_X64
232
+ arch = ARCH_X86_64
233
+ end
234
+ end
235
+
236
+ processes <<
237
+ {
238
+ 'pid' => p.get_tlv_value(TLV_TYPE_PID),
239
+ 'parentid' => p.get_tlv_value(TLV_TYPE_PARENT_PID),
240
+ 'name' => p.get_tlv_value(TLV_TYPE_PROCESS_NAME),
241
+ 'path' => p.get_tlv_value(TLV_TYPE_PROCESS_PATH),
242
+ 'session' => p.get_tlv_value(TLV_TYPE_PROCESS_SESSION),
243
+ 'user' => p.get_tlv_value(TLV_TYPE_USER_NAME),
244
+ 'arch' => arch
245
+ }
246
+ }
247
+
248
+ return processes
249
+ end
250
+
251
+ #
252
+ # An alias for get_processes.
253
+ #
254
+ def Process.processes
255
+ self.get_processes
256
+ end
257
+
258
+ ##
259
+ #
260
+ # Instance methods
261
+ #
262
+ ##
263
+
264
+ #
265
+ # Initializes the process instance and its aliases.
266
+ #
267
+ def initialize(pid, handle, channel = nil)
268
+ self.client = self.class.client
269
+ self.handle = handle
270
+ self.channel = channel
271
+
272
+ # If the process identifier is zero, then we must lookup the current
273
+ # process identifier
274
+ if (pid == 0)
275
+ self.pid = client.sys.process.getpid
276
+ else
277
+ self.pid = pid
278
+ end
279
+
280
+ initialize_aliases(
281
+ {
282
+ 'image' => Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Image.new(self),
283
+ 'io' => Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::IO.new(self),
284
+ 'memory' => Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Memory.new(self),
285
+ 'thread' => Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessSubsystem::Thread.new(self),
286
+ })
287
+ end
288
+
289
+ #
290
+ # Returns the executable name of the process.
291
+ #
292
+ def name
293
+ return get_info()['name']
294
+ end
295
+
296
+ #
297
+ # Returns the path to the process' executable.
298
+ #
299
+ def path
300
+ return get_info()['path']
301
+ end
302
+
303
+ #
304
+ # Closes the handle to the process that was opened.
305
+ #
306
+ def close
307
+ request = Packet.create_request('stdapi_sys_process_close')
308
+
309
+ request.add_tlv(TLV_TYPE_HANDLE, handle)
310
+
311
+ response = client.send_request(request)
312
+
313
+ handle = nil;
314
+
315
+ return true
316
+ end
317
+
318
+ #
319
+ # Block untill this process terminates on the remote side.
320
+ # By default we choose not to allow a packet responce timeout to
321
+ # occur as we may be waiting indefinatly for the process to terminate.
322
+ #
323
+ def wait( timeout = -1 )
324
+ request = Packet.create_request('stdapi_sys_process_wait')
325
+
326
+ request.add_tlv(TLV_TYPE_HANDLE, self.handle)
327
+
328
+ response = self.client.send_request(request, timeout)
329
+
330
+ self.handle = nil
331
+
332
+ return true
333
+ end
334
+
335
+ attr_reader :client, :handle, :channel, :pid # :nodoc:
336
+ protected
337
+ attr_writer :client, :handle, :channel, :pid # :nodoc:
338
+
339
+ #
340
+ # Gathers information about the process and returns a hash.
341
+ #
342
+ def get_info
343
+ request = Packet.create_request('stdapi_sys_process_get_info')
344
+ info = {}
345
+
346
+ request.add_tlv(TLV_TYPE_HANDLE, handle)
347
+
348
+ # Send the request
349
+ response = client.send_request(request)
350
+
351
+ # Populate the hash
352
+ info['name'] = response.get_tlv_value(TLV_TYPE_PROCESS_NAME)
353
+ info['path'] = response.get_tlv_value(TLV_TYPE_PROCESS_PATH)
354
+
355
+ return info
356
+ end
357
+
358
+ end
359
+
360
+ end; end; end; end; end; end
361
+
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rex/post/meterpreter/client'
4
+ require 'rex/post/meterpreter/extensions/stdapi/constants'
5
+
6
+ module Rex
7
+ module Post
8
+ module Meterpreter
9
+ module Extensions
10
+ module Stdapi
11
+ module Sys
12
+ module ProcessSubsystem
13
+
14
+ ###
15
+ #
16
+ # Interacts with loading, unloading, enumerating, and querying
17
+ # image files in the context of a given process.
18
+ #
19
+ ###
20
+ class Image
21
+
22
+ ##
23
+ #
24
+ # Constructor
25
+ #
26
+ ##
27
+
28
+ #
29
+ # Initializes the image instance.
30
+ #
31
+ def initialize(process)
32
+ self.process = process
33
+ end
34
+
35
+ #
36
+ # Returns the image base address associated with the supplied image name.
37
+ #
38
+ def [](key)
39
+ each_image { |i|
40
+ if (i['name'].downcase == key.downcase)
41
+ return i['base']
42
+ end
43
+ }
44
+
45
+ return nil
46
+ end
47
+
48
+ #
49
+ # Loads an image file into the context of the process.
50
+ #
51
+ def load(image_path)
52
+ request = Packet.create_request('stdapi_sys_process_image_load')
53
+
54
+ request.add_tlv(TLV_TYPE_HANDLE, process.handle)
55
+ request.add_tlv(TLV_TYPE_IMAGE_FILE_PATH, image_path)
56
+
57
+ response = process.client.send_request(request)
58
+
59
+ return response.get_tlv_value(TLV_TYPE_IMAGE_BASE)
60
+ end
61
+
62
+ #
63
+ # Returns the address of the procedure that is found in the supplied
64
+ # library.
65
+ #
66
+ def get_procedure_address(image_file, procedure)
67
+ request = Packet.create_request('stdapi_sys_process_image_get_proc_address')
68
+
69
+ request.add_tlv(TLV_TYPE_HANDLE, process.handle)
70
+ request.add_tlv(TLV_TYPE_IMAGE_FILE, image_file)
71
+ request.add_tlv(TLV_TYPE_PROCEDURE_NAME, procedure)
72
+
73
+ response = process.client.send_request(request)
74
+
75
+ return response.get_tlv_value(TLV_TYPE_PROCEDURE_ADDRESS)
76
+ end
77
+
78
+ #
79
+ # Unloads an image file that is loaded into the address space of the
80
+ # process by its base address.
81
+ #
82
+ def unload(base)
83
+ request = Packet.create_request('stdapi_sys_process_image_unload')
84
+
85
+ request.add_tlv(TLV_TYPE_HANDLE, process.handle)
86
+ request.add_tlv(TLV_TYPE_IMAGE_BASE, base)
87
+
88
+ response = process.client.send_request(request)
89
+
90
+ return true
91
+ end
92
+
93
+ #
94
+ # Enumerates through each image in the process.
95
+ #
96
+ def each_image(&block)
97
+ get_images.each(&block)
98
+ end
99
+
100
+ #
101
+ # Returns an array of images in the process with hash objects that
102
+ # have keys for 'name', 'path', and 'base'.
103
+ #
104
+ def get_images
105
+ request = Packet.create_request('stdapi_sys_process_image_get_images')
106
+ images = []
107
+
108
+ request.add_tlv(TLV_TYPE_HANDLE, process.handle)
109
+
110
+ response = process.client.send_request(request)
111
+
112
+ response.each(TLV_TYPE_IMAGE_GROUP) { |i|
113
+ images <<
114
+ {
115
+ 'name' => i.get_tlv_value(TLV_TYPE_IMAGE_NAME),
116
+ 'base' => i.get_tlv_value(TLV_TYPE_IMAGE_BASE),
117
+ 'path' => i.get_tlv_value(TLV_TYPE_IMAGE_FILE_PATH)
118
+ }
119
+ }
120
+
121
+ return images
122
+ end
123
+
124
+ protected
125
+ attr_accessor :process # :nodoc:
126
+
127
+ end
128
+
129
+ end; end; end; end; end; end; end