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,16 @@
1
+ module Rex
2
+ module Proto
3
+ module NTLM
4
+ module Exceptions
5
+
6
+ class NTLMMissingChallenge < ::RuntimeError
7
+ def to_s
8
+ "Unable to complete, no challenge key found"
9
+ end
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,536 @@
1
+ #
2
+ # An NTLM Authentication Library for Ruby
3
+ #
4
+ # This code is a derivative of "dbf2.rb" written by yrock
5
+ # and Minero Aoki. You can find original code here:
6
+ # http://jp.rubyist.net/magazine/?0013-CodeReview
7
+ # -------------------------------------------------------------
8
+ # Copyright (c) 2005,2006 yrock
9
+ #
10
+ # This program is free software.
11
+ # You can distribute/modify this program under the terms of the
12
+ # Ruby License.
13
+ #
14
+ # 2011-02-23 refactored by Alexandre Maloteaux for Metasploit Project
15
+ # -------------------------------------------------------------
16
+ #
17
+ # 2006-02-11 refactored by Minero Aoki
18
+ # -------------------------------------------------------------
19
+ #
20
+ # All protocol information used to write this code stems from
21
+ # "The NTLM Authentication Protocol" by Eric Glass. The author
22
+ # would thank to him for this tremendous work and making it
23
+ # available on the net.
24
+ # http://davenport.sourceforge.net/ntlm.html
25
+ # -------------------------------------------------------------
26
+ # Copyright (c) 2003 Eric Glass
27
+ #
28
+ # Permission to use, copy, modify, and distribute this document
29
+ # for any purpose and without any fee is hereby granted,
30
+ # provided that the above copyright notice and this list of
31
+ # conditions appear in all copies.
32
+ # -------------------------------------------------------------
33
+ #
34
+ # The author also looked Mozilla-Firefox-1.0.7 source code,
35
+ # namely, security/manager/ssl/src/nsNTLMAuthModule.cpp and
36
+ # Jonathan Bastien-Filiatrault's libntlm-ruby.
37
+ # "http://x2a.org/websvn/filedetails.php?
38
+ # repname=libntlm-ruby&path=%2Ftrunk%2Fntlm.rb&sc=1"
39
+ # The latter has a minor bug in its separate_keys function.
40
+ # The third key has to begin from the 14th character of the
41
+ # input string instead of 13th:)
42
+ #--
43
+ # $Id: ntlm.rb 11678 2011-01-30 19:26:35Z hdm $
44
+ #++
45
+
46
+ #this module defines the message class , useful for easily handling type 1/2/3 ntlm messages
47
+
48
+ require 'rex/proto/ntlm/base'
49
+ require 'rex/proto/ntlm/constants'
50
+ require 'rex/proto/ntlm/crypt'
51
+
52
+
53
+ module Rex
54
+ module Proto
55
+ module NTLM
56
+ class Message < Rex::Proto::NTLM::Base::FieldSet
57
+
58
+ BASE = Rex::Proto::NTLM::Base
59
+ CONST = Rex::Proto::NTLM::Constants
60
+ CRYPT = Rex::Proto::NTLM::Crypt
61
+
62
+
63
+ class << Message
64
+ def parse(str)
65
+ m = Type0.new
66
+ m.parse(str)
67
+ case m.type
68
+ when 1
69
+ t = Type1.parse(str)
70
+ when 2
71
+ t = Type2.parse(str)
72
+ when 3
73
+ t = Type3.parse(str)
74
+ else
75
+ raise ArgumentError, "unknown type: #{m.type}"
76
+ end
77
+ t
78
+ end
79
+
80
+ def decode64(str)
81
+ parse(Rex::Text::decode_base64(str))
82
+ end
83
+ end#self
84
+
85
+ def has_flag?(flag)
86
+ (self[:flag].value & CONST::FLAGS[flag]) == CONST::FLAGS[flag]
87
+ end
88
+
89
+ def set_flag(flag)
90
+ self[:flag].value |= CONST::FLAGS[flag]
91
+ end
92
+
93
+ def dump_flags
94
+ CONST::FLAG_KEYS.each{ |k| print(k, "=", flag?(k), "\n") }
95
+ end
96
+
97
+ def serialize
98
+ deflag
99
+ super + security_buffers.map{|n, f| f.value}.join
100
+ end
101
+
102
+ def encode64
103
+ Rex::Text::encode_base64(serialize)
104
+ end
105
+
106
+ def decode64(str)
107
+ parse(Rex::Text::decode_base64(str))
108
+ end
109
+
110
+ alias head_size size
111
+
112
+ def data_size
113
+ security_buffers.inject(0){|sum, a| sum += a[1].data_size}
114
+ end
115
+
116
+ def size
117
+ head_size + data_size
118
+ end
119
+
120
+ private
121
+
122
+ def security_buffers
123
+ @alist.find_all{|n, f| f.instance_of?(BASE::SecurityBuffer)}
124
+ end
125
+
126
+ def deflag
127
+ security_buffers.inject(head_size){|cur, a|
128
+ a[1].offset = cur
129
+ cur += a[1].data_size
130
+ }
131
+ end
132
+
133
+ def data_edge
134
+ security_buffers.map{ |n, f| f.active ? f.offset : size}.min
135
+ end
136
+
137
+ # sub class definitions
138
+
139
+ Type0 = Message.define {
140
+ string :sign, {:size => 8, :value => CONST::SSP_SIGN}
141
+ int32LE :type, {:value => 0}
142
+ }
143
+
144
+ Type1 = Message.define {
145
+ string :sign, {:size => 8, :value => CONST::SSP_SIGN}
146
+ int32LE :type, {:value => 1}
147
+ int32LE :flag, {:value => CONST::DEFAULT_FLAGS[:TYPE1] }
148
+ security_buffer :domain, {:value => "", :active => false}
149
+ security_buffer :workstation, {:value => "", :active => false}
150
+ string :padding, {:size => 0, :value => "", :active => false }
151
+ }
152
+
153
+ class Type1
154
+ class << Type1
155
+ def parse(str)
156
+ t = new
157
+ t.parse(str)
158
+ t
159
+ end
160
+ end
161
+
162
+ def parse(str)
163
+ super(str)
164
+ enable(:domain) if has_flag?(:DOMAIN_SUPPLIED)
165
+ enable(:workstation) if has_flag?(:WORKSTATION_SUPPLIED)
166
+ super(str)
167
+ if ( (len = data_edge - head_size) > 0)
168
+ self.padding = "\0" * len
169
+ super(str)
170
+ end
171
+ end
172
+ end
173
+
174
+ Type2 = Message.define{
175
+ string :sign, {:size => 8, :value => CONST::SSP_SIGN}
176
+ int32LE :type, {:value => 2}
177
+ security_buffer :target_name, {:size => 0, :value => ""}
178
+ int32LE :flag, {:value => CONST::DEFAULT_FLAGS[:TYPE2]}
179
+ int64LE :challenge, {:value => 0}
180
+ int64LE :context, {:value => 0, :active => false}
181
+ security_buffer :target_info, {:value => "", :active => false}
182
+ string :padding, {:size => 0, :value => "", :active => false }
183
+ }
184
+
185
+ class Type2
186
+ class << Type2
187
+ def parse(str)
188
+ t = new
189
+ t.parse(str)
190
+ t
191
+ end
192
+ end
193
+
194
+ def parse(str)
195
+ super(str)
196
+ if has_flag?(:TARGET_INFO)
197
+ enable(:context)
198
+ enable(:target_info)
199
+ super(str)
200
+ end
201
+ if ( (len = data_edge - head_size) > 0)
202
+ self.padding = "\0" * len
203
+ super(str)
204
+ end
205
+ end
206
+ #create a type 3 response base on a type2
207
+ # This mehod is not compatible with windows 7 / 2008 r2
208
+ # to make it compatible avpair Time and SPN must be handle as in utils
209
+ def response(arg, opt = {})
210
+ usr = arg[:user]
211
+ pwd = arg[:password]
212
+ if usr.nil? or pwd.nil?
213
+ raise ArgumentError, "user and password have to be supplied"
214
+ end
215
+
216
+ if opt[:workstation]
217
+ ws = opt[:workstation]
218
+ else
219
+ ws = ""
220
+ end
221
+
222
+ if opt[:client_challenge]
223
+ cc = opt[:client_challenge]
224
+ else
225
+ cc = rand(CONST::MAX64)
226
+ end
227
+ cc = Rex::Text::pack_int64le(cc) if cc.is_a?(Integer)
228
+ opt[:client_challenge] = cc
229
+
230
+ if has_flag?(:OEM) and opt[:unicode]
231
+ usr = Rex::Text::to_ascii(usr,'utf-16le')
232
+ pwd = Rex::Text::to_ascii(pwd,'utf-16le')
233
+ ws = Rex::Text::to_ascii(ws,'utf-16le')
234
+ opt[:unicode] = false
235
+ end
236
+
237
+ if has_flag?(:UNICODE) and !opt[:unicode]
238
+ usr = Rex::Text::to_unicode(usr,'utf-16le')
239
+ pwd = Rex::Text::to_unicode(pwd,'utf-16le')
240
+ ws = Rex::Text::to_unicode(ws,'utf-16le')
241
+ opt[:unicode] = true
242
+ end
243
+
244
+ tgt = self.target_name
245
+ ti = self.target_info
246
+
247
+ chal = self[:challenge].serialize
248
+
249
+ if opt[:ntlmv2]
250
+ ar = { :ntlmv2_hash => CRYPT::ntlmv2_hash(usr, pwd, tgt, opt),
251
+ :challenge => chal, :target_info => ti}
252
+ lm_res = CRYPT::lmv2_response(ar, opt)
253
+ ntlm_res = CRYPT::ntlmv2_response(ar, opt)
254
+ elsif has_flag?(:NTLM2_KEY)
255
+ ar = {:ntlm_hash => CRYPT::ntlm_hash(pwd, opt), :challenge => chal}
256
+ lm_res, ntlm_res = CRYPT::ntlm2_session(ar, opt)
257
+ else
258
+ lm_res = CRYPT::lm_response(pwd, chal)
259
+ ntlm_res = CRYPT::ntlm_response(pwd, chal)
260
+ end
261
+
262
+ Type3.create({
263
+ :lm_response => lm_res,
264
+ :ntlm_response => ntlm_res,
265
+ :domain => tgt,
266
+ :user => usr,
267
+ :workstation => ws,
268
+ :flag => self.flag
269
+ })
270
+ end
271
+ end
272
+
273
+
274
+ Type3 = Message.define{
275
+ string :sign, {:size => 8, :value => CONST::SSP_SIGN}
276
+ int32LE :type, {:value => 3}
277
+ security_buffer :lm_response, {:value => ""}
278
+ security_buffer :ntlm_response, {:value => ""}
279
+ security_buffer :domain, {:value => ""}
280
+ security_buffer :user, {:value => ""}
281
+ security_buffer :workstation, {:value => ""}
282
+ security_buffer :session_key, {:value => "", :active => false }
283
+ int64LE :flag, {:value => 0, :active => false }
284
+ }
285
+
286
+ class Type3
287
+ class << Type3
288
+ def parse(str)
289
+ t = new
290
+ t.parse(str)
291
+ t
292
+ end
293
+
294
+ def create(arg, opt ={})
295
+ t = new
296
+ t.lm_response = arg[:lm_response]
297
+ t.ntlm_response = arg[:ntlm_response]
298
+ t.domain = arg[:domain]
299
+ t.user = arg[:user]
300
+ t.workstation = arg[:workstation]
301
+
302
+ if arg[:session_key]
303
+ t.enable(:session_key)
304
+ t.session_key = arg[session_key]
305
+ end
306
+ if arg[:flag]
307
+ t.enable(:session_key)
308
+ t.enable(:flag)
309
+ t.flag = arg[:flag]
310
+ end
311
+ t
312
+ end
313
+ end#self
314
+ end
315
+
316
+ public
317
+ #those class method have been merged from lib/rex/smb/utils
318
+
319
+ #
320
+ # Process Type 3 NTLM Message (in Base64)
321
+ #
322
+ # from http://www.innovation.ch/personal/ronald/ntlm.html
323
+ #
324
+ # struct {
325
+ # byte protocol[8]; // 'N', 'T', 'L', 'M', 'S', 'S', 'P', '\0'
326
+ # byte type; // 0x03
327
+ # byte zero[3];
328
+ #
329
+ # short lm_resp_len; // LanManager response length (always 0x18)
330
+ # short lm_resp_len; // LanManager response length (always 0x18)
331
+ # short lm_resp_off; // LanManager response offset
332
+ # byte zero[2];
333
+ #
334
+ # short nt_resp_len; // NT response length (always 0x18)
335
+ # short nt_resp_len; // NT response length (always 0x18)
336
+ # short nt_resp_off; // NT response offset
337
+ # byte zero[2];
338
+ #
339
+ # short dom_len; // domain string length
340
+ # short dom_len; // domain string length
341
+ # short dom_off; // domain string offset (always 0x40)
342
+ # byte zero[2];
343
+ #
344
+ # short user_len; // username string length
345
+ # short user_len; // username string length
346
+ # short user_off; // username string offset
347
+ # byte zero[2];
348
+ #
349
+ # short host_len; // host string length
350
+ # short host_len; // host string length
351
+ # short host_off; // host string offset
352
+ # byte zero[6];
353
+ #
354
+ # short msg_len; // message length
355
+ # byte zero[2];
356
+ #
357
+ # short flags; // 0x8201
358
+ # byte zero[2];
359
+ #
360
+ # byte dom[*]; // domain string (unicode UTF-16LE)
361
+ # byte user[*]; // username string (unicode UTF-16LE)
362
+ # byte host[*]; // host string (unicode UTF-16LE)
363
+ # byte lm_resp[*]; // LanManager response
364
+ # byte nt_resp[*]; // NT response
365
+ # } type_3_message
366
+ #
367
+ def self.process_type3_message(message)
368
+ decode = Rex::Text.decode_base64(message.strip)
369
+ type = decode[8,1].unpack("C").first
370
+ if (type == 3)
371
+ lm_len = decode[12,2].unpack("v").first
372
+ lm_offset = decode[16,2].unpack("v").first
373
+ lm = decode[lm_offset, lm_len].unpack("H*").first
374
+
375
+ nt_len = decode[20,2].unpack("v").first
376
+ nt_offset = decode[24,2].unpack("v").first
377
+ nt = decode[nt_offset, nt_len].unpack("H*").first
378
+
379
+ dom_len = decode[28,2].unpack("v").first
380
+ dom_offset = decode[32,2].unpack("v").first
381
+ domain = decode[dom_offset, dom_len]
382
+
383
+ user_len = decode[36,2].unpack("v").first
384
+ user_offset = decode[40,2].unpack("v").first
385
+ user = decode[user_offset, user_len]
386
+
387
+ host_len = decode[44,2].unpack("v").first
388
+ host_offset = decode[48,2].unpack("v").first
389
+ host = decode[host_offset, host_len]
390
+
391
+ return domain, user, host, lm, nt
392
+ else
393
+ return "", "", "", "", ""
394
+ end
395
+ end
396
+
397
+
398
+
399
+ #
400
+ # Process Type 1 NTLM Messages, return a Base64 Type 2 Message
401
+ #
402
+ def self.process_type1_message(message, nonce = "\x11\x22\x33\x44\x55\x66\x77\x88", win_domain = 'DOMAIN',
403
+ win_name = 'SERVER', dns_name = 'server', dns_domain = 'example.com', downgrade = true)
404
+
405
+ dns_name = Rex::Text.to_unicode(dns_name + "." + dns_domain)
406
+ win_domain = Rex::Text.to_unicode(win_domain)
407
+ dns_domain = Rex::Text.to_unicode(dns_domain)
408
+ win_name = Rex::Text.to_unicode(win_name)
409
+ decode = Rex::Text.decode_base64(message.strip)
410
+
411
+ type = decode[8,1].unpack("C").first
412
+
413
+ if (type == 1)
414
+ # A type 1 message has been received, lets build a type 2 message response
415
+
416
+ reqflags = decode[12,4]
417
+ reqflags = reqflags.unpack("V").first
418
+
419
+ if (reqflags & CONST::REQUEST_TARGET) == CONST::REQUEST_TARGET
420
+
421
+ if (downgrade)
422
+ # At this time NTLMv2 and signing requirements are not supported
423
+ if (reqflags & CONST::NEGOTIATE_NTLM2_KEY) == CONST::NEGOTIATE_NTLM2_KEY
424
+ reqflags = reqflags - CONST::NEGOTIATE_NTLM2_KEY
425
+ end
426
+ if (reqflags & CONST::NEGOTIATE_ALWAYS_SIGN) == CONST::NEGOTIATE_ALWAYS_SIGN
427
+ reqflags = reqflags - CONST::NEGOTIATE_ALWAYS_SIGN
428
+ end
429
+ end
430
+
431
+ flags = reqflags + CONST::TARGET_TYPE_DOMAIN + CONST::TARGET_TYPE_SERVER
432
+ tid = true
433
+
434
+ tidoffset = 48 + win_domain.length
435
+ tidbuff =
436
+ [2].pack('v') + # tid type, win domain
437
+ [win_domain.length].pack('v') +
438
+ win_domain +
439
+ [1].pack('v') + # tid type, server name
440
+ [win_name.length].pack('v') +
441
+ win_name +
442
+ [4].pack('v') + # tid type, domain name
443
+ [dns_domain.length].pack('v') +
444
+ dns_domain +
445
+ [3].pack('v') + # tid type, dns_name
446
+ [dns_name.length].pack('v') +
447
+ dns_name
448
+ else
449
+ flags = CONST::NEGOTIATE_UNICODE + CONST::NEGOTIATE_NTLM
450
+ tid = false
451
+ end
452
+
453
+ type2msg = "NTLMSSP\0" + # protocol, 8 bytes
454
+ "\x02\x00\x00\x00" # type, 4 bytes
455
+
456
+ if (tid)
457
+ type2msg += # Target security info, 8 bytes. Filled if REQUEST_TARGET
458
+ [win_domain.length].pack('v') + # Length, 2 bytes
459
+ [win_domain.length].pack('v') # Allocated space, 2 bytes
460
+ end
461
+
462
+ type2msg +="\x30\x00\x00\x00" + # Offset, 4 bytes
463
+ [flags].pack('V') + # flags, 4 bytes
464
+ nonce + # the nonce, 8 bytes
465
+ "\x00" * 8 # Context (all 0s), 8 bytes
466
+
467
+ if (tid)
468
+ type2msg += # Target information security buffer. Filled if REQUEST_TARGET
469
+ [tidbuff.length].pack('v') + # Length, 2 bytes
470
+ [tidbuff.length].pack('v') + # Allocated space, 2 bytes
471
+ [tidoffset].pack('V') + # Offset, 4 bytes (usually \x48 + length of win_domain)
472
+ win_domain + # Target name data (domain in unicode if REQUEST_UNICODE)
473
+ # Target information data
474
+ tidbuff + # Type, 2 bytes
475
+ # Length, 2 bytes
476
+ # Data (in unicode if REQUEST_UNICODE)
477
+ "\x00\x00\x00\x00" # Terminator, 4 bytes, all \x00
478
+ end
479
+
480
+ type2msg = Rex::Text.encode_base64(type2msg).delete("\n") # base64 encode and remove the returns
481
+ else
482
+ # This is not a Type2 message
483
+ type2msg = ""
484
+ end
485
+
486
+ return type2msg
487
+ end
488
+
489
+ #
490
+ # Downgrading Type messages to LMv1/NTLMv1 and removing signing
491
+ #
492
+ def self.downgrade_type_message(message)
493
+ decode = Rex::Text.decode_base64(message.strip)
494
+
495
+ type = decode[8,1].unpack("C").first
496
+
497
+ if (type > 0 and type < 4)
498
+ reqflags = decode[12..15] if (type == 1 or type == 3)
499
+ reqflags = decode[20..23] if (type == 2)
500
+ reqflags = reqflags.unpack("V")
501
+
502
+ # Remove NEGOTIATE_NTLMV2_KEY and NEGOTIATE_ALWAYS_SIGN, this lowers the negotiation
503
+ # down to LMv1/NTLMv1.
504
+ if (reqflags & CONST::NEGOTIATE_NTLM2_KEY) == CONST::NEGOTIATE_NTLM2_KEY
505
+ reqflags = reqflags - CONST::NEGOTIATE_NTLM2_KEY
506
+ end
507
+ if (reqflags & CONST::NEGOTIATE_ALWAYS_SIGN) == CONST::NEGOTIATE_ALWAYS_SIGN
508
+ reqflags = reqflags - CONST::NEGOTIATE_ALWAYS_SIGN
509
+ end
510
+
511
+ # Return the flags back to the decode so we can base64 it again
512
+ flags = reqflags.to_s(16)
513
+ 0.upto(8) do |idx|
514
+ if (idx > flags.length)
515
+ flags.insert(0, "0")
516
+ end
517
+ end
518
+
519
+ idx = 0
520
+ 0.upto(3) do |cnt|
521
+ if (type == 2)
522
+ decode[23-cnt] = [flags[idx,1]].pack("C")
523
+ else
524
+ decode[15-cnt] = [flags[idx,1]].pack("C")
525
+ end
526
+ idx += 2
527
+ end
528
+
529
+ end
530
+ return Rex::Text.encode_base64(decode).delete("\n") # base64 encode and remove the returns
531
+ end
532
+
533
+ end
534
+ end
535
+ end
536
+ end