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,56 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'rex/test'
6
+ require 'rex/proto/dcerpc/packet'
7
+
8
+ class Rex::Proto::DCERPC::Packet::UnitTest < Test::Unit::TestCase
9
+
10
+ Klass = Rex::Proto::DCERPC::Packet
11
+
12
+ def test_parse
13
+
14
+ actual = Klass.make_bind('367abb81-9844-35f1-ad32-98f038001003', '2.0')
15
+ expected = ["\005\000\v\003\020\000\000\000H\000\000\000\000\000\000\000\320\026\320\026\000\000\000\000\001\000\000\000\000\000\001\000\201\273z6D\230\3615\2552\230\3608\000\020\003\002\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000", 0]
16
+ assert_equal(expected, actual, 'bind')
17
+
18
+ srand(0)
19
+ actual = Klass.make_bind_fake_multi('367abb81-9844-35f1-ad32-98f038001003', '2.0')
20
+ expected = [ "\005\000\v\003\020\000\000\0004\003\000\000\000\000\000\000\320\026\320\026\000\000\000\000\022\000\000\000\000\000\001\000u\300C\373\303g\t\323\025\362$WF\330X\214\002\000\001\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\001\000\001\000\346'W\256XQ\245\031MH\t\224s\320\363\305\000\000\002\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\002\000\001\000c\330\261\363\035\223\223\216\247 \301\t\271\177 \037\002\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\003\000\001\000\227\243\376\313r\267\034\"\200\200\2445\205&\350\364\001\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\004\000\001\000\204i*\272\037x\001A\347\2519#fw\v\256\002\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\005\000\001\000\200\216c5\214y\252T\313D\006\304/\177\364\203\004\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\006\000\001\000\264\350N\217\224\343\272\027\317\215uU01E\251\003\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\a\000\001\000_\305^\000q\262$\2420]\203b*\315p\347\005\000\001\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\010\000\001\000\177\000\212r+\272\177\027\273\202yb>\243\336{\003\000\002\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\t\000\001\000\256\343\224\3212\233\016):\301$\nV+h\v\002\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\n\000\001\000P \266\200&\023\256*s\270\274\350M\036\030}\002\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\v\000\001\000^\342k\rp(H\023_H\232\302\370\264C\354\005\000\002\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\f\000\001\000`\004\303\355\213\374V\315ymK\270\020\230\235\225\001\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\r\000\001\000\274yvu\275S\241h\240\344\373\373yF\325\037\005\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\016\000\001\000\201\273z6D\230\3615\2552\230\3608\000\020\003\002\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\017\000\001\000\270\230O)\022(\266\317\v\246o]\371\201\337v\004\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\020\000\001\000}\030C\322\357\003\352\314\346#\326\376\275\305\327+\000\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\021\000\001\000h\324\212\266\353\245}\234o\350\002\e\323\331\2275\003\000\002\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000", 14]
21
+ assert_equal(expected, actual, 'bind fake multi')
22
+
23
+ actual = Klass.make_alter_context('367abb81-9844-35f1-ad32-98f038001003', '2.0')
24
+ expected = "\005\000\016\003\020\000\000\000H\000\000\000\000\000\000\000\320\026\320\026\000\000\000\000\001\000\000\000\000\000\001\000\201\273z6D\230\3615\2552\230\3608\000\020\003\002\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000"
25
+ assert_equal(expected, actual, 'alter context')
26
+
27
+ actual = Klass.make_request(1337, '', 1024, 7331)
28
+ expected = ["\005\000\000\003\020\000\000\000\030\000\000\000\000\000\000\000\000\000\000\000\243\0349\005"]
29
+ assert_equal(expected, actual, 'make_request with no stub')
30
+
31
+ actual = Klass.make_request(1337, 'ABCD', 1024, 7331)
32
+ expected = ["\005\000\000\003\020\000\000\000\034\000\000\000\000\000\000\000\004\000\000\000\243\0349\005ABCD"]
33
+ assert_equal(expected, actual, 'make_request with stub')
34
+
35
+ actual = Klass.make_request(1337, 'ABCD', 3, 7331)
36
+ expected = ["\005\000\000\001\020\000\000\000\e\000\000\000\000\000\000\000\003\000\000\000\243\0349\005ABC", "\005\000\000\002\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005D"]
37
+ assert_equal(expected, actual, 'make_request with 2 frags')
38
+
39
+ actual = Klass.make_request(1337, 'ABCD', 1, 7331)
40
+ expected = ["\005\000\000\001\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005A", "\005\000\000\000\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005B", "\005\000\000\000\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005C", "\005\000\000\002\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005D"]
41
+ assert_equal(expected, actual, 'make_request with 4 frags')
42
+
43
+
44
+ actual = Klass.make_request(1337, '', 1024, 7331, '367abb81-9844-35f1-ad32-98f038001003')
45
+ expected = ["\005\000\000\x83\020\000\000\000\030\000\000\000\000\000\000\000\000\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003"]
46
+ assert_equal(expected, actual, 'make_request with no stub, with object_id')
47
+
48
+ actual = Klass.make_request(1337, 'ABCD', 1024, 7331, '367abb81-9844-35f1-ad32-98f038001003')
49
+ expected = ["\005\000\000\x83\020\000\000\000\034\000\000\000\000\000\000\000\004\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003ABCD"]
50
+ assert_equal(expected, actual, 'make_request with stub, with object_id')
51
+
52
+ actual = Klass.make_request(1337, 'ABCD', 1, 7331, '367abb81-9844-35f1-ad32-98f038001003')
53
+ expected = ["\005\000\000\x81\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003A", "\005\000\000\x80\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003B", "\005\000\000\x80\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003C", "\005\000\000\x82\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003D"]
54
+ assert_equal(expected, actual, 'make_request with 4 frags')
55
+ end
56
+ end
@@ -0,0 +1,187 @@
1
+ require 'rex/proto/dcerpc/uuid'
2
+ require 'rex/proto/dcerpc/exceptions'
3
+
4
+ module Rex
5
+ module Proto
6
+ module DCERPC
7
+ class Response
8
+
9
+ attr_accessor :frag_len, :auth_len, :type, :vers_major, :vers_minor
10
+ attr_accessor :flags, :data_rep, :call_id, :max_frag_xmit, :max_frag_recv
11
+ attr_accessor :assoc_group, :sec_addr_len, :sec_addr, :num_results
12
+ attr_accessor :nack_reason, :xfer_syntax_uuid, :xfer_syntax_vers
13
+ attr_accessor :ack_reason, :ack_result, :ack_xfer_syntax_uuid, :ack_xfer_syntax_vers
14
+ attr_accessor :alloc_hint, :context_id, :cancel_cnt, :status, :stub_data
15
+ attr_accessor :raw
16
+
17
+ # Create a new DCERPC::Response object
18
+ # This can be initialized in two ways:
19
+ # 1) Call .new() with the first 10 bytes of packet, then call parse on the rest
20
+ # 2) Call .new() with the full packet contents
21
+ def initialize(data)
22
+
23
+ self.ack_result = []
24
+ self.ack_reason = []
25
+ self.ack_xfer_syntax_uuid = []
26
+ self.ack_xfer_syntax_vers = []
27
+
28
+ if (! data or data.length < 10)
29
+ raise Rex::Proto::DCERPC::Exceptions::InvalidPacket, 'DCERPC response packet is incomplete'
30
+ end
31
+
32
+ if (data.length == 10)
33
+ self.frag_len = data[8,2].unpack('v')[0]
34
+ self.raw = data
35
+ end
36
+
37
+ if (data.length > 10)
38
+ self.raw = data
39
+ self.parse
40
+ end
41
+ end
42
+
43
+ # Parse the contents of a DCERPC response packet and fill out all the fields
44
+ def parse(body = '')
45
+ self.raw = self.raw + body
46
+ self.type = self.raw[2,1].unpack('C')[0]
47
+
48
+ uuid = Rex::Proto::DCERPC::UUID
49
+ data = self.raw
50
+
51
+
52
+ if(not data)
53
+ raise Rex::Proto::DCERPC::Exceptions::InvalidPacket, 'DCERPC response packet is incomplete'
54
+ end
55
+
56
+ # BIND_ACK == 12, ALTER_CONTEXT_RESP == 15
57
+ if (self.type == 12 or self.type == 15)
58
+
59
+ # Decode most of the DCERPC header
60
+ self.vers_major,
61
+ self.vers_minor,
62
+ trash,
63
+ self.flags,
64
+ self.data_rep,
65
+ self.frag_len,
66
+ self.auth_len,
67
+ self.call_id,
68
+ self.max_frag_xmit,
69
+ self.max_frag_recv,
70
+ self.assoc_group,
71
+ self.sec_addr_len = data.unpack('CCCCNvvVvvVv')
72
+
73
+
74
+ if(not self.frag_len or data.length < self.frag_len)
75
+ raise Rex::Proto::DCERPC::Exceptions::InvalidPacket, 'DCERPC response packet is incomplete'
76
+ end
77
+
78
+ # Keep an offset into the packet handy
79
+ x = 0
80
+
81
+ # XXX This is still somewhat broken (4 digit ports)
82
+ self.sec_addr = data[26, self.sec_addr_len]
83
+
84
+ # Move the pointer into the packet forward
85
+ x += 26 + self.sec_addr_len
86
+
87
+ # Align the pointer on a dword boundary
88
+ while (x % 4 != 0)
89
+ x += 1
90
+ end
91
+
92
+ # Figure out how many results we have (multiple-context binds)
93
+ self.num_results = data[ x, 4 ].unpack('V')[0]
94
+
95
+ # Move the pointer to the ack_result[0] offset
96
+ x += 4
97
+
98
+ # Initialize the ack_result index
99
+ ack = 0
100
+
101
+ # Scan through all results and add them to the result arrays
102
+ while ack < self.num_results
103
+ self.ack_result[ack] = data[ x + 0, 2 ].unpack('v')[0]
104
+ self.ack_reason[ack] = data[ x + 2, 2 ].unpack('v')[0]
105
+ self.ack_xfer_syntax_uuid[ack] = uuid.uuid_unpack(data[ x + 4, 16 ])
106
+ self.ack_xfer_syntax_vers[ack] = data[ x + 20, 4 ].unpack('V')[0]
107
+ x += 24
108
+ ack += 1
109
+ end
110
+
111
+ # End of BIND_ACK || ALTER_CONTEXT_RESP
112
+ end
113
+
114
+ # BIND_NACK == 13
115
+ if (self.type == 13)
116
+
117
+ # Decode most of the DCERPC header
118
+ self.vers_major,
119
+ self.vers_minor,
120
+ trash,
121
+ self.flags,
122
+ self.data_rep,
123
+ self.frag_len,
124
+ self.auth_len,
125
+ self.call_id,
126
+ self.nack_reason = data.unpack('CCCCNvvVv')
127
+ end
128
+
129
+ # RESPONSE == 2
130
+ if (self.type == 2)
131
+
132
+ # Decode the DCERPC response header
133
+ self.vers_major,
134
+ self.vers_minor,
135
+ trash,
136
+ self.flags,
137
+ self.data_rep,
138
+ self.frag_len,
139
+ self.auth_len,
140
+ self.call_id,
141
+ self.alloc_hint,
142
+ self.context_id,
143
+ self.cancel_cnt = data.unpack('CCCCNvvVVvC')
144
+
145
+ # Error out if the whole header was not read
146
+ if !(self.alloc_hint and self.context_id and self.cancel_cnt)
147
+ raise Rex::Proto::DCERPC::Exceptions::InvalidPacket, 'DCERPC response packet is incomplete'
148
+ end
149
+
150
+ # Put the application data into self.stub_data
151
+ self.stub_data = data[data.length - self.alloc_hint, 0xffff]
152
+ # End of RESPONSE
153
+ end
154
+
155
+ # FAULT == 3
156
+ if (self.type == 3)
157
+
158
+ # Decode the DCERPC response header
159
+ self.vers_major,
160
+ self.vers_minor,
161
+ trash,
162
+ self.flags,
163
+ self.data_rep,
164
+ self.frag_len,
165
+ self.auth_len,
166
+ self.call_id,
167
+ self.alloc_hint,
168
+ self.context_id,
169
+ self.cancel_cnt,
170
+ trash,
171
+ self.status = data.unpack('CCCCNvvVVvCCV')
172
+
173
+ # Put the application data into self.stub_data
174
+ self.stub_data = data[data.length - self.alloc_hint, 0xffff]
175
+ # End of FAULT
176
+ end
177
+
178
+ end
179
+
180
+ protected
181
+ # attr_accessor :raw
182
+
183
+ end
184
+ end
185
+ end
186
+ end
187
+
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'rex/test'
6
+ require 'rex/proto/dcerpc/response'
7
+
8
+ class Rex::Proto::DCERPC::Response::UnitTest < Test::Unit::TestCase
9
+
10
+ Klass = Rex::Proto::DCERPC::Response
11
+
12
+ def test_parse
13
+
14
+ end
15
+ end
@@ -0,0 +1,84 @@
1
+ module Rex
2
+ module Proto
3
+ module DCERPC
4
+ class UUID
5
+
6
+
7
+ @@known_uuids =
8
+ {
9
+ 'MGMT' => [ 'afa8bd80-7d8a-11c9-bef4-08002b102989', '2.0' ],
10
+ 'REMACT' => [ '4d9f4ab8-7d1c-11cf-861e-0020af6e7c57', '0.0' ],
11
+ 'SYSACT' => [ '000001a0-0000-0000-c000-000000000046', '0.0' ],
12
+ 'LSA_DS' => [ '3919286a-b10c-11d0-9ba8-00c04fd92ef5', '0.0' ],
13
+ 'SAMR' => [ '12345778-1234-abcd-ef00-0123456789ac', '1.0' ],
14
+ 'MSMQ' => [ 'fdb3a030-065f-11d1-bb9b-00a024ea5525', '1.0' ],
15
+ 'EVENTLOG' => [ '82273fdc-e32a-18c3-3f78-827929dc23ea', '0.0' ],
16
+ 'SVCCTL' => [ '367abb81-9844-35f1-ad32-98f038001003', '2.0' ],
17
+ 'SRVSVC' => [ '4b324fc8-1670-01d3-1278-5a47bf6ee188', '3.0' ],
18
+ 'PNP' => [ '8d9f4e40-a03d-11ce-8f69-08003e30051b', '1.0' ]
19
+ }
20
+
21
+ # Convert a UUID in binary format to the string representation
22
+ def self.uuid_unpack(uuid_bin)
23
+ raise ArgumentError if uuid_bin.length != 16
24
+ sprintf("%.8x-%.4x-%.4x-%.4x-%s",
25
+ uuid_bin[ 0, 4].unpack('V')[0],
26
+ uuid_bin[ 4, 2].unpack('v')[0],
27
+ uuid_bin[ 6, 2].unpack('v')[0],
28
+ uuid_bin[ 8, 2].unpack('n')[0],
29
+ uuid_bin[10, 6].unpack('H*')[0]
30
+ )
31
+ end
32
+
33
+ # Validate a text based UUID
34
+ def self.is? (uuid_str)
35
+ raise ArgumentError if !uuid_str
36
+ if uuid_str.match(/^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/)
37
+ return true
38
+ else
39
+ return false
40
+ end
41
+ end
42
+
43
+ # Convert a UUID in string format to the binary representation
44
+ def self.uuid_pack (uuid_str)
45
+ raise ArgumentError if !self.is?(uuid_str)
46
+ parts = uuid_str.split('-')
47
+ [ parts[0].hex, parts[1].hex, parts[2].hex, parts[3].hex ].pack('Vvvn') + [ parts[4] ].pack('H*')
48
+ end
49
+
50
+ # Provide the common TransferSyntax UUID in packed format
51
+ def self.xfer_syntax_uuid ()
52
+ self.uuid_pack('8a885d04-1ceb-11c9-9fe8-08002b104860')
53
+ end
54
+
55
+ # Provide the common TransferSyntax version number
56
+ def self.xfer_syntax_vers ()
57
+ '2.0'
58
+ end
59
+
60
+ # Determine the UUID string for the DCERPC service with this name
61
+ def self.uuid_by_name (name)
62
+ if @@known_uuids.key?(name)
63
+ @@known_uuids[name][0]
64
+ end
65
+ end
66
+
67
+ # Determine the common version number for the DCERPC service with this name
68
+ def self.vers_by_name (name)
69
+ if @@known_uuids.key?(name)
70
+ @@known_uuids[name][1]
71
+ end
72
+ end
73
+
74
+ # Convert a string or number in float format to two unique numbers 2.0 => [2, 0]
75
+ def self.vers_to_nums (vers)
76
+ vers_maj = vers.to_i
77
+ vers_min = ((vers.to_f - vers.to_i) * 10).to_i
78
+ return vers_maj, vers_min
79
+ end
80
+
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
4
+
5
+ require 'rex/test'
6
+ require 'rex/exceptions'
7
+ require 'rex/proto/dcerpc/uuid'
8
+
9
+ class Rex::Proto::DCERPC::UUID::UnitTest < Test::Unit::TestCase
10
+
11
+ Klass = Rex::Proto::DCERPC::UUID
12
+
13
+ def test_is_uuid
14
+ assert(Klass.is?('afa8bd80-7d8a-11c9-bef4-08002b102989'), 'valid')
15
+ assert(!Klass.is?('afa8bd80-7d8a-11c9-bef4-08002b10298'), 'too short')
16
+ assert(!Klass.is?('afa8bd80-7d8a-11c9-bef4-08002b10298Z'), 'invalid character')
17
+ assert(!Klass.is?('afa8bd80-7d8a-11c9-bef4a08002b10298a'), 'missing dash')
18
+ assert(!Klass.is?('afa8bd80-7d8a-11c9-bef-a08002b10298a'), 'dash in wrong place')
19
+ assert_raise(Rex::ArgumentError, 'pack - too short') { Klass.is?(nil) }
20
+ end
21
+
22
+ def test_lookup
23
+ assert_equal(Klass.uuid_by_name('MGMT'), 'afa8bd80-7d8a-11c9-bef4-08002b102989', 'uuid_by_name')
24
+ assert_equal(Klass.vers_by_name('MGMT'), '2.0', 'vers_by_name')
25
+ assert(!Klass.uuid_by_name('NO_SUCH_UUID'), 'uuid_by_name - invalid')
26
+ assert(!Klass.vers_by_name('NO_SUCH_UUID'), 'vers_by_name - invalid')
27
+ end
28
+
29
+ def test_packing
30
+ uuid = '367abb81-9844-35f1-ad32-98f038001003'
31
+ assert_equal(Klass.uuid_pack(uuid), "\201\273z6D\230\3615\2552\230\3608\000\020\003", 'pack')
32
+ assert_equal(Klass.uuid_unpack("\201\273z6D\230\3615\2552\230\3608\000\020\003"), uuid, 'unpack')
33
+ assert_raise(Rex::ArgumentError, 'pack - too short') { Klass.uuid_pack('foo') }
34
+ assert_raise(Rex::ArgumentError, 'unpack - too short') { Klass.uuid_unpack('foo') }
35
+ end
36
+
37
+ def test_xfer
38
+ assert_equal(Klass.xfer_syntax_uuid(), "\004]\210\212\353\034\311\021\237\350\010\000+\020H`", 'xfer_syntax_uuid')
39
+ assert_equal(Klass.xfer_syntax_vers(), '2.0', 'xfer_syntax_vers')
40
+ end
41
+
42
+ def test_vers
43
+ assert_equal(Klass.vers_to_nums('2.0'), [2, 0], 'vers_to_nums')
44
+ assert_equal(Klass.vers_to_nums('2'), [2, 0], 'vers_to_nums (short)')
45
+ end
46
+ end
@@ -0,0 +1,7 @@
1
+ # $Id: dhcp.rb 12196 2011-04-01 00:51:33Z egypt $
2
+ #
3
+ # DHCP Server support written by scriptjunkie
4
+ #
5
+
6
+ require 'rex/proto/dhcp/constants'
7
+ require 'rex/proto/dhcp/server'
@@ -0,0 +1,33 @@
1
+ # $Id: constants.rb 12196 2011-04-01 00:51:33Z egypt $
2
+ require 'rex/proto/dhcp'
3
+
4
+ module Rex
5
+ module Proto
6
+ module DHCP
7
+
8
+ Request = 1
9
+ Response = 2
10
+
11
+ DHCPDiscover = 1
12
+ DHCPOffer = 2
13
+ DHCPRequest = 3
14
+ DHCPAck = 5
15
+
16
+ DHCPMagic = "\x63\x82\x53\x63"
17
+
18
+ OpDHCPServer = 0x36
19
+ OpLeaseTime = 0x33
20
+ OpSubnetMask = 1
21
+ OpRouter = 3
22
+ OpDns = 6
23
+ OpEnd = 0xff
24
+
25
+ PXEMagic = "\xF1\x00\x74\x7E"
26
+ OpPXEMagic = 0xD0
27
+ OpPXEConfigFile = 0xD1
28
+ OpPXEPathPrefix = 0xD2
29
+ OpPXERebootTime = 0xD3
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,292 @@
1
+ # $Id: server.rb 12196 2011-04-01 00:51:33Z egypt $
2
+
3
+ require 'rex/socket'
4
+ require 'rex/proto/dhcp'
5
+
6
+ module Rex
7
+ module Proto
8
+ module DHCP
9
+
10
+ ##
11
+ #
12
+ # DHCP Server class
13
+ # not completely configurable - written specifically for a PXE server
14
+ # - scriptjunkie
15
+ ##
16
+
17
+ class Server
18
+
19
+ include Rex::Socket
20
+
21
+ def initialize(hash, context = {})
22
+ self.listen_host = '0.0.0.0' # clients don't already have addresses. Needs to be 0.0.0.0
23
+ self.listen_port = 67 # mandatory (bootps)
24
+ self.context = context
25
+ self.sock = nil
26
+
27
+ @shutting_down = false
28
+
29
+ self.myfilename = hash['FILENAME'] || ""
30
+ self.myfilename << ("\x00" * (128 - self.myfilename.length))
31
+
32
+ source = hash['SRVHOST'] || Rex::Socket.source_address
33
+ self.ipstring = Rex::Socket.addr_aton(source)
34
+
35
+ ipstart = hash['DHCPIPSTART']
36
+ if ipstart
37
+ self.start_ip = Rex::Socket.addr_atoi(ipstart)
38
+ else
39
+ # Use the first 3 octects of the server's IP to construct the
40
+ # default range of x.x.x.32-254
41
+ self.start_ip = "#{self.ipstring[0..2]}\x20".unpack("N").first
42
+ end
43
+ self.current_ip = start_ip
44
+
45
+ ipend = hash['DHCPIPEND']
46
+ if ipend
47
+ self.end_ip = Rex::Socket.addr_atoi(ipend)
48
+ else
49
+ # Use the first 3 octects of the server's IP to construct the
50
+ # default range of x.x.x.32-254
51
+ self.end_ip = "#{self.ipstring[0..2]}\xfe".unpack("N").first
52
+ end
53
+
54
+ # netmask
55
+ netmask = hash['NETMASK'] || "255.255.255.0"
56
+ self.netmaskn = Rex::Socket.addr_aton(netmask)
57
+
58
+ # router
59
+ router = hash['ROUTER'] || source
60
+ self.router = Rex::Socket.addr_aton(router)
61
+
62
+ # dns
63
+ dnsserv = hash['DNSSERVER'] || source
64
+ self.dnsserv = Rex::Socket.addr_aton(dnsserv)
65
+
66
+ # broadcast
67
+ if hash['BROADCAST']
68
+ self.broadcasta = Rex::Socket.addr_aton(hash['BROADCAST'])
69
+ else
70
+ self.broadcasta = Rex::Socket.addr_itoa( self.start_ip | (Rex::Socket.addr_ntoi(self.netmaskn) ^ 0xffffffff) )
71
+ end
72
+
73
+ self.served = {}
74
+ if (hash['SERVEONCE'])
75
+ self.serveOnce = true
76
+ else
77
+ self.serveOnce = false
78
+ end
79
+
80
+ if (hash['PXE'])
81
+ self.servePXE = true
82
+ else
83
+ self.servePXE = false
84
+ end
85
+
86
+ self.leasetime = 600
87
+ self.relayip = "\x00\x00\x00\x00" # relay ip - not currently suported
88
+ self.pxeconfigfile = "update2"
89
+ self.pxepathprefix = ""
90
+ self.pxereboottime = 2000
91
+ end
92
+
93
+
94
+ # Start the DHCP server
95
+ def start
96
+ self.sock = Rex::Socket::Udp.create(
97
+ 'LocalHost' => listen_host,
98
+ 'LocalPort' => listen_port,
99
+ 'Context' => context
100
+ )
101
+
102
+ self.thread = Rex::ThreadFactory.spawn("DHCPServerMonitor", false) {
103
+ monitor_socket
104
+ }
105
+ end
106
+
107
+ # Stop the DHCP server
108
+ def stop
109
+ @shutting_down = true
110
+ self.thread.kill
111
+ self.sock.close rescue nil
112
+ end
113
+
114
+
115
+ # Set an option
116
+ def set_option(opts)
117
+ allowed_options = [
118
+ :serveOnce, :servePXE, :relayip, :leasetime, :dnsserv,
119
+ :pxeconfigfile, :pxepathprefix, :pxereboottime, :router
120
+ ]
121
+
122
+ opts.each_pair { |k,v|
123
+ next if not v
124
+ if allowed_options.include?(k)
125
+ self.instance_variable_set("@#{k}", v)
126
+ end
127
+ }
128
+ end
129
+
130
+
131
+ # Send a single packet to the specified host
132
+ def send_packet(ip, pkt)
133
+ port = 68 # bootpc
134
+ if ip
135
+ self.sock.sendto( pkt, ip, port )
136
+ else
137
+ if not self.sock.sendto( pkt, '255.255.255.255', port )
138
+ self.sock.sendto( pkt, self.broadcasta, port )
139
+ end
140
+ end
141
+ end
142
+
143
+ attr_accessor :listen_host, :listen_port, :context, :leasetime, :relayip, :router, :dnsserv
144
+ attr_accessor :sock, :thread, :myfilename, :ipstring, :served, :serveOnce
145
+ attr_accessor :current_ip, :start_ip, :end_ip, :broadcasta, :netmaskn
146
+ attr_accessor :servePXE, :pxeconfigfile, :pxepathprefix, :pxereboottime
147
+
148
+ protected
149
+
150
+
151
+ # See if there is anything to do.. If so, dispatch it.
152
+ def monitor_socket
153
+ while true
154
+ rds = [@sock]
155
+ wds = []
156
+ eds = [@sock]
157
+
158
+ r,w,e = ::IO.select(rds,wds,eds,1)
159
+
160
+ if (r != nil and r[0] == self.sock)
161
+ buf,host,port = self.sock.recvfrom(65535)
162
+ # Lame compatabilitiy :-/
163
+ from = [host, port]
164
+ dispatch_request(from, buf)
165
+ end
166
+
167
+ end
168
+ end
169
+
170
+ def dhcpoption(type, val = nil)
171
+ ret = ''
172
+ ret << [type].pack('C')
173
+
174
+ if val
175
+ ret << [val.length].pack('C') + val
176
+ end
177
+
178
+ ret
179
+ end
180
+
181
+ # Dispatch a packet that we received
182
+ def dispatch_request(from, buf)
183
+ type = buf.unpack('C').first
184
+ if (type != Request)
185
+ #dlog("Unknown DHCP request type: #{type}")
186
+ return
187
+ end
188
+
189
+ # parse out the members
190
+ hwtype = buf[1,1]
191
+ hwlen = buf[2,1].unpack("C").first
192
+ hops = buf[3,1]
193
+ txid = buf[4..7]
194
+ elapsed = buf[8..9]
195
+ flags = buf[10..11]
196
+ clientip = buf[12..15]
197
+ givenip = buf[16..19]
198
+ nextip = buf[20..23]
199
+ relayip = buf[24..27]
200
+ clienthwaddr = buf[28..(27+hwlen)]
201
+ servhostname = buf[44..107]
202
+ filename = buf[108..235]
203
+ magic = buf[236..239]
204
+
205
+ if (magic != DHCPMagic)
206
+ #dlog("Invalid DHCP request - bad magic.")
207
+ return
208
+ end
209
+
210
+ messageType = 0
211
+ pxeclient = false
212
+
213
+ # options parsing loop
214
+ spot = 240
215
+ while (spot < buf.length - 3)
216
+ optionType = buf[spot,1].unpack("C").first
217
+ break if optionType == 0xff
218
+
219
+ optionLen = buf[spot + 1,1].unpack("C").first
220
+ optionValue = buf[(spot + 2)..(spot + optionLen + 1)]
221
+ spot = spot + optionLen + 2
222
+ if optionType == 53
223
+ messageType = optionValue.unpack("C").first
224
+ elsif optionType == 150
225
+ pxeclient = true
226
+ end
227
+ end
228
+
229
+ if pxeclient == false && self.servePXE == true
230
+ #dlog ("No tftp server request; ignoring (probably not PXE client)")
231
+ return
232
+ end
233
+
234
+ # prepare response
235
+ pkt = [Response].pack('C')
236
+ pkt << buf[1..7] #hwtype, hwlen, hops, txid
237
+ pkt << "\x00\x00\x00\x00" #elapsed, flags
238
+ pkt << clientip
239
+ if messageType == DHCPDiscover
240
+ # give next ip address (not super reliable high volume but it should work for a basic server)
241
+ self.current_ip += 1
242
+ if self.current_ip > self.end_ip
243
+ self.current_ip = self.start_ip
244
+ end
245
+ end
246
+ pkt << Rex::Socket.addr_iton(self.current_ip)
247
+ pkt << self.ipstring #next server ip
248
+ pkt << self.relayip
249
+ pkt << buf[28..43] #client hw address
250
+ pkt << servhostname
251
+ pkt << self.myfilename
252
+ pkt << magic
253
+ pkt << "\x35\x01" #Option
254
+
255
+ if messageType == DHCPDiscover #DHCP Discover - send DHCP Offer
256
+ pkt << [DHCPOffer].pack('C')
257
+ # check if already served based on hw addr (MAC address)
258
+ if self.serveOnce == true && self.served.has_key?(buf[28..43])
259
+ #dlog ("Already served; allowing normal boot")
260
+ return
261
+ end
262
+ elsif messageType == DHCPRequest #DHCP Request - send DHCP ACK
263
+ pkt << [DHCPAck].pack('C')
264
+ # now we ignore their discovers (but we'll respond to requests in case a packet was lost)
265
+ self.served.merge!( buf[28..43] => true )
266
+ else
267
+ #dlog("ignoring unknown DHCP request - type #{messageType}")
268
+ return
269
+ end
270
+
271
+ # Options!
272
+ pkt << dhcpoption(OpDHCPServer, self.ipstring)
273
+ pkt << dhcpoption(OpLeaseTime, [self.leasetime].pack('N'))
274
+ pkt << dhcpoption(OpSubnetMask, self.netmaskn)
275
+ pkt << dhcpoption(OpRouter, self.router)
276
+ pkt << dhcpoption(OpDns, self.dnsserv)
277
+ pkt << dhcpoption(OpPXEMagic, PXEMagic)
278
+ pkt << dhcpoption(OpPXEConfigFile, self.pxeconfigfile)
279
+ pkt << dhcpoption(OpPXEPathPrefix, self.pxepathprefix)
280
+ pkt << dhcpoption(OpPXERebootTime, [self.pxereboottime].pack('N'))
281
+ pkt << dhcpoption(OpEnd)
282
+
283
+ pkt << ("\x00" * 32) #padding
284
+
285
+ send_packet(nil, pkt)
286
+ end
287
+
288
+ end
289
+
290
+ end
291
+ end
292
+ end