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,165 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/socket'
3
+
4
+ ###
5
+ #
6
+ # This class provides methods for interacting with a UDP socket.
7
+ #
8
+ ###
9
+ module Rex::Socket::Udp
10
+
11
+ include Rex::Socket
12
+
13
+ ##
14
+ #
15
+ # Factory
16
+ #
17
+ ##
18
+
19
+ #
20
+ # Creates the client using the supplied hash.
21
+ #
22
+ def self.create(hash = {})
23
+ hash['Proto'] = 'udp'
24
+ # If we have are to bind to a LocalHost we must be a Server to avail of pivoting.
25
+ # Rex::Socket::Parameters will subsequently turn off the sever flag after the correct
26
+ # comm has been chosen.
27
+ if( hash['LocalHost'] )
28
+ hash['Server'] = true
29
+ end
30
+ self.create_param(Rex::Socket::Parameters.from_hash(hash))
31
+ end
32
+
33
+ #
34
+ # Wrapper around the base socket class' creation method that automatically
35
+ # sets the parameter's protocol to UDP.
36
+ #
37
+ def self.create_param(param)
38
+ param.proto = 'udp'
39
+ Rex::Socket.create_param(param)
40
+ end
41
+
42
+ ##
43
+ #
44
+ # UDP connected state methods
45
+ #
46
+ ##
47
+
48
+ #
49
+ # Write the supplied datagram to the connected UDP socket.
50
+ #
51
+ def write(gram)
52
+ begin
53
+ return syswrite(gram)
54
+ rescue ::Errno::EHOSTUNREACH,::Errno::ENETDOWN,::Errno::ENETUNREACH,::Errno::ENETRESET,::Errno::EHOSTDOWN,::Errno::EACCES,::Errno::EINVAL,::Errno::EADDRNOTAVAIL
55
+ return nil
56
+ end
57
+ end
58
+
59
+ alias put write
60
+
61
+ #
62
+ # Read a datagram from the UDP socket.
63
+ #
64
+ def read(length = 65535)
65
+ if length < 0
66
+ length = 65535
67
+ end
68
+ return sysread(length)
69
+ end
70
+
71
+ #
72
+ # Read a datagram from the UDP socket with a timeout
73
+ #
74
+ def timed_read(length = 65535, timeout=def_read_timeout)
75
+ begin
76
+ if ((rv = ::IO.select([ fd ], nil, nil, timeout)) and
77
+ (rv[0]) and (rv[0][0] == fd)
78
+ )
79
+ return read(length)
80
+ else
81
+ return ''
82
+ end
83
+ rescue Exception
84
+ return ''
85
+ end
86
+ end
87
+
88
+ #alias send write
89
+ #alias recv read
90
+
91
+ ##
92
+ #
93
+ # UDP non-connected state methods
94
+ #
95
+ ##
96
+
97
+ #
98
+ # Sends a datagram to the supplied host:port with optional flags.
99
+ #
100
+ def sendto(gram, peerhost, peerport, flags = 0)
101
+
102
+ # Catch unconnected IPv6 sockets talking to IPv4 addresses
103
+ peer = Rex::Socket.resolv_nbo(peerhost)
104
+ if (peer.length == 4 and self.ipv == 6)
105
+ peerhost = Rex::Socket.getaddress(peerhost, true)
106
+ if peerhost[0,7].downcase != '::ffff:'
107
+ peerhost = '::ffff:' + peerhost
108
+ end
109
+ end
110
+
111
+ begin
112
+ send(gram, flags, Rex::Socket.to_sockaddr(peerhost, peerport))
113
+ rescue ::Errno::EHOSTUNREACH,::Errno::ENETDOWN,::Errno::ENETUNREACH,::Errno::ENETRESET,::Errno::EHOSTDOWN,::Errno::EACCES,::Errno::EINVAL,::Errno::EADDRNOTAVAIL
114
+ return nil
115
+ end
116
+
117
+ end
118
+
119
+ #
120
+ # Receives a datagram and returns the data and host:port of the requestor
121
+ # as [ data, host, port ].
122
+ #
123
+ def recvfrom(length = 65535, timeout=def_read_timeout)
124
+
125
+ begin
126
+ if ((rv = ::IO.select([ fd ], nil, nil, timeout)) and
127
+ (rv[0]) and (rv[0][0] == fd)
128
+ )
129
+ data, saddr = recvfrom_nonblock(length)
130
+ af, host, port = Rex::Socket.from_sockaddr(saddr)
131
+
132
+ return [ data, host, port ]
133
+ else
134
+ return [ '', nil, nil ]
135
+ end
136
+ rescue ::Timeout::Error
137
+ return [ '', nil, nil ]
138
+ rescue ::Interrupt
139
+ raise $!
140
+ rescue ::Exception
141
+ return [ '', nil, nil ]
142
+ end
143
+ end
144
+
145
+ #
146
+ # Calls recvfrom and only returns the data
147
+ #
148
+ def get(timeout=nil)
149
+ data, saddr, sport = recvfrom(65535, timeout)
150
+ return data
151
+ end
152
+
153
+ #
154
+ # The default number of seconds to wait for a read operation to timeout.
155
+ #
156
+ def def_read_timeout
157
+ 10
158
+ end
159
+
160
+ def type?
161
+ return 'udp'
162
+ end
163
+
164
+ end
165
+
@@ -0,0 +1,201 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/socket'
4
+ require 'rex/ui/text/table'
5
+
6
+ module Rex::SSLScan
7
+ class Result
8
+
9
+ attr_accessor :openssl_sslv2
10
+
11
+ attr_reader :ciphers
12
+ attr_reader :supported_versions
13
+
14
+ def initialize()
15
+ @cert = nil
16
+ @ciphers = Set.new
17
+ @supported_versions = [:SSLv2, :SSLv3, :TLSv1]
18
+ end
19
+
20
+ def cert
21
+ @cert
22
+ end
23
+
24
+ def cert=(input)
25
+ unless input.kind_of? OpenSSL::X509::Certificate or input.nil?
26
+ raise ArgumentError, "Must be an X509 Cert!"
27
+ end
28
+ @cert = input
29
+ end
30
+
31
+ def sslv2
32
+ @ciphers.reject{|cipher| cipher[:version] != :SSLv2 }
33
+ end
34
+
35
+ def sslv3
36
+ @ciphers.reject{|cipher| cipher[:version] != :SSLv3 }
37
+ end
38
+
39
+ def tlsv1
40
+ @ciphers.reject{|cipher| cipher[:version] != :TLSv1 }
41
+ end
42
+
43
+ def weak_ciphers
44
+ accepted.reject{|cipher| cipher[:weak] == false }
45
+ end
46
+
47
+ def strong_ciphers
48
+ accepted.reject{|cipher| cipher[:weak] }
49
+ end
50
+
51
+ # Returns all accepted ciphers matching the supplied version
52
+ # @param version [Symbol, Array] The SSL Version to filter on
53
+ # @raise [ArgumentError] if the version supplied is invalid
54
+ # @return [Array] An array of accepted cipher details matching the supplied versions
55
+ def accepted(version = :all)
56
+ enum_ciphers(:accepted, version)
57
+ end
58
+
59
+ # Returns all rejected ciphers matching the supplied version
60
+ # @param version [Symbol, Array] The SSL Version to filter on
61
+ # @raise [ArgumentError] if the version supplied is invalid
62
+ # @return [Array] An array of rejected cipher details matching the supplied versions
63
+ def rejected(version = :all)
64
+ enum_ciphers(:rejected, version)
65
+ end
66
+
67
+ def each_accepted(version = :all)
68
+ accepted(version).each do |cipher_result|
69
+ yield cipher_result
70
+ end
71
+ end
72
+
73
+ def each_rejected(version = :all)
74
+ rejected(version).each do |cipher_result|
75
+ yield cipher_result
76
+ end
77
+ end
78
+
79
+ def supports_sslv2?
80
+ !(accepted(:SSLv2).empty?)
81
+ end
82
+
83
+ def supports_sslv3?
84
+ !(accepted(:SSLv3).empty?)
85
+ end
86
+
87
+ def supports_tlsv1?
88
+ !(accepted(:TLSv1).empty?)
89
+ end
90
+
91
+ def supports_ssl?
92
+ supports_sslv2? or supports_sslv3? or supports_tlsv1?
93
+ end
94
+
95
+ def supports_weak_ciphers?
96
+ !(weak_ciphers.empty?)
97
+ end
98
+
99
+ def standards_compliant?
100
+ if supports_ssl?
101
+ return false if supports_sslv2?
102
+ return false if supports_weak_ciphers?
103
+ end
104
+ true
105
+ end
106
+
107
+ # Adds the details of a cipher test to the Result object.
108
+ # @param version [Symbol] the SSL Version
109
+ # @param cipher [String] the SSL cipher
110
+ # @param key_length [Fixnum] the length of encryption key
111
+ # @param status [Symbol] :accepted or :rejected
112
+ def add_cipher(version, cipher, key_length, status)
113
+ unless @supported_versions.include? version
114
+ raise ArgumentError, "Must be a supported SSL Version"
115
+ end
116
+ unless OpenSSL::SSL::SSLContext.new(version).ciphers.flatten.include? cipher
117
+ raise ArgumentError, "Must be a valid SSL Cipher for #{version}!"
118
+ end
119
+ unless key_length.kind_of? Fixnum
120
+ raise ArgumentError, "Must supply a valid key length"
121
+ end
122
+ unless [:accepted, :rejected].include? status
123
+ raise ArgumentError, "Status must be either :accepted or :rejected"
124
+ end
125
+
126
+ strong_cipher_ctx = OpenSSL::SSL::SSLContext.new(version)
127
+ # OpenSSL Directive For Strong Ciphers
128
+ # See: http://www.rapid7.com/vulndb/lookup/ssl-weak-ciphers
129
+ strong_cipher_ctx.ciphers = "ALL:!aNULL:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM"
130
+
131
+ if strong_cipher_ctx.ciphers.flatten.include? cipher
132
+ weak = false
133
+ else
134
+ weak = true
135
+ end
136
+
137
+ cipher_details = {:version => version, :cipher => cipher, :key_length => key_length, :weak => weak, :status => status}
138
+ @ciphers << cipher_details
139
+ end
140
+
141
+ def to_s
142
+ unless supports_ssl?
143
+ return "Server does not appear to support SSL on this port!"
144
+ end
145
+ table = Rex::Ui::Text::Table.new(
146
+ 'Header' => 'SSL Ciphers',
147
+ 'Indent' => 1,
148
+ 'Columns' => ['Status', 'Weak', 'SSL Version', 'Key Length', 'Cipher'],
149
+ 'SortIndex' => -1
150
+ )
151
+ ciphers.each do |cipher|
152
+ if cipher[:weak]
153
+ weak = '*'
154
+ else
155
+ weak = ' '
156
+ end
157
+ table << [cipher[:status].to_s.capitalize, weak , cipher[:version], cipher[:key_length], cipher[:cipher]]
158
+ end
159
+
160
+ # Sort by SSL Version, then Key Length, and then Status
161
+ table.rows.sort_by!{|row| [row[0],row[2],row[3]]}
162
+ text = "#{table.to_s}"
163
+ if @cert
164
+ text << " \n\n #{@cert.to_text}"
165
+ end
166
+ if openssl_sslv2 == false
167
+ text << "\n\n *** WARNING: Your OS hates freedom! Your OpenSSL libs are compiled without SSLv2 support!"
168
+ end
169
+ text
170
+ end
171
+
172
+ protected
173
+
174
+ # @param state [Symbol] Either :accepted or :rejected
175
+ # @param version [Symbol, Array] The SSL Version to filter on (:SSLv2, :SSLv3, :TLSv1, :all)
176
+ # @return [Set] The Set of cipher results matching the filter criteria
177
+ def enum_ciphers(state, version = :all)
178
+ case version
179
+ when Symbol
180
+ case version
181
+ when :all
182
+ return @ciphers.select{|cipher| cipher[:status] == state}
183
+ when :SSLv2, :SSLv3, :TLSv1
184
+ return @ciphers.select{|cipher| cipher[:status] == state and cipher[:version] == version}
185
+ else
186
+ raise ArgumentError, "Invalid SSL Version Supplied: #{version}"
187
+ end
188
+ when Array
189
+ version = version.reject{|v| !(@supported_versions.include? v)}
190
+ if version.empty?
191
+ return @ciphers.select{|cipher| cipher[:status] == state}
192
+ else
193
+ return @ciphers.select{|cipher| cipher[:status] == state and version.include? cipher[:version]}
194
+ end
195
+ else
196
+ raise ArgumentError, "Was expecting Symbol or Array and got #{version.class}"
197
+ end
198
+ end
199
+
200
+ end
201
+ end
@@ -0,0 +1,206 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/socket'
3
+ require 'rex/sslscan/result'
4
+
5
+ module Rex::SSLScan
6
+
7
+ class Scanner
8
+
9
+ attr_accessor :context
10
+ attr_accessor :host
11
+ attr_accessor :port
12
+ attr_accessor :timeout
13
+
14
+ attr_reader :supported_versions
15
+ attr_reader :sslv2
16
+
17
+ # Initializes the scanner object
18
+ # @param host [String] IP address or hostname to scan
19
+ # @param port [Fixnum] Port number to scan, default: 443
20
+ # @param timeout [Fixnum] Timeout for connections, in seconds. default: 5
21
+ # @raise [StandardError] Raised when the configuration is invalid
22
+ def initialize(host,port = 443,context = {},timeout=5)
23
+ @host = host
24
+ @port = port
25
+ @timeout = timeout
26
+ @context = context
27
+ if check_opensslv2 == true
28
+ @supported_versions = [:SSLv2, :SSLv3, :TLSv1]
29
+ @sslv2 = true
30
+ else
31
+ @supported_versions = [:SSLv3, :TLSv1]
32
+ @sslv2 = false
33
+ end
34
+ raise StandardError, "The scanner configuration is invalid" unless valid?
35
+ end
36
+
37
+ # Checks whether the scanner option has a valid configuration
38
+ # @return [Boolean] True or False, the configuration is valid.
39
+ def valid?
40
+ begin
41
+ @host = Rex::Socket.getaddress(@host, true)
42
+ rescue
43
+ return false
44
+ end
45
+ return false unless @port.kind_of? Fixnum
46
+ return false unless @port >= 0 and @port <= 65535
47
+ return false unless @timeout.kind_of? Fixnum
48
+ return true
49
+ end
50
+
51
+ # Initiate the Scan against the target. Will test each cipher one at a time.
52
+ # @return [Result] object containing the details of the scan
53
+ def scan
54
+ scan_result = Rex::SSLScan::Result.new
55
+ scan_result.openssl_sslv2 = sslv2
56
+ # If we can't get any SSL connection, then don't bother testing
57
+ # individual ciphers.
58
+ if test_ssl == :rejected and test_tls == :rejected
59
+ return scan_result
60
+ end
61
+
62
+ @supported_versions.each do |ssl_version|
63
+ sslctx = OpenSSL::SSL::SSLContext.new(ssl_version)
64
+ sslctx.ciphers.each do |cipher_name, ssl_ver, key_length, alg_length|
65
+ status = test_cipher(ssl_version, cipher_name)
66
+ scan_result.add_cipher(ssl_version, cipher_name, key_length, status)
67
+ if status == :accepted and scan_result.cert.nil?
68
+ scan_result.cert = get_cert(ssl_version, cipher_name)
69
+ end
70
+ end
71
+ end
72
+ scan_result
73
+ end
74
+
75
+ def test_ssl
76
+ begin
77
+ scan_client = Rex::Socket::Tcp.create(
78
+ 'Context' => @context,
79
+ 'PeerHost' => @host,
80
+ 'PeerPort' => @port,
81
+ 'SSL' => true,
82
+ 'SSLVersion' => :SSLv23,
83
+ 'Timeout' => @timeout
84
+ )
85
+ rescue ::Exception => e
86
+ return :rejected
87
+ ensure
88
+ if scan_client
89
+ scan_client.close
90
+ end
91
+ end
92
+ return :accepted
93
+ end
94
+
95
+ def test_tls
96
+ begin
97
+ scan_client = Rex::Socket::Tcp.create(
98
+ 'Context' => @context,
99
+ 'PeerHost' => @host,
100
+ 'PeerPort' => @port,
101
+ 'SSL' => true,
102
+ 'SSLVersion' => :TLSv1,
103
+ 'Timeout' => @timeout
104
+ )
105
+ rescue ::Exception => e
106
+ return :rejected
107
+ ensure
108
+ if scan_client
109
+ scan_client.close
110
+ end
111
+ end
112
+ return :accepted
113
+ end
114
+
115
+ # Tests the specified SSL Version and Cipher against the configured target
116
+ # @param ssl_version [Symbol] The SSL version to use (:SSLv2, :SSLv3, :TLSv1)
117
+ # @param cipher [String] The SSL Cipher to use
118
+ # @return [Symbol] Either :accepted or :rejected
119
+ def test_cipher(ssl_version, cipher)
120
+ validate_params(ssl_version,cipher)
121
+ begin
122
+ scan_client = Rex::Socket::Tcp.create(
123
+ 'Context' => @context,
124
+ 'PeerHost' => @host,
125
+ 'PeerPort' => @port,
126
+ 'SSL' => true,
127
+ 'SSLVersion' => ssl_version,
128
+ 'SSLCipher' => cipher,
129
+ 'Timeout' => @timeout
130
+ )
131
+ rescue ::Exception => e
132
+ return :rejected
133
+ ensure
134
+ if scan_client
135
+ scan_client.close
136
+ end
137
+ end
138
+
139
+ return :accepted
140
+ end
141
+
142
+ # Retrieve the X509 Cert from the target service,
143
+ # @param ssl_version [Symbol] The SSL version to use (:SSLv2, :SSLv3, :TLSv1)
144
+ # @param cipher [String] The SSL Cipher to use
145
+ # @return [OpenSSL::X509::Certificate] if the certificate was retrieved
146
+ # @return [Nil] if the cert couldn't be retrieved
147
+ def get_cert(ssl_version, cipher)
148
+ validate_params(ssl_version,cipher)
149
+ begin
150
+ scan_client = Rex::Socket::Tcp.create(
151
+ 'PeerHost' => @host,
152
+ 'PeerPort' => @port,
153
+ 'SSL' => true,
154
+ 'SSLVersion' => ssl_version,
155
+ 'SSLCipher' => cipher,
156
+ 'Timeout' => @timeout
157
+ )
158
+ cert = scan_client.peer_cert
159
+ if cert.kind_of? OpenSSL::X509::Certificate
160
+ return cert
161
+ else
162
+ return nil
163
+ end
164
+ rescue ::Exception => e
165
+ return nil
166
+ ensure
167
+ if scan_client
168
+ scan_client.close
169
+ end
170
+ end
171
+ end
172
+
173
+
174
+ protected
175
+
176
+ # Validates that the SSL Version and Cipher are valid both seperately and
177
+ # together as part of an SSL Context.
178
+ # @param ssl_version [Symbol] The SSL version to use (:SSLv2, :SSLv3, :TLSv1)
179
+ # @param cipher [String] The SSL Cipher to use
180
+ # @raise [StandardError] If an invalid or unsupported SSL Version was supplied
181
+ # @raise [StandardError] If the cipher is not valid for that version of SSL
182
+ def validate_params(ssl_version, cipher)
183
+ raise StandardError, "The scanner configuration is invalid" unless valid?
184
+ unless @supported_versions.include? ssl_version
185
+ raise StandardError, "SSL Version must be one of: #{@supported_versions.to_s}"
186
+ end
187
+ if ssl_version == :SSLv2 and sslv2 == false
188
+ raise StandardError, "Your OS hates freedom! Your OpenSSL libs are compiled without SSLv2 support!"
189
+ else
190
+ unless OpenSSL::SSL::SSLContext.new(ssl_version).ciphers.flatten.include? cipher
191
+ raise StandardError, "Must be a valid SSL Cipher for #{ssl_version}!"
192
+ end
193
+ end
194
+ end
195
+
196
+ def check_opensslv2
197
+ begin
198
+ OpenSSL::SSL::SSLContext.new(:SSLv2)
199
+ rescue
200
+ return false
201
+ end
202
+ return true
203
+ end
204
+
205
+ end
206
+ end