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,57 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+ module Post
5
+
6
+ ###
7
+ #
8
+ # This class provides generalized methods for interacting with a thread
9
+ # running in a process on a remote machine via a post-exploitation client.
10
+ #
11
+ ###
12
+ class Thread
13
+
14
+ #
15
+ # Suspend the remote thread.
16
+ #
17
+ def suspend
18
+ raise NotImplementedError
19
+ end
20
+
21
+ #
22
+ # Resume execution of the remote thread.
23
+ #
24
+ def resume
25
+ raise NotImplementedError
26
+ end
27
+
28
+ #
29
+ # Terminate the remote thread.
30
+ #
31
+ def terminate
32
+ raise NotImplementedError
33
+ end
34
+
35
+ #
36
+ # Query architecture-specific register state.
37
+ #
38
+ def query_regs
39
+ raise NotImplementedError
40
+ end
41
+
42
+ #
43
+ # Set architecture-specific register state.
44
+ #
45
+ def set_regs
46
+ raise NotImplementedError
47
+ end
48
+
49
+ #
50
+ # Close resources associated with the thread.
51
+ #
52
+ def close
53
+ raise NotImplementedError
54
+ end
55
+ end
56
+
57
+ end; end
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+ module Post
5
+
6
+ ###
7
+ #
8
+ # This class provides generalized user interface manipulation routines that
9
+ # might be supported by post-exploitation clients.
10
+ #
11
+ ###
12
+ class UI
13
+
14
+ #
15
+ # This method disables the keyboard on the remote machine.
16
+ #
17
+ def disable_keyboard
18
+ raise NotImplementedError
19
+ end
20
+
21
+ #
22
+ # This method enables the keyboard on the remote machine.
23
+ #
24
+ def enable_keyboard
25
+ raise NotImplementedError
26
+ end
27
+
28
+ #
29
+ # This method disables the mouse on the remote machine.
30
+ #
31
+ def disable_mouse
32
+ raise NotImplementedError
33
+ end
34
+
35
+ #
36
+ # This method enables the mouse on the remote machine.
37
+ #
38
+ def enable_mouse
39
+ raise NotImplementedError
40
+ end
41
+
42
+ #
43
+ # This method gets the number of seconds the user has been idle from input
44
+ # on the remote machine.
45
+ #
46
+ def idle_time
47
+ raise NotImplementedError
48
+ end
49
+
50
+ end
51
+
52
+ end; end
@@ -0,0 +1,12 @@
1
+ require 'rex/proto/http'
2
+ require 'rex/proto/smb'
3
+ require 'rex/proto/dcerpc'
4
+ require 'rex/proto/drda'
5
+
6
+ module Rex
7
+ module Proto
8
+
9
+ attr_accessor :alias
10
+
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..'))
4
+
5
+ require 'test/unit'
6
+ require 'rex/proto/smb.rb.ts'
7
+ require 'rex/proto/dcerpc.rb.ts'
8
+ require 'rex/proto/http.rb.ts'
@@ -0,0 +1,6 @@
1
+ require 'rex/proto/dcerpc/uuid'
2
+ require 'rex/proto/dcerpc/response'
3
+ require 'rex/proto/dcerpc/client'
4
+ require 'rex/proto/dcerpc/packet'
5
+ require 'rex/proto/dcerpc/handle'
6
+ require 'rex/proto/dcerpc/ndr'
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rex/test'
4
+ require 'rex/proto/dcerpc/uuid.rb.ut'
5
+ require 'rex/proto/dcerpc/response.rb.ut'
6
+ require 'rex/proto/dcerpc/packet.rb.ut'
7
+ # require 'rex/proto/dcerpc/ndr.rb.ut'
8
+ require 'rex/proto/dcerpc/handle.rb.ut'
9
+ require 'rex/proto/dcerpc/client.rb.ut'
@@ -0,0 +1,358 @@
1
+ module Rex
2
+ module Proto
3
+ module DCERPC
4
+ class Client
5
+
6
+ require 'rex/proto/dcerpc/uuid'
7
+ require 'rex/proto/dcerpc/response'
8
+ require 'rex/proto/dcerpc/exceptions'
9
+ require 'rex/text'
10
+ require 'rex/proto/smb/exceptions'
11
+
12
+ attr_accessor :handle, :socket, :options, :last_response, :context, :no_bind, :ispipe, :smb
13
+
14
+ # initialize a DCE/RPC Function Call
15
+ def initialize(handle, socket, useroptions = Hash.new)
16
+ self.handle = handle
17
+ self.socket = socket
18
+ self.options = {
19
+ 'smb_user' => '',
20
+ 'smb_pass' => '',
21
+ 'smb_pipeio' => 'rw',
22
+ 'smb_name' => nil,
23
+ 'read_timeout' => 10,
24
+ 'connect_timeout' => 5
25
+ }
26
+
27
+ self.options.merge!(useroptions)
28
+
29
+ # If the caller passed us a smb_client object, use it and
30
+ # and skip the connect/login/ipc$ stages of the setup
31
+ if (self.options['smb_client'])
32
+ self.smb = self.options['smb_client']
33
+ end
34
+
35
+ # we must have a valid handle, regardless of everything else
36
+ raise ArgumentError, 'handle is not a Rex::Proto::DCERPC::Handle' if !self.handle.is_a?(Rex::Proto::DCERPC::Handle)
37
+
38
+ # we do this in case socket needs setup first, ie, socket = nil
39
+ if !self.options['no_socketsetup']
40
+ self.socket_check()
41
+ end
42
+
43
+ raise ArgumentError, 'socket can not read' if !self.socket.respond_to?(:read)
44
+ raise ArgumentError, 'socket can not write' if !self.socket.respond_to?(:write)
45
+
46
+ if !self.options['no_autobind']
47
+ self.bind()
48
+ end
49
+ end
50
+
51
+ def socket_check()
52
+ if self.socket == nil
53
+ self.socket_setup()
54
+ end
55
+
56
+ case self.handle.protocol
57
+ when 'ncacn_ip_tcp'
58
+ if self.socket.type? != 'tcp'
59
+ raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
60
+ end
61
+ when 'ncacn_np'
62
+ if self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe
63
+ self.ispipe = 1
64
+ elsif self.socket.type? == 'tcp'
65
+ self.smb_connect()
66
+ else
67
+ raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
68
+ end
69
+ # No support ncacn_ip_udp (is it needed now that its ripped from Vista?)
70
+ else
71
+ raise "Unsupported protocol : #{self.handle.protocol}"
72
+ end
73
+ end
74
+
75
+ # Create the appropriate socket based on protocol
76
+ def socket_setup()
77
+ ctx = { 'Msf' => self.options['Msf'], 'MsfExploit' => self.options['MsfExploit'] }
78
+ self.socket = case self.handle.protocol
79
+
80
+ when 'ncacn_ip_tcp'
81
+ Rex::Socket.create_tcp(
82
+ 'PeerHost' => self.handle.address,
83
+ 'PeerPort' => self.handle.options[0],
84
+ 'Context' => ctx,
85
+ 'Timeout' => self.options['connect_timeout']
86
+ )
87
+
88
+ when 'ncacn_np'
89
+ begin
90
+ socket = Rex::Socket.create_tcp(
91
+ 'PeerHost' => self.handle.address,
92
+ 'PeerPort' => 445,
93
+ 'Context' => ctx,
94
+ 'Timeout' => self.options['connect_timeout']
95
+ )
96
+ rescue Timeout::Error, Rex::ConnectionRefused
97
+ socket = Rex::Socket.create_tcp(
98
+ 'PeerHost' => self.handle.address,
99
+ 'PeerPort' => 139,
100
+ 'Context' => ctx,
101
+ 'Timeout' => self.options['connect_timeout']
102
+ )
103
+ end
104
+ socket
105
+ else nil
106
+ end
107
+
108
+ # Add this socket to the exploit's list of open sockets
109
+ options['MsfExploit'].add_socket(self.socket) if (options['MsfExploit'])
110
+ end
111
+
112
+ def smb_connect()
113
+ require 'rex/proto/smb/simpleclient'
114
+
115
+ if(not self.smb)
116
+ if self.socket.peerport == 139
117
+ smb = Rex::Proto::SMB::SimpleClient.new(self.socket)
118
+ else
119
+ smb = Rex::Proto::SMB::SimpleClient.new(self.socket, true)
120
+ end
121
+
122
+ smb.login('*SMBSERVER', self.options['smb_user'], self.options['smb_pass'])
123
+ smb.connect("\\\\#{self.handle.address}\\IPC$")
124
+ self.smb = smb
125
+ self.smb.read_timeout = self.options['read_timeout']
126
+ end
127
+
128
+ f = self.smb.create_pipe(self.handle.options[0])
129
+ f.mode = self.options['smb_pipeio']
130
+ self.socket = f
131
+ end
132
+
133
+ def read()
134
+
135
+ max_read = self.options['pipe_read_max_size'] || 1024*1024
136
+ min_read = self.options['pipe_read_min_size'] || max_read
137
+
138
+ raw_response = ''
139
+
140
+ # Are we reading from a remote pipe over SMB?
141
+ if (self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe)
142
+ begin
143
+
144
+ # Max SMB read is 65535, cap it at 64000
145
+ max_read = [64000, max_read].min
146
+ min_read = [64000, min_read].min
147
+
148
+ read_limit = nil
149
+
150
+ while(true)
151
+ # Random read offsets will not work on Windows NT 4.0 (thanks Dave!)
152
+
153
+ read_cnt = (rand(max_read-min_read)+min_read)
154
+ if(read_limit)
155
+ if(read_cnt + raw_response.length > read_limit)
156
+ read_cnt = raw_response.length - read_limit
157
+ end
158
+ end
159
+
160
+ data = self.socket.read( read_cnt, rand(1024)+1)
161
+ break if !(data and data.length > 0)
162
+ raw_response += data
163
+
164
+ # Keep reading until we have at least the DCERPC header
165
+ next if raw_response.length < 10
166
+
167
+ # We now have to process the raw_response and parse out the DCERPC fragment length
168
+ # if we have read enough data. Once we have the length value, we need to make sure
169
+ # that we don't read beyond this amount, or it can screw up the SMB state
170
+ if (not read_limit)
171
+ begin
172
+ check = Rex::Proto::DCERPC::Response.new(raw_response)
173
+ read_limit = check.frag_len
174
+ rescue ::Rex::Proto::DCERPC::Exceptions::InvalidPacket
175
+ end
176
+ end
177
+
178
+ break if (read_limit and read_limit == raw_response.length)
179
+ end
180
+
181
+ rescue Rex::Proto::SMB::Exceptions::NoReply
182
+ # I don't care if I didn't get a reply...
183
+ rescue Rex::Proto::SMB::Exceptions::ErrorCode => exception
184
+ if exception.error_code != 0xC000014B
185
+ raise exception
186
+ end
187
+ end
188
+ # This must be a regular TCP or UDP socket
189
+ else
190
+ if (self.socket.type? == 'tcp')
191
+ if (false and max_read)
192
+ while (true)
193
+ data = self.socket.get_once((rand(max_read-min_read)+min_read), self.options['read_timeout'])
194
+ break if not data
195
+ break if not data.length
196
+ raw_response << data
197
+ end
198
+ else
199
+ # Just read the entire response in one go
200
+ raw_response = self.socket.get_once(-1, self.options['read_timeout'])
201
+ end
202
+ else
203
+ # No segmented read support for non-TCP sockets
204
+ raw_response = self.socket.read(0xFFFFFFFF / 2 - 1) # read max data
205
+ end
206
+ end
207
+
208
+ raw_response
209
+ end
210
+
211
+ # Write data to the underlying socket, limiting the sizes of the writes based on
212
+ # the pipe_write_min / pipe_write_max options.
213
+ def write(data)
214
+
215
+ max_write = self.options['pipe_write_max_size'] || data.length
216
+ min_write = self.options['pipe_write_min_size'] || max_write
217
+
218
+ if(min_write > max_write)
219
+ max_write = min_write
220
+ end
221
+
222
+ idx = 0
223
+
224
+ if (self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe)
225
+ while(idx < data.length)
226
+ bsize = (rand(max_write-min_write)+min_write).to_i
227
+ len = self.socket.write(data[idx, bsize], rand(1024)+1)
228
+ idx += bsize
229
+ end
230
+ else
231
+ self.socket.write(data)
232
+ end
233
+
234
+ data.length
235
+ end
236
+
237
+ def bind()
238
+ require 'rex/proto/dcerpc/packet'
239
+ bind = ''
240
+ context = ''
241
+ if self.options['fake_multi_bind']
242
+
243
+ args = [ self.handle.uuid[0], self.handle.uuid[1] ]
244
+
245
+ if (self.options['fake_multi_bind_prepend'])
246
+ args << self.options['fake_multi_bind_prepend']
247
+ end
248
+
249
+ if (self.options['fake_multi_bind_append'])
250
+ args << self.options['fake_multi_bind_append']
251
+ end
252
+
253
+ bind, context = Rex::Proto::DCERPC::Packet.make_bind_fake_multi(*args)
254
+ else
255
+ bind, context = Rex::Proto::DCERPC::Packet.make_bind(self.handle.uuid[0], self.handle.uuid[1])
256
+ end
257
+
258
+ raise 'make_bind failed' if !bind
259
+
260
+ self.write(bind)
261
+ raw_response = self.read()
262
+ response = Rex::Proto::DCERPC::Response.new(raw_response)
263
+ self.last_response = response
264
+ if response.type == 12 or response.type == 15
265
+ if self.last_response.ack_result[context] == 2
266
+ raise "Could not bind to #{self.handle}"
267
+ end
268
+ self.context = context
269
+ else
270
+ raise "Could not bind to #{self.handle}"
271
+ end
272
+ end
273
+
274
+ # Perform a DCE/RPC Function Call
275
+ def call(function, data)
276
+
277
+ frag_size = data.length
278
+ if options['frag_size']
279
+ frag_size = options['frag_size']
280
+ end
281
+ object_id = ''
282
+ if options['object_call']
283
+ object_id = self.handle.uuid[0]
284
+ end
285
+ if options['random_object_id']
286
+ object_id = Rex::Proto::DCERPC::UUID.uuid_unpack(Rex::Text.rand_text(16))
287
+ end
288
+
289
+ call_packets = Rex::Proto::DCERPC::Packet.make_request(function, data, frag_size, self.context, object_id)
290
+ call_packets.each { |packet|
291
+ self.write(packet)
292
+ }
293
+
294
+ raw_response = ''
295
+
296
+ begin
297
+ raw_response = self.read()
298
+ rescue ::EOFError
299
+ raise Rex::Proto::DCERPC::Exceptions::NoResponse
300
+ end
301
+
302
+ if (raw_response == nil or raw_response.length == 0)
303
+ raise Rex::Proto::DCERPC::Exceptions::NoResponse
304
+ end
305
+
306
+
307
+ self.last_response = Rex::Proto::DCERPC::Response.new(raw_response)
308
+
309
+ if self.last_response.type == 3
310
+ e = Rex::Proto::DCERPC::Exceptions::Fault.new
311
+ e.fault = self.last_response.status
312
+ raise e
313
+ end
314
+
315
+ self.last_response.stub_data
316
+ end
317
+
318
+ # Process a DCERPC response packet from a socket
319
+ def self.read_response(socket, timeout=self.options['read_timeout'])
320
+
321
+ data = socket.get_once(-1, timeout)
322
+
323
+ # We need at least 10 bytes to find the FragLen
324
+ if (! data or data.length() < 10)
325
+ return
326
+ end
327
+
328
+ # Pass the first 10 bytes to the constructor
329
+ resp = Rex::Proto::DCERPC::Response.new(data.slice!(0, 10))
330
+
331
+ # Something went wrong in the parser...
332
+ if (! resp.frag_len)
333
+ return resp
334
+ end
335
+
336
+ # Do we need to read more data?
337
+ if (resp.frag_len > (data.length + 10))
338
+ begin
339
+ data << socket.timed_read(resp.frag_len - data.length - 10, timeout)
340
+ rescue Timeout::Error
341
+ end
342
+ end
343
+
344
+ # Still missing some data...
345
+ if (data.length() != resp.frag_len - 10)
346
+ # TODO: Bubble this up somehow
347
+ # $stderr.puts "Truncated DCERPC response :-("
348
+ return resp
349
+ end
350
+
351
+ resp.parse(data)
352
+ return resp
353
+ end
354
+
355
+ end
356
+ end
357
+ end
358
+ end