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,93 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/proto/http'
7
+
8
+ class Rex::Proto::Http::Client::UnitTest < Test::Unit::TestCase
9
+
10
+ Klass = Rex::Proto::Http::Client
11
+
12
+ def test_parse
13
+ c = Klass.new('www.metasploit.com')
14
+
15
+ # Set request factory parameters
16
+ c.set_config(
17
+ 'vhost' => 'www.metasploit.com',
18
+ 'agent' => 'Metasploit Framework/3.3',
19
+ 'version' => '1.1',
20
+ 'cookie' => 'NoCookie=NotACookie'
21
+ )
22
+
23
+ # Set client parameters
24
+ c.set_config(
25
+ 'read_max_data' => 1024 * 1024
26
+ )
27
+
28
+ #
29
+ # Request the main web page
30
+ #
31
+ r = c.request_raw(
32
+ 'method' => 'GET',
33
+ 'uri' => '/'
34
+ )
35
+
36
+ resp = c.send_recv(r)
37
+
38
+ assert_equal(200, resp.code)
39
+ assert_equal('OK', resp.message)
40
+ assert_equal('1.1', resp.proto)
41
+
42
+ #
43
+ # Request a file that does not exist
44
+ #
45
+ r = c.request_raw(
46
+ 'method' => 'GET',
47
+ 'uri' => '/NoFileHere.404'
48
+ )
49
+
50
+ resp = c.send_recv(r)
51
+
52
+ assert_equal(404, resp.code)
53
+ assert_equal('Not Found', resp.message)
54
+ assert_equal('1.1', resp.proto)
55
+
56
+
57
+ #
58
+ # Send a POST request that results in a 302
59
+ #
60
+ c = Klass.new('beta.microsoft.com')
61
+ c.set_config('vhost' => 'beta.microsoft.com')
62
+
63
+ r = c.request_cgi(
64
+ 'method' => 'POST',
65
+ 'uri' => '/',
66
+ 'vars_post' => { 'var' => 'val' },
67
+ 'ctype' => 'application/x-www-form-urlencoded'
68
+ )
69
+
70
+ resp = c.send_recv(r)
71
+
72
+ assert_equal(200, resp.code)
73
+ assert_equal('OK', resp.message)
74
+ assert_equal('1.1', resp.proto)
75
+ end
76
+
77
+ def test_ssl
78
+ c = Klass.new('www.metasploit.com', 443, {}, true)
79
+ c.set_config('vhost' => 'www.metasploit.com')
80
+ r = c.request_raw(
81
+ 'method' => 'GET',
82
+ 'uri' => '/'
83
+ )
84
+ resp = c.send_recv(r)
85
+
86
+ assert_equal(200, resp.code)
87
+ assert_equal('OK', resp.message)
88
+ assert_equal('1.0', resp.proto)
89
+ c.close
90
+ end
91
+
92
+ end
93
+
@@ -0,0 +1,46 @@
1
+ module Rex
2
+ module Proto
3
+ module Http
4
+
5
+ ###
6
+ #
7
+ # This class acts as the base class for all handlers.
8
+ #
9
+ ###
10
+ class Handler
11
+
12
+ require 'rex/proto/http/handler/erb'
13
+ require 'rex/proto/http/handler/proc'
14
+
15
+ #
16
+ # Initializes the handler instance as being associated with the supplied
17
+ # server.
18
+ #
19
+ def initialize(server)
20
+ self.server = server
21
+ end
22
+
23
+ #
24
+ # By default, handlers do not require a relative resource.
25
+ #
26
+ def self.relative_resource_required?
27
+ false
28
+ end
29
+
30
+ #
31
+ # Calls the class method.
32
+ #
33
+ def relative_resource_required?
34
+ self.class.relative_resource_required?
35
+ end
36
+
37
+ protected
38
+
39
+ attr_accessor :server # :nodoc:
40
+
41
+ end
42
+
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,128 @@
1
+ require 'erb'
2
+ include ERB::Util
3
+
4
+ module Rex
5
+ module Proto
6
+ module Http
7
+
8
+ ###
9
+ #
10
+ # This class implements a handler for ERB (.rhtml) template files. This is
11
+ # based off the webrick handler.
12
+ #
13
+ ###
14
+ class Handler::Erb < Handler
15
+
16
+ #
17
+ # ERB handlers required a relative resource so that the full path name can
18
+ # be computed.
19
+ #
20
+ def self.relative_resource_required?
21
+ true
22
+ end
23
+
24
+ #
25
+ # Initializes the ERB handler
26
+ #
27
+ def initialize(server, root_path, opts = {})
28
+ super(server)
29
+
30
+ self.root_path = root_path
31
+ self.opts = opts
32
+
33
+ self.opts['MimeType'] = "text/html" unless self.opts['MimeType']
34
+ end
35
+
36
+ #
37
+ # Called when a request arrives.
38
+ #
39
+ def on_request(cli, req)
40
+ resource = req.relative_resource
41
+
42
+ # Make sure directory traversals aren't happening
43
+ if (resource =~ /\.\./)
44
+ wlog("Erb::on_request: Dangerous request performed: #{resource}",
45
+ LogSource)
46
+ return
47
+ # If the request is for the root directory, use the document index file.
48
+ elsif (resource == '/')
49
+ resource << opts['DocumentIndex'] || 'index.rhtml'
50
+ end
51
+
52
+ begin
53
+ resp = Response.new
54
+
55
+ # Calculate the actual file path on disk.
56
+ file_path = root_path + resource
57
+
58
+ # Serialize the contents of the file
59
+ data = ''
60
+
61
+ File.open(file_path, 'rb') { |f|
62
+ data = f.read
63
+ }
64
+
65
+ # Set the content-type to text/html by default. We do this before
66
+ # evaluation so that the script can change it.
67
+ resp['Content-Type'] = server ? server.mime_type(resource) : 'text/html'
68
+
69
+ # If the requested file is a ruby html file, evaluate it.
70
+ if (File.extname(file_path) == ".rhtml")
71
+ # Evaluate the data and set the output as the response body.
72
+ resp.body = evaluate(ERB.new(data), cli, req, resp)
73
+ # Otherwise, just set the body to the data that was read.
74
+ else
75
+ resp.body = data
76
+ end
77
+ rescue Errno::ENOENT
78
+ server.send_e404(cli, req)
79
+ rescue
80
+ elog("Erb::on_request: #{$!}\n#{$@.join("\n")}", LogSource)
81
+
82
+ resp.code = 500
83
+ resp.message = "Internal Server Error"
84
+ resp.body =
85
+ "<html><head>" +
86
+ "<title>Internal Server Error</title>" +
87
+ "</head><body> " +
88
+ "<h1>Internal Server Error</h1>" +
89
+ "The server encountered an error:<br/><br/> <b>" + html_escape($!) + "</b><br/><br/>" +
90
+ "Stack trace:<br/><br/>" +
91
+ $@.map { |e| html_escape(e.to_s) }.join("<br/>") +
92
+ "</body></html>"
93
+ end
94
+
95
+ # Send the response to the
96
+ if (cli and resp)
97
+ cli.send_response(resp)
98
+ end
99
+
100
+ resp
101
+ end
102
+
103
+ #
104
+ # Evaulates the ERB context in a specific binding context.
105
+ #
106
+ def evaluate(erb, cli, request, response)
107
+ # If the thing that created this handler wanted us to use a callback
108
+ # instead of the default behavior, then let's do that.
109
+ if (opts['ErbCallback'])
110
+ opts['ErbCallback'].call(erb, cli, request, response)
111
+ else
112
+ Module.new.module_eval {
113
+ query_string = request.qstring
114
+ meta_vars = request.meta_vars
115
+ erb.result(binding)
116
+ }
117
+ end
118
+ end
119
+
120
+ protected
121
+
122
+ attr_accessor :root_path, :opts # :nodoc:
123
+
124
+ end
125
+
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/proto/http'
7
+
8
+ class Rex::Proto::Http::Handler::Erb::UnitTest < Test::Unit::TestCase
9
+
10
+ Klass = Rex::Proto::Http::Handler::Erb
11
+ Request = Rex::Proto::Http::Request
12
+
13
+ def test_erb
14
+ k = Klass.new(nil, File.dirname(__FILE__))
15
+ r = k.on_request(nil, Request::Get.new("/erb.rb.ut.rb.rhtml"))
16
+
17
+ assert_not_nil(r)
18
+ assert_equal("foo 4\n", r.body)
19
+ end
20
+
21
+ end
@@ -0,0 +1 @@
1
+ foo <%= 2 + 2 %>
@@ -0,0 +1,54 @@
1
+ require 'erb'
2
+
3
+ module Rex
4
+ module Proto
5
+ module Http
6
+
7
+ ###
8
+ #
9
+ # This class is used to wrapper the calling of a procedure when a request
10
+ # arrives.
11
+ #
12
+ ###
13
+ class Handler::Proc < Handler
14
+
15
+ #
16
+ # Initializes the proc handler with the supplied procedure
17
+ #
18
+ def initialize(server, procedure, virt_dir = false)
19
+ super(server)
20
+
21
+ self.procedure = procedure
22
+ self.virt_dir = virt_dir || false
23
+ end
24
+
25
+ #
26
+ # Returns true if the procedure is representing a virtual directory.
27
+ #
28
+ def relative_resource_required?
29
+ virt_dir
30
+ end
31
+
32
+ #
33
+ # Called when a request arrives.
34
+ #
35
+ def on_request(cli, req)
36
+ begin
37
+ procedure.call(cli, req)
38
+ rescue Errno::EPIPE
39
+ elog("Proc::on_request: Client closed connection prematurely", LogSource)
40
+ rescue
41
+ elog("Proc::on_request: #{$!}\n\n#{$@.join("\n")}", LogSource)
42
+ end
43
+ end
44
+
45
+ protected
46
+
47
+ attr_accessor :procedure # :nodoc:
48
+ attr_accessor :virt_dir # :nodoc:
49
+
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/proto/http'
7
+
8
+ class Rex::Proto::Http::Handler::Proc::UnitTest < Test::Unit::TestCase
9
+
10
+ Klass = Rex::Proto::Http::Handler::Proc
11
+ Request = Rex::Proto::Http::Request
12
+
13
+ def test_proc
14
+ cool = 0
15
+ k = Klass.new(nil, Proc.new { |cli, req|
16
+ cool = 1
17
+ })
18
+
19
+ r = k.on_request(nil, Request::Get.new("/erb.rb.ut.rb.rhtml"))
20
+
21
+ assert_equal(1, cool)
22
+ end
23
+
24
+ end
@@ -0,0 +1,161 @@
1
+ require 'rex/proto/http'
2
+
3
+ module Rex
4
+ module Proto
5
+ module Http
6
+
7
+ ###
8
+ #
9
+ # Represents the logical HTTP header portion of an HTTP packet (request or
10
+ # response).
11
+ #
12
+ ###
13
+ class Packet::Header < Hash
14
+
15
+ #
16
+ # Initializes an HTTP packet header class that inherits from a Hash base
17
+ # class.
18
+ #
19
+ def initialize
20
+ self.dcase_hash = {}
21
+
22
+ reset
23
+ end
24
+
25
+ #
26
+ # Parses a header from a string.
27
+ #
28
+ # XXX - Putting : in a header value breaks this badly
29
+ def from_s(header)
30
+ reset
31
+
32
+ # ghettoooooo!
33
+ # If we don't have any newlines..., put one there.
34
+ if (header.size > 0 && header !~ /\r\n/)
35
+ header << "\r\n"
36
+ end
37
+
38
+ # put the non-standard line terminations back to normal
39
+ # gah. not having look behinds suck,
40
+ header.gsub!(/([^\r])\n/,'\1' + "\r\n")
41
+
42
+ # undo folding, kinda ugly but works for now.
43
+ header.gsub!(/:\s*\r\n\s+/smi,': ')
44
+
45
+ # Extract the command string
46
+ self.cmd_string = header.slice!(/.+\r\n/)
47
+
48
+ # Extract each header value pair
49
+ header.split(/\r\n/m).each { |str|
50
+ if (md = str.match(/^(.+?): (.+?)$/))
51
+ if (self[md[1]])
52
+ self[md[1]] << ", " + md[2]
53
+ else
54
+ self[md[1]] = md[2]
55
+ end
56
+ end
57
+ }
58
+ end
59
+
60
+ #
61
+ # More advanced [] that does downcase comparison.
62
+ #
63
+ def [](key)
64
+ begin
65
+ rv = self.fetch(key)
66
+ rescue IndexError
67
+ rv = nil
68
+ end
69
+ if (rv == nil)
70
+ begin
71
+ rv = self.dcase_hash[key.downcase]
72
+ rescue IndexError
73
+ rv = nil
74
+ end
75
+ end
76
+
77
+ return rv
78
+ end
79
+
80
+ #
81
+ # More advanced []= that does downcase storage.
82
+ #
83
+ def []=(key, value)
84
+ stored = false
85
+
86
+ self.each_key { |k|
87
+ if (k.downcase == key.downcase)
88
+ self.store(k, value)
89
+ stored = true
90
+ end
91
+ }
92
+
93
+ self.store(key, value) if (stored == false)
94
+ self.dcase_hash[key.downcase] = value
95
+ end
96
+
97
+ #
98
+ # Converts the header to a string.
99
+ #
100
+ def to_s(prefix = '')
101
+ str = prefix
102
+
103
+ if self.junk_headers
104
+ while str.length < 4096
105
+ if self.fold
106
+ str << "X-#{Rex::Text.rand_text_alphanumeric(rand(30) + 5)}:\r\n\t#{Rex::Text.rand_text_alphanumeric(rand(1024) + 1)}\r\n"
107
+ else
108
+ str << "X-#{Rex::Text.rand_text_alphanumeric(rand(30) + 5)}: #{Rex::Text.rand_text_alphanumeric(rand(1024) + 1)}\r\n"
109
+ end
110
+ end
111
+ end
112
+
113
+ each_pair { |var, val|
114
+ if self.fold
115
+ str << "#{var}:\r\n\t#{val}\r\n"
116
+ else
117
+ str << "#{var}: #{val}\r\n"
118
+ end
119
+ }
120
+
121
+ str << "\r\n"
122
+
123
+ return str
124
+ end
125
+
126
+ #
127
+ # Brings in from an array like yo.
128
+ #
129
+ def from_a(ary)
130
+ ary.each { |e|
131
+ self[e[0]] = e[1]
132
+ }
133
+ end
134
+
135
+ #
136
+ # Flushes all header pairs.
137
+ #
138
+ def reset
139
+ self.cmd_string = ''
140
+ self.clear
141
+ self.dcase_hash.clear
142
+ end
143
+
144
+ #
145
+ # The raw command string associated with the header which will vary between
146
+ # requests and responses.
147
+ #
148
+ attr_accessor :junk_headers
149
+ attr_accessor :cmd_string
150
+ attr_accessor :fold
151
+
152
+ protected
153
+
154
+ attr_accessor :dcase_hash # :nodoc:
155
+
156
+ end
157
+
158
+ end
159
+ end
160
+ end
161
+