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,85 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Proto
4
+ module DCERPC
5
+ class UUID
6
+
7
+
8
+ @@known_uuids =
9
+ {
10
+ 'MGMT' => [ 'afa8bd80-7d8a-11c9-bef4-08002b102989', '2.0' ],
11
+ 'REMACT' => [ '4d9f4ab8-7d1c-11cf-861e-0020af6e7c57', '0.0' ],
12
+ 'SYSACT' => [ '000001a0-0000-0000-c000-000000000046', '0.0' ],
13
+ 'LSA_DS' => [ '3919286a-b10c-11d0-9ba8-00c04fd92ef5', '0.0' ],
14
+ 'SAMR' => [ '12345778-1234-abcd-ef00-0123456789ac', '1.0' ],
15
+ 'MSMQ' => [ 'fdb3a030-065f-11d1-bb9b-00a024ea5525', '1.0' ],
16
+ 'EVENTLOG' => [ '82273fdc-e32a-18c3-3f78-827929dc23ea', '0.0' ],
17
+ 'SVCCTL' => [ '367abb81-9844-35f1-ad32-98f038001003', '2.0' ],
18
+ 'SRVSVC' => [ '4b324fc8-1670-01d3-1278-5a47bf6ee188', '3.0' ],
19
+ 'PNP' => [ '8d9f4e40-a03d-11ce-8f69-08003e30051b', '1.0' ]
20
+ }
21
+
22
+ # Convert a UUID in binary format to the string representation
23
+ def self.uuid_unpack(uuid_bin)
24
+ raise ArgumentError if uuid_bin.length != 16
25
+ sprintf("%.8x-%.4x-%.4x-%.4x-%s",
26
+ uuid_bin[ 0, 4].unpack('V')[0],
27
+ uuid_bin[ 4, 2].unpack('v')[0],
28
+ uuid_bin[ 6, 2].unpack('v')[0],
29
+ uuid_bin[ 8, 2].unpack('n')[0],
30
+ uuid_bin[10, 6].unpack('H*')[0]
31
+ )
32
+ end
33
+
34
+ # Validate a text based UUID
35
+ def self.is? (uuid_str)
36
+ raise ArgumentError if !uuid_str
37
+ if uuid_str.match(/^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/)
38
+ return true
39
+ else
40
+ return false
41
+ end
42
+ end
43
+
44
+ # Convert a UUID in string format to the binary representation
45
+ def self.uuid_pack (uuid_str)
46
+ raise ArgumentError if !self.is?(uuid_str)
47
+ parts = uuid_str.split('-')
48
+ [ parts[0].hex, parts[1].hex, parts[2].hex, parts[3].hex ].pack('Vvvn') + [ parts[4] ].pack('H*')
49
+ end
50
+
51
+ # Provide the common TransferSyntax UUID in packed format
52
+ def self.xfer_syntax_uuid ()
53
+ self.uuid_pack('8a885d04-1ceb-11c9-9fe8-08002b104860')
54
+ end
55
+
56
+ # Provide the common TransferSyntax version number
57
+ def self.xfer_syntax_vers ()
58
+ '2.0'
59
+ end
60
+
61
+ # Determine the UUID string for the DCERPC service with this name
62
+ def self.uuid_by_name (name)
63
+ if @@known_uuids.key?(name)
64
+ @@known_uuids[name][0]
65
+ end
66
+ end
67
+
68
+ # Determine the common version number for the DCERPC service with this name
69
+ def self.vers_by_name (name)
70
+ if @@known_uuids.key?(name)
71
+ @@known_uuids[name][1]
72
+ end
73
+ end
74
+
75
+ # Convert a string or number in float format to two unique numbers 2.0 => [2, 0]
76
+ def self.vers_to_nums (vers)
77
+ vers_maj = vers.to_i
78
+ vers_min = ((vers.to_f - vers.to_i) * 10).to_i
79
+ return vers_maj, vers_min
80
+ end
81
+
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,3 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/proto/dcerpc/wdscp/constants'
3
+ require 'rex/proto/dcerpc/wdscp/packet'
@@ -0,0 +1,89 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Proto
4
+ module DCERPC
5
+ module WDSCP
6
+ # http://msdn.microsoft.com/en-us/library/dd891406(prot.20).aspx
7
+ # http://msdn.microsoft.com/en-us/library/dd541332(prot.20).aspx
8
+ # Not all values defined by the spec have been imported...
9
+ class Constants
10
+ WDSCP_RPC_UUID = "1A927394-352E-4553-AE3F-7CF4AAFCA620"
11
+ OS_DEPLOYMENT_GUID = "\x5a\xeb\xde\xd8\xfd\xef\xb2\x43\x99\xfc\x1a\x8a\x59\x21\xc2\x27"
12
+
13
+ VAR_NAME_ARCHITECTURE = "ARCHITECTURE"
14
+ VAR_NAME_CLIENT_GUID = "CLIENT_GUID"
15
+ VAR_NAME_CLIENT_MAC = "CLIENT_MAC"
16
+ VAR_NAME_VERSION = "VERSION"
17
+ VAR_NAME_MESSAGE_TYPE = "MESSAGE_TYPE"
18
+ VAR_NAME_TRANSACTION_ID = "TRANSACTION_ID"
19
+ VAR_NAME_FLAGS = "FLAGS"
20
+ VAR_NAME_CC = "CC" #Client Capabilities
21
+ VAR_NAME_IMDC = "IMDC"
22
+
23
+ VAR_TYPE_LOOKUP = {
24
+ VAR_NAME_ARCHITECTURE => :ULONG,
25
+ VAR_NAME_CLIENT_GUID => :WSTRING,
26
+ VAR_NAME_CLIENT_MAC => :WSTRING,
27
+ VAR_NAME_VERSION => :ULONG,
28
+ VAR_NAME_MESSAGE_TYPE => :ULONG,
29
+ VAR_NAME_TRANSACTION_ID => :WSTRING,
30
+ VAR_NAME_FLAGS => :ULONG,
31
+ VAR_NAME_CC => :ULONG,
32
+ VAR_NAME_IMDC => :ULONG
33
+ }
34
+
35
+ CC_FLAGS = {
36
+ :V2 => 1,
37
+ :VHDX => 2
38
+ }
39
+
40
+ DOMAIN_JOIN_FLAGS = {
41
+ :JOIN_DOMAIN => 1,
42
+ :ACCOUNT_EXISTS => 2,
43
+ :PRESTAGE_USING_MAC => 3,
44
+ :RESET_BOOT_PROGRAM => 256
45
+ }
46
+
47
+ ARCHITECTURE = {
48
+ :X64 => 9,
49
+ :X86 => 0,
50
+ :IA64 => 6,
51
+ :ARM => 5
52
+ }
53
+
54
+ PACKET_TYPE = {
55
+ :REQUEST => 1,
56
+ :REPLY => 2
57
+ }
58
+
59
+ OPCODE = {
60
+ :IMG_ENUMERATE => 2,
61
+ :LOG_INIT => 3,
62
+ :LOG_MSG => 4,
63
+ :GET_CLIENT_UNATTEND => 5,
64
+ :GET_UNATTEND_VARIABLES => 6,
65
+ :GET_DOMAIN_JOIN_INFORMATION => 7,
66
+ :RESET_BOOT_PROGRAM => 8,
67
+ :GET_MACHINE_DRIVER_PACKAGES => 200
68
+ }
69
+
70
+ BASE_TYPE = {
71
+ :BYTE => 0x0001,
72
+ :USHORT => 0x0002,
73
+ :ULONG => 0x0004,
74
+ :ULONG64 => 0x0008,
75
+ :STRING => 0x0010,
76
+ :WSTRING => 0x0020,
77
+ :BLOB => 0x0040
78
+ }
79
+
80
+ TYPE_MODIFIER = {
81
+ :NONE => 0x0000,
82
+ :ARRAY => 0x1000
83
+ }
84
+
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,94 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Proto
4
+ module DCERPC
5
+ module WDSCP
6
+ class Packet
7
+
8
+ WDS_CONST = Rex::Proto::DCERPC::WDSCP::Constants
9
+
10
+ def initialize(packet_type, opcode)
11
+ if opcode.nil? || packet_type.nil?
12
+ raise(ArgumentError, "Packet arguments cannot be nil")
13
+ end
14
+
15
+ @variables = []
16
+ @packet_type = WDS_CONST::PACKET_TYPE[packet_type]
17
+ @opcode = WDS_CONST::OPCODE[opcode]
18
+ end
19
+
20
+ def add_var(name, type_mod=0, value_length=nil, array_size=0, value)
21
+ padding = 0
22
+ vt = WDS_CONST::VAR_TYPE_LOOKUP[name]
23
+ value_type = WDS_CONST::BASE_TYPE[vt]
24
+ name = Rex::Text.to_unicode(name).unpack('H*')[0]
25
+
26
+ # Terminate strings with null char
27
+ if vt == :STRING
28
+ value << "\x00"
29
+ elsif vt == :WSTRING
30
+ value = Rex::Text.to_unicode(value)
31
+ value << "\x00\x00"
32
+ end
33
+
34
+ value_length ||= value.length
35
+ # Variable block total size should be evenly divisible by 16.
36
+ len = 16 * (1 + (value_length/16))
37
+ @variables <<
38
+ [ name,
39
+ padding,
40
+ value_type,
41
+ type_mod,
42
+ value_length,
43
+ array_size,
44
+ value
45
+ ].pack('H132vvvVVa%i' % len)
46
+ end
47
+
48
+ def create
49
+ packet = []
50
+ var_count = @variables.count
51
+
52
+ packet_size = 0
53
+ @variables.each do |var|
54
+ packet_size += var.length
55
+ end
56
+
57
+ # variables + operation
58
+ packet_size += 16
59
+
60
+ # These bytes are not part of the spec but are not part of DCERPC according to Wireshark
61
+ # Perhaps something from MSRPC specific? Basically length of the WDSCP packet twice...
62
+ packet << [(packet_size+40)].pack('V') * 2
63
+ packet << create_endpoint_header(packet_size)
64
+ packet << create_operation_header(packet_size, var_count, @packet_type, @opcode)
65
+ packet.concat(@variables)
66
+
67
+ return packet.join
68
+ end
69
+
70
+ def create_operation_header(packet_size, var_count, packet_type=:REQUEST, opcode)
71
+ return [
72
+ packet_size, # PacketSize
73
+ 256, # Version
74
+ packet_type, # Packet_Type
75
+ 0, # Padding
76
+ opcode, # Opcode
77
+ var_count, # Variable Count
78
+ ].pack('VvCCVV')
79
+ end
80
+
81
+ def create_endpoint_header(packet_size)
82
+ return [
83
+ 40, # Header_Size
84
+ 256, # Version
85
+ packet_size, # Packet_Size - This doesn't differ from operation header despite the spec...
86
+ WDS_CONST::OS_DEPLOYMENT_GUID, # GUID
87
+ "\x00"*16, # Reserved
88
+ ].pack('vvVa16a16')
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,7 @@
1
+ # -*- coding: binary -*-
2
+ #
3
+ # DHCP Server support written by scriptjunkie
4
+ #
5
+
6
+ require 'rex/proto/dhcp/constants'
7
+ require 'rex/proto/dhcp/server'
@@ -0,0 +1,34 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/proto/dhcp'
3
+
4
+ module Rex
5
+ module Proto
6
+ module DHCP
7
+
8
+ Request = 1
9
+ Response = 2
10
+
11
+ DHCPDiscover = 1
12
+ DHCPOffer = 2
13
+ DHCPRequest = 3
14
+ DHCPAck = 5
15
+
16
+ DHCPMagic = "\x63\x82\x53\x63"
17
+
18
+ OpDHCPServer = 0x36
19
+ OpLeaseTime = 0x33
20
+ OpSubnetMask = 1
21
+ OpRouter = 3
22
+ OpDns = 6
23
+ OpHostname = 0x0c
24
+ OpEnd = 0xff
25
+
26
+ PXEMagic = "\xF1\x00\x74\x7E"
27
+ OpPXEMagic = 0xD0
28
+ OpPXEConfigFile = 0xD1
29
+ OpPXEPathPrefix = 0xD2
30
+ OpPXERebootTime = 0xD3
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,334 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/socket'
4
+ require 'rex/proto/dhcp'
5
+
6
+ module Rex
7
+ module Proto
8
+ module DHCP
9
+
10
+ ##
11
+ #
12
+ # DHCP Server class
13
+ # not completely configurable - written specifically for a PXE server
14
+ # - scriptjunkie
15
+ #
16
+ # extended to support testing/exploiting CVE-2011-0997
17
+ # - apconole@yahoo.com
18
+ ##
19
+
20
+ class Server
21
+
22
+ include Rex::Socket
23
+
24
+ def initialize(hash, context = {})
25
+ self.listen_host = '0.0.0.0' # clients don't already have addresses. Needs to be 0.0.0.0
26
+ self.listen_port = 67 # mandatory (bootps)
27
+ self.context = context
28
+ self.sock = nil
29
+
30
+ self.myfilename = hash['FILENAME'] || ""
31
+ self.myfilename << ("\x00" * (128 - self.myfilename.length))
32
+
33
+ source = hash['SRVHOST'] || Rex::Socket.source_address
34
+ self.ipstring = Rex::Socket.addr_aton(source)
35
+
36
+ ipstart = hash['DHCPIPSTART']
37
+ if ipstart
38
+ self.start_ip = Rex::Socket.addr_atoi(ipstart)
39
+ else
40
+ # Use the first 3 octects of the server's IP to construct the
41
+ # default range of x.x.x.32-254
42
+ self.start_ip = "#{self.ipstring[0..2]}\x20".unpack("N").first
43
+ end
44
+ self.current_ip = start_ip
45
+
46
+ ipend = hash['DHCPIPEND']
47
+ if ipend
48
+ self.end_ip = Rex::Socket.addr_atoi(ipend)
49
+ else
50
+ # Use the first 3 octects of the server's IP to construct the
51
+ # default range of x.x.x.32-254
52
+ self.end_ip = "#{self.ipstring[0..2]}\xfe".unpack("N").first
53
+ end
54
+
55
+ # netmask
56
+ netmask = hash['NETMASK'] || "255.255.255.0"
57
+ self.netmaskn = Rex::Socket.addr_aton(netmask)
58
+
59
+ # router
60
+ router = hash['ROUTER'] || source
61
+ self.router = Rex::Socket.addr_aton(router)
62
+
63
+ # dns
64
+ dnsserv = hash['DNSSERVER'] || source
65
+ self.dnsserv = Rex::Socket.addr_aton(dnsserv)
66
+
67
+ # broadcast
68
+ if hash['BROADCAST']
69
+ self.broadcasta = Rex::Socket.addr_aton(hash['BROADCAST'])
70
+ else
71
+ self.broadcasta = Rex::Socket.addr_itoa( self.start_ip | (Rex::Socket.addr_ntoi(self.netmaskn) ^ 0xffffffff) )
72
+ end
73
+
74
+ self.served = {}
75
+ self.serveOnce = hash.include?('SERVEONCE')
76
+
77
+ self.servePXE = (hash.include?('PXE') or hash.include?('FILENAME') or hash.include?('PXEONLY'))
78
+ self.serveOnlyPXE = hash.include?('PXEONLY')
79
+
80
+ # Always assume we don't give out hostnames ...
81
+ self.give_hostname = false
82
+ self.served_over = 0
83
+ if (hash['HOSTNAME'])
84
+ self.give_hostname = true
85
+ self.served_hostname = hash['HOSTNAME']
86
+ if ( hash['HOSTSTART'] )
87
+ self.served_over = hash['HOSTSTART'].to_i
88
+ end
89
+ end
90
+
91
+ self.leasetime = 600
92
+ self.relayip = "\x00\x00\x00\x00" # relay ip - not currently suported
93
+ self.pxeconfigfile = "update2"
94
+ self.pxealtconfigfile = "update0"
95
+ self.pxepathprefix = ""
96
+ self.pxereboottime = 2000
97
+ end
98
+
99
+ def report(&block)
100
+ self.reporter = block
101
+ end
102
+
103
+ # Start the DHCP server
104
+ def start
105
+ self.sock = Rex::Socket::Udp.create(
106
+ 'LocalHost' => listen_host,
107
+ 'LocalPort' => listen_port,
108
+ 'Context' => context
109
+ )
110
+
111
+ self.thread = Rex::ThreadFactory.spawn("DHCPServerMonitor", false) {
112
+ monitor_socket
113
+ }
114
+ end
115
+
116
+ # Stop the DHCP server
117
+ def stop
118
+ self.thread.kill
119
+ self.served = {}
120
+ self.sock.close rescue nil
121
+ end
122
+
123
+
124
+ # Set an option
125
+ def set_option(opts)
126
+ allowed_options = [
127
+ :serveOnce, :pxealtconfigfile, :servePXE, :relayip, :leasetime, :dnsserv,
128
+ :pxeconfigfile, :pxepathprefix, :pxereboottime, :router,
129
+ :give_hostname, :served_hostname, :served_over, :serveOnlyPXE
130
+ ]
131
+
132
+ opts.each_pair { |k,v|
133
+ next if not v
134
+ if allowed_options.include?(k)
135
+ self.instance_variable_set("@#{k}", v)
136
+ end
137
+ }
138
+ end
139
+
140
+
141
+ # Send a single packet to the specified host
142
+ def send_packet(ip, pkt)
143
+ port = 68 # bootpc
144
+ if ip
145
+ self.sock.sendto( pkt, ip, port )
146
+ else
147
+ if not self.sock.sendto( pkt, '255.255.255.255', port )
148
+ self.sock.sendto( pkt, self.broadcasta, port )
149
+ end
150
+ end
151
+ end
152
+
153
+ attr_accessor :listen_host, :listen_port, :context, :leasetime, :relayip, :router, :dnsserv
154
+ attr_accessor :sock, :thread, :myfilename, :ipstring, :served, :serveOnce
155
+ attr_accessor :current_ip, :start_ip, :end_ip, :broadcasta, :netmaskn
156
+ attr_accessor :servePXE, :pxeconfigfile, :pxealtconfigfile, :pxepathprefix, :pxereboottime, :serveOnlyPXE
157
+ attr_accessor :give_hostname, :served_hostname, :served_over, :reporter
158
+
159
+ protected
160
+
161
+
162
+ # See if there is anything to do.. If so, dispatch it.
163
+ def monitor_socket
164
+ while true
165
+ rds = [@sock]
166
+ wds = []
167
+ eds = [@sock]
168
+
169
+ r,w,e = ::IO.select(rds,wds,eds,1)
170
+
171
+ if (r != nil and r[0] == self.sock)
172
+ buf,host,port = self.sock.recvfrom(65535)
173
+ # Lame compatabilitiy :-/
174
+ from = [host, port]
175
+ dispatch_request(from, buf)
176
+ end
177
+
178
+ end
179
+ end
180
+
181
+ def dhcpoption(type, val = nil)
182
+ ret = ''
183
+ ret << [type].pack('C')
184
+
185
+ if val
186
+ ret << [val.length].pack('C') + val
187
+ end
188
+
189
+ ret
190
+ end
191
+
192
+ # Dispatch a packet that we received
193
+ def dispatch_request(from, buf)
194
+ type = buf.unpack('C').first
195
+ if (type != Request)
196
+ #dlog("Unknown DHCP request type: #{type}")
197
+ return
198
+ end
199
+
200
+ # parse out the members
201
+ hwtype = buf[1,1]
202
+ hwlen = buf[2,1].unpack("C").first
203
+ hops = buf[3,1]
204
+ txid = buf[4..7]
205
+ elapsed = buf[8..9]
206
+ flags = buf[10..11]
207
+ clientip = buf[12..15]
208
+ givenip = buf[16..19]
209
+ nextip = buf[20..23]
210
+ relayip = buf[24..27]
211
+ clienthwaddr = buf[28..(27+hwlen)]
212
+ servhostname = buf[44..107]
213
+ filename = buf[108..235]
214
+ magic = buf[236..239]
215
+
216
+ if (magic != DHCPMagic)
217
+ #dlog("Invalid DHCP request - bad magic.")
218
+ return
219
+ end
220
+
221
+ messageType = 0
222
+ pxeclient = false
223
+
224
+ # options parsing loop
225
+ spot = 240
226
+ while (spot < buf.length - 3)
227
+ optionType = buf[spot,1].unpack("C").first
228
+ break if optionType == 0xff
229
+
230
+ optionLen = buf[spot + 1,1].unpack("C").first
231
+ optionValue = buf[(spot + 2)..(spot + optionLen + 1)]
232
+ spot = spot + optionLen + 2
233
+ if optionType == 53
234
+ messageType = optionValue.unpack("C").first
235
+ elsif optionType == 150 or (optionType == 60 and optionValue.include? "PXEClient")
236
+ pxeclient = true
237
+ end
238
+ end
239
+
240
+ # don't serve if only serving PXE and not PXE request
241
+ return if pxeclient == false and self.serveOnlyPXE == true
242
+
243
+ # prepare response
244
+ pkt = [Response].pack('C')
245
+ pkt << buf[1..7] #hwtype, hwlen, hops, txid
246
+ pkt << "\x00\x00\x00\x00" #elapsed, flags
247
+ pkt << clientip
248
+
249
+ # if this is somebody we've seen before, use the saved IP
250
+ if self.served.include?( buf[28..43] )
251
+ pkt << Rex::Socket.addr_iton(self.served[buf[28..43]][0])
252
+ else # otherwise go to next ip address
253
+ self.current_ip += 1
254
+ if self.current_ip > self.end_ip
255
+ self.current_ip = self.start_ip
256
+ end
257
+ self.served.merge!( buf[28..43] => [ self.current_ip, messageType == DHCPRequest ] )
258
+ pkt << Rex::Socket.addr_iton(self.current_ip)
259
+ end
260
+ pkt << self.ipstring #next server ip
261
+ pkt << self.relayip
262
+ pkt << buf[28..43] #client hw address
263
+ pkt << servhostname
264
+ pkt << self.myfilename
265
+ pkt << magic
266
+ pkt << "\x35\x01" #Option
267
+
268
+ if messageType == DHCPDiscover #DHCP Discover - send DHCP Offer
269
+ pkt << [DHCPOffer].pack('C')
270
+ # check if already served an Ack based on hw addr (MAC address)
271
+ # if serveOnce & PXE, don't reply to another PXE request
272
+ # if serveOnce & ! PXE, don't reply to anything
273
+ if self.serveOnce == true and self.served.has_key?(buf[28..43]) and
274
+ self.served[buf[28..43]][1] and (pxeclient == false or self.servePXE == false)
275
+ return
276
+ end
277
+ elsif messageType == DHCPRequest #DHCP Request - send DHCP ACK
278
+ pkt << [DHCPAck].pack('C')
279
+ # now we ignore their discovers (but we'll respond to requests in case a packet was lost)
280
+ if ( self.served_over != 0 )
281
+ # NOTE: this is sufficient for low-traffic net
282
+ # for high-traffic, this will probably lead to
283
+ # hostname collision
284
+ self.served_over += 1
285
+ end
286
+ else
287
+ return # ignore unknown DHCP request
288
+ end
289
+
290
+ # Options!
291
+ pkt << dhcpoption(OpDHCPServer, self.ipstring)
292
+ pkt << dhcpoption(OpLeaseTime, [self.leasetime].pack('N'))
293
+ pkt << dhcpoption(OpSubnetMask, self.netmaskn)
294
+ pkt << dhcpoption(OpRouter, self.router)
295
+ pkt << dhcpoption(OpDns, self.dnsserv)
296
+ if self.servePXE # PXE options
297
+ pkt << dhcpoption(OpPXEMagic, PXEMagic)
298
+ # We already got this one, serve localboot file
299
+ if self.serveOnce == true and self.served.has_key?(buf[28..43]) and
300
+ self.served[buf[28..43]][1] and pxeclient == true
301
+ pkt << dhcpoption(OpPXEConfigFile, self.pxealtconfigfile)
302
+ else
303
+ # We are handing out an IP and our PXE attack
304
+ if(self.reporter)
305
+ self.reporter.call(buf[28..43],self.ipstring)
306
+ end
307
+ pkt << dhcpoption(OpPXEConfigFile, self.pxeconfigfile)
308
+ end
309
+ pkt << dhcpoption(OpPXEPathPrefix, self.pxepathprefix)
310
+ pkt << dhcpoption(OpPXERebootTime, [self.pxereboottime].pack('N'))
311
+ if ( self.give_hostname == true )
312
+ send_hostname = self.served_hostname
313
+ if ( self.served_over != 0 )
314
+ # NOTE : see above comments for the 'uniqueness' of this value
315
+ send_hostname += self.served_over.to_s
316
+ end
317
+ pkt << dhcpoption(OpHostname, send_hostname)
318
+ end
319
+ end
320
+ pkt << dhcpoption(OpEnd)
321
+
322
+ pkt << ("\x00" * 32) #padding
323
+
324
+ # And now we mark as requested
325
+ self.served[buf[28..43]][1] = true if messageType == DHCPRequest
326
+
327
+ send_packet(nil, pkt)
328
+ end
329
+
330
+ end
331
+
332
+ end
333
+ end
334
+ end