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,586 @@
1
+ require 'socket'
2
+ require 'thread'
3
+ require 'resolv'
4
+ require 'rex/exceptions'
5
+
6
+ module Rex
7
+
8
+ ###
9
+ #
10
+ # Base class for all sockets.
11
+ #
12
+ ###
13
+ module Socket
14
+
15
+ module Comm
16
+ end
17
+
18
+ require 'rex/socket/parameters'
19
+ require 'rex/socket/tcp'
20
+ require 'rex/socket/tcp_server'
21
+
22
+ require 'rex/socket/comm'
23
+ require 'rex/socket/comm/local'
24
+
25
+ require 'rex/socket/switch_board'
26
+ require 'rex/socket/subnet_walker'
27
+ require 'rex/socket/range_walker'
28
+
29
+ ##
30
+ #
31
+ # Factory methods
32
+ #
33
+ ##
34
+
35
+ #
36
+ # Create a socket instance using the supplied parameter hash.
37
+ #
38
+ def self.create(opts = {})
39
+ return create_param(Rex::Socket::Parameters.from_hash(opts))
40
+ end
41
+
42
+ #
43
+ # Create a socket using the supplied Rex::Socket::Parameter instance.
44
+ #
45
+ def self.create_param(param)
46
+ return param.comm.create(param)
47
+ end
48
+
49
+ #
50
+ # Create a TCP socket using the supplied parameter hash.
51
+ #
52
+ def self.create_tcp(opts = {})
53
+ return create_param(Rex::Socket::Parameters.from_hash(opts.merge('Proto' => 'tcp')))
54
+ end
55
+
56
+ #
57
+ # Create a TCP server socket using the supplied parameter hash.
58
+ #
59
+ def self.create_tcp_server(opts = {})
60
+ return create_tcp(opts.merge('Server' => true))
61
+ end
62
+
63
+ #
64
+ # Create a UDP socket using the supplied parameter hash.
65
+ #
66
+ def self.create_udp(opts = {})
67
+ return create_param(Rex::Socket::Parameters.from_hash(opts.merge('Proto' => 'udp')))
68
+ end
69
+
70
+ #
71
+ # Create a IP socket using the supplied parameter hash.
72
+ #
73
+ def self.create_ip(opts = {})
74
+ return create_param(Rex::Socket::Parameters.from_hash(opts.merge('Proto' => 'ip')))
75
+ end
76
+
77
+ ##
78
+ #
79
+ # Serialization
80
+ #
81
+ ##
82
+
83
+
84
+ # Cache our IPv6 support flag
85
+ @@support_ipv6 = nil
86
+
87
+ #
88
+ # Determine whether we support IPv6
89
+ #
90
+ def self.support_ipv6?
91
+ return @@support_ipv6 if not @@support_ipv6.nil?
92
+
93
+ @@support_ipv6 = false
94
+
95
+ if (::Socket.const_defined?('AF_INET6'))
96
+ begin
97
+ s = ::Socket.new(::Socket::AF_INET6, ::Socket::SOCK_DGRAM, ::Socket::IPPROTO_UDP)
98
+ s.close
99
+ @@support_ipv6 = true
100
+ rescue
101
+ end
102
+ end
103
+
104
+ return @@support_ipv6
105
+ end
106
+
107
+ #
108
+ # Determine whether this is an IPv4 address
109
+ #
110
+ def self.is_ipv4?(addr)
111
+ res = Rex::Socket.getaddress(addr)
112
+ res.match(/:/) ? false : true
113
+ end
114
+
115
+ #
116
+ # Determine whether this is an IPv6 address
117
+ #
118
+ def self.is_ipv6?(addr)
119
+ res = Rex::Socket.getaddress(addr)
120
+ res.match(/:/) ? true : false
121
+ end
122
+
123
+ #
124
+ # Checks to see if the supplied address is a dotted quad.
125
+ #
126
+ def self.dotted_ip?(addr)
127
+ # Assume anything with a colon is IPv6
128
+ return true if (support_ipv6? and addr =~ /:/)
129
+
130
+ # Otherwise assume this is IPv4
131
+ (addr =~ /^(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))$/) ? true : false
132
+ end
133
+
134
+ #
135
+ # Wrapper for Resolv.getaddress that takes special care to see if the
136
+ # supplied address is already a dotted quad, for instance. This is
137
+ # necessary to prevent calls to gethostbyaddr (which occurs on windows).
138
+ # These calls can be quite slow.
139
+ #
140
+ def self.getaddress(addr)
141
+ begin
142
+ dotted_ip?(addr) ? addr : Resolv.getaddress(addr)
143
+ rescue ::ArgumentError # Win32 bug
144
+ nil
145
+ end
146
+ end
147
+
148
+ #
149
+ # Wrapper for Socket.gethostbyname which takes into account whether or not
150
+ # an IP address is supplied. If it is, then reverse DNS resolution does
151
+ # not occur. This is done in order to prevent delays, such as would occur
152
+ # on Windows.
153
+ #
154
+ def self.gethostbyname(host)
155
+ if (dotted_ip?(host))
156
+ if (is_ipv4?(host))
157
+ return [ host, host, 2, host.split('.').map{ |c| c.to_i }.pack("C4") ]
158
+ end
159
+ end
160
+
161
+ ::Socket.gethostbyname(host)
162
+ end
163
+
164
+ #
165
+ # Create a sockaddr structure using the supplied IP address, port, and
166
+ # address family
167
+ #
168
+ def self.to_sockaddr(ip, port)
169
+
170
+ if (ip == '::ffff:0.0.0.0')
171
+ ip = support_ipv6?() ? '::' : '0.0.0.0'
172
+ end
173
+
174
+ return ::Socket.pack_sockaddr_in(port, ip)
175
+ end
176
+
177
+ #
178
+ # Returns the address family, host, and port of the supplied sockaddr as
179
+ # [ af, host, port ]
180
+ #
181
+ def self.from_sockaddr(saddr)
182
+ port, host = ::Socket::unpack_sockaddr_in(saddr)
183
+ af = ::Socket::AF_INET
184
+ if (support_ipv6?() and is_ipv6?(host))
185
+ af = ::Socket::AF_INET6
186
+ end
187
+ return [ af, host, port ]
188
+ end
189
+
190
+ #
191
+ # Resolves a host to raw network-byte order.
192
+ #
193
+ def self.resolv_nbo(host)
194
+ self.gethostbyname(Rex::Socket.getaddress(host))[3]
195
+ end
196
+
197
+ #
198
+ # Resolves a host to a network-byte order ruby integer.
199
+ #
200
+ def self.resolv_nbo_i(host)
201
+ addr_ntoi(resolv_nbo(host))
202
+ end
203
+
204
+ #
205
+ # Resolves a host to a dotted address.
206
+ #
207
+ def self.resolv_to_dotted(host)
208
+ addr_ntoa(addr_aton(host))
209
+ end
210
+
211
+ #
212
+ # Converts a ascii address into an integer
213
+ #
214
+ def self.addr_atoi(addr)
215
+ resolv_nbo_i(addr)
216
+ end
217
+
218
+ #
219
+ # Converts an integer address into ascii
220
+ #
221
+ def self.addr_itoa(addr, v6=false)
222
+
223
+ nboa = addr_iton(addr, v6)
224
+
225
+ # IPv4
226
+ if (addr < 0x100000000 and not v6)
227
+ nboa.unpack('C4').join('.')
228
+ # IPv6
229
+ else
230
+ nboa.unpack('n8').map{ |c| "%.4x" % c }.join(":")
231
+ end
232
+ end
233
+
234
+ #
235
+ # Converts a ascii address to network byte order
236
+ #
237
+ def self.addr_aton(addr)
238
+ resolv_nbo(addr)
239
+ end
240
+
241
+ #
242
+ # Converts a network byte order address to ascii
243
+ #
244
+ def self.addr_ntoa(addr)
245
+
246
+ # IPv4
247
+ if (addr.length == 4)
248
+ return addr.unpack('C4').join('.')
249
+ end
250
+
251
+ # IPv6
252
+ if (addr.length == 16)
253
+ return addr.unpack('n8').map{ |c| "%.4x" % c }.join(":")
254
+ end
255
+
256
+ raise RuntimeError, "Invalid address format"
257
+ end
258
+
259
+ #
260
+ # Converts a network byte order address to an integer
261
+ #
262
+ def self.addr_ntoi(addr)
263
+
264
+ bits = addr.unpack("N*")
265
+
266
+ if (bits.length == 1)
267
+ return bits[0]
268
+ end
269
+
270
+ if (bits.length == 4)
271
+ val = 0
272
+ bits.each_index { |i| val += ( bits[i] << (96 - (i * 32)) ) }
273
+ return val
274
+ end
275
+
276
+ raise RuntimeError, "Invalid address format"
277
+ end
278
+
279
+ #
280
+ # Converts an integer into a network byte order address
281
+ #
282
+ def self.addr_iton(addr, v6=false)
283
+ if(addr < 0x100000000 and not v6)
284
+ return [addr].pack('N')
285
+ else
286
+ w = []
287
+ w[0] = (addr >> 96) & 0xffffffff
288
+ w[1] = (addr >> 64) & 0xffffffff
289
+ w[2] = (addr >> 32) & 0xffffffff
290
+ w[3] = addr & 0xffffffff
291
+ return w.pack('N4')
292
+ end
293
+ end
294
+
295
+ #
296
+ # Converts a CIDR subnet into an array (base, bcast)
297
+ #
298
+ def self.cidr_crack(cidr, v6=false)
299
+ tmp = cidr.split('/')
300
+
301
+ tst,scope = tmp[0].split("%",2)
302
+ scope = "%" + scope if scope
303
+ scope ||= ""
304
+
305
+ addr = addr_atoi(tst)
306
+
307
+ bits = 32
308
+ mask = 0
309
+ use6 = false
310
+
311
+ if (addr > 0xffffffff or v6 or cidr =~ /:/)
312
+ use6 = true
313
+ bits = 128
314
+ end
315
+
316
+ mask = (2 ** bits) - (2 ** (bits - tmp[1].to_i))
317
+ base = addr & mask
318
+
319
+ stop = base + (2 ** (bits - tmp[1].to_i)) - 1
320
+ return [self.addr_itoa(base, use6) + scope, self.addr_itoa(stop, use6) + scope]
321
+ end
322
+
323
+ #
324
+ # Converts a netmask (255.255.255.240) into a bitmask (28). This is the
325
+ # lame kid way of doing it.
326
+ #
327
+ def self.net2bitmask(netmask)
328
+
329
+ nmask = resolv_nbo(netmask)
330
+ imask = addr_ntoi(nmask)
331
+ bits = 32
332
+
333
+ if (imask > 0xffffffff)
334
+ bits = 128
335
+ end
336
+
337
+ 0.upto(bits-1) do |bit|
338
+ p = 2 ** bit
339
+ return (bits - bit) if ((imask & p) == p)
340
+ end
341
+
342
+ 0
343
+ end
344
+
345
+ #
346
+ # Converts a bitmask (28) into a netmask (255.255.255.240)
347
+ # TODO: IPv6 (use is ambiguous right now)
348
+ #
349
+ def self.bit2netmask(bitmask)
350
+ [ (~((2 ** (32 - bitmask)) - 1)) & 0xffffffff ].pack('N').unpack('CCCC').join('.')
351
+ end
352
+
353
+
354
+ def self.portspec_crack(pspec)
355
+ portspec_to_portlist(pspec)
356
+ end
357
+
358
+ #
359
+ # Converts a port specification like "80,21-23,443" into a sorted,
360
+ # unique array of valid port numbers like [21,22,23,80,443]
361
+ #
362
+ def self.portspec_to_portlist(pspec)
363
+ ports = []
364
+
365
+ # Build ports array from port specification
366
+ pspec.split(/,/).each do |item|
367
+ start, stop = item.split(/-/).map { |p| p.to_i }
368
+
369
+ start ||= 0
370
+ stop ||= item.match(/-/) ? 65535 : start
371
+
372
+ start, stop = stop, start if stop < start
373
+
374
+ start.upto(stop) { |p| ports << p }
375
+ end
376
+
377
+ # Sort, and remove dups and invalid ports
378
+ ports.sort.uniq.delete_if { |p| p < 1 or p > 65535 }
379
+ end
380
+
381
+ #
382
+ # Converts a port list like [1,2,3,4,5,100] into a
383
+ # range specification like "1-5,100"
384
+ #
385
+ def self.portlist_to_portspec(parr)
386
+ ranges = []
387
+ range = []
388
+ lastp = nil
389
+
390
+ parr.uniq.sort{|a,b| a<=>b}.map{|a| a.to_i}.each do |n|
391
+ next if (n < 1 or n > 65535)
392
+ if not lastp
393
+ range = [n]
394
+ lastp = n
395
+ next
396
+ end
397
+
398
+ if lastp == n - 1
399
+ range << n
400
+ else
401
+ ranges << range
402
+ range = [n]
403
+ end
404
+ lastp = n
405
+ end
406
+
407
+ ranges << range
408
+ ranges.delete(nil)
409
+ ranges.uniq.map{|x| x.length == 1 ? "#{x[0]}" : "#{x[0]}-#{x[-1]}"}.join(",")
410
+ end
411
+
412
+ ##
413
+ #
414
+ # Utility class methods
415
+ #
416
+ ##
417
+
418
+ def self.source_address(dest='50.50.50.50')
419
+ begin
420
+ s = self.create_udp(
421
+ 'PeerHost' => dest,
422
+ 'PeerPort' => 31337
423
+ )
424
+ r = s.getsockname[1]
425
+ s.close
426
+ return r
427
+ rescue ::Exception
428
+ return '127.0.0.1'
429
+ end
430
+ end
431
+
432
+ #
433
+ # Create a TCP socket pair.
434
+ #
435
+ # sf: This create a socket pair using native ruby sockets and will work
436
+ # on Windows where ::Socket.pair is not implemented.
437
+ # Note: OpenSSL requires native ruby sockets for its io.
438
+ #
439
+ def self.tcp_socket_pair
440
+ lsock = nil
441
+ rsock = nil
442
+ laddr = '127.0.0.1'
443
+ lport = 0
444
+ threads = []
445
+ mutex = ::Mutex.new
446
+
447
+ threads << ::Thread.new {
448
+ server = nil
449
+ mutex.synchronize {
450
+ threads << ::Thread.new {
451
+ mutex.synchronize {
452
+ rsock = ::TCPSocket.new( laddr, lport )
453
+ }
454
+ }
455
+ server = ::Socket.new( ::Socket::AF_INET, ::Socket::SOCK_STREAM, 0 )
456
+ server.bind( ::Socket.sockaddr_in( 0, laddr ) )
457
+ lport, caddr = ::Socket.unpack_sockaddr_in( server.getsockname )
458
+ server.listen( 1 )
459
+ }
460
+ lsock, saddr = server.accept
461
+ server.close
462
+ }
463
+
464
+ threads.each { |t| t.join }
465
+
466
+ return [lsock, rsock]
467
+ end
468
+
469
+ #
470
+ # Create a UDP socket pair using native ruby UDP sockets.
471
+ #
472
+ def self.udp_socket_pair
473
+ laddr = '127.0.0.1'
474
+
475
+ lsock = ::UDPSocket.new
476
+ lsock.bind( laddr, 0 )
477
+
478
+ rsock = ::UDPSocket.new
479
+ rsock.bind( laddr, 0 )
480
+
481
+ rsock.connect( *lsock.addr.values_at(3,1) )
482
+
483
+ lsock.connect( *rsock.addr.values_at(3,1) )
484
+
485
+ return [lsock, rsock]
486
+ end
487
+
488
+ ##
489
+ #
490
+ # Class initialization
491
+ #
492
+ ##
493
+
494
+ #
495
+ # Initialize general socket parameters.
496
+ #
497
+ def initsock(params = nil)
498
+ if (params)
499
+ self.peerhost = params.peerhost
500
+ self.peerport = params.peerport
501
+ self.localhost = params.localhost
502
+ self.localport = params.localport
503
+ self.context = params.context || {}
504
+ self.ipv = params.v6 ? 6 : 4
505
+ end
506
+ end
507
+
508
+ #
509
+ # By default, all sockets are themselves selectable file descriptors.
510
+ #
511
+ def fd
512
+ self
513
+ end
514
+
515
+ #
516
+ # Returns local connection information.
517
+ #
518
+ def getsockname
519
+ Socket.from_sockaddr(super)
520
+ end
521
+
522
+ #
523
+ # Wrapper around getsockname
524
+ #
525
+ def getlocalname
526
+ getsockname
527
+ end
528
+
529
+ #
530
+ # Return peer connection information.
531
+ #
532
+ def getpeername
533
+ return Socket.from_sockaddr(super)
534
+ end
535
+
536
+ #
537
+ # Returns a string that indicates the type of the socket, such as 'tcp'.
538
+ #
539
+ def type?
540
+ raise NotImplementedError, "Socket type is not supported."
541
+ end
542
+
543
+ #
544
+ # The peer host of the connected socket.
545
+ #
546
+ attr_reader :peerhost
547
+ #
548
+ # The peer port of the connected socket.
549
+ #
550
+ attr_reader :peerport
551
+ #
552
+ # The local host of the connected socket.
553
+ #
554
+ attr_reader :localhost
555
+ #
556
+ # The local port of the connected socket.
557
+ #
558
+ attr_reader :localport
559
+ #
560
+ # The IP version of the socket
561
+ #
562
+ attr_reader :ipv
563
+ #
564
+ # Contextual information that describes the source and other
565
+ # instance-specific attributes. This comes from the param.context
566
+ # attribute.
567
+ #
568
+ attr_reader :context
569
+
570
+ protected
571
+
572
+ attr_writer :peerhost, :peerport, :localhost, :localport # :nodoc:
573
+ attr_writer :context # :nodoc:
574
+ attr_writer :ipv # :nodoc:
575
+
576
+ end
577
+
578
+ end
579
+
580
+ #
581
+ # Globalized socket constants
582
+ #
583
+ SHUT_RDWR = ::Socket::SHUT_RDWR
584
+ SHUT_RD = ::Socket::SHUT_RD
585
+ SHUT_WR = ::Socket::SHUT_WR
586
+