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,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'rex/test'
6
+ require 'rex/proto/drda/constants'
7
+
8
+ class Rex::Proto::DRDA::Constants::UnitTest < Test::Unit::TestCase
9
+
10
+ Konst = Rex::Proto::DRDA::Constants
11
+
12
+ def test_defines
13
+ assert_equal(Konst::EXCSAT, 0x1041)
14
+ assert_equal(Konst::MGRLVLLS, 0x1404)
15
+ assert_equal(Konst::SECCHKCD, 0x11a4)
16
+ end
17
+
18
+ def test_const_values
19
+ assert_kind_of(Array, Konst.const_values)
20
+ assert Konst.const_values.include? Konst::EXCSAT
21
+ end
22
+
23
+ end
@@ -0,0 +1,252 @@
1
+ require 'rex/proto/drda'
2
+
3
+ module Rex
4
+ module Proto
5
+ module DRDA
6
+
7
+ class Error < StandardError; end
8
+ class RespError < Error; end
9
+
10
+ # See:
11
+ # http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.drda/db2z_excsat.htm
12
+ class MGRLVLLS_PARAM < Struct.new(:length, :codepoint, :payload)
13
+ def initialize(args={})
14
+ self[:codepoint] = Constants::MGRLVLLS
15
+ self[:payload] = "\x14\x03\x00\x0a\x24\x07\x00\x0a" +
16
+ "\x14\x74\x00\x05\x24\x0f\x00\x08" +
17
+ "\x14\x40\x00\x09\x1c\x08\x04\xb8"
18
+ self[:length] = self[:payload].to_s.size+4
19
+ end
20
+ def to_s
21
+ self.to_a.pack("nna*")
22
+ end
23
+ end
24
+
25
+ # Currently, only takes a MGRLVLLS param. Extend the struct
26
+ # when more parameters are defined.
27
+ class EXCSAT_DDM < Struct.new(:length, :magic, :format, :correlid, :length2,
28
+ :codepoint, :mgrlvlls)
29
+
30
+ def initialize(args={})
31
+ self[:magic] = 0xd0
32
+ self[:format] = 0x41
33
+ self[:correlid] = 1
34
+ self[:codepoint] = Constants::EXCSAT
35
+ self[:mgrlvlls] = args[:mgrlvlls] || MGRLVLLS_PARAM.new.to_s
36
+ self[:length] = (10 + self[:mgrlvlls].to_s.size)
37
+ self[:length2] = self[:length]-6
38
+ end
39
+
40
+ def to_s
41
+ packstr = "nCCnnn"
42
+ packstr += "a*" # Pack smarter as more params are added.
43
+ self.to_a.pack(packstr)
44
+ end
45
+ end
46
+
47
+ # See http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.drda/db2z_accsec.htm
48
+ # for all sorts of info about SECMEC.
49
+ class SECMEC_PARAM < Struct.new(:length, :codepoint, :payload)
50
+ def initialize(args={})
51
+ self[:length] = 6
52
+ self[:codepoint] = Constants::SECMEC
53
+ self[:payload] = 3 # Plaintext username and password.
54
+ end
55
+ def to_s
56
+ self.to_a.pack("nnn")
57
+ end
58
+ end
59
+
60
+ # Relational Database name parameter.
61
+ class RDBNAM_PARAM < Struct.new(:length, :codepoint, :payload)
62
+ def initialize(args={})
63
+ self[:length] = 22 # Since the database name is padded out.
64
+ self[:codepoint] = Constants::RDBNAM
65
+ self[:payload] = encode(args[:payload].to_s)
66
+ end
67
+
68
+ def encode(str)
69
+ Rex::Text.to_ebcdic([str].pack("A18"))
70
+ end
71
+
72
+ def payload=(str)
73
+ self[:payload] = encode(str.to_s)
74
+ end
75
+
76
+ def to_s
77
+ self.to_a.pack("nna18")
78
+ end
79
+
80
+ end
81
+
82
+ # The ACCSEC DDM is responsible for picking the security mechanism (SECMEC)
83
+ # which, in our case, will always be plain text username and password. It
84
+ # also sets the relational database name (RDBNAM), if specified. You need
85
+ # one to login, but not to probe.
86
+ class ACCSEC_DDM < Struct.new(:length, :magic, :format, :correlid, :length2,
87
+ :codepoint, :secmec, :rdbnam)
88
+ def initialize(args={})
89
+ self[:magic] = 0xd0
90
+ self[:format] = args[:format] || 0x01
91
+ self[:correlid] = 2
92
+ self[:codepoint] = Constants::ACCSEC
93
+ self[:secmec] = SECMEC_PARAM.new.to_s
94
+ if args[:dbname] # Include a database name if we're given one.
95
+ self[:rdbnam] = RDBNAM_PARAM.new(:payload => args[:dbname]).to_s
96
+ end
97
+ self[:length] = 10 + self[:secmec].to_s.size + self[:rdbnam].to_s.size
98
+ self[:length2] = self[:length]-6
99
+ end
100
+ def dbname=(str)
101
+ self[:rdbnam] = RDBNAM_PARAM.new(:payload => args[:dbname]).to_s
102
+ end
103
+ def to_s
104
+ packstr = "nCCnnna6"
105
+ packstr += "a22" if self[:rdbnam]
106
+ self.to_a.pack(packstr)
107
+ end
108
+ end
109
+
110
+ class DDM_PARAM < Struct.new(:length, :codepoint, :payload)
111
+
112
+ def read(str="")
113
+ raise DRDA::Error, "Input isn't a String." if !str.kind_of? String
114
+ raise DRDA::RespError, "DDM_PARAM is too short" if str.size < 4
115
+ (self[:length], self[:codepoint]) =
116
+ str.unpack("nn")
117
+ raise DRDA::RespError, "DDM_PARAM Length is too short" if self[:length] < 4
118
+ rest = str[4,self[:length]-4] # If it's negative or whatever, it'll end up as "".
119
+ self[:payload] = rest.to_s[0,self[:length]-4]
120
+ return self
121
+ end
122
+
123
+ def to_s
124
+ self.to_a.pack("nna*")
125
+ end
126
+
127
+ end
128
+
129
+ class BASIC_DDM < Struct.new(:length, :magic, :format, :correlid,
130
+ :length2, :codepoint, :payload)
131
+ def initialize
132
+ self[:payload] = []
133
+ end
134
+
135
+ def read(str="")
136
+ self[:payload].clear
137
+ raise DRDA::Error, "Input isn't a String." if !str.kind_of? String
138
+ raise DRDA::RespError, "Response is too short." if str.size < 10
139
+ (self[:length],self[:magic],self[:format],
140
+ self[:correlid],self[:length2],self[:codepoint]) =
141
+ str.unpack("nCCnnn")
142
+ sanity_check
143
+ rest = str[10,self[:length2]-4]
144
+ i = 0
145
+ while (i < rest.size)
146
+ if self[:codepoint] == Constants::SQLCARD # These aren't DDM's.
147
+ this_param = rest[i,self[:length]-10]
148
+ else
149
+ this_param = DDM_PARAM.new.read(rest[i,rest.size])
150
+ end
151
+ self[:payload] << this_param
152
+ i += this_param.to_s.size
153
+ end
154
+ return self
155
+ end
156
+
157
+ # Just a quick test.
158
+ def sanity_check
159
+ if self[:length] < 10
160
+ raise DRDA::RespError, "DDM Length is too short."
161
+ elsif self[:length2] < 4
162
+ raise DRDA::RespError, "DDM Length2 is too short."
163
+ elsif self[:length]-6 != self[:length2]
164
+ raise DRDA::RespError, "Codepoint: 0x#{self[:codepoint].to_s(16)} DDM Length2 (0x#{self[:length2].to_s(16)}) isn't six less than Length (0x#{self[:length].to_s(16)})"
165
+ end
166
+ end
167
+
168
+ def to_s
169
+ self.to_a.pack("nCCnnn") + self[:payload].map {|x| x.to_s}.join
170
+ end
171
+
172
+ end
173
+
174
+ class SERVER_PACKET < Array
175
+
176
+ def read(str="")
177
+ raise DRDA::Error, "Input isn't a String." if !str.kind_of? String
178
+ self.clear
179
+ i = 0
180
+ while(i < str.size)
181
+ this_ddm = BASIC_DDM.new.read(str[i,str.size])
182
+ self << this_ddm
183
+ i += this_ddm.to_s.size
184
+ end
185
+ return self
186
+ end
187
+
188
+ def to_s; self.join; end
189
+ def sz; self.to_s.size; end
190
+
191
+ end
192
+
193
+ class PASSWORD_PARAM < Struct.new(:length, :codepoint, :payload)
194
+ def initialize(args={})
195
+ self[:codepoint] = Constants::PASSWORD
196
+ self[:payload] = Rex::Text.to_ebcdic(args[:payload].to_s)
197
+ self[:length] = self[:payload].size + 4
198
+ end
199
+ def encode(str)
200
+ Rex::Text.to_ebcdic(str)
201
+ end
202
+ def to_s
203
+ self.to_a.pack("nna*")
204
+ end
205
+ end
206
+
207
+ class USERID_PARAM < Struct.new(:length, :codepoint, :payload)
208
+ def initialize(args={})
209
+ self[:codepoint] = Constants::USERID
210
+ self[:payload] = Rex::Text.to_ebcdic(args[:payload].to_s)
211
+ self[:length] = self[:payload].size + 4
212
+ end
213
+ def encode(str)
214
+ Rex::Text.to_ebcdic(str)
215
+ end
216
+ def to_s
217
+ self.to_a.pack("nna*")
218
+ end
219
+ end
220
+
221
+ class SECCHK_DDM < Struct.new(:length, :magic, :format, :correlid, :length2,
222
+ :codepoint, :secmec, :rdbnam, :password, :userid)
223
+ def initialize(args={}) # Takes :dbname, :dbpass, :dbuser
224
+ self[:magic] = 0xd0
225
+ self[:format] = 0x01
226
+ self[:correlid] = 2
227
+ self[:codepoint] = Constants::SECCHK
228
+ self[:secmec] = SECMEC_PARAM.new.to_s
229
+ if args[:dbname] # Include a database name if we're given one.
230
+ self[:rdbnam] = RDBNAM_PARAM.new(:payload => args[:dbname]).to_s
231
+ end
232
+ self[:password] = PASSWORD_PARAM.new(:payload => args[:dbpass]).to_s
233
+ self[:userid] = USERID_PARAM.new(:payload => args[:dbuser]).to_s
234
+ self[:length] = ( 10 + self[:secmec].to_s.size + self[:rdbnam].to_s.size +
235
+ self[:password].to_s.size + self[:userid].to_s.size )
236
+ self[:length2] = self[:length]-6
237
+ end
238
+ def dbname=(str)
239
+ self[:rdbnam] = RDBNAM_PARAM.new(:payload => args[:dbname]).to_s
240
+ end
241
+ def to_s
242
+ packstr = "nCCnnna6"
243
+ packstr += "a22" if self[:rdbnam]
244
+ packstr += "a*a*" # username and password
245
+ self.to_a.pack(packstr)
246
+ end
247
+ end
248
+
249
+ end
250
+ end
251
+ end
252
+
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'rex/test'
6
+ require 'rex/proto/drda/packet'
7
+
8
+ class Rex::Proto::DRDA::UnitTest < Test::Unit::TestCase
9
+
10
+ Klass = Rex::Proto::DRDA
11
+ Konst = Rex::Proto::DRDA::Constants
12
+
13
+ # Test a sample param
14
+ def test_mgrlvlls_param
15
+ p = Klass::MGRLVLLS_PARAM.new
16
+ assert_kind_of(Struct, p)
17
+ assert_equal(Konst::MGRLVLLS, p.codepoint)
18
+ end
19
+
20
+ # Test a sample ddm
21
+ def test_secchk_ddm
22
+ d = Klass::SECCHK_DDM.new
23
+ assert_kind_of Struct, d
24
+ assert_equal Konst::SECCHK, d.codepoint
25
+ end
26
+
27
+ # All parameter names should have a corresponding codepoint,
28
+ # except "DDM_PARAM" (a generic parameter).
29
+ def test_all_param_codepoints
30
+ params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
31
+ assert_operator params.size, :>=, 6 # Allow for more later.
32
+ params.each do |p|
33
+ cp = p.split(/_PARAM/).first
34
+ next if cp == "DDM"
35
+ assert Konst.const_defined? cp
36
+ assert_kind_of Numeric, Konst.const_get(cp)
37
+ end
38
+ end
39
+
40
+ # Similarly, so should DDM Structs.
41
+ def test_all_ddm_codepoints
42
+ ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
43
+ assert_operator ddms.size, :>=, 4 # Allow for more later.
44
+ ddms.each do |p|
45
+ cp = p.split(/_DDM/).first
46
+ next if cp == "BASIC"
47
+ assert_kind_of Numeric, Konst.const_get(cp)
48
+ end
49
+ end
50
+
51
+ # Ensure that all params have the same struct.
52
+ def test_param_struct
53
+ params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
54
+ params.each do |p|
55
+ obj = Klass.const_get(p).new
56
+ assert_equal 3, obj.size
57
+ assert_respond_to obj, :codepoint
58
+ assert_respond_to obj, :length
59
+ assert_respond_to obj, :payload
60
+ end
61
+ end
62
+
63
+ # Make some similiar assertions about DDMs, though specific DDMs
64
+ # will have particular elements after the codepoint, usually more
65
+ # than one.
66
+ def test_ddm_struct
67
+ ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
68
+ ddms.each do |d|
69
+ obj = Klass.const_get(d).new
70
+ assert_operator obj.size, :>=, 7
71
+ assert_respond_to obj, :length
72
+ assert_respond_to obj, :magic
73
+ assert_respond_to obj, :format
74
+ assert_respond_to obj, :correlid
75
+ assert_respond_to obj, :length2
76
+ assert_respond_to obj, :codepoint
77
+ end
78
+ end
79
+
80
+ # The server packet is special since it's an Array of BASIC_DDM's,
81
+ # and doesn't have a particular, fixed struct. (It would be nice
82
+ # to build those up on the fly, but we're not really interested in
83
+ # validating most server responses right now.
84
+ def test_server_packet_structure
85
+ s = Klass::SERVER_PACKET.new
86
+ assert_kind_of Array, s
87
+ assert_respond_to s, :to_s
88
+ assert_respond_to s, :sz
89
+ assert_respond_to s, :read
90
+ end
91
+
92
+ # Exercise the SERVER_PACKET#read function with a sample packet.
93
+ def test_server_packet_read
94
+ pkt = "0015d0420001000f1219000611490000000511a4000050d0520002004a2201000611490000000c112ee2d8d3f0f8f0f2f4000d002fd8e3c4e2d8d3e7f8f6000a00350006119c033300062103022e00172135c3f0c1f8f6c1f0f14bc5c6f1f2070402195612008cd0030002008624080000000000303030303053514c303830323400ffffffff0200000000000000030000000000000000000000202020202020202020202000124d59444232444220202020202020202020200000003331ff383139ff4d59555345522020ff4d594442324442ff514442322f4c494e5558ff353538ff353538ff30ff31323038ff30ffff".scan(/../).map {|x| x.to_i(16).chr}.join
95
+ s = Klass::SERVER_PACKET.new
96
+ assert_equal 0, s.size
97
+ s.read(pkt)
98
+ assert_equal 3, s.size
99
+ assert_equal Konst::SECCHKRM, s[0].codepoint
100
+ assert_equal Konst::ACCRDBRM, s[1].codepoint
101
+ assert_equal Konst::SQLCARD, s[2].codepoint
102
+ assert_equal 0xd0, s[0].magic
103
+ assert_equal 0x52, s[1].format
104
+ assert_equal 134, s[2].length2
105
+ assert_equal 21+80+140, s.sz
106
+ end
107
+
108
+ end
109
+
@@ -0,0 +1,123 @@
1
+ require 'rex/proto/drda'
2
+
3
+ module Rex
4
+ module Proto
5
+ module DRDA
6
+ class Utils
7
+
8
+ # Creates a packet with EXCSAT_DDM and an ACCSEC_DDM. This will elicit
9
+ # a reponse from the target server.
10
+ def self.client_probe(dbname=nil)
11
+ pkt = [
12
+ EXCSAT_DDM.new,
13
+ ACCSEC_DDM.new(:dbname => dbname)
14
+ ]
15
+ pkt.map {|x| x.to_s}.join
16
+ end
17
+
18
+ # Creates a packet with EXCSAT_DDM and an SECCHK_DDM.
19
+ # In order to ever succeed, you do need a successful probe first.
20
+ def self.client_auth(args={})
21
+ dbname = args[:dbname]
22
+ dbuser = args[:dbuser]
23
+ dbpass = args[:dbpass]
24
+ pkt = [
25
+ ACCSEC_DDM.new(:format => 0x41),
26
+ SECCHK_DDM.new(:dbname => dbname, :dbuser => dbuser, :dbpass => dbpass)
27
+ ]
28
+ pkt.map {|x| x.to_s}.join
29
+ end
30
+
31
+ def self.server_packet_info(obj)
32
+ info_hash = {}
33
+ return info_hash unless obj.kind_of? Rex::Proto::DRDA::SERVER_PACKET
34
+ obj.each do |ddm|
35
+ case ddm.codepoint
36
+ when Constants::EXCSATRD
37
+ info_hash.merge!(_info_excsatrd(ddm))
38
+ when Constants::ACCSECRD
39
+ info_hash.merge!(_info_accsecrd(ddm))
40
+ when Constants::RDBNFNRM
41
+ info_hash.merge!(_info_rdbnfnrm(ddm))
42
+ when Constants::SECCHKRM
43
+ info_hash.merge!(_info_secchkrm(ddm))
44
+ else
45
+ next
46
+ end
47
+ end
48
+ return info_hash
49
+ end
50
+
51
+ def self._info_excsatrd(ddm)
52
+ info_hash = {:excsatrd => true}
53
+ ddm.payload.each do |param|
54
+ case param.codepoint
55
+ when Constants::SRVNAM
56
+ info_hash[:instance_name] = Rex::Text.from_ebcdic(param.payload)
57
+ when Constants::SRVCLSNM
58
+ info_hash[:platform] = Rex::Text.from_ebcdic(param.payload)
59
+ when Constants::SRVRLSLV
60
+ info_hash[:version] = Rex::Text.from_ebcdic(param.payload)
61
+ else
62
+ next
63
+ end
64
+ end
65
+ return info_hash
66
+ end
67
+
68
+ def self._info_accsecrd(ddm)
69
+ info_hash = {:accsecrd => true}
70
+ ddm.payload.each do |param|
71
+ case param.codepoint
72
+ when Constants::SECMEC
73
+ info_hash[:plaintext_auth] = true if param.payload =~ /\x00\x03/
74
+ when Constants::SECCHKCD
75
+ info_hash[:security_check_code] = param.payload.unpack("C").first
76
+ # A little spurious? This is always nonzero when there's no SECCHKRM DDM.
77
+ info_hash[:db_login_success] = false unless info_hash[:security_check_code].zero?
78
+ else
79
+ next
80
+ end
81
+ end
82
+ return info_hash
83
+ end
84
+
85
+ def self._info_rdbnfnrm(ddm)
86
+ info_hash = {:rdbnfnrm => true}
87
+ info_hash[:database_found] = false
88
+ ddm.payload.each do |param|
89
+ case param.codepoint
90
+ when Constants::RDBNAM
91
+ info_hash[:db_name] = Rex::Text.from_ebcdic(param.payload).unpack("A*").first
92
+ when Constants::SRVDGN
93
+ info_hash[:error_message] = Rex::Text.from_ebcdic(param.payload)
94
+ else
95
+ next
96
+ end
97
+ end
98
+ return info_hash
99
+ end
100
+
101
+ def self._info_secchkrm(ddm)
102
+ info_hash = {:secchkrm => true}
103
+ ddm.payload.each do |param|
104
+ case param.codepoint
105
+ when Constants::SRVCOD
106
+ info_hash[:severity_code] = param.payload.unpack("n").first
107
+ when Constants::SECCHKCD
108
+ info_hash[:security_check_code] = param.payload.unpack("C").first
109
+ else
110
+ next
111
+ end
112
+ end
113
+ if info_hash[:serverity].to_i.zero? and info_hash[:security_check_code].to_i.zero?
114
+ info_hash[:db_login_success] = true
115
+ end
116
+ return info_hash
117
+ end
118
+
119
+ end
120
+
121
+ end
122
+ end
123
+ end