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,77 @@
1
+ ##
2
+ # $Id: minifat.rb 8457 2010-02-11 18:36:38Z jduck $
3
+ # Version: $Revision: 8457 $
4
+ ##
5
+
6
+ ##
7
+ # Rex::OLE - an OLE implementation
8
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
9
+ ##
10
+
11
+ module Rex
12
+ module OLE
13
+
14
+ class MiniFAT < DIFAT
15
+
16
+ #
17
+ # low-level functions
18
+ #
19
+ def read
20
+ @entries = []
21
+
22
+ visited = []
23
+ sect = @stg.header._sectMiniFatStart
24
+ @stg.header._csectMiniFat.times { |idx|
25
+ break if sect == SECT_END
26
+
27
+ if (visited.include?(sect))
28
+ raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
29
+ end
30
+ visited << sect
31
+
32
+ buf = @stg.read_sector(sect, @stg.header.sector_size)
33
+ @stg.header.idx_per_sect.times { |idx|
34
+ @entries << Util.get32(buf, (idx*4))
35
+ }
36
+ sect = @stg.next_sector(sect)
37
+ }
38
+ end
39
+
40
+ def allocate_sector
41
+ idx = @entries.index(SECT_FREE)
42
+
43
+ if (not idx)
44
+ # add a sector worth
45
+ idx = @entries.length
46
+ @stg.header.idx_per_sect.times {
47
+ @entries << SECT_FREE
48
+ }
49
+ end
50
+
51
+ # default mini-sectors to end of chain
52
+ @entries[idx] = SECT_END
53
+ idx
54
+ end
55
+
56
+ def write
57
+ return if (@entries.length < 1)
58
+
59
+ mf_start = nil
60
+ mfs_count = 0
61
+ prev_sect = nil
62
+ copy = @entries.dup
63
+ while (copy.length > 0)
64
+ part = copy.slice!(0, @stg.header.idx_per_sect)
65
+ sbuf = Util.pack32array(part)
66
+ idx = @stg.write_sector(sbuf, nil, prev_sect)
67
+ mfs_count += 1
68
+ mf_start ||= idx
69
+ end
70
+ @stg.header._sectMiniFatStart = mf_start
71
+ @stg.header._csectMiniFat = mfs_count
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ msfbase = __FILE__
4
+ while File.symlink?(msfbase)
5
+ msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
6
+ end
7
+ path = File.expand_path(File.dirname(msfbase))
8
+ path += "/../../../"
9
+ $:.unshift(path)
10
+
11
+
12
+ require 'rex/ole'
13
+
14
+ if (ARGV.length < 1)
15
+ $stderr.puts "usage: make_ole <file>"
16
+ exit(1)
17
+ end
18
+
19
+ document = ARGV.shift
20
+
21
+ if (stg = Rex::OLE::Storage.new(document, Rex::OLE::STGM_WRITE))
22
+ if (stm = stg.create_stream("testing"))
23
+ stm << "A" * 1024
24
+ stm.close
25
+ end
26
+ stg.close
27
+ end
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ msfbase = __FILE__
4
+ while File.symlink?(msfbase)
5
+ msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
6
+ end
7
+ path = File.expand_path(File.dirname(msfbase))
8
+ path += "/../../../"
9
+ $:.unshift(path)
10
+
11
+
12
+ require 'rex/ole'
13
+
14
+ if (ARGV.length < 1)
15
+ $stderr.puts "usage: dir <file>"
16
+ exit(1)
17
+ end
18
+
19
+ document = ARGV.shift
20
+
21
+
22
+ # recursive printer :)
23
+ def show_entries(ent, spaces=0)
24
+ spstr = " " * spaces
25
+
26
+ puts "%s + #{ent.name}" % spstr
27
+ ent.each { |el|
28
+ show_entries(el, spaces+2)
29
+ }
30
+ end
31
+
32
+ if (stg = Rex::OLE::Storage.new(document))
33
+ show_entries(stg)
34
+ stg.close
35
+ end
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ msfbase = __FILE__
4
+ while File.symlink?(msfbase)
5
+ msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
6
+ end
7
+ path = File.expand_path(File.dirname(msfbase))
8
+ path += "/../../../"
9
+ $:.unshift(path)
10
+
11
+ require 'rex/ole'
12
+
13
+ if (ARGV.length < 2)
14
+ $stderr.puts "usage: dump_stream <file> <stream>"
15
+ exit(1)
16
+ end
17
+
18
+ document = ARGV.shift
19
+ stream = ARGV.shift
20
+
21
+ if (stg = Rex::OLE::Storage.new(document))
22
+ if (stm = stg.open_stream(stream))
23
+ data = stm.read(stm.length)
24
+ data ||= ""
25
+ $stderr.puts "Successfully opened the \"%s\" stream (%u bytes)" % [stream, data.length]
26
+ $stdout.puts data
27
+ stm.close
28
+ else
29
+ $stderr.puts "Unable to open stream: #{stream}"
30
+ end
31
+ stg.close
32
+ else
33
+ $stderr.puts "Unable to open storage: #{document}"
34
+ end
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ msfbase = __FILE__
4
+ while File.symlink?(msfbase)
5
+ msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
6
+ end
7
+ path = File.expand_path(File.dirname(msfbase))
8
+ path += "/../../../"
9
+ $:.unshift(path)
10
+
11
+ require 'rex/ole'
12
+
13
+ if (ARGV.length < 1)
14
+ $stderr.puts "usage: ole_info <file>"
15
+ exit(1)
16
+ end
17
+
18
+ document = ARGV.shift
19
+
20
+ if (stg = Rex::OLE::Storage.new(document))
21
+ puts stg.inspect
22
+ stg.close
23
+ end
@@ -0,0 +1,395 @@
1
+ ##
2
+ # $Id: storage.rb 8457 2010-02-11 18:36:38Z jduck $
3
+ # Version: $Revision: 8457 $
4
+ ##
5
+
6
+ ##
7
+ # Rex::OLE - an OLE implementation
8
+ # written in 2010 by Joshua J. Drake <jduck [at] metasploit.com>
9
+ ##
10
+
11
+ module Rex
12
+ module OLE
13
+
14
+ class Storage
15
+
16
+ attr_accessor :header
17
+
18
+ def initialize(filename=nil, mode=STGM_READ)
19
+ @mode = mode
20
+ @modified = nil
21
+
22
+ @fd = nil
23
+ @filename = nil
24
+ @header = Header.new
25
+ @difat = DIFAT.new self
26
+ @fat = FAT.new self
27
+ @minifat = MiniFAT.new self
28
+ @directory = Directory.new self
29
+ @ministream = Stream.new self
30
+
31
+ if (filename)
32
+ @filename = filename
33
+ open(filename, mode)
34
+ return
35
+ end
36
+ end
37
+
38
+
39
+ def each
40
+ @directory.each { |el|
41
+ yield el
42
+ }
43
+ end
44
+
45
+
46
+ def name
47
+ @filename
48
+ end
49
+
50
+
51
+ def open(filename, mode)
52
+ if (mode == STGM_READWRITE)
53
+ fmode = 'r+b'
54
+ elsif (mode == STGM_WRITE)
55
+ fmode = 'w+b'
56
+ else
57
+ fmode = 'rb'
58
+ end
59
+
60
+ @fd = File.new(filename, fmode)
61
+
62
+ # don't read for new files
63
+ if (mode == STGM_WRITE)
64
+ # ensure there is a root
65
+ write_to_disk
66
+ return
67
+ end
68
+
69
+ # parse the header
70
+ @header.read @fd
71
+ @difat.read
72
+ @fat.read @difat
73
+ @minifat.read
74
+ @directory.read
75
+ # NOTE: we can't use read_stream_data here (must read using regular FAT, regardless of size)
76
+ # read data using the root node's start/length
77
+ @ministream << read_data(@directory)
78
+ end
79
+
80
+ def close
81
+ if (@modified) and (@mode != STGM_READ)
82
+ write_to_disk
83
+ end
84
+ @fd.close
85
+ end
86
+
87
+ def inspect
88
+ ret = ""
89
+ ret << "header = %s\n" % @header.to_s
90
+
91
+ ret << "*** %u DIFAT sectors\n" % @difat.length
92
+ ret << @difat.to_s << "\n"
93
+
94
+ ret << "*** %u FAT sectors\n" % @fat.length
95
+ ret << @fat.to_s << "\n"
96
+
97
+ ret << "*** %u MiniFAT sectors:\n" % @minifat.length
98
+ if (@minifat.length > 0)
99
+ ret << @minifat.to_s << "\n"
100
+ end
101
+
102
+ ret << "*** ministream (%u bytes):\n" % @ministream.length
103
+ if (@ministream.length > 0)
104
+ ret << @ministream.to_s << "\n"
105
+ end
106
+
107
+ ret << "*** %u directory entries\n" % @directory.num_entries
108
+ ret << @directory.to_s << "\n"
109
+ end
110
+
111
+
112
+ #
113
+ # stream manipulation functions
114
+ #
115
+ def create_stream(name, mode=STGM_WRITE, parent_stg=nil)
116
+ if (stm = open_stream(name, mode, parent_stg))
117
+ stm.close
118
+ return nil
119
+ end
120
+
121
+ # eek, don't check the name for now
122
+ # if we do, we cant create alot of streams (summary info for example)
123
+ =begin
124
+ if (not Util.name_is_valid(name))
125
+ return nil
126
+ end
127
+ =end
128
+
129
+ stm = Stream.new self
130
+ stm.name = name
131
+ parent_stg ||= @directory
132
+ dlog("Adding stream #{name} to storage #{parent_stg.name}", 'rex', LEV_3)
133
+ @directory.link_item(parent_stg, stm)
134
+ @modified = true
135
+ stm
136
+ end
137
+
138
+ def open_stream(name, mode=STGM_READ, parent_stg=nil)
139
+ parent_stg ||= @directory
140
+ stm = parent_stg.find_stream_by_name_and_type(name, STGTY_STREAM)
141
+ if (stm)
142
+ # TODO: optimize out the need to read all of the data up-front
143
+ stm << read_stream_data(stm)
144
+ end
145
+ stm
146
+ end
147
+
148
+
149
+ #
150
+ # storage manipulation functions
151
+ #
152
+ def create_storage(name, mode=STGM_READ, parent_stg=nil)
153
+ stg = SubStorage.new self
154
+ stg.name = name
155
+ parent_stg ||= @directory
156
+ dlog("Adding storage #{name} to storage #{parent_stg.name}", 'rex', LEV_3)
157
+ @directory.link_item(parent_stg, stg)
158
+ stg
159
+ end
160
+
161
+ def open_storage(name, mode=STGM_READ, parent_stg=nil)
162
+ @directory.find_stream_by_name_and_type(name, STGTY_STORAGE)
163
+ end
164
+
165
+
166
+ #
167
+ # low-level functions
168
+ #
169
+ def write_to_disk
170
+ # reset FAT/DIFAT
171
+ @difat = DIFAT.new self
172
+ @fat = FAT.new self
173
+
174
+ @header.write @fd
175
+ write_user_data
176
+
177
+ # NOTE: we call write_stream here since we MUST write this to
178
+ # the regular stream (regardless of size)
179
+ ms_start = write_stream(@ministream)
180
+ @directory.set_ministream_params(ms_start, @ministream.length)
181
+
182
+ @minifat.write
183
+ @directory.write
184
+ @fat.write(@difat)
185
+ @difat.write
186
+
187
+ # write it again, now that its complete
188
+ @header.write @fd
189
+ @fd.flush
190
+ end
191
+
192
+ def write_sector(sbuf, type=nil, prev_sect=nil)
193
+ len = sbuf.length
194
+ if (len != @header.sector_size)
195
+ # pad it if less
196
+ if (len < @header.sector_size)
197
+ sbuf = sbuf.dup
198
+ sbuf << "\x00" * (@header.sector_size - len)
199
+ else
200
+ raise RuntimeError, 'not sector sized!'
201
+ end
202
+ end
203
+
204
+ # write the data
205
+ idx = @fat.allocate_sector(type)
206
+ # point previous sector to here
207
+ if (prev_sect)
208
+ @fat[prev_sect] = idx
209
+ end
210
+ write_sector_raw(idx, sbuf)
211
+ return idx
212
+ end
213
+
214
+ def write_sector_raw(sect, sbuf)
215
+ dlog("Writing sector 0x%02x" % sect, 'rex', LEV_3)
216
+ @fd.seek((sect + 1) * @header.sector_size, ::IO::SEEK_SET)
217
+ @fd.write(sbuf)
218
+ end
219
+
220
+
221
+ def write_mini_sector(sbuf, prev_sect=nil)
222
+ len = sbuf.length
223
+ if (len != @header.mini_sector_size)
224
+ if (len < @header.mini_sector_size)
225
+ sbuf = sbuf.dup
226
+ sbuf << "\x00" * (@header.mini_sector_size - len)
227
+ else
228
+ raise RuntimeError, 'not mini sector sized!'
229
+ end
230
+ end
231
+
232
+ idx = @minifat.allocate_sector
233
+ # point the previous mini sector to here
234
+ if (prev_sect)
235
+ @minifat[prev_sect] = idx
236
+ end
237
+ write_mini_sector_raw(idx, sbuf)
238
+ idx
239
+ end
240
+
241
+ def write_mini_sector_raw(sect, sbuf)
242
+ dlog("Writing mini sector 0x%02x" % sect, 'rex', LEV_3)
243
+ @ministream << sbuf
244
+ end
245
+
246
+
247
+
248
+ def write_user_data
249
+ @directory.each_entry { |stm|
250
+ # only regular streams this pass
251
+ next if (stm.type != STGTY_STREAM)
252
+
253
+ if (stm.length >= @header._ulMiniSectorCutoff)
254
+ stm.start_sector = write_stream(stm)
255
+ else
256
+ # NOTE: stm_start is a minifat value
257
+ stm.start_sector = write_mini_stream(stm)
258
+ end
259
+ }
260
+ end
261
+
262
+ def write_stream(stm)
263
+ dlog("Writing \"%s\" to regular stream" % stm.name, 'rex', LEV_3)
264
+ stm_start = nil
265
+ prev_sect = nil
266
+ stm.seek(0)
267
+ while (sbuf = stm.read(@header.sector_size))
268
+ sect = write_sector(sbuf, nil, prev_sect)
269
+ stm_start ||= sect
270
+ prev_sect = sect
271
+ end
272
+ stm_start
273
+ end
274
+
275
+ def write_mini_stream(stm)
276
+ dlog("Writing \"%s\" to mini stream" % stm.name, 'rex', LEV_3)
277
+ prev_sect = nil
278
+ stm.seek(0)
279
+ while (sbuf = stm.read(@header.mini_sector_size))
280
+ sect = write_mini_sector(sbuf, prev_sect)
281
+ stm_start ||= sect
282
+ prev_sect = sect
283
+ end
284
+ stm_start
285
+ end
286
+
287
+
288
+ def read_stream_data(direntry)
289
+ if (direntry.length < @header._ulMiniSectorCutoff)
290
+ return read_data_mini(direntry)
291
+ end
292
+
293
+ read_data(direntry)
294
+ end
295
+
296
+ def read_data(direntry)
297
+ ret = ""
298
+ visited = []
299
+ left = direntry.length
300
+ sect = direntry.start_sector
301
+ while (sect != SECT_END)
302
+ if (visited.include?(sect))
303
+ raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
304
+ end
305
+ visited << sect
306
+
307
+ # how much to read?
308
+ block = @header.sector_size
309
+ block = left if (block > left)
310
+
311
+ # read it.
312
+ dlog("read_data - reading 0x%x bytes" % block, 'rex', LEV_3)
313
+ buf = read_sector(sect, block)
314
+ ret << buf
315
+ left -= buf.length
316
+
317
+ # done?
318
+ break if (left == 0)
319
+
320
+ sect = next_sector(sect)
321
+ end
322
+ ret
323
+ end
324
+
325
+ def read_data_mini(direntry)
326
+ ret = ""
327
+ visited = []
328
+ left = direntry.length
329
+ sect = direntry.start_sector
330
+ while (sect != SECT_END)
331
+ if (visited.include?(sect))
332
+ raise RuntimeError, 'Sector chain loop detected (0x%08x mini)' % sect
333
+ end
334
+ visited << sect
335
+
336
+ # how much to read?
337
+ block = @header.mini_sector_size
338
+ block = left if (block > left)
339
+
340
+ # read it.
341
+ dlog("read_data_mini - reading 0x%x bytes" % block, 'rex', LEV_3)
342
+ buf = read_mini_sector(sect, block)
343
+ ret << buf
344
+ left -= buf.length
345
+
346
+ # done?
347
+ break if (left == 0)
348
+
349
+ sect = next_mini_sector(sect)
350
+ end
351
+ ret
352
+ end
353
+
354
+
355
+ def read_sector(sect, len)
356
+ off = ((sect + 1) * @header.sector_size)
357
+ @fd.seek(off, ::IO::SEEK_SET)
358
+ buf = @fd.read(len)
359
+ if (not buf)
360
+ if (@fd.eof?)
361
+ raise RuntimeError, 'EOF while reading sector data (0x%08x)' % sect
362
+ else
363
+ raise RuntimeError, 'Unknown error while reading sector data (0x%08x)' % sect
364
+ end
365
+ end
366
+ if (buf.length != len)
367
+ raise RuntimeError, 'Insufficient data for sector (0x%08x): got %u of %u' % [sect, buf.length, len]
368
+ end
369
+ buf
370
+ end
371
+
372
+ def next_sector(sect)
373
+ return SECT_END if (sect >= @fat.length)
374
+ @fat[sect]
375
+ end
376
+
377
+
378
+ def read_mini_sector(sect, len)
379
+ dlog("Reading mini sector 0x%x" % sect, 'rex', LEV_3)
380
+ off = (@header.mini_sector_size * sect)
381
+ dlog("Reading from offset 0x%x of ministream" % off, 'rex', LEV_3)
382
+ @ministream.seek(off)
383
+ data = @ministream.read(len)
384
+ data
385
+ end
386
+
387
+ def next_mini_sector(sect)
388
+ return SECT_END if (sect >= @minifat.length)
389
+ @minifat[sect]
390
+ end
391
+
392
+ end
393
+
394
+ end
395
+ end