dstruct 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +23 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -0
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -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 +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -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 +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +326 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. metadata +536 -0
@@ -0,0 +1,75 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Proto
4
+ module NTLM
5
+ class Constants
6
+
7
+ SSP_SIGN = "NTLMSSP\0"
8
+ BLOB_SIGN = 0x00000101
9
+ LM_MAGIC = "KGS!@\#$%"
10
+ TIME_OFFSET = 11644473600
11
+ MAX64 = 0xffffffffffffffff
12
+
13
+ FLAGS = {
14
+ :UNICODE => 0x00000001,
15
+ :OEM => 0x00000002,
16
+ :REQUEST_TARGET => 0x00000004,
17
+ #:UNKNOWN => 0x00000008,
18
+ :SIGN => 0x00000010,
19
+ :SEAL => 0x00000020,
20
+ #:UNKNOWN => 0x00000040,
21
+ :NETWARE => 0x00000100,
22
+ :NTLM => 0x00000200,
23
+ #:UNKNOWN => 0x00000400,
24
+ #:UNKNOWN => 0x00000800,
25
+ :DOMAIN_SUPPLIED => 0x00001000,
26
+ :WORKSTATION_SUPPLIED => 0x00002000,
27
+ :LOCAL_CALL => 0x00004000,
28
+ :ALWAYS_SIGN => 0x00008000,
29
+ :TARGET_TYPE_DOMAIN => 0x00010000,
30
+ :TARGET_INFO => 0x00800000,
31
+ :NTLM2_KEY => 0x00080000,
32
+ :KEY128 => 0x20000000,
33
+ :KEY56 => 0x80000000
34
+ }
35
+
36
+ FLAG_KEYS = FLAGS.keys.sort{|a, b| FLAGS[a] <=> FLAGS[b] }
37
+
38
+ DEFAULT_FLAGS = {
39
+ :TYPE1 => FLAGS[:UNICODE] | FLAGS[:OEM] | FLAGS[:REQUEST_TARGET] | FLAGS[:NTLM] | FLAGS[:ALWAYS_SIGN] | FLAGS[:NTLM2_KEY],
40
+ :TYPE2 => FLAGS[:UNICODE],
41
+ :TYPE3 => FLAGS[:UNICODE] | FLAGS[:REQUEST_TARGET] | FLAGS[:NTLM] | FLAGS[:ALWAYS_SIGN] | FLAGS[:NTLM2_KEY]
42
+ }
43
+
44
+ # NTLM Response Type
45
+ NTLM_V1_RESPONSE = 1
46
+ NTLM_V2_RESPONSE = 2
47
+ NTLM_2_SESSION_RESPONSE = 3
48
+
49
+ #the same flags but merged from lib/rex/proto/smb/constants and keeped for compatibility
50
+ # NTLMSSP Message Flags
51
+ NEGOTIATE_UNICODE = 0x00000001 # Only set if Type 1 contains it - this or oem, not both
52
+ NEGOTIATE_OEM = 0x00000002 # Only set if Type 1 contains it - this or unicode, not both
53
+ REQUEST_TARGET = 0x00000004 # If set in Type 1, must return domain or server
54
+ NEGOTIATE_SIGN = 0x00000010 # Session signature required
55
+ NEGOTIATE_SEAL = 0x00000020 # Session seal required
56
+ NEGOTIATE_LMKEY = 0x00000080 # LM Session Key should be used for signing and sealing
57
+ NEGOTIATE_NTLM = 0x00000200 # NTLM auth is supported
58
+ NEGOTIATE_ANONYMOUS = 0x00000800 # Anonymous context used
59
+ NEGOTIATE_DOMAIN = 0x00001000 # Sent in Type1, client gives domain info
60
+ NEGOTIATE_WORKSTATION = 0x00002000 # Sent in Type1, client gives workstation info
61
+ NEGOTIATE_LOCAL_CALL = 0x00004000 # Server and client are on same machine
62
+ NEGOTIATE_ALWAYS_SIGN = 0x00008000 # Add signatures to packets
63
+ TARGET_TYPE_DOMAIN = 0x00010000 # If REQUEST_TARGET, we're adding the domain name
64
+ TARGET_TYPE_SERVER = 0x00020000 # If REQUEST_TARGET, we're adding the server name
65
+ TARGET_TYPE_SHARE = 0x00040000 # Supposed to denote "a share" but for a webserver?
66
+ NEGOTIATE_NTLM2_KEY = 0x00080000 # NTLMv2 Signature and Key exchanges
67
+ NEGOTIATE_TARGET_INFO = 0x00800000 # Server set when sending Target Information Block
68
+ NEGOTIATE_128 = 0x20000000 # 128-bit encryption supported
69
+ NEGOTIATE_KEY_EXCH = 0x40000000 # Client will supply encrypted master key in Session Key field of Type3 msg
70
+ NEGOTIATE_56 = 0x80000000 # 56-bit encryption supported
71
+
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,412 @@
1
+ # -*- coding: binary -*-
2
+ #
3
+ # An NTLM Authentication Library for Ruby
4
+ #
5
+ # This code is a derivative of "dbf2.rb" written by yrock
6
+ # and Minero Aoki. You can find original code here:
7
+ # http://jp.rubyist.net/magazine/?0013-CodeReview
8
+ # -------------------------------------------------------------
9
+ # Copyright (c) 2005,2006 yrock
10
+ #
11
+ # This program is free software.
12
+ # You can distribute/modify this program under the terms of the
13
+ # Ruby License.
14
+ #
15
+ # 2011-03-08 improved through a code merge with Metasploit's SMB::Crypt
16
+ # -------------------------------------------------------------
17
+ #
18
+ # 2011-02-23 refactored and improved by Alexandre Maloteaux for Metasploit Project
19
+ # -------------------------------------------------------------
20
+ #
21
+ # 2006-02-11 refactored by Minero Aoki
22
+ # -------------------------------------------------------------
23
+ #
24
+ # All protocol information used to write this code stems from
25
+ # "The NTLM Authentication Protocol" by Eric Glass. The author
26
+ # would thank to him for this tremendous work and making it
27
+ # available on the net.
28
+ # http://davenport.sourceforge.net/ntlm.html
29
+ # -------------------------------------------------------------
30
+ # Copyright (c) 2003 Eric Glass
31
+ #
32
+ # Permission to use, copy, modify, and distribute this document
33
+ # for any purpose and without any fee is hereby granted,
34
+ # provided that the above copyright notice and this list of
35
+ # conditions appear in all copies.
36
+ # -------------------------------------------------------------
37
+ #
38
+ # The author also looked Mozilla-Firefox-1.0.7 source code,
39
+ # namely, security/manager/ssl/src/nsNTLMAuthModule.cpp and
40
+ # Jonathan Bastien-Filiatrault's libntlm-ruby.
41
+ # "http://x2a.org/websvn/filedetails.php?
42
+ # repname=libntlm-ruby&path=%2Ftrunk%2Fntlm.rb&sc=1"
43
+ # The latter has a minor bug in its separate_keys function.
44
+ # The third key has to begin from the 14th character of the
45
+ # input string instead of 13th:)
46
+
47
+ require 'rex/proto/ntlm/constants'
48
+ require 'rex/proto/ntlm/base'
49
+
50
+ module Rex
51
+ module Proto
52
+ module NTLM
53
+ class Crypt
54
+
55
+ CONST = Rex::Proto::NTLM::Constants
56
+ BASE = Rex::Proto::NTLM::Base
57
+
58
+ @@loaded_openssl = false
59
+
60
+ begin
61
+ require 'openssl'
62
+ require 'openssl/digest'
63
+ @@loaded_openssl = true
64
+ rescue ::Exception
65
+ end
66
+
67
+ def self.gen_keys(str)
68
+ str.scan(/.{7}/).map{ |key| des_56_to_64(key) }
69
+ end
70
+
71
+ def self.des_56_to_64(ckey56s)
72
+ ckey64 = []
73
+ ckey56 = ckey56s.unpack('C*')
74
+ ckey64[0] = ckey56[0]
75
+ ckey64[1] = ((ckey56[0] << 7) & 0xFF) | (ckey56[1] >> 1)
76
+ ckey64[2] = ((ckey56[1] << 6) & 0xFF) | (ckey56[2] >> 2)
77
+ ckey64[3] = ((ckey56[2] << 5) & 0xFF) | (ckey56[3] >> 3)
78
+ ckey64[4] = ((ckey56[3] << 4) & 0xFF) | (ckey56[4] >> 4)
79
+ ckey64[5] = ((ckey56[4] << 3) & 0xFF) | (ckey56[5] >> 5)
80
+ ckey64[6] = ((ckey56[5] << 2) & 0xFF) | (ckey56[6] >> 6)
81
+ ckey64[7] = (ckey56[6] << 1) & 0xFF
82
+ ckey64.pack('C*')
83
+ end
84
+
85
+ def self.apply_des(plain, keys)
86
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
87
+ dec = OpenSSL::Cipher::DES.new
88
+ keys.map do |k|
89
+ dec.key = k
90
+ dec.encrypt.update(plain)
91
+ end
92
+ end
93
+
94
+ def self.lm_hash(password, half = false)
95
+ size = half ? 7 : 14
96
+ keys = gen_keys(password.upcase.ljust(size, "\0"))
97
+ apply_des(CONST::LM_MAGIC, keys).join
98
+ end
99
+
100
+ def self.ntlm_hash(password, opt = {})
101
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
102
+ pwd = password.dup
103
+ unless opt[:unicode]
104
+ pwd = Rex::Text.to_unicode(pwd)
105
+ end
106
+ OpenSSL::Digest::MD4.digest(pwd)
107
+ end
108
+
109
+ # This hash is used for lmv2/ntlmv2 response calculation
110
+ def self.ntlmv2_hash(user, password, domain, opt={})
111
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
112
+
113
+ if opt[:pass_is_hash]
114
+ ntlmhash = password
115
+ else
116
+ ntlmhash = ntlm_hash(password, opt)
117
+ end
118
+ # With Win 7 and maybe other OSs we sometimes get the domain not uppercased
119
+ userdomain = user.upcase + domain
120
+ unless opt[:unicode]
121
+ userdomain = Rex::Text.to_unicode(userdomain)
122
+ end
123
+ OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, ntlmhash, userdomain)
124
+ end
125
+
126
+ # Create the LANMAN response
127
+ def self.lm_response(arg, half = false)
128
+ begin
129
+ hash = arg[:lm_hash]
130
+ chal = arg[:challenge]
131
+ rescue
132
+ raise ArgumentError
133
+ end
134
+ chal = BASE::pack_int64le(chal) if chal.is_a?(Integer)
135
+ if half then size = 7 else size = 21 end
136
+ keys = gen_keys hash.ljust(size, "\0")
137
+ apply_des(chal, keys).join
138
+ end
139
+
140
+ # Synonym of lm_response for old compatibility with lib/rex/proto/smb/crypt
141
+ def self.lanman_des(password, challenge)
142
+ lm_response({
143
+ :lm_hash => self.lm_hash(password),
144
+ :challenge => challenge
145
+ })
146
+ end
147
+
148
+ def self.ntlm_response(arg)
149
+ hash = arg[:ntlm_hash]
150
+ chal = arg[:challenge]
151
+ chal = BASE::pack_int64le(chal) if chal.is_a?(::Integer)
152
+ keys = gen_keys(hash.ljust(21, "\0"))
153
+ apply_des(chal, keys).join
154
+ end
155
+
156
+ #synonym of ntlm_response for old compatibility with lib/rex/proto/smb/crypt
157
+ def self.ntlm_md4(password, challenge)
158
+ ntlm_response({
159
+ :ntlm_hash => self.ntlm_hash(password),
160
+ :challenge => challenge
161
+ })
162
+ end
163
+
164
+ def self.ntlmv2_response(arg, opt = {})
165
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
166
+
167
+ key, chal = arg[:ntlmv2_hash], arg[:challenge]
168
+ if not (key and chal)
169
+ raise ArgumentError , 'ntlmv2_hash and challenge are mandatory'
170
+ end
171
+
172
+ chal = BASE::pack_int64le(chal) if chal.is_a?(::Integer)
173
+ bb = nil
174
+
175
+ if opt[:nt_client_challenge]
176
+ if opt[:nt_client_challenge].to_s.length <= 8
177
+ raise ArgumentError,"nt_client_challenge is not in a correct format "
178
+ end
179
+ bb = opt[:nt_client_challenge]
180
+ else
181
+ if not arg[:target_info]
182
+ raise ArgumentError, "target_info is mandatory in this case"
183
+ end
184
+
185
+ ti = arg[:target_info]
186
+ cc = opt[:client_challenge] || rand(CONST::MAX64)
187
+ cc = BASE::pack_int64le(cc) if cc.is_a?(::Integer)
188
+
189
+ ts = opt[:timestamp] || Time.now.to_i
190
+
191
+ # Convert the unix timestamp to windows format
192
+ # epoch -> milsec from Jan 1, 1601
193
+ ts = 10000000 * (ts + CONST::TIME_OFFSET)
194
+
195
+ blob = BASE::Blob.new
196
+ blob.timestamp = ts
197
+ blob.challenge = cc
198
+ blob.target_info = ti
199
+
200
+ bb = blob.serialize
201
+ end
202
+
203
+ OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, key, chal + bb) + bb
204
+ end
205
+
206
+ def self.lmv2_response(arg, opt = {})
207
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
208
+ key = arg[:ntlmv2_hash]
209
+ chal = arg[:challenge]
210
+
211
+ chal = BASE::pack_int64le(chal) if chal.is_a?(::Integer)
212
+ cc = opt[:client_challenge] || rand(CONST::MAX64)
213
+ cc = BASE::pack_int64le(cc) if cc.is_a?(::Integer)
214
+
215
+ OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, key, chal + cc) + cc
216
+ end
217
+
218
+ def self.ntlm2_session(arg, opt = {})
219
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
220
+ passwd_hash,chal = arg[:ntlm_hash],arg[:challenge]
221
+ if not (passwd_hash and chal)
222
+ raise RuntimeError, "ntlm_hash and challenge are required"
223
+ end
224
+
225
+ cc = opt[:client_challenge] || rand(CONST::MAX64)
226
+ cc = BASE::pack_int64le(cc) if cc.is_a?(Integer)
227
+
228
+ keys = gen_keys(passwd_hash.ljust(21, "\0"))
229
+ session_hash = OpenSSL::Digest::MD5.digest(chal + cc)[0,8]
230
+ response = apply_des(session_hash, keys).join
231
+ [cc.ljust(24, "\0"), response]
232
+ end
233
+
234
+ #this function will check if the net lm response provided correspond to en empty password
235
+ def self.is_hash_from_empty_pwd?(arg)
236
+ hash_type = arg[:type]
237
+ raise ArgumentError,"arg[:type] is mandatory" if not hash_type
238
+ raise ArgumentError,"arg[:type] must be lm or ntlm" if not hash_type =~ /^((lm)|(ntlm))$/
239
+
240
+ ntlm_ver = arg[:ntlm_ver]
241
+ raise ArgumentError,"arg[:ntlm_ver] is mandatory" if not ntlm_ver
242
+
243
+ hash = arg[:hash]
244
+ raise ArgumentError,"arg[:hash] is mandatory" if not hash
245
+
246
+ srv_chall = arg[:srv_challenge]
247
+ raise ArgumentError,"arg[:srv_challenge] is mandatory" if not srv_chall
248
+ raise ArgumentError,"Server challenge length must be exactly 8 bytes" if srv_chall.length != 8
249
+
250
+ #calculate responses for empty pwd
251
+ case ntlm_ver
252
+ when CONST::NTLM_V1_RESPONSE
253
+ if hash.length != 24
254
+ raise ArgumentError,"hash length must be exactly 24 bytes "
255
+ end
256
+ case hash_type
257
+ when 'lm'
258
+ arglm = { :lm_hash => self.lm_hash(''),
259
+ :challenge => srv_chall}
260
+ calculatedhash = self.lm_response(arglm)
261
+ when 'ntlm'
262
+ argntlm = { :ntlm_hash => self.ntlm_hash(''),
263
+ :challenge => srv_chall }
264
+ calculatedhash = self.ntlm_response(argntlm)
265
+ end
266
+ when CONST::NTLM_V2_RESPONSE
267
+ raise ArgumentError,"hash length must be exactly 16 bytes " if hash.length != 16
268
+ cli_chall = arg[:cli_challenge]
269
+ raise ArgumentError,"arg[:cli_challenge] is mandatory in this case" if not cli_chall
270
+ user = arg[:user]
271
+ raise ArgumentError,"arg[:user] is mandatory in this case" if not user
272
+ domain = arg[:domain]
273
+ raise ArgumentError,"arg[:domain] is mandatory in this case" if not domain
274
+
275
+ case hash_type
276
+ when 'lm'
277
+ raise ArgumentError,"Client challenge length must be exactly 8 bytes " if cli_chall.length != 8
278
+ arglm = { :ntlmv2_hash => self.ntlmv2_hash(user,'', domain),
279
+ :challenge => srv_chall }
280
+ optlm = { :client_challenge => cli_chall}
281
+ calculatedhash = self.lmv2_response(arglm, optlm)[0,16]
282
+ when 'ntlm'
283
+ raise ArgumentError,"Client challenge length must be bigger then 8 bytes " if cli_chall.length <= 8
284
+ argntlm = { :ntlmv2_hash => self.ntlmv2_hash(user, '', domain),
285
+ :challenge => srv_chall }
286
+ optntlm = { :nt_client_challenge => cli_chall}
287
+ calculatedhash = self.ntlmv2_response(argntlm,optntlm)[0,16]
288
+ end
289
+ when CONST::NTLM_2_SESSION_RESPONSE
290
+ raise ArgumentError,"hash length must be exactly 16 bytes " if hash.length != 24
291
+ cli_chall = arg[:cli_challenge]
292
+ raise ArgumentError,"arg[:cli_challenge] is mandatory in this case" if not cli_chall
293
+ raise ArgumentError,"Client challenge length must be exactly 8 bytes " if cli_chall.length != 8
294
+ case hash_type
295
+ when 'lm'
296
+ raise ArgumentError, "ntlm2_session is incompatible with lm"
297
+ when 'ntlm'
298
+ argntlm = { :ntlm_hash => self.ntlm_hash(''),
299
+ :challenge => srv_chall }
300
+ optntlm = { :client_challenge => cli_chall}
301
+ end
302
+ calculatedhash = self.ntlm2_session(argntlm,optntlm).join[24,24]
303
+ else
304
+ raise ArgumentError,"ntlm_ver is of unknow type"
305
+ end
306
+ hash == calculatedhash
307
+ end
308
+
309
+
310
+
311
+ #
312
+ # Signing method added for metasploit project
313
+ #
314
+
315
+ # Used when only the LMv1 response is provided (i.e., with Win9x clients)
316
+ def self.lmv1_user_session_key(pass, opt = {})
317
+ if opt[:pass_is_hash]
318
+ usk = pass[0,8]
319
+ else
320
+ usk = self.lm_hash(pass.upcase[0,7],true)
321
+ end
322
+ usk.ljust(16,"\x00")
323
+ end
324
+
325
+ # This variant is used when the client sends the NTLMv1 response
326
+ def self.ntlmv1_user_session_key(pass, opt = {})
327
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
328
+
329
+ if opt[:pass_is_hash]
330
+ usk = pass
331
+ else
332
+ usk = self.ntlm_hash(pass)
333
+ end
334
+ OpenSSL::Digest::MD4.digest(usk)
335
+ end
336
+
337
+ # Used when NTLMv1 authentication is employed with NTLM2 session security
338
+ def self.ntlm2_session_user_session_key(pass, srv_chall, cli_chall, opt = {})
339
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
340
+
341
+ ntlm_key = self.ntlmv1_user_session_key(pass, opt )
342
+ session_chal = srv_chall + cli_chall
343
+ OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, ntlm_key, session_chal)
344
+ end
345
+
346
+ # Used when the LMv2 response is sent
347
+ def self.lmv2_user_session_key(user, pass, domain, srv_chall, cli_chall, opt = {})
348
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
349
+
350
+ ntlmv2_key = self.ntlmv2_hash(user, pass, domain, opt)
351
+ hash1 = OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, ntlmv2_key, srv_chall + cli_chall)
352
+ OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, ntlmv2_key, hash1)
353
+ end
354
+
355
+ # Used when the NTLMv2 response is sent
356
+ class << self; alias_method :ntlmv2_user_session_key, :lmv2_user_session_key; end
357
+
358
+ # Used when LanMan Key flag is set
359
+ def self.lanman_session_key(pass, srvchall, opt = {})
360
+ if opt[:pass_is_hash]
361
+ halfhash = pass[0,8]
362
+ else
363
+ halfhash = lm_hash(pass.upcase[0,7],true)
364
+ end
365
+ plain = self.lm_response({
366
+ :lm_hash => halfhash[0,7],
367
+ :challenge => srvchall
368
+ }, true )
369
+ key = halfhash + ["bdbdbdbdbdbd"].pack("H*")
370
+ keys = self.gen_keys(key)
371
+ apply_des(plain, keys).join
372
+ end
373
+
374
+ def self.encrypt_sessionkey(session_key, user_session_key)
375
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
376
+ cipher = OpenSSL::Cipher::Cipher.new('rc4')
377
+ cipher.encrypt
378
+ cipher.key = user_session_key
379
+ cipher.update(session_key)
380
+ end
381
+
382
+ def self.decrypt_sessionkey(encrypted_session_key, user_session_key)
383
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
384
+ cipher = OpenSSL::Cipher::Cipher.new('rc4')
385
+ cipher.decrypt
386
+ cipher.key = user_session_key
387
+ cipher.update(encrypted_session_key)
388
+ end
389
+
390
+ def self.make_weak_sessionkey(session_key,key_size,lanman_key = false)
391
+ case key_size
392
+ when 40
393
+ if lanman_key
394
+ return session_key[0,5] + "\xe5\x38\xb0"
395
+ else
396
+ return session_key[0,5]
397
+ end
398
+ when 56
399
+ if lanman_key
400
+ return session_key[0,7] + "\xa0"
401
+ else
402
+ return session_key[0,7]
403
+ end
404
+ else #128
405
+ return session_key[0,16]
406
+ end
407
+ end
408
+
409
+ end
410
+ end
411
+ end
412
+ end