librex 0.0.20 → 0.0.21

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 (435) hide show
  1. data/Rakefile +1 -0
  2. data/lib/rex/LICENSE +29 -0
  3. data/lib/rex/arch.rb +103 -0
  4. data/lib/rex/arch/sparc.rb +75 -0
  5. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  6. data/lib/rex/arch/x86.rb +513 -0
  7. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  8. data/lib/rex/assembly/nasm.rb +104 -0
  9. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +311 -0
  12. data/lib/rex/constants.rb +113 -0
  13. data/lib/rex/elfparsey.rb +11 -0
  14. data/lib/rex/elfparsey/elf.rb +123 -0
  15. data/lib/rex/elfparsey/elfbase.rb +258 -0
  16. data/lib/rex/elfparsey/exceptions.rb +27 -0
  17. data/lib/rex/elfscan.rb +12 -0
  18. data/lib/rex/elfscan/scanner.rb +207 -0
  19. data/lib/rex/elfscan/search.rb +46 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +114 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  26. data/lib/rex/encoder/ndr.rb +89 -0
  27. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +106 -0
  31. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  32. data/lib/rex/encoder/xor.rb +69 -0
  33. data/lib/rex/encoder/xor/dword.rb +13 -0
  34. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  35. data/lib/rex/encoders/xor_dword.rb +35 -0
  36. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  37. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  38. data/lib/rex/encoding/xor.rb +20 -0
  39. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  40. data/lib/rex/encoding/xor/byte.rb +15 -0
  41. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  42. data/lib/rex/encoding/xor/dword.rb +21 -0
  43. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  44. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  45. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  47. data/lib/rex/encoding/xor/generic.rb +146 -0
  48. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  49. data/lib/rex/encoding/xor/qword.rb +15 -0
  50. data/lib/rex/encoding/xor/word.rb +21 -0
  51. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  52. data/lib/rex/exceptions.rb +275 -0
  53. data/lib/rex/exceptions.rb.ut.rb +44 -0
  54. data/lib/rex/exploitation/cmdstager.rb +9 -0
  55. data/lib/rex/exploitation/cmdstager/base.rb +175 -0
  56. data/lib/rex/exploitation/cmdstager/debug_asm.rb +142 -0
  57. data/lib/rex/exploitation/cmdstager/debug_write.rb +136 -0
  58. data/lib/rex/exploitation/cmdstager/tftp.rb +63 -0
  59. data/lib/rex/exploitation/cmdstager/vbs.rb +128 -0
  60. data/lib/rex/exploitation/egghunter.rb +277 -0
  61. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  62. data/lib/rex/exploitation/encryptjs.rb +77 -0
  63. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  64. data/lib/rex/exploitation/heaplib.rb +94 -0
  65. data/lib/rex/exploitation/javascriptosdetect.rb +897 -0
  66. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  67. data/lib/rex/exploitation/omelet.rb +320 -0
  68. data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
  69. data/lib/rex/exploitation/opcodedb.rb +818 -0
  70. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  71. data/lib/rex/exploitation/seh.rb +92 -0
  72. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  73. data/lib/rex/file.rb +112 -0
  74. data/lib/rex/file.rb.ut.rb +16 -0
  75. data/lib/rex/image_source.rb +12 -0
  76. data/lib/rex/image_source/disk.rb +60 -0
  77. data/lib/rex/image_source/image_source.rb +46 -0
  78. data/lib/rex/image_source/memory.rb +37 -0
  79. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  80. data/lib/rex/io/datagram_abstraction.rb +35 -0
  81. data/lib/rex/io/ring_buffer.rb +364 -0
  82. data/lib/rex/io/stream.rb +319 -0
  83. data/lib/rex/io/stream_abstraction.rb +197 -0
  84. data/lib/rex/io/stream_server.rb +211 -0
  85. data/lib/rex/job_container.rb +187 -0
  86. data/lib/rex/logging.rb +4 -0
  87. data/lib/rex/logging/log_dispatcher.rb +179 -0
  88. data/lib/rex/logging/log_sink.rb +42 -0
  89. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  90. data/lib/rex/logging/sinks/stderr.rb +43 -0
  91. data/lib/rex/machparsey.rb +9 -0
  92. data/lib/rex/machparsey/exceptions.rb +34 -0
  93. data/lib/rex/machparsey/mach.rb +209 -0
  94. data/lib/rex/machparsey/machbase.rb +408 -0
  95. data/lib/rex/machscan.rb +9 -0
  96. data/lib/rex/machscan/scanner.rb +217 -0
  97. data/lib/rex/mime.rb +9 -0
  98. data/lib/rex/mime/header.rb +77 -0
  99. data/lib/rex/mime/message.rb +144 -0
  100. data/lib/rex/mime/part.rb +20 -0
  101. data/lib/rex/nop/opty2.rb +108 -0
  102. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  103. data/lib/rex/nop/opty2_tables.rb +300 -0
  104. data/lib/rex/ole.rb +205 -0
  105. data/lib/rex/ole/clsid.rb +47 -0
  106. data/lib/rex/ole/difat.rb +141 -0
  107. data/lib/rex/ole/directory.rb +231 -0
  108. data/lib/rex/ole/direntry.rb +240 -0
  109. data/lib/rex/ole/docs/dependencies.txt +8 -0
  110. data/lib/rex/ole/docs/references.txt +1 -0
  111. data/lib/rex/ole/fat.rb +99 -0
  112. data/lib/rex/ole/header.rb +204 -0
  113. data/lib/rex/ole/minifat.rb +77 -0
  114. data/lib/rex/ole/propset.rb +144 -0
  115. data/lib/rex/ole/samples/create_ole.rb +27 -0
  116. data/lib/rex/ole/samples/dir.rb +35 -0
  117. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  118. data/lib/rex/ole/samples/ole_info.rb +23 -0
  119. data/lib/rex/ole/storage.rb +395 -0
  120. data/lib/rex/ole/stream.rb +53 -0
  121. data/lib/rex/ole/substorage.rb +49 -0
  122. data/lib/rex/ole/util.rb +157 -0
  123. data/lib/rex/parser/arguments.rb +97 -0
  124. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  125. data/lib/rex/parser/ini.rb +185 -0
  126. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  127. data/lib/rex/parser/ip360_aspl_xml.rb +102 -0
  128. data/lib/rex/parser/ip360_xml.rb +97 -0
  129. data/lib/rex/parser/nessus_xml.rb +118 -0
  130. data/lib/rex/parser/netsparker_xml.rb +94 -0
  131. data/lib/rex/parser/nexpose_xml.rb +136 -0
  132. data/lib/rex/parser/nmap_xml.rb +137 -0
  133. data/lib/rex/parser/retina_xml.rb +109 -0
  134. data/lib/rex/payloads.rb +1 -0
  135. data/lib/rex/payloads/win32.rb +2 -0
  136. data/lib/rex/payloads/win32/common.rb +26 -0
  137. data/lib/rex/payloads/win32/kernel.rb +53 -0
  138. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  139. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  140. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  141. data/lib/rex/payloads/win32/kernel/stager.rb +194 -0
  142. data/lib/rex/peparsey.rb +12 -0
  143. data/lib/rex/peparsey/exceptions.rb +32 -0
  144. data/lib/rex/peparsey/pe.rb +212 -0
  145. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  146. data/lib/rex/peparsey/pebase.rb +1680 -0
  147. data/lib/rex/peparsey/section.rb +136 -0
  148. data/lib/rex/pescan.rb +13 -0
  149. data/lib/rex/pescan/analyze.rb +309 -0
  150. data/lib/rex/pescan/scanner.rb +206 -0
  151. data/lib/rex/pescan/search.rb +56 -0
  152. data/lib/rex/platforms.rb +1 -0
  153. data/lib/rex/platforms/windows.rb +51 -0
  154. data/lib/rex/poly.rb +132 -0
  155. data/lib/rex/poly/block.rb +477 -0
  156. data/lib/rex/poly/register.rb +100 -0
  157. data/lib/rex/poly/register/x86.rb +40 -0
  158. data/lib/rex/post.rb +8 -0
  159. data/lib/rex/post/dir.rb +51 -0
  160. data/lib/rex/post/file.rb +172 -0
  161. data/lib/rex/post/file_stat.rb +220 -0
  162. data/lib/rex/post/gen.pl +13 -0
  163. data/lib/rex/post/io.rb +182 -0
  164. data/lib/rex/post/meterpreter.rb +4 -0
  165. data/lib/rex/post/meterpreter/channel.rb +445 -0
  166. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  167. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  168. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  169. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  170. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  171. data/lib/rex/post/meterpreter/client.rb +364 -0
  172. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  173. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  174. data/lib/rex/post/meterpreter/extension.rb +32 -0
  175. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  176. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  177. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  178. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  179. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  180. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
  181. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  182. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  183. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +111 -0
  184. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  185. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +101 -0
  186. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +26 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +282 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +266 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  198. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +208 -0
  199. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +6 -0
  200. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38106 -0
  201. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +31 -0
  202. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +47 -0
  203. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +36 -0
  204. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1818 -0
  205. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
  206. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3848 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +26 -0
  208. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
  209. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
  212. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +318 -0
  213. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +100 -0
  214. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +42 -0
  215. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +148 -0
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +127 -0
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +309 -0
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +204 -0
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +51 -0
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +630 -0
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +75 -0
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +103 -0
  223. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +149 -0
  224. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  225. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +370 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +211 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +63 -0
  240. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  241. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  242. data/lib/rex/post/meterpreter/packet.rb +688 -0
  243. data/lib/rex/post/meterpreter/packet_dispatcher.rb +431 -0
  244. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  245. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  246. data/lib/rex/post/meterpreter/ui/console.rb +137 -0
  247. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  248. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +730 -0
  249. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  250. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  251. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +231 -0
  252. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  253. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  254. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  255. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  256. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  257. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +65 -0
  258. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +442 -0
  259. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +298 -0
  260. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +486 -0
  261. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  262. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +157 -0
  263. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  264. data/lib/rex/post/permission.rb +26 -0
  265. data/lib/rex/post/process.rb +57 -0
  266. data/lib/rex/post/thread.rb +57 -0
  267. data/lib/rex/post/ui.rb +52 -0
  268. data/lib/rex/proto.rb +13 -0
  269. data/lib/rex/proto.rb.ts.rb +8 -0
  270. data/lib/rex/proto/dcerpc.rb +6 -0
  271. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  272. data/lib/rex/proto/dcerpc/client.rb +361 -0
  273. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  274. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  275. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  276. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  277. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  278. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  279. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  280. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  281. data/lib/rex/proto/dcerpc/response.rb +187 -0
  282. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  283. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  284. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  285. data/lib/rex/proto/dhcp.rb +7 -0
  286. data/lib/rex/proto/dhcp/constants.rb +33 -0
  287. data/lib/rex/proto/dhcp/server.rb +292 -0
  288. data/lib/rex/proto/drda.rb +5 -0
  289. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  290. data/lib/rex/proto/drda/constants.rb +49 -0
  291. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  292. data/lib/rex/proto/drda/packet.rb +252 -0
  293. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  294. data/lib/rex/proto/drda/utils.rb +123 -0
  295. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  296. data/lib/rex/proto/http.rb +5 -0
  297. data/lib/rex/proto/http.rb.ts.rb +12 -0
  298. data/lib/rex/proto/http/client.rb +821 -0
  299. data/lib/rex/proto/http/client.rb.ut.rb +95 -0
  300. data/lib/rex/proto/http/handler.rb +46 -0
  301. data/lib/rex/proto/http/handler/erb.rb +128 -0
  302. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  303. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  304. data/lib/rex/proto/http/handler/proc.rb +60 -0
  305. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  306. data/lib/rex/proto/http/header.rb +161 -0
  307. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  308. data/lib/rex/proto/http/packet.rb +407 -0
  309. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  310. data/lib/rex/proto/http/request.rb +356 -0
  311. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  312. data/lib/rex/proto/http/response.rb +90 -0
  313. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  314. data/lib/rex/proto/http/server.rb +369 -0
  315. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  316. data/lib/rex/proto/ntlm.rb +7 -0
  317. data/lib/rex/proto/ntlm.rb.ut.rb +177 -0
  318. data/lib/rex/proto/ntlm/base.rb +326 -0
  319. data/lib/rex/proto/ntlm/constants.rb +74 -0
  320. data/lib/rex/proto/ntlm/crypt.rb +415 -0
  321. data/lib/rex/proto/ntlm/exceptions.rb +16 -0
  322. data/lib/rex/proto/ntlm/message.rb +536 -0
  323. data/lib/rex/proto/ntlm/utils.rb +764 -0
  324. data/lib/rex/proto/proxy/socks4a.rb +440 -0
  325. data/lib/rex/proto/rfb.rb +19 -0
  326. data/lib/rex/proto/rfb.rb.ut.rb +37 -0
  327. data/lib/rex/proto/rfb/cipher.rb +84 -0
  328. data/lib/rex/proto/rfb/client.rb +207 -0
  329. data/lib/rex/proto/rfb/constants.rb +52 -0
  330. data/lib/rex/proto/smb.rb +7 -0
  331. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  332. data/lib/rex/proto/smb/client.rb +1952 -0
  333. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  334. data/lib/rex/proto/smb/constants.rb +1047 -0
  335. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  336. data/lib/rex/proto/smb/crypt.rb +36 -0
  337. data/lib/rex/proto/smb/evasions.rb +66 -0
  338. data/lib/rex/proto/smb/exceptions.rb +858 -0
  339. data/lib/rex/proto/smb/simpleclient.rb +306 -0
  340. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  341. data/lib/rex/proto/smb/utils.rb +103 -0
  342. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  343. data/lib/rex/proto/sunrpc.rb +1 -0
  344. data/lib/rex/proto/sunrpc/client.rb +195 -0
  345. data/lib/rex/proto/tftp.rb +12 -0
  346. data/lib/rex/proto/tftp/constants.rb +39 -0
  347. data/lib/rex/proto/tftp/server.rb +497 -0
  348. data/lib/rex/proto/tftp/server.rb.ut.rb +28 -0
  349. data/lib/rex/script.rb +42 -0
  350. data/lib/rex/script/base.rb +59 -0
  351. data/lib/rex/script/meterpreter.rb +15 -0
  352. data/lib/rex/script/shell.rb +9 -0
  353. data/lib/rex/service.rb +48 -0
  354. data/lib/rex/service_manager.rb +141 -0
  355. data/lib/rex/service_manager.rb.ut.rb +32 -0
  356. data/lib/rex/services/local_relay.rb +423 -0
  357. data/lib/rex/socket.rb +684 -0
  358. data/lib/rex/socket.rb.ut.rb +107 -0
  359. data/lib/rex/socket/comm.rb +119 -0
  360. data/lib/rex/socket/comm/local.rb +412 -0
  361. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  362. data/lib/rex/socket/ip.rb +130 -0
  363. data/lib/rex/socket/parameters.rb +345 -0
  364. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  365. data/lib/rex/socket/range_walker.rb +346 -0
  366. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  367. data/lib/rex/socket/ssl_tcp.rb +184 -0
  368. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  369. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  370. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +61 -0
  371. data/lib/rex/socket/subnet_walker.rb +75 -0
  372. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  373. data/lib/rex/socket/switch_board.rb +278 -0
  374. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  375. data/lib/rex/socket/tcp.rb +76 -0
  376. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  377. data/lib/rex/socket/tcp_server.rb +66 -0
  378. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  379. data/lib/rex/socket/udp.rb +164 -0
  380. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  381. data/lib/rex/struct2.rb +5 -0
  382. data/lib/rex/struct2/c_struct.rb +181 -0
  383. data/lib/rex/struct2/c_struct_template.rb +39 -0
  384. data/lib/rex/struct2/constant.rb +26 -0
  385. data/lib/rex/struct2/element.rb +44 -0
  386. data/lib/rex/struct2/generic.rb +73 -0
  387. data/lib/rex/struct2/restraint.rb +54 -0
  388. data/lib/rex/struct2/s_string.rb +72 -0
  389. data/lib/rex/struct2/s_struct.rb +111 -0
  390. data/lib/rex/sync.rb +6 -0
  391. data/lib/rex/sync/event.rb +94 -0
  392. data/lib/rex/sync/read_write_lock.rb +176 -0
  393. data/lib/rex/sync/ref.rb +57 -0
  394. data/lib/rex/sync/thread_safe.rb +82 -0
  395. data/lib/rex/test.rb +35 -0
  396. data/lib/rex/text.rb +1163 -0
  397. data/lib/rex/text.rb.ut.rb +190 -0
  398. data/lib/rex/thread_factory.rb +42 -0
  399. data/lib/rex/time.rb +65 -0
  400. data/lib/rex/transformer.rb +115 -0
  401. data/lib/rex/transformer.rb.ut.rb +38 -0
  402. data/lib/rex/ui.rb +21 -0
  403. data/lib/rex/ui/interactive.rb +298 -0
  404. data/lib/rex/ui/output.rb +78 -0
  405. data/lib/rex/ui/output/none.rb +18 -0
  406. data/lib/rex/ui/progress_tracker.rb +96 -0
  407. data/lib/rex/ui/subscriber.rb +149 -0
  408. data/lib/rex/ui/text/color.rb +97 -0
  409. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  410. data/lib/rex/ui/text/dispatcher_shell.rb +467 -0
  411. data/lib/rex/ui/text/input.rb +117 -0
  412. data/lib/rex/ui/text/input/buffer.rb +75 -0
  413. data/lib/rex/ui/text/input/readline.rb +129 -0
  414. data/lib/rex/ui/text/input/socket.rb +95 -0
  415. data/lib/rex/ui/text/input/stdio.rb +45 -0
  416. data/lib/rex/ui/text/irb_shell.rb +57 -0
  417. data/lib/rex/ui/text/output.rb +80 -0
  418. data/lib/rex/ui/text/output/buffer.rb +61 -0
  419. data/lib/rex/ui/text/output/file.rb +43 -0
  420. data/lib/rex/ui/text/output/socket.rb +43 -0
  421. data/lib/rex/ui/text/output/stdio.rb +40 -0
  422. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  423. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  424. data/lib/rex/ui/text/shell.rb +328 -0
  425. data/lib/rex/ui/text/table.rb +279 -0
  426. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  427. data/lib/rex/zip.rb +93 -0
  428. data/lib/rex/zip/archive.rb +184 -0
  429. data/lib/rex/zip/blocks.rb +182 -0
  430. data/lib/rex/zip/entry.rb +104 -0
  431. data/lib/rex/zip/samples/comment.rb +32 -0
  432. data/lib/rex/zip/samples/mkwar.rb +138 -0
  433. data/lib/rex/zip/samples/mkzip.rb +19 -0
  434. data/lib/rex/zip/samples/recursive.rb +58 -0
  435. metadata +434 -1
@@ -0,0 +1,95 @@
1
+ module Rex
2
+ module Post
3
+ module Meterpreter
4
+ module Ui
5
+
6
+ ###
7
+ #
8
+ # Mixin that is meant to extend the base channel class from meterpreter in a
9
+ # manner that adds interactive capabilities.
10
+ #
11
+ ###
12
+ module Console::InteractiveChannel
13
+
14
+ include Rex::Ui::Interactive
15
+
16
+ #
17
+ # Interacts with self.
18
+ #
19
+ def _interact
20
+ # If the channel has a left-side socket, then we can interact with it.
21
+ if (self.lsock)
22
+ self.interactive(true)
23
+
24
+ interact_stream(self)
25
+
26
+ self.interactive(false)
27
+ else
28
+ print_error("Channel #{self.cid} does not support interaction.")
29
+
30
+ self.interacting = false
31
+ end
32
+ end
33
+
34
+ #
35
+ # Called when an interrupt is sent.
36
+ #
37
+ def _interrupt
38
+ prompt_yesno("Terminate channel #{self.cid}?")
39
+ end
40
+
41
+ #
42
+ # Suspends interaction with the channel.
43
+ #
44
+ def _suspend
45
+ # Ask the user if they would like to background the session
46
+ if (prompt_yesno("Background channel #{self.cid}?") == true)
47
+ self.interactive(false)
48
+
49
+ self.interacting = false
50
+ end
51
+ end
52
+
53
+ #
54
+ # Closes the channel like it aint no thang.
55
+ #
56
+ def _interact_complete
57
+ begin
58
+ self.interactive(false)
59
+
60
+ self.close
61
+ rescue IOError
62
+ end
63
+ end
64
+
65
+ #
66
+ # Reads data from local input and writes it remotely.
67
+ #
68
+ def _stream_read_local_write_remote(channel)
69
+ data = user_input.gets
70
+ return if not data
71
+ self.write(data)
72
+ end
73
+
74
+ #
75
+ # Reads from the channel and writes locally.
76
+ #
77
+ def _stream_read_remote_write_local(channel)
78
+ data = self.lsock.sysread(16384)
79
+
80
+ user_output.print(data)
81
+ end
82
+
83
+ #
84
+ # Returns the remote file descriptor to select on
85
+ #
86
+ def _remote_fd(stream)
87
+ self.lsock
88
+ end
89
+
90
+ end
91
+
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Generic page protection flags
4
+ PROT_NONE = 0
5
+ PROT_READ = (1 << 0)
6
+ PROT_WRITE = (1 << 1)
7
+ PROT_EXEC = (1 << 2)
8
+ PROT_COW = (1 << 20)
9
+
10
+ # Generic permissions
11
+ GEN_NONE = 0
12
+ GEN_READ = (1 << 0)
13
+ GEN_WRITE = (1 << 1)
14
+ GEN_EXEC = (1 << 2)
15
+
16
+ # Generic process open permissions
17
+ PROCESS_READ = (1 << 0)
18
+ PROCESS_WRITE = (1 << 1)
19
+ PROCESS_EXECUTE = (1 << 2)
20
+ PROCESS_ALL = 0xffffffff
21
+
22
+ # Generic thread open permissions
23
+ THREAD_READ = (1 << 0)
24
+ THREAD_WRITE = (1 << 1)
25
+ THREAD_EXECUTE = (1 << 2)
26
+ THREAD_ALL = 0xffffffff
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rex
4
+ module Post
5
+
6
+ ###
7
+ #
8
+ # This class performs basic process operations against a process running on a
9
+ # remote machine via the post-exploitation mechanisms. Refer to the Ruby
10
+ # documentation for expected behaviors.
11
+ #
12
+ ###
13
+ class Process
14
+
15
+ def Process.getresuid
16
+ raise NotImplementedError
17
+ end
18
+ def Process.setresuid(a, b, c)
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def Process.euid
23
+ getresuid()[1]
24
+ end
25
+ def Process.euid=(id)
26
+ setresuid(-1, id, -1)
27
+ end
28
+ def Process.uid
29
+ getresuid()[0]
30
+ end
31
+ def Process.uid=(id)
32
+ setresuid(id, -1, -1)
33
+ end
34
+
35
+ def Process.egid
36
+ getresgid()[1]
37
+ end
38
+ def Process.egid=(id)
39
+ setresgid(-1, id, -1)
40
+ end
41
+ def Process.gid
42
+ getresgid()[0]
43
+ end
44
+ def Process.gid=(id)
45
+ setresgid(id, -1, -1)
46
+ end
47
+
48
+ def Process.pid
49
+ raise NotImplementedError
50
+ end
51
+ def Process.ppid
52
+ raise NotImplementedError
53
+ end
54
+
55
+ end
56
+
57
+ end; end # Post/Rex
@@ -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,13 @@
1
+ require 'rex/proto/http'
2
+ require 'rex/proto/smb'
3
+ require 'rex/proto/ntlm'
4
+ require 'rex/proto/dcerpc'
5
+ require 'rex/proto/drda'
6
+
7
+ module Rex
8
+ module Proto
9
+
10
+ attr_accessor :alias
11
+
12
+ end
13
+ 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,361 @@
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
+ break if (read_limit and read_limit <= raw_response.length)
178
+ end
179
+
180
+ rescue Rex::Proto::SMB::Exceptions::NoReply
181
+ # I don't care if I didn't get a reply...
182
+ rescue Rex::Proto::SMB::Exceptions::ErrorCode => exception
183
+ if exception.error_code != 0xC000014B
184
+ raise exception
185
+ end
186
+ end
187
+ # This must be a regular TCP or UDP socket
188
+ else
189
+ if (self.socket.type? == 'tcp')
190
+ if (false and max_read)
191
+ while (true)
192
+ data = self.socket.get_once((rand(max_read-min_read)+min_read), self.options['read_timeout'])
193
+ break if not data
194
+ break if not data.length
195
+ raw_response << data
196
+ end
197
+ else
198
+ # Just read the entire response in one go
199
+ raw_response = self.socket.get_once(-1, self.options['read_timeout'])
200
+ end
201
+ else
202
+ # No segmented read support for non-TCP sockets
203
+ raw_response = self.socket.read(0xFFFFFFFF / 2 - 1) # read max data
204
+ end
205
+ end
206
+
207
+ raw_response
208
+ end
209
+
210
+ # Write data to the underlying socket, limiting the sizes of the writes based on
211
+ # the pipe_write_min / pipe_write_max options.
212
+ def write(data)
213
+
214
+ max_write = self.options['pipe_write_max_size'] || data.length
215
+ min_write = self.options['pipe_write_min_size'] || max_write
216
+
217
+ if(min_write > max_write)
218
+ max_write = min_write
219
+ end
220
+
221
+ idx = 0
222
+
223
+ if (self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe)
224
+ while(idx < data.length)
225
+ bsize = (rand(max_write-min_write)+min_write).to_i
226
+ len = self.socket.write(data[idx, bsize], rand(1024)+1)
227
+ idx += bsize
228
+ end
229
+ else
230
+ self.socket.write(data)
231
+ end
232
+
233
+ data.length
234
+ end
235
+
236
+ def bind()
237
+ require 'rex/proto/dcerpc/packet'
238
+ bind = ''
239
+ context = ''
240
+ if self.options['fake_multi_bind']
241
+
242
+ args = [ self.handle.uuid[0], self.handle.uuid[1] ]
243
+
244
+ if (self.options['fake_multi_bind_prepend'])
245
+ args << self.options['fake_multi_bind_prepend']
246
+ end
247
+
248
+ if (self.options['fake_multi_bind_append'])
249
+ args << self.options['fake_multi_bind_append']
250
+ end
251
+
252
+ bind, context = Rex::Proto::DCERPC::Packet.make_bind_fake_multi(*args)
253
+ else
254
+ bind, context = Rex::Proto::DCERPC::Packet.make_bind(self.handle.uuid[0], self.handle.uuid[1])
255
+ end
256
+
257
+ raise 'make_bind failed' if !bind
258
+
259
+ self.write(bind)
260
+ raw_response = self.read()
261
+
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, do_recv = true)
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
+ return true if not do_recv
295
+
296
+ raw_response = ''
297
+
298
+ begin
299
+ raw_response = self.read()
300
+ rescue ::EOFError
301
+ raise Rex::Proto::DCERPC::Exceptions::NoResponse
302
+ end
303
+
304
+ if (raw_response == nil or raw_response.length == 0)
305
+ raise Rex::Proto::DCERPC::Exceptions::NoResponse
306
+ end
307
+
308
+
309
+ self.last_response = Rex::Proto::DCERPC::Response.new(raw_response)
310
+
311
+ if self.last_response.type == 3
312
+ e = Rex::Proto::DCERPC::Exceptions::Fault.new
313
+ e.fault = self.last_response.status
314
+ raise e
315
+ end
316
+
317
+ self.last_response.stub_data
318
+ end
319
+
320
+ # Process a DCERPC response packet from a socket
321
+ def self.read_response(socket, timeout=self.options['read_timeout'])
322
+
323
+ data = socket.get_once(-1, timeout)
324
+
325
+ # We need at least 10 bytes to find the FragLen
326
+ if (! data or data.length() < 10)
327
+ return
328
+ end
329
+
330
+ # Pass the first 10 bytes to the constructor
331
+ resp = Rex::Proto::DCERPC::Response.new(data.slice!(0, 10))
332
+
333
+ # Something went wrong in the parser...
334
+ if (! resp.frag_len)
335
+ return resp
336
+ end
337
+
338
+ # Do we need to read more data?
339
+ if (resp.frag_len > (data.length + 10))
340
+ begin
341
+ data << socket.timed_read(resp.frag_len - data.length - 10, timeout)
342
+ rescue Timeout::Error
343
+ end
344
+ end
345
+
346
+ # Still missing some data...
347
+ if (data.length() != resp.frag_len - 10)
348
+ # TODO: Bubble this up somehow
349
+ # $stderr.puts "Truncated DCERPC response :-("
350
+ return resp
351
+ end
352
+
353
+ resp.parse(data)
354
+ return resp
355
+ end
356
+
357
+ end
358
+ end
359
+ end
360
+ end
361
+