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,36 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module IPMI
6
+
7
+ class RAKP2 < BitStruct
8
+ unsigned :rmcp_version, 8, "RMCP Version"
9
+ unsigned :rmcp_padding, 8, "RMCP Padding"
10
+ unsigned :rmcp_sequence, 8, "RMCP Sequence"
11
+ unsigned :rmcp_mtype, 1, "RMCP Message Type"
12
+ unsigned :rmcp_class, 7, "RMCP Message Class"
13
+
14
+ unsigned :session_auth_type, 8, "Authentication Type"
15
+
16
+ unsigned :session_payload_encrypted, 1, "Session Payload Encrypted"
17
+ unsigned :session_payload_authenticated, 1, "Session Payload Authenticated"
18
+ unsigned :session_payload_type, 6, "Session Payload Type", :endian => 'little'
19
+
20
+ unsigned :session_id, 32, "Session ID"
21
+ unsigned :session_sequence, 32, "Session Sequence Number"
22
+ unsigned :message_length, 16, "Message Length", :endian => "little"
23
+
24
+ unsigned :ignored1, 8, "Ignored"
25
+ unsigned :error_code, 8, "RMCP Error Code"
26
+ unsigned :ignored2, 16, "Ignored"
27
+ char :console_session_id, 32, "Console Session ID"
28
+ char :bmc_random_id, 128, "BMC Random ID"
29
+ char :bmc_guid, 128, "RAKP2 Hash 2 (nulls)"
30
+ char :hmac_sha1, 160, "HMAC_SHA1 Output"
31
+ rest :stuff, "The rest of the stuff"
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,125 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module IPMI
6
+ class Utils
7
+
8
+ def self.checksum(data)
9
+ sum = 0
10
+ data.unpack("C*").each {|c| sum += c }
11
+ sum = ~sum + 1
12
+ sum & 0xff
13
+ end
14
+
15
+ def self.create_ipmi_getchannel_probe
16
+ [ # Get Channel Authentication Capabilities
17
+ 0x06, 0x00, 0xff, 0x07, # RMCP Header
18
+ 0x00, 0x00, 0x00, 0x00,
19
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x20, 0x18,
20
+ 0xc8, 0x81, 0x00, 0x38, 0x8e, 0x04, 0xb5
21
+ ].pack("C*")
22
+ end
23
+
24
+ # open rmcpplus_request
25
+ def self.create_ipmi_session_open_request(console_session_id)
26
+ head = [
27
+ 0x06, 0x00, 0xff, 0x07, # RMCP Header
28
+ 0x06, # RMCP+ Authentication Type
29
+ PAYLOAD_RMCPPLUSOPEN_REQ, # Payload Type
30
+ 0x00, 0x00, 0x00, 0x00, # Session ID
31
+ 0x00, 0x00, 0x00, 0x00 # Sequence Number
32
+ ].pack("C*")
33
+
34
+ data =
35
+ [ # Maximum access
36
+ 0x00, 0x00,
37
+ # Reserved
38
+ 0x00, 0x00
39
+ ].pack("C*") +
40
+ console_session_id +
41
+ [
42
+ 0x00, 0x00, 0x00, 0x08,
43
+ 0x01, 0x00, 0x00, 0x00,
44
+ 0x01, 0x00, 0x00, 0x08,
45
+ # HMAC-SHA1
46
+ 0x01, 0x00, 0x00, 0x00,
47
+ 0x02, 0x00, 0x00, 0x08,
48
+ # AES Encryption
49
+ 0x01, 0x00, 0x00, 0x00
50
+ ].pack("C*")
51
+
52
+ head + [data.length].pack('v') + data
53
+ end
54
+
55
+
56
+ # open rmcpplus_request with cipherzero
57
+ def self.create_ipmi_session_open_cipher_zero_request(console_session_id)
58
+ head = [
59
+ 0x06, 0x00, 0xff, 0x07, # RMCP Header
60
+ 0x06, # RMCP+ Authentication Type
61
+ PAYLOAD_RMCPPLUSOPEN_REQ, # Payload Type
62
+ 0x00, 0x00, 0x00, 0x00, # Session ID
63
+ 0x00, 0x00, 0x00, 0x00 # Sequence Number
64
+ ].pack("C*")
65
+
66
+ data =
67
+ [ # Maximum access
68
+ 0x00, 0x00,
69
+ # Reserved
70
+ 0x00, 0x00
71
+ ].pack("C*") +
72
+ console_session_id +
73
+ [
74
+ 0x00, 0x00, 0x00, 0x08,
75
+ # Cipher 0
76
+ 0x00, 0x00, 0x00, 0x00,
77
+ 0x01, 0x00, 0x00, 0x08,
78
+ # Cipher 0
79
+ 0x00, 0x00, 0x00, 0x00,
80
+ 0x02, 0x00, 0x00, 0x08,
81
+ # No Encryption
82
+ 0x00, 0x00, 0x00, 0x00
83
+ ].pack("C*")
84
+
85
+ head + [data.length].pack('v') + data
86
+ end
87
+
88
+ def self.create_ipmi_rakp_1(bmc_session_id, console_random_id, username)
89
+ [
90
+ 0x06, 0x00, 0xff, 0x07, # RMCP Header
91
+ 0x06, # RMCP+ Authentication Type
92
+ PAYLOAD_RAKP1, # Payload Type
93
+ 0x00, 0x00,
94
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
95
+ 0x00, 0x00, 0x00, 0x00
96
+ ].pack("C*") +
97
+ bmc_session_id +
98
+ console_random_id +
99
+ [
100
+ 0x14, 0x00, 0x00,
101
+ username.length
102
+ ].pack("C*") +
103
+ username
104
+ end
105
+
106
+
107
+ def self.create_rakp_hmac_sha1_salt(con_sid, bmc_sid, con_rid, bmc_rid, bmc_gid, auth_level, username)
108
+ con_sid +
109
+ bmc_sid +
110
+ con_rid +
111
+ bmc_rid +
112
+ bmc_gid +
113
+ [ auth_level ].pack("C") +
114
+ [ username.length ].pack("C") +
115
+ username
116
+ end
117
+
118
+ def self.verify_rakp_hmac_sha1(salt, hash, password)
119
+ OpenSSL::HMAC.digest('sha1', password, salt) == hash
120
+ end
121
+
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,7 @@
1
+ # -*- coding: binary -*-
2
+ # NAT-PMP protocol support
3
+ #
4
+ # @author Jon Hart <jhart@spoofed.org>
5
+
6
+ require 'rex/proto/natpmp/constants'
7
+ require 'rex/proto/natpmp/packet'
@@ -0,0 +1,19 @@
1
+ # -*- coding: binary -*-
2
+ ##
3
+ #
4
+ # NAT-PMP constants
5
+ #
6
+ # by Jon Hart <jhart@spoofed.org>
7
+ #
8
+ ##
9
+
10
+ module Rex
11
+ module Proto
12
+ module NATPMP
13
+ DefaultPort = 5351
14
+ Version = 0
15
+ TCP = 2
16
+ UDP = 1
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,45 @@
1
+ # -*- coding: binary -*-
2
+ ##
3
+ #
4
+ # NAT-PMP protocol support
5
+ #
6
+ # by Jon Hart <jhart@spoofed.org>
7
+ #
8
+ ##
9
+
10
+ module Rex
11
+ module Proto
12
+ module NATPMP
13
+
14
+ # Return a NAT-PMP request to get the external address.
15
+ def external_address_request
16
+ [ 0, 0 ].pack('nn')
17
+ end
18
+
19
+ # Parse a NAT-PMP external address response +resp+.
20
+ # Returns the decoded parts of the response as an array.
21
+ def parse_external_address_response(resp)
22
+ (ver, op, result, epoch, addr) = resp.unpack("CCnNN")
23
+ [ ver, op, result, epoch, Rex::Socket::addr_itoa(addr) ]
24
+ end
25
+
26
+ # Return a NAT-PMP request to map remote port +rport+/+protocol+ to local port +lport+ for +lifetime+ ms
27
+ def map_port_request(lport, rport, protocol, lifetime)
28
+ [ Rex::Proto::NATPMP::Version, # version
29
+ protocol, # opcode, which is now the protocol we are asking to forward
30
+ 0, # reserved
31
+ lport,
32
+ rport,
33
+ lifetime
34
+ ].pack("CCnnnN")
35
+ end
36
+
37
+ # Parse a NAT-PMP mapping response +resp+.
38
+ # Returns the decoded parts as an array.
39
+ def parse_map_port_response(resp)
40
+ resp.unpack("CCnNnnN")
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,8 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/proto/ntlm/constants'
3
+ require 'rex/proto/ntlm/exceptions'
4
+ require 'rex/proto/ntlm/crypt'
5
+ require 'rex/proto/ntlm/utils'
6
+ require 'rex/proto/ntlm/base'
7
+ require 'rex/proto/ntlm/message'
8
+
@@ -0,0 +1,327 @@
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-02-23 refactored by Alexandre Maloteaux for Metasploit Project
16
+ # -------------------------------------------------------------
17
+ #
18
+ # 2006-02-11 refactored by Minero Aoki
19
+ # -------------------------------------------------------------
20
+ #
21
+ # All protocol information used to write this code stems from
22
+ # "The NTLM Authentication Protocol" by Eric Glass. The author
23
+ # would thank to him for this tremendous work and making it
24
+ # available on the net.
25
+ # http://davenport.sourceforge.net/ntlm.html
26
+ # -------------------------------------------------------------
27
+ # Copyright (c) 2003 Eric Glass
28
+ #
29
+ # Permission to use, copy, modify, and distribute this document
30
+ # for any purpose and without any fee is hereby granted,
31
+ # provided that the above copyright notice and this list of
32
+ # conditions appear in all copies.
33
+ # -------------------------------------------------------------
34
+ #
35
+ # The author also looked Mozilla-Firefox-1.0.7 source code,
36
+ # namely, security/manager/ssl/src/nsNTLMAuthModule.cpp and
37
+ # Jonathan Bastien-Filiatrault's libntlm-ruby.
38
+ # "http://x2a.org/websvn/filedetails.php?
39
+ # repname=libntlm-ruby&path=%2Ftrunk%2Fntlm.rb&sc=1"
40
+ # The latter has a minor bug in its separate_keys function.
41
+ # The third key has to begin from the 14th character of the
42
+ # input string instead of 13th:)
43
+
44
+ require 'rex/proto/ntlm/constants'
45
+
46
+ module Rex
47
+ module Proto
48
+ module NTLM
49
+ # The base type needed for other modules like message and crypt
50
+ class Base
51
+
52
+ CONST = Rex::Proto::NTLM::Constants
53
+
54
+ # base classes for primitives
55
+ class Field
56
+ attr_accessor :active, :value
57
+
58
+ def initialize(opts)
59
+ @value = opts[:value]
60
+ @active = opts[:active].nil? ? true : opts[:active]
61
+ end
62
+
63
+ def size
64
+ @active ? @size : 0
65
+ end
66
+ end
67
+
68
+ class String < Field
69
+ def initialize(opts)
70
+ super(opts)
71
+ @size = opts[:size]
72
+ end
73
+
74
+ def parse(str, offset=0)
75
+ if @active and str.size >= offset + @size
76
+ @value = str[offset, @size]
77
+ @size
78
+ else
79
+ 0
80
+ end
81
+ end
82
+
83
+ def serialize
84
+ if @active
85
+ @value
86
+ else
87
+ ""
88
+ end
89
+ end
90
+
91
+ def value=(val)
92
+ @value = val
93
+ @size = @value.nil? ? 0 : @value.size
94
+ @active = (@size > 0)
95
+ end
96
+ end
97
+
98
+ class Int16LE < Field
99
+ def initialize(opt)
100
+ super(opt)
101
+ @size = 2
102
+ end
103
+
104
+ def parse(str, offset=0)
105
+ if @active and str.size >= offset + @size
106
+ @value = str[offset, @size].unpack("v")[0]
107
+ @size
108
+ else
109
+ 0
110
+ end
111
+ end
112
+
113
+ def serialize
114
+ [@value].pack("v")
115
+ end
116
+ end
117
+
118
+ class Int32LE < Field
119
+ def initialize(opt)
120
+ super(opt)
121
+ @size = 4
122
+ end
123
+
124
+ def parse(str, offset=0)
125
+ if @active and str.size >= offset + @size
126
+ @value = str.slice(offset, @size).unpack("V")[0]
127
+ @size
128
+ else
129
+ 0
130
+ end
131
+ end
132
+
133
+ def serialize
134
+ [@value].pack("V") if @active
135
+ end
136
+ end
137
+
138
+ class Int64LE < Field
139
+ def initialize(opt)
140
+ super(opt)
141
+ @size = 8
142
+ end
143
+
144
+ def parse(str, offset=0)
145
+ if @active and str.size >= offset + @size
146
+ d, u = str.slice(offset, @size).unpack("V2")
147
+ @value = (u * 0x100000000 + d)
148
+ @size
149
+ else
150
+ 0
151
+ end
152
+ end
153
+
154
+ def serialize
155
+ [@value & 0x00000000ffffffff, @value >> 32].pack("V2") if @active
156
+ end
157
+ end
158
+
159
+ # base class of data structure
160
+ class FieldSet
161
+ class << FieldSet
162
+ def define(&block)
163
+ klass = Class.new(self) do
164
+ def self.inherited(subclass)
165
+ proto = @proto
166
+
167
+ subclass.instance_eval do
168
+ @proto = proto
169
+ end
170
+ end
171
+ end
172
+
173
+ klass.module_eval(&block)
174
+
175
+ klass
176
+ end
177
+
178
+ def string(name, opts)
179
+ add_field(name, String, opts)
180
+ end
181
+
182
+ def int16LE(name, opts)
183
+ add_field(name, Int16LE, opts)
184
+ end
185
+
186
+ def int32LE(name, opts)
187
+ add_field(name, Int32LE, opts)
188
+ end
189
+
190
+ def int64LE(name, opts)
191
+ add_field(name, Int64LE, opts)
192
+ end
193
+
194
+ def security_buffer(name, opts)
195
+ add_field(name, SecurityBuffer, opts)
196
+ end
197
+
198
+ def prototypes
199
+ @proto
200
+ end
201
+
202
+ def names
203
+ @proto.map{|n, t, o| n}
204
+ end
205
+
206
+ def types
207
+ @proto.map{|n, t, o| t}
208
+ end
209
+
210
+ def opts
211
+ @proto.map{|n, t, o| o}
212
+ end
213
+
214
+ private
215
+
216
+ def add_field(name, type, opts)
217
+ (@proto ||= []).push [name, type, opts]
218
+ define_accessor name
219
+ end
220
+
221
+ def define_accessor(name)
222
+ module_eval(<<-End, __FILE__, __LINE__ + 1)
223
+ def #{name}
224
+ self['#{name}'].value
225
+ end
226
+
227
+ def #{name}=(val)
228
+ self['#{name}'].value = val
229
+ end
230
+ End
231
+ end
232
+ end #self
233
+
234
+ def initialize
235
+ @alist = self.class.prototypes.map{ |n, t, o| [n, t.new(o)] }
236
+ end
237
+
238
+ def serialize
239
+ @alist.map{|n, f| f.serialize }.join
240
+ end
241
+
242
+ def parse(str, offset=0)
243
+ @alist.inject(offset){|cur, a| cur += a[1].parse(str, cur)}
244
+ end
245
+
246
+ def size
247
+ @alist.inject(0){|sum, a| sum += a[1].size}
248
+ end
249
+
250
+ def [](name)
251
+ a = @alist.assoc(name.to_s.intern)
252
+ raise ArgumentError, "no such field: #{name}" unless a
253
+ a[1]
254
+ end
255
+
256
+ def []=(name, val)
257
+ a = @alist.assoc(name.to_s.intern)
258
+ raise ArgumentError, "no such field: #{name}" unless a
259
+ a[1] = val
260
+ end
261
+
262
+ def enable(name)
263
+ self[name].active = true
264
+ end
265
+
266
+ def disable(name)
267
+ self[name].active = false
268
+ end
269
+ end
270
+
271
+ Blob = FieldSet.define {
272
+ int32LE :blob_signature, {:value => CONST::BLOB_SIGN}
273
+ int32LE :reserved, {:value => 0}
274
+ int64LE :timestamp, {:value => 0}
275
+ string :challenge, {:value => "", :size => 8}
276
+ int32LE :unknown1, {:value => 0}
277
+ string :target_info, {:value => "", :size => 0}
278
+ int32LE :unknown2, {:value => 0}
279
+ }
280
+
281
+ SecurityBuffer = FieldSet.define {
282
+ int16LE :length, {:value => 0}
283
+ int16LE :allocated, {:value => 0}
284
+ int32LE :offset, {:value => 0}
285
+ }
286
+
287
+
288
+ class SecurityBuffer
289
+ attr_accessor :active
290
+ def initialize(opts)
291
+ super()
292
+ @value = opts[:value]
293
+ @active = opts[:active].nil? ? true : opts[:active]
294
+ @size = 8
295
+ end
296
+
297
+ def parse(str, offset=0)
298
+ if @active and str.size >= offset + @size
299
+ super(str, offset)
300
+ @value = str[self.offset, self.length]
301
+ @size
302
+ else
303
+ 0
304
+ end
305
+ end
306
+
307
+ def serialize
308
+ super if @active
309
+ end
310
+
311
+ def value
312
+ @value
313
+ end
314
+
315
+ def value=(val)
316
+ @value = val
317
+ self.length = self.allocated = val.size
318
+ end
319
+
320
+ def data_size
321
+ @active ? @value.size : 0
322
+ end
323
+ end
324
+ end
325
+ end
326
+ end
327
+ end