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,128 @@
1
+ ##
2
+ # $Id: ole.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
+ # License: MSF_LICENSE
11
+ #
12
+ #
13
+ # This module implements Object-Linking-and-Embedding otherwise known as
14
+ # Compound File Binary File Format or Windows Compound Binary File Format.
15
+ # OLE is the container format for modern Excel, Word, PowerPoint, and many
16
+ # other file formats.
17
+ #
18
+ # NOTE: This implementation is almost fully compliant with [MS-CFB] v1.1
19
+ #
20
+ #
21
+ # SUPPORTS:
22
+ #
23
+ # 1. R/W v3 OLE files (v4 may work, but wasn't tested)
24
+ # 2. RO double-indirect fat sectors
25
+ # 3. RO fat sectors (including those in double-indirect parts)
26
+ # 4. WO support for less than 109 fat sectors :)
27
+ # 5. R/W minifat sectors
28
+ # 6. R/W ministream
29
+ # 7. R/W normal streams
30
+ # 8. R/W substorages (including nesting)
31
+ # 9. full directory support (hierarchal and flattened access)
32
+ # 10. big and little endian files (although only little endian was tested)
33
+ #
34
+ #
35
+ # TODO (in order of priority):
36
+ #
37
+ # 1. support deleting storages/streams
38
+ # 2. create copyto and other typical interface functions
39
+ # 3. support writing DIF sectors > 109
40
+ # - may lead to allocating more fat sectors :-/
41
+ # 4. properly support mode params for open_stream/open_storage/etc
42
+ # 5. optimize to prevent unecessary loading/writing
43
+ # 6. support for auxillary streams (DocumentSummaryInformation and SummaryInformation)
44
+ # 7. support non-committal editing (open, change, close w/o save)
45
+ # 8. support timestamps
46
+ # 9. provide interface to change paramters (endian, etc)
47
+ #
48
+ #
49
+ # TO INVESTIGATE:
50
+ #
51
+ # 1. moving storage interface functions into something used by both
52
+ # the main storage and substorages (unifying the code) (mixin?)
53
+ # 2. eliminating flattening the directory prior to writing it out
54
+ #
55
+ ##
56
+
57
+ require 'rex'
58
+
59
+ module Rex
60
+ module OLE
61
+
62
+ # misc util
63
+ # NOTE: the v1.1 spec says that everything "MUST be stored in little-endian byte order"
64
+ BIG_ENDIAN = 0xfeff
65
+ LITTLE_ENDIAN = 0xfffe
66
+ # defines Util class
67
+ require 'rex/ole/util'
68
+ require 'rex/ole/clsid'
69
+
70
+
71
+ # constants for dealing with the header
72
+ HDR_SZ = 512
73
+ # signatures
74
+ SIG = "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1"
75
+ SIG_BETA = "\x0e\x11\xfc\x0d\xd0\xcf\x11\xe0"
76
+ # defines Header class
77
+ require 'rex/ole/header'
78
+
79
+
80
+ # sector types
81
+ SECT_MAX = 0xfffffffa
82
+ SECT_DIF = 0xfffffffc
83
+ SECT_FAT = 0xfffffffd
84
+ SECT_END = 0xfffffffe
85
+ SECT_FREE = 0xffffffff
86
+ # defines DIFAT class
87
+ require 'rex/ole/difat'
88
+ # defines FAT class
89
+ require 'rex/ole/fat'
90
+ # defines MiniFAT class
91
+ require 'rex/ole/minifat'
92
+
93
+
94
+ # directory entries
95
+ DIRENTRY_SZ = 128
96
+ DIR_NOSTREAM = 0xffffffff
97
+ DIR_MAXREGSID = 0xfffffffa
98
+ # defines Directory class
99
+ require 'rex/ole/directory'
100
+
101
+ # types
102
+ STGTY_INVALID = 0
103
+ STGTY_STORAGE = 1
104
+ STGTY_STREAM = 2
105
+ STGTY_LOCKBYTES = 3
106
+ STGTY_PROPERTY = 4
107
+ STGTY_ROOT = 5
108
+ # for red/black tree
109
+ COLOR_RED = 0
110
+ COLOR_BLACK = 1
111
+ # defines DirEntry base class
112
+ require 'rex/ole/direntry'
113
+
114
+
115
+ # constants for storages
116
+ STGM_READ = 0
117
+ STGM_WRITE = 1
118
+ STGM_READWRITE = 2
119
+ # defines Storage class
120
+ require 'rex/ole/storage'
121
+ # defines SubStorage class
122
+ require 'rex/ole/substorage'
123
+ # defines Stream class
124
+ require 'rex/ole/stream'
125
+
126
+
127
+ end
128
+ end
@@ -0,0 +1,47 @@
1
+ ##
2
+ # $Id: clsid.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
+
12
+ module Rex
13
+ module OLE
14
+
15
+ class CLSID
16
+
17
+ def initialize(buf=nil)
18
+ @buf = buf
19
+ @buf ||= "\x00" * 16
20
+ end
21
+
22
+ def pack
23
+ @buf
24
+ end
25
+
26
+ def to_s
27
+ ret = ""
28
+ ret << "%08x" % Util.get32(@buf, 0)
29
+ ret << "-"
30
+ ret << "%04x" % Util.get16(@buf, 4)
31
+ ret << "-"
32
+ ret << "%04x" % Util.get16(@buf, 6)
33
+ ret << "-"
34
+ idx = 0
35
+ last8 = @buf[8,8]
36
+ last8.unpack('C*').each { |byte|
37
+ ret << [byte].pack('C').unpack('H*')[0]
38
+ ret << "-" if (idx == 1)
39
+ idx += 1
40
+ }
41
+ ret
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,141 @@
1
+ ##
2
+ # $Id: difat.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 DIFAT
15
+
16
+ def initialize stg
17
+ @stg = stg
18
+ @entries = []
19
+ end
20
+
21
+ #
22
+ # convenience access to entries
23
+ #
24
+ def []=(idx,expr)
25
+ @entries[idx] = expr
26
+ end
27
+
28
+ def [](idx)
29
+ @entries[idx]
30
+ end
31
+
32
+ def +(expr)
33
+ @entries += expr
34
+ self
35
+ end
36
+
37
+ def <<(expr)
38
+ @entries << expr
39
+ end
40
+
41
+ def length
42
+ @entries.length
43
+ end
44
+
45
+ def slice!(start,stop)
46
+ @entries.slice!(start,stop)
47
+ end
48
+
49
+ def reset
50
+ @entries = []
51
+ end
52
+
53
+ def each
54
+ @entries.each { |el|
55
+ yield el
56
+ }
57
+ end
58
+
59
+ #
60
+ # woop
61
+ #
62
+ def to_s
63
+ ret = "{ "
64
+ @entries.each { |el|
65
+ ret << ", " if (ret.length > 2)
66
+ case el
67
+ when SECT_END
68
+ ret << "END"
69
+ when SECT_DIF
70
+ ret << "DIF"
71
+ when SECT_FAT
72
+ ret << "FAT"
73
+ when SECT_FREE
74
+ ret << "FREE"
75
+ else
76
+ ret << "0x%x" % el
77
+ end
78
+ }
79
+ ret << " }"
80
+ ret
81
+ end
82
+
83
+ #
84
+ # low-level functions
85
+ #
86
+ def read
87
+ @entries = []
88
+
89
+ # start with the header part
90
+ @entries += @stg.header._sectFat
91
+
92
+ # double indirect fat
93
+ sect = @stg.header._sectDifStart
94
+ while (sect != SECT_END)
95
+ if (@entries.include?(sect))
96
+ raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
97
+ end
98
+
99
+ @entries << sect
100
+ buf = @stg.read_sector(sect, @stg.header.sector_size)
101
+
102
+ # the last sect ptr in the block becomes the next entry
103
+ sect = Util.get32(buf, ((@stg.header.idx_per_sect)-1) * 4)
104
+ end
105
+
106
+ # don't need these free ones, but it doesn't hurt to keep them.
107
+ #@difat.delete(SECT_FREE)
108
+ end
109
+
110
+ def write
111
+ len = @entries.length
112
+ first109 = @entries.dup
113
+
114
+ rest = nil
115
+ if (len > 109)
116
+ rest = first109.slice!(109,len)
117
+ end
118
+
119
+ @stg.header._sectFat = []
120
+ @stg.header._sectFat += first109
121
+ if (len < 109)
122
+ need = 109 - len
123
+ need.times {
124
+ @stg.header._sectFat << SECT_FREE
125
+ }
126
+ end
127
+
128
+ if (rest and rest.length > 0)
129
+ raise RuntimeError, 'TODO: support writing DIF properly!'
130
+ # may require adding more fat sectors :-/
131
+ #@stg.header._csectDif = rest.length
132
+ #@stg.header._sectDifStart = idx
133
+ end
134
+
135
+ @stg.header._csectFat = len
136
+ end
137
+
138
+ end
139
+
140
+ end
141
+ end
@@ -0,0 +1,230 @@
1
+ ##
2
+ # $Id: directory.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
+ require 'rex/ole/direntry'
15
+
16
+ #
17
+ # This class serves as the root directory entry in addition to
18
+ # an abstraction around the concept of a directory as a whole.
19
+ #
20
+ class Directory < DirEntry
21
+
22
+ # XXX: num_entries is not maintained once a stream/storage is added!
23
+ attr_accessor :num_entries
24
+
25
+ def initialize(stg)
26
+ super
27
+
28
+ @num_entries = 1
29
+ end
30
+
31
+
32
+ # woop, recursive each
33
+ def yield_entries(de, &block)
34
+ block.call(de)
35
+ de.each { |el|
36
+ yield_entries(el, &block)
37
+ }
38
+ end
39
+ def each_entry(&block)
40
+ yield_entries(self, &block)
41
+ end
42
+
43
+
44
+ def set_ministream_params(start, size)
45
+ @_sectStart = start
46
+ @_ulSize = size
47
+ end
48
+
49
+ def link_item(parent, child)
50
+ # set sid, advance count
51
+ child.sid = @num_entries
52
+ @num_entries += 1
53
+
54
+
55
+ # link item to siblings and/or parent
56
+ if (parent._sidChild == DIR_NOSTREAM)
57
+ parent._sidChild = child.sid
58
+ dlog("Linking #{child.name} as THE child of #{parent.name} as sid #{child.sid}", 'rex', LEV_3)
59
+ else
60
+ sib = nil
61
+ parent.each { |el|
62
+ if (el._sidLeftSib == DIR_NOSTREAM)
63
+ sib = el
64
+ el._sidLeftSib = child.sid
65
+ dlog("Linking #{child.name} as the LEFT sibling of #{sib.name} as sid #{child.sid}", 'rex', LEV_3)
66
+ break
67
+ end
68
+ if (el._sidRightSib == DIR_NOSTREAM)
69
+ sib = el
70
+ el._sidRightSib = child.sid
71
+ dlog("Linking #{child.name} as the RIGHT sibling of #{sib.name} as sid #{child.sid}", 'rex', LEV_3)
72
+ break
73
+ end
74
+ }
75
+ raise RuntimeError, 'Unable to find a sibling to link to in the directory'
76
+ end
77
+ parent << child
78
+ end
79
+
80
+
81
+ #
82
+ # low-level functions
83
+ #
84
+ def from_s(sid, buf)
85
+ super
86
+
87
+ if (@_sidRightSib != DIR_NOSTREAM)
88
+ raise RuntimeError, 'Root Entry is invalid! (has right sibling)'
89
+ end
90
+ if (@_sidLeftSib != DIR_NOSTREAM)
91
+ raise RuntimeError, 'Root Entry is invalid! (has left sibling)'
92
+ end
93
+ end
94
+
95
+ def read
96
+ @children = []
97
+ visited = []
98
+ entries = []
99
+ root_node = nil
100
+ sect = @stg.header._sectDirStart
101
+ while (sect != SECT_END)
102
+
103
+ if (visited.include?(sect))
104
+ raise RuntimeError, 'Sector chain loop detected (0x%08x)' % sect
105
+ end
106
+ visited << sect
107
+
108
+ sbuf = @stg.read_sector(sect, @stg.header.sector_size)
109
+ while (sbuf.length >= DIRENTRY_SZ)
110
+ debuf = sbuf.slice!(0, DIRENTRY_SZ)
111
+
112
+ type = Util.get8(debuf, 0x42)
113
+ case type
114
+ when STGTY_ROOT
115
+ if (entries.length != 0)
116
+ raise RuntimeError, 'Root Entry found, but not first encountered!'
117
+ end
118
+ if (root_node)
119
+ raise RuntimeError, 'Multiple root directory sectors detected (0x%08x)' % sect
120
+ end
121
+ de = self
122
+ root_node = de
123
+
124
+ when STGTY_STORAGE
125
+ de = SubStorage.new @stg
126
+
127
+ when STGTY_STREAM
128
+ de = Stream.new @stg
129
+
130
+ when STGTY_INVALID
131
+ # skip invalid entries
132
+ next
133
+
134
+ else
135
+ raise RuntimeError, 'Unsupported directory entry type (0x%02x)' % type
136
+ end
137
+
138
+ # read content
139
+ de.from_s(entries.length, debuf)
140
+ entries << de
141
+ end
142
+ sect = @stg.next_sector(sect)
143
+ end
144
+
145
+ @num_entries = entries.length
146
+
147
+ # sort out the tree structure, starting with the root
148
+ if (@_sidChild != DIR_NOSTREAM)
149
+ populate_children(entries, root_node, @_sidChild)
150
+ end
151
+ end
152
+
153
+
154
+ # recursively add entries to their proper parents :)
155
+ def populate_children(entries, parent, sid)
156
+ node = entries[sid]
157
+ dlog("populate_children(entries, \"#{parent.name}\", #{sid}) - node: #{node.name}", 'rex', LEV_3)
158
+ parent << node
159
+ if (node.type == STGTY_STORAGE) and (node._sidChild != DIR_NOSTREAM)
160
+ populate_children(entries, node, node._sidChild)
161
+ end
162
+ if (node._sidLeftSib != DIR_NOSTREAM)
163
+ populate_children(entries, parent, node._sidLeftSib)
164
+ end
165
+ if (node._sidRightSib != DIR_NOSTREAM)
166
+ populate_children(entries, parent, node._sidRightSib)
167
+ end
168
+ end
169
+
170
+ # NOTE: this may not be necessary if we were to use each_entry
171
+ def flatten_tree(entries, parent)
172
+ entries << parent
173
+ parent.each { |el|
174
+ flatten_tree(entries, el)
175
+ }
176
+ end
177
+
178
+
179
+ def write
180
+ # flatten the directory again
181
+ entries = []
182
+ flatten_tree(entries, self)
183
+ dlog("flattened tree has #{entries.length} entries...", 'rex', LEV_3)
184
+
185
+ # count directory sectors
186
+ ds_count = entries.length / 4
187
+ if ((entries.length % 4) > 0)
188
+ # one more sector to hold the rest
189
+ ds_count += 1
190
+ end
191
+
192
+ # put the root entry first
193
+ sbuf = self.pack
194
+
195
+ # add the rest
196
+ prev_sect = nil
197
+ dir_start = nil
198
+ entries.each { |de|
199
+ # we already got the root entry, no more!
200
+ next if (de.type == STGTY_ROOT)
201
+
202
+ dir = de.pack
203
+ dlog("writing dir entry #{de.name}", 'rex', LEV_3)
204
+ sbuf << dir
205
+
206
+ if (sbuf.length == @stg.header.sector_size)
207
+ # we have a full sector, add it!
208
+ sect = @stg.write_sector(sbuf, nil, prev_sect)
209
+ prev_sect = sect
210
+ dir_start ||= sect
211
+ # reset..
212
+ sbuf = ""
213
+ end
214
+ }
215
+
216
+ # still a partial sector left?
217
+ if (sbuf.length > 0)
218
+ # add it! (NOTE: it will get padded with nul bytes if its not sector sized)
219
+ sect = @stg.write_sector(sbuf, nil, prev_sect)
220
+ prev_sect = sect
221
+ dir_start ||= sect
222
+ end
223
+
224
+ @stg.header._sectDirStart = dir_start
225
+ end
226
+
227
+ end
228
+
229
+ end
230
+ end