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,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'rex/test'
6
+ require 'rex/proto/smb/utils'
7
+
8
+ class Rex::Proto::SMB::Utils::UnitTest < Test::Unit::TestCase
9
+
10
+ Klass = Rex::Proto::SMB::Utils
11
+
12
+ def test_nbname
13
+
14
+ nbdecoded = 'METASPLOITROCKS!'
15
+ nbencoded = 'ENEFFEEBFDFAEMEPEJFEFCEPEDELFDCB'
16
+
17
+ assert_equal(Klass.nbname_encode(nbdecoded), nbencoded )
18
+ assert_equal(Klass.nbname_decode(nbencoded), nbdecoded )
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ require 'rex/proto/sunrpc/client'
@@ -0,0 +1,195 @@
1
+ require 'rex/socket'
2
+ require 'rex/encoder/xdr'
3
+
4
+ module Rex
5
+ module Proto
6
+ module SunRPC
7
+
8
+ class RPCTimeout < ::Interrupt
9
+ def initialize(msg = 'Operation timed out.')
10
+ @msg = msg
11
+ end
12
+
13
+ def to_s
14
+ @msg
15
+ end
16
+ end
17
+
18
+ # XXX: CPORT!
19
+ class Client
20
+ AUTH_NULL = 0
21
+ AUTH_UNIX = 1
22
+
23
+ PMAP_PROG = 100000
24
+ PMAP_VERS = 2
25
+ PMAP_GETPORT = 3
26
+
27
+ CALL = 0
28
+
29
+ attr_accessor :rhost, :rport, :proto, :program, :version
30
+ attr_accessor :pport, :call_sock, :timeout, :context
31
+
32
+ attr_accessor :should_fragment
33
+
34
+ def initialize(opts)
35
+ self.rhost = opts[:rhost]
36
+ self.rport = opts[:rport]
37
+ self.program = opts[:program]
38
+ self.version = opts[:version]
39
+ self.timeout = opts[:timeout] || 20
40
+ self.context = opts[:context] || {}
41
+ self.proto = opts[:proto]
42
+
43
+ if self.proto.downcase !~ /^(tcp|udp)$/
44
+ raise ::Rex::ArgumentError, 'Protocol is not "tcp" or "udp"'
45
+ end
46
+
47
+ @pport = nil
48
+
49
+ @auth_type = AUTH_NULL
50
+ @auth_data = ''
51
+
52
+ @call_sock = nil
53
+ end
54
+
55
+ # XXX: Add optional parameter to have proto be something else
56
+ def create()
57
+ proto_num = 0
58
+ if @proto.eql?('tcp')
59
+ proto_num = 6
60
+ elsif @proto.eql?('udp')
61
+ proto_num = 17
62
+ end
63
+
64
+ buf =
65
+ Rex::Encoder::XDR.encode(CALL, 2, PMAP_PROG, PMAP_VERS, PMAP_GETPORT,
66
+ @auth_type, [@auth_data, 400], AUTH_NULL, '',
67
+ @program, @version, proto_num, 0)
68
+
69
+ sock = make_rpc(@proto, @rhost, @rport)
70
+ send_rpc(sock, buf)
71
+ ret = recv_rpc(sock)
72
+ close_rpc(sock)
73
+
74
+ return ret
75
+ end
76
+
77
+ def call(procedure, buffer, maxwait = self.timeout)
78
+ buf =
79
+ Rex::Encoder::XDR.encode(CALL, 2, @program, @version, procedure,
80
+ @auth_type, [@auth_data, 400], AUTH_NULL, '')+
81
+ buffer
82
+
83
+ if ! @call_sock
84
+ @call_sock = make_rpc(@proto, @rhost, @pport)
85
+ end
86
+
87
+ send_rpc(@call_sock, buf)
88
+ recv_rpc(@call_sock, maxwait)
89
+ end
90
+
91
+ def destroy
92
+ close_rpc(@call_sock) if @call_sock
93
+ @call_sock = nil
94
+ end
95
+
96
+ def authnull_create
97
+ @auth_type = AUTH_NULL
98
+ @auth_data = ''
99
+ end
100
+
101
+ def authunix_create(host, uid, gid, groupz)
102
+ raise ::Rex::ArgumentError, 'Hostname length is too long' if host.length > 255
103
+ # 10?
104
+ raise ::Rex::ArgumentError, 'Too many groups' if groupz.length > 10
105
+
106
+ @auth_type = AUTH_UNIX
107
+ @auth_data =
108
+ Rex::Encoder::XDR.encode(0, host, uid, gid, groupz) # XXX: TIME! GROUPZ?!
109
+ end
110
+
111
+ # XXX: Dirty, integrate some sort of request system into create/call?
112
+ def portmap_req(host, port, rpc_vers, procedure, buffer)
113
+ buf = Rex::Encoder::XDR.encode(CALL, 2, PMAP_PROG, rpc_vers, procedure,
114
+ AUTH_NULL, '', AUTH_NULL, '') + buffer
115
+
116
+ sock = make_rpc('tcp', host, port)
117
+ send_rpc(sock, buf)
118
+ ret = recv_rpc(sock)
119
+ close_rpc(sock)
120
+
121
+ return ret
122
+ end
123
+
124
+ private
125
+ def make_rpc(proto, host, port)
126
+ Rex::Socket.create(
127
+ 'PeerHost' => host,
128
+ 'PeerPort' => port,
129
+ 'Proto' => proto,
130
+ 'Timeout' => self.timeout,
131
+ 'Context' => self.context
132
+ )
133
+ end
134
+
135
+ def build_tcp(buf)
136
+ if !self.should_fragment
137
+ return Rex::Encoder::XDR.encode(0x80000000 | buf.length) + buf
138
+ end
139
+
140
+ str = buf.dup
141
+
142
+ fragmented = ''
143
+
144
+ while (str.size > 0)
145
+ frag = str.slice!(0, rand(3) + 1)
146
+ len = frag.size
147
+ if str.size == 0
148
+ len |= 0x80000000
149
+ end
150
+
151
+ fragmented += Rex::Encoder::XDR.encode(len) + frag
152
+ end
153
+
154
+ return fragmented
155
+ end
156
+
157
+ def send_rpc(sock, buf)
158
+ buf = gen_xid() + buf
159
+ if sock.type?.eql?('tcp')
160
+ buf = build_tcp(buf)
161
+ end
162
+ sock.put(buf)
163
+ end
164
+
165
+ def recv_rpc(sock, maxwait=self.timeout)
166
+
167
+ buf = nil
168
+ begin
169
+ Timeout.timeout(maxwait) { buf = sock.get }
170
+ rescue ::Timeout
171
+ end
172
+
173
+ return nil if not buf
174
+
175
+ buf.slice!(0..3)
176
+ if sock.type?.eql?('tcp')
177
+ buf.slice!(0..3)
178
+ end
179
+ return buf if buf.length > 1
180
+ return nil
181
+ end
182
+
183
+ def close_rpc(sock)
184
+ sock.close
185
+ end
186
+
187
+ def gen_xid
188
+ return Rex::Encoder::XDR.encode(rand(0xffffffff) + 1)
189
+ end
190
+ end
191
+
192
+ end
193
+ end
194
+ end
195
+
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+
5
+ ###
6
+ #
7
+ # This class provides an easy interface for loading and executing ruby
8
+ # scripts.
9
+ #
10
+ ###
11
+ module Script
12
+
13
+ class Completed < ::RuntimeError
14
+ end
15
+
16
+ #
17
+ # Reads the contents of the supplied file and exeutes them.
18
+ #
19
+ def self.execute_file(file, in_binding = nil)
20
+ str = ''
21
+ buf = ::File.read(file, ::File.size(file))
22
+ execute(buf, in_binding)
23
+ end
24
+
25
+ #
26
+ # Executes arbitrary ruby from the supplied string.
27
+ #
28
+ def self.execute(str, in_binding = nil)
29
+ begin
30
+ eval(str, in_binding)
31
+ rescue Completed
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ require 'rex/script/base'
40
+ require 'rex/script/shell'
41
+ require 'rex/script/meterpreter'
42
+
@@ -0,0 +1,59 @@
1
+ module Rex
2
+ module Script
3
+ class Base
4
+
5
+ class OutputSink
6
+ def print(msg); end
7
+ def print_line(msg); end
8
+ def print_status(msg); end
9
+ def print_good(msg); end
10
+ def print_error(msg); end
11
+ end
12
+
13
+ attr_accessor :client, :framework, :path, :error, :args
14
+ attr_accessor :session, :sink, :workspace
15
+
16
+ def initialize(client, path)
17
+ self.client = client
18
+ self.framework = client.framework
19
+ self.path = path
20
+ self.sink = OutputSink.new
21
+
22
+ if(client.framework.db and client.framework.db.active)
23
+ self.workspace = client.framework.db.find_workspace( client.workspace.to_s ) || client.framework.db.workspace
24
+ end
25
+
26
+ # Convenience aliases
27
+ self.session = self.client
28
+ end
29
+
30
+ def output
31
+ client.user_output || self.sink
32
+ end
33
+
34
+ def completed
35
+ raise Rex::Script::Completed
36
+ end
37
+
38
+ def run(args)
39
+ self.args = args
40
+ begin
41
+ eval(::File.read(self.path, ::File.size(self.path)), binding )
42
+ rescue ::Interrupt
43
+ rescue ::Rex::Script::Completed
44
+ rescue ::Exception => e
45
+ self.error = e
46
+ raise e
47
+ end
48
+ end
49
+
50
+ def print(*args); output.print(*args); end
51
+ def print_status(*args); output.print_status(*args); end
52
+ def print_error(*args); output.print_error(*args); end
53
+ def print_good(*args); output.print_good(*args); end
54
+ def print_line(*args); output.print_line(*args); end
55
+
56
+ end
57
+ end
58
+ end
59
+
@@ -0,0 +1,9 @@
1
+
2
+ module Rex
3
+ module Script
4
+ class Meterpreter < Base
5
+
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,9 @@
1
+
2
+ module Rex
3
+ module Script
4
+ class Shell < Base
5
+
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,48 @@
1
+ require 'rex'
2
+ require 'rex/proto'
3
+
4
+ module Rex
5
+
6
+ ###
7
+ #
8
+ # The service module is used to extend classes that are passed into the
9
+ # service manager start routine. It provides extra methods, such as reference
10
+ # counting, that are used to track the service instances more uniformly.
11
+ #
12
+ ###
13
+ module Service
14
+ include Ref
15
+
16
+ require 'rex/services/local_relay'
17
+
18
+ #
19
+ # Returns the hardcore, as in porno, alias for this service. This is used
20
+ # by the service manager to manage singleton services.
21
+ #
22
+ def self.hardcore_alias(*args)
23
+ return "__#{args}"
24
+ end
25
+
26
+ def deref
27
+ rv = super
28
+
29
+ # If there's only one reference, then it's the service managers.
30
+ if @_references == 1
31
+ Rex::ServiceManager.stop_service(self)
32
+ end
33
+
34
+ rv
35
+ end
36
+
37
+ #
38
+ # Calls stop on the service once the ref count drops.
39
+ #
40
+ def cleanup
41
+ stop
42
+ end
43
+
44
+ attr_accessor :alias
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,141 @@
1
+ require 'singleton'
2
+ require 'rex'
3
+ require 'rex/service'
4
+
5
+ module Rex
6
+
7
+ ###
8
+ #
9
+ # This class manages service allocation and interaction. This class can be
10
+ # used to start HTTP servers and manage them and all that stuff. Yup.
11
+ #
12
+ ###
13
+ class ServiceManager < Hash
14
+
15
+ #
16
+ # This class is a singleton.
17
+ #
18
+ include Singleton
19
+
20
+ #
21
+ # Calls the instance method to start a service.
22
+ #
23
+ def self.start(klass, *args)
24
+ self.instance.start(klass, *args)
25
+ end
26
+
27
+ #
28
+ # Calls the instance method to stop a service.
29
+ #
30
+ def self.stop(klass, *args)
31
+ self.instance.stop(klass, *args)
32
+ end
33
+
34
+ #
35
+ # Stop a service using the alias that's associated with it.
36
+ #
37
+ def self.stop_by_alias(als)
38
+ self.instance.stop_by_alias(als)
39
+ end
40
+
41
+ #
42
+ # Stop the supplied service instance.
43
+ #
44
+ def self.stop_service(service)
45
+ self.instance.stop_service(service)
46
+ end
47
+
48
+ #
49
+ # Starts a service and assigns it a unique name in the service hash.
50
+ #
51
+ def start(klass, *args)
52
+ # Get the hardcore alias.
53
+ hals = "#{klass}" + klass.hardcore_alias(*args)
54
+
55
+ # Has a service already been constructed for this guy? If so, increment
56
+ # its reference count like it aint no thang.
57
+ if (inst = self[hals])
58
+ inst.ref
59
+ return inst
60
+ end
61
+
62
+ inst = klass.new(*args)
63
+ als = inst.alias
64
+
65
+ # Find an alias that isn't taken.
66
+ if (self[als])
67
+ cnt = 1
68
+ cnt += 1 while (self[als + " #{cnt}"])
69
+ als = inst.alias + " #{cnt}"
70
+ end
71
+
72
+ # Extend the instance as a service.
73
+ inst.extend(Rex::Service)
74
+
75
+ # Re-aliases the instance.
76
+ inst.alias = als
77
+
78
+ # Fire up the engines. If an error occurs an exception will be
79
+ # raised.
80
+ inst.start
81
+
82
+ # Alias associate and initialize reference counting
83
+ self[als] = self[hals] = inst.refinit
84
+
85
+ # Pass the caller a reference
86
+ inst.ref
87
+
88
+ inst
89
+ end
90
+
91
+ #
92
+ # Stop a service using a given klass and arguments. These should mirror
93
+ # what was originally passed to start exactly. If the reference count of
94
+ # the service drops to zero the service will be destroyed.
95
+ #
96
+ def stop(klass, *args)
97
+ stop_service(hals[hardcore_alias(klass, *args)])
98
+ end
99
+
100
+ #
101
+ # Stops a service using the provided alias.
102
+ #
103
+ def stop_by_alias(als)
104
+ stop_service(self[als])
105
+ end
106
+
107
+ #
108
+ # Stops a service instance.
109
+ #
110
+ def stop_service(inst)
111
+ # Stop the service and be done wif it, but only if the number of
112
+ # references has dropped to zero
113
+ if (inst)
114
+ # Since the instance may have multiple aliases, scan through
115
+ # all the pairs for matching stuff.
116
+ self.each_pair { |cals, cinst|
117
+ self.delete(cals) if (inst == cinst)
118
+ }
119
+
120
+ # Lose the list-held reference to the instance
121
+ inst.deref
122
+
123
+ return true
124
+ end
125
+
126
+ # Return false if the service isn't there
127
+ return false
128
+ end
129
+
130
+ protected
131
+
132
+ #
133
+ # Returns the alias for a given service instance.
134
+ #
135
+ def hardcore_alias(klass, *args)
136
+ "__#{klass.name}#{args}"
137
+ end
138
+
139
+ end
140
+
141
+ end