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,51 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/socket/parameters'
7
+
8
+ class Rex::Socket::Parameters::UnitTest < Test::Unit::TestCase
9
+
10
+ def test_parameters
11
+ h = {
12
+ 'PeerHost' => 'phost',
13
+ 'PeerPort' => 12,
14
+ 'LocalHost' => 'lhost',
15
+ 'LocalPort' => 47,
16
+ 'Bare' => true,
17
+ 'Server' => true,
18
+ 'Comm' => 'nothing',
19
+ 'Proto' => 'tcp',
20
+ 'SSL' => true
21
+ }
22
+
23
+ p = Rex::Socket::Parameters.from_hash(h)
24
+
25
+ assert_equal('phost', p.peerhost, "peerhost")
26
+ assert_equal('phost', p.peeraddr, "peeraddr")
27
+ assert_equal(12, p.peerport, "peerport")
28
+ assert_equal('lhost', p.localhost, "localhost")
29
+ assert_equal('lhost', p.localaddr, "localaddr")
30
+ assert_equal(47, p.localport, "localport")
31
+ assert_equal(true, p.bare?, "bare")
32
+ assert_equal(true, p.server?, "server")
33
+ assert_equal(false, p.client?, "client")
34
+ assert_equal('nothing', p.comm, "comm")
35
+ assert_equal(true, p.tcp?, "proto tcp")
36
+ assert_equal(false, p.udp?, "proto udp")
37
+ assert_equal(true, p.ssl, "ssl")
38
+
39
+ p = Rex::Socket::Parameters.from_hash({})
40
+
41
+ assert_equal(nil, p.peerhost, "null peerhost")
42
+ assert_equal('0.0.0.0', p.localhost, "default localhost")
43
+ assert_equal(0, p.peerport, "0 peerport")
44
+ assert_equal(0, p.localport, "0 localport")
45
+ assert_equal(false, p.bare, "default false bare")
46
+ assert_equal('tcp', p.proto, "default tcp proto")
47
+ assert_equal(false, p.server, "default false server")
48
+ assert_equal(false, p.ssl, "default false ssl")
49
+ end
50
+
51
+ end
@@ -0,0 +1,295 @@
1
+ require 'rex/socket'
2
+
3
+ module Rex
4
+ module Socket
5
+
6
+ ###
7
+ #
8
+ # This class provides an interface to enumerating an IP range
9
+ #
10
+ # This class uses start,stop pairs to represent ranges of addresses. This
11
+ # is very efficient for large numbers of consecutive addresses, and not
12
+ # show-stoppingly inefficient when storing a bunch of non-consecutive
13
+ # addresses, which should be a somewhat unusual case.
14
+ #
15
+ ###
16
+ class RangeWalker
17
+
18
+ #
19
+ # Initializes a walker instance using the supplied range
20
+ #
21
+ def initialize(parseme)
22
+ if parseme.is_a? RangeWalker
23
+ @ranges = parseme.ranges.dup
24
+ else
25
+ @ranges = parse(parseme)
26
+ end
27
+ reset
28
+ end
29
+
30
+ def self.parse(parseme)
31
+ self.new.parse(parseme)
32
+ end
33
+
34
+ def parse(parseme)
35
+ return nil if not parseme
36
+ ranges = []
37
+ parseme.split(' ').each { |arg|
38
+ if arg.include?("/")
39
+ # Then it's CIDR notation and needs special case
40
+ if arg =~ /[,-]/
41
+ # Improper CIDR notation (can't mix with 1,3 or 1-3 style IP ranges)
42
+ return false
43
+ end
44
+ expanded = expand_cidr(arg)
45
+ if expanded
46
+ ranges += expanded
47
+ else
48
+ return false
49
+ end
50
+ elsif arg.include?(":")
51
+ # Then it's IPv6
52
+ # Can't really do much with IPv6 right now, just return it and
53
+ # hope for the best
54
+ addr = Rex::Socket.addr_atoi(arg)
55
+ ranges.push [addr, addr, true]
56
+ elsif arg =~ /[^-0-9,.*]/
57
+ # Then it's a domain name and we should send it on to addr_atoi
58
+ # unmolested to force a DNS lookup.
59
+ addr = Rex::Socket.addr_atoi(arg)
60
+ ranges.push [addr, addr]
61
+ else
62
+ expanded = expand_nmap(arg)
63
+ if expanded
64
+ ranges += expanded
65
+ else
66
+ return false
67
+ end
68
+ end
69
+ }
70
+
71
+ return ranges
72
+ end
73
+
74
+ #
75
+ # Resets the subnet walker back to its original state.
76
+ #
77
+ def reset
78
+ return false if not valid?
79
+ @curr_range = 0
80
+ @curr_addr = @ranges[0][0]
81
+
82
+ @length = 0
83
+ @ranges.each { |r| @length += r[1] - r[0] + 1 }
84
+ end
85
+
86
+ #
87
+ # Returns the next IP address.
88
+ #
89
+ def next_ip
90
+ return false if not valid?
91
+ if (@curr_addr > @ranges[@curr_range][1])
92
+ if (@curr_range >= @ranges.length - 1)
93
+ return nil
94
+ end
95
+ @curr_range += 1
96
+ @curr_addr = @ranges[@curr_range][0]
97
+ end
98
+ addr = Rex::Socket.addr_itoa(@curr_addr, @ranges[@curr_range][2])
99
+ @curr_addr += 1
100
+ return addr
101
+ end
102
+
103
+ def valid?
104
+ (@ranges and not @ranges.empty?)
105
+ end
106
+
107
+ #
108
+ # Returns true if the argument is an ip address that falls within any of
109
+ # the stored ranges.
110
+ #
111
+ def include?(addr)
112
+ return false if not @ranges
113
+ if (addr.is_a? String)
114
+ addr = Rex::Socket.addr_atoi(addr)
115
+ end
116
+ @ranges.map { |r|
117
+ if r.start <= addr and addr <= r.stop
118
+ return true
119
+ end
120
+ }
121
+ return false
122
+ end
123
+
124
+ #
125
+ # Calls the given block with each address
126
+ #
127
+ def each(&block)
128
+ while (ip = next_ip)
129
+ block.call(ip)
130
+ end
131
+ end
132
+
133
+ #
134
+ # Returns an array with one element, a Range defined by the given CIDR
135
+ # block.
136
+ #
137
+ def expand_cidr(arg)
138
+ start,stop = Rex::Socket.cidr_crack(arg)
139
+ if !start or !stop
140
+ return false
141
+ end
142
+ range = Range.new
143
+ range.start = Rex::Socket.addr_atoi(start)
144
+ range.stop = Rex::Socket.addr_atoi(stop)
145
+ range.ipv6 = (arg.include?(":"))
146
+
147
+ return [range]
148
+ end
149
+
150
+ #
151
+ # Expands an nmap-style host range x.x.x.x where x can be simply "*" which
152
+ # means 0-255 or any combination and repitition of:
153
+ # i,n
154
+ # n-m
155
+ # i,n-m
156
+ # n-m,i
157
+ # ensuring that n is never greater than m.
158
+ #
159
+ # non-unique elements will be removed
160
+ # e.g.:
161
+ # 10.1.1.1-3,2-2,2 => ["10.1.1.1", "10.1.1.2", "10.1.1.3"]
162
+ # 10.1.1.1-3,7 => ["10.1.1.1", "10.1.1.2", "10.1.1.3", "10.1.1.7"]
163
+ #
164
+ # Returns an array of Ranges
165
+ #
166
+ def expand_nmap(arg)
167
+ # Can't really do anything with IPv6
168
+ return false if arg.include?(":")
169
+
170
+ # nmap calls these errors, but it's hard to catch them with our
171
+ # splitting below, so short-cut them here
172
+ return false if arg.include?(",-") or arg.include?("-,")
173
+
174
+ bytes = []
175
+ sections = arg.split('.')
176
+ if sections.length != 4
177
+ # Too many or not enough dots
178
+ return false
179
+ end
180
+ sections.each { |section|
181
+ if section.empty?
182
+ # pretty sure this is an unintentional artifact of the C
183
+ # functions that turn strings into ints, but it sort of makes
184
+ # sense, so why not
185
+ # "10...1" => "10.0.0.1"
186
+ section = "0"
187
+ end
188
+
189
+ if section == "*"
190
+ # I think this ought to be 1-254, but this is how nmap does it.
191
+ section = "0-255"
192
+ elsif section.include?("*")
193
+ return false
194
+ end
195
+
196
+ # Break down the sections into ranges like so
197
+ # "1-3,5-7" => ["1-3", "5-7"]
198
+ ranges = section.split(',', -1)
199
+ sets = []
200
+ ranges.each { |r|
201
+ bounds = []
202
+ if r.include?('-')
203
+ # Then it's an actual range, break it down into start,stop
204
+ # pairs:
205
+ # "1-3" => [ 1, 3 ]
206
+ # if the lower bound is empty, start at 0
207
+ # if the upper bound is empty, stop at 255
208
+ #
209
+ bounds = r.split('-', -1)
210
+ return false if (bounds.length > 2)
211
+
212
+ bounds[0] = 0 if bounds[0].nil? or bounds[0].empty?
213
+ bounds[1] = 255 if bounds[1].nil? or bounds[1].empty?
214
+ bounds.map!{|b| b.to_i}
215
+ return false if bounds[0] > bounds[1]
216
+ else
217
+ # Then it's a single value
218
+ bounds[0] = r.to_i
219
+ end
220
+ return false if bounds[0] > 255 or (bounds[1] and bounds[1] > 255)
221
+ return false if bounds[1] and bounds[0] > bounds[1]
222
+ if bounds[1]
223
+ bounds[0].upto(bounds[1]) do |i|
224
+ sets.push(i)
225
+ end
226
+ elsif bounds[0]
227
+ sets.push(bounds[0])
228
+ end
229
+ }
230
+ bytes.push(sets.sort.uniq)
231
+ }
232
+
233
+ #
234
+ # Combinitorically squish all of the quads together into a big list of
235
+ # ip addresses, stored as ints
236
+ #
237
+ # e.g.:
238
+ # [[1],[1],[1,2],[1,2]]
239
+ # =>
240
+ # [atoi("1.1.1.1"),atoi("1.1.1.2"),atoi("1.1.2.1"),atoi("1.1.2.2")]
241
+ addrs = []
242
+ for a in bytes[0]
243
+ for b in bytes[1]
244
+ for c in bytes[2]
245
+ for d in bytes[3]
246
+ ip = (a << 24) + (b << 16) + (c << 8) + d
247
+ addrs.push ip
248
+ end
249
+ end
250
+ end
251
+ end
252
+
253
+ addrs.sort!
254
+ addrs.uniq!
255
+ rng = Range.new
256
+ rng.start = addrs[0]
257
+ ranges = []
258
+ 1.upto(addrs.length - 1) do |idx|
259
+ if addrs[idx - 1] + 1 == addrs[idx]
260
+ # Then this address is contained in the current range
261
+ next
262
+ else
263
+ # Then this address is the upper bound for the current range
264
+ rng.stop = addrs[idx - 1]
265
+ ranges.push(rng.dup)
266
+ rng.start = addrs[idx]
267
+ end
268
+ end
269
+ rng.stop = addrs[addrs.length - 1]
270
+ ranges.push(rng.dup)
271
+ return ranges
272
+ end
273
+
274
+ #
275
+ # The total number of IPs within the range
276
+ #
277
+ attr_reader :ranges
278
+ attr_reader :length
279
+
280
+ # for backwards compatibility
281
+ alias :num_ips :length
282
+
283
+ end
284
+
285
+ class Range < Array
286
+ def start; self[0]; end
287
+ def stop; self[1]; end
288
+ def ipv6; self[2]; end
289
+ def start=(val); self[0] = val; end
290
+ def stop=(val); self[1] = val; end
291
+ def ipv6=(val); self[2] = val; end
292
+ end
293
+
294
+ end
295
+ end
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/socket/range_walker'
7
+
8
+ class Rex::Socket::RangeWalker::UnitTest < Test::Unit::TestCase
9
+
10
+ Klass = Rex::Socket::RangeWalker
11
+
12
+ def test_walker
13
+
14
+ #
15
+ # Single argument
16
+ #
17
+ s = Klass.new('10.0.0.0-10.0.0.255')
18
+
19
+ 0.upto(255) { |x|
20
+ assert_equal('10.0.0.' + x.to_s, s.next_ip)
21
+ }
22
+ assert_nil(s.next_ip)
23
+
24
+ s.reset
25
+
26
+ 0.upto(255) { |x|
27
+ assert_equal('10.0.0.' + x.to_s, s.next_ip)
28
+ }
29
+ assert_nil(s.next_ip)
30
+
31
+ #
32
+
33
+
34
+ #
35
+ # Backwards
36
+ #
37
+ s = Klass.new('10.0.0.255-10.0.0.0')
38
+
39
+ 0.upto(255) { |x|
40
+ assert_equal('10.0.0.' + x.to_s, s.next_ip)
41
+ }
42
+ assert_nil(s.next_ip)
43
+
44
+ #
45
+ # Same address
46
+ #
47
+ s = Klass.new('10.0.0.255-10.0.0.255')
48
+ assert_equal('10.0.0.255', s.next_ip)
49
+ assert_nil(s.next_ip)
50
+
51
+
52
+
53
+ end
54
+
55
+ end
@@ -0,0 +1,184 @@
1
+ require 'rex/socket'
2
+
3
+ ###
4
+ #
5
+ # This class provides methods for interacting with an SSL TCP client
6
+ # connection.
7
+ #
8
+ ###
9
+ module Rex::Socket::SslTcp
10
+
11
+ begin
12
+ @@loaded_openssl = false
13
+
14
+ begin
15
+ require 'openssl'
16
+ @@loaded_openssl = true
17
+ rescue ::Exception
18
+ end
19
+
20
+
21
+ include Rex::Socket::Tcp
22
+
23
+ ##
24
+ #
25
+ # Factory
26
+ #
27
+ ##
28
+
29
+ #
30
+ # Creates an SSL TCP instance.
31
+ #
32
+ def self.create(hash = {})
33
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
34
+ hash['SSL'] = true
35
+ self.create_param(Rex::Socket::Parameters.from_hash(hash))
36
+ end
37
+
38
+ #
39
+ # Set the SSL flag to true and call the base class's create_param routine.
40
+ #
41
+ def self.create_param(param)
42
+ param.ssl = true
43
+ Rex::Socket::Tcp.create_param(param)
44
+ end
45
+
46
+ ##
47
+ #
48
+ # Class initialization
49
+ #
50
+ ##
51
+
52
+ #
53
+ # Initializes the SSL socket.
54
+ #
55
+ def initsock(params = nil)
56
+ super
57
+
58
+
59
+ version = :SSLv3
60
+ if(params)
61
+ case params.ssl_version
62
+ when 'SSL2'
63
+ version = :SSLv2
64
+ when 'TLS1'
65
+ version = :TLSv1
66
+ end
67
+ end
68
+
69
+ # Build the SSL connection
70
+ self.sslctx = OpenSSL::SSL::SSLContext.new(version)
71
+
72
+ # Configure the SSL context
73
+ # TODO: Allow the user to specify the verify mode and callback
74
+ # Valid modes:
75
+ # VERIFY_CLIENT_ONCE
76
+ # VERIFY_FAIL_IF_NO_PEER_CERT
77
+ # VERIFY_NONE
78
+ # VERIFY_PEER
79
+ self.sslctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
80
+ self.sslctx.options = OpenSSL::SSL::OP_ALL
81
+
82
+ # Set the verification callback
83
+ self.sslctx.verify_callback = Proc.new do |valid, store|
84
+ self.peer_verified = valid
85
+ true
86
+ end
87
+
88
+ # Tie the context to a socket
89
+ self.sslsock = OpenSSL::SSL::SSLSocket.new(self, self.sslctx)
90
+
91
+ # XXX - enabling this causes infinite recursion, so disable for now
92
+ # self.sslsock.sync_close = true
93
+
94
+ # Force a negotiation timeout
95
+ begin
96
+ Timeout.timeout(params.timeout) do
97
+ # Negotiate the connection
98
+ self.sslsock.connect
99
+ end
100
+
101
+ rescue ::Timeout::Error
102
+ raise Rex::ConnectionTimeout.new(params.peerhost, params.peerport)
103
+ end
104
+ end
105
+
106
+ ##
107
+ #
108
+ # Stream mixin implementations
109
+ #
110
+ ##
111
+
112
+ #
113
+ # Writes data over the SSL socket.
114
+ #
115
+ def write(buf, opts = {})
116
+ return sslsock.write(buf)
117
+ end
118
+
119
+ #
120
+ # Reads data from the SSL socket.
121
+ #
122
+ def read(length = nil, opts = {})
123
+ length = 16384 unless length
124
+
125
+ begin
126
+ return sslsock.sysread(length)
127
+ rescue EOFError, ::Errno::EPIPE
128
+ return nil
129
+ end
130
+ end
131
+
132
+ #
133
+ # Closes the SSL socket.
134
+ #
135
+ def close
136
+ sslsock.close
137
+ super
138
+ end
139
+
140
+ #
141
+ # Ignore shutdown requests
142
+ #
143
+ def shutdown(how=0)
144
+ # Calling shutdown() on an SSL socket can lead to bad things
145
+ # Cause of http://metasploit.com/dev/trac/ticket/102
146
+ end
147
+
148
+ #
149
+ # Access to peer cert
150
+ #
151
+ def peer_cert
152
+ sslsock.peer_cert if sslsock
153
+ end
154
+
155
+ #
156
+ # Access to peer cert chain
157
+ #
158
+ def peer_cert_chain
159
+ sslsock.peer_cert_chain if sslsock
160
+ end
161
+
162
+ #
163
+ # Access to the current cipher
164
+ #
165
+ def cipher
166
+ sslsock.cipher if sslsock
167
+ end
168
+
169
+
170
+
171
+ attr_reader :peer_verified # :nodoc:
172
+ attr_accessor :sslsock, :sslctx # :nodoc:
173
+ protected
174
+
175
+ attr_writer :peer_verified # :nodoc:
176
+
177
+ rescue LoadError
178
+ end
179
+
180
+ def type?
181
+ return 'tcp-ssl'
182
+ end
183
+
184
+ end