librex 0.0.68 → 0.0.70

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 (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -0,0 +1,200 @@
1
+
2
+ require 'rex/socket'
3
+ require 'rex/ui/text/table'
4
+
5
+ module Rex::SSLScan
6
+ class Result
7
+
8
+ attr_accessor :openssl_sslv2
9
+
10
+ attr_reader :ciphers
11
+ attr_reader :supported_versions
12
+
13
+ def initialize()
14
+ @cert = nil
15
+ @ciphers = Set.new
16
+ @supported_versions = [:SSLv2, :SSLv3, :TLSv1]
17
+ end
18
+
19
+ def cert
20
+ @cert
21
+ end
22
+
23
+ def cert=(input)
24
+ unless input.kind_of? OpenSSL::X509::Certificate or input.nil?
25
+ raise ArgumentError, "Must be an X509 Cert!"
26
+ end
27
+ @cert = input
28
+ end
29
+
30
+ def sslv2
31
+ @ciphers.reject{|cipher| cipher[:version] != :SSLv2 }
32
+ end
33
+
34
+ def sslv3
35
+ @ciphers.reject{|cipher| cipher[:version] != :SSLv3 }
36
+ end
37
+
38
+ def tlsv1
39
+ @ciphers.reject{|cipher| cipher[:version] != :TLSv1 }
40
+ end
41
+
42
+ def weak_ciphers
43
+ accepted.reject{|cipher| cipher[:weak] == false }
44
+ end
45
+
46
+ def strong_ciphers
47
+ accepted.reject{|cipher| cipher[:weak] }
48
+ end
49
+
50
+ # Returns all accepted ciphers matching the supplied version
51
+ # @param version [Symbol, Array] The SSL Version to filter on
52
+ # @raise [ArgumentError] if the version supplied is invalid
53
+ # @return [Array] An array of accepted cipher details matching the supplied versions
54
+ def accepted(version = :all)
55
+ enum_ciphers(:accepted, version)
56
+ end
57
+
58
+ # Returns all rejected ciphers matching the supplied version
59
+ # @param version [Symbol, Array] The SSL Version to filter on
60
+ # @raise [ArgumentError] if the version supplied is invalid
61
+ # @return [Array] An array of rejected cipher details matching the supplied versions
62
+ def rejected(version = :all)
63
+ enum_ciphers(:rejected, version)
64
+ end
65
+
66
+ def each_accepted(version = :all)
67
+ accepted(version).each do |cipher_result|
68
+ yield cipher_result
69
+ end
70
+ end
71
+
72
+ def each_rejected(version = :all)
73
+ rejected(version).each do |cipher_result|
74
+ yield cipher_result
75
+ end
76
+ end
77
+
78
+ def supports_sslv2?
79
+ !(accepted(:SSLv2).empty?)
80
+ end
81
+
82
+ def supports_sslv3?
83
+ !(accepted(:SSLv3).empty?)
84
+ end
85
+
86
+ def supports_tlsv1?
87
+ !(accepted(:TLSv1).empty?)
88
+ end
89
+
90
+ def supports_ssl?
91
+ supports_sslv2? or supports_sslv3? or supports_tlsv1?
92
+ end
93
+
94
+ def supports_weak_ciphers?
95
+ !(weak_ciphers.empty?)
96
+ end
97
+
98
+ def standards_compliant?
99
+ if supports_ssl?
100
+ return false if supports_sslv2?
101
+ return false if supports_weak_ciphers?
102
+ end
103
+ true
104
+ end
105
+
106
+ # Adds the details of a cipher test to the Result object.
107
+ # @param version [Symbol] the SSL Version
108
+ # @param cipher [String] the SSL cipher
109
+ # @param key_length [Fixnum] the length of encryption key
110
+ # @param status [Symbol] :accepted or :rejected
111
+ def add_cipher(version, cipher, key_length, status)
112
+ unless @supported_versions.include? version
113
+ raise ArgumentError, "Must be a supported SSL Version"
114
+ end
115
+ unless OpenSSL::SSL::SSLContext.new(version).ciphers.flatten.include? cipher
116
+ raise ArgumentError, "Must be a valid SSL Cipher for #{version}!"
117
+ end
118
+ unless key_length.kind_of? Fixnum
119
+ raise ArgumentError, "Must supply a valid key length"
120
+ end
121
+ unless [:accepted, :rejected].include? status
122
+ raise ArgumentError, "Status must be either :accepted or :rejected"
123
+ end
124
+
125
+ strong_cipher_ctx = OpenSSL::SSL::SSLContext.new(version)
126
+ # OpenSSL Directive For Strong Ciphers
127
+ # See: http://www.rapid7.com/vulndb/lookup/ssl-weak-ciphers
128
+ strong_cipher_ctx.ciphers = "ALL:!aNULL:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM"
129
+
130
+ if strong_cipher_ctx.ciphers.flatten.include? cipher
131
+ weak = false
132
+ else
133
+ weak = true
134
+ end
135
+
136
+ cipher_details = {:version => version, :cipher => cipher, :key_length => key_length, :weak => weak, :status => status}
137
+ @ciphers << cipher_details
138
+ end
139
+
140
+ def to_s
141
+ unless supports_ssl?
142
+ return "Server does not appear to support SSL on this port!"
143
+ end
144
+ table = Rex::Ui::Text::Table.new(
145
+ 'Header' => 'SSL Ciphers',
146
+ 'Indent' => 1,
147
+ 'Columns' => ['Status', 'Weak', 'SSL Version', 'Key Length', 'Cipher'],
148
+ 'SortIndex' => -1
149
+ )
150
+ ciphers.each do |cipher|
151
+ if cipher[:weak]
152
+ weak = '*'
153
+ else
154
+ weak = ' '
155
+ end
156
+ table << [cipher[:status].to_s.capitalize, weak , cipher[:version], cipher[:key_length], cipher[:cipher]]
157
+ end
158
+
159
+ # Sort by SSL Version, then Key Length, and then Status
160
+ table.rows.sort_by!{|row| [row[0],row[2],row[3]]}
161
+ text = "#{table.to_s}"
162
+ if @cert
163
+ text << " \n\n #{@cert.to_text}"
164
+ end
165
+ if openssl_sslv2 == false
166
+ text << "\n\n *** WARNING: Your OS hates freedom! Your OpenSSL libs are compiled without SSLv2 support!"
167
+ end
168
+ text
169
+ end
170
+
171
+ protected
172
+
173
+ # @param state [Symbol] Either :accepted or :rejected
174
+ # @param version [Symbol, Array] The SSL Version to filter on (:SSLv2, :SSLv3, :TLSv1, :all)
175
+ # @return [Set] The Set of cipher results matching the filter criteria
176
+ def enum_ciphers(state, version = :all)
177
+ case version
178
+ when Symbol
179
+ case version
180
+ when :all
181
+ return @ciphers.select{|cipher| cipher[:status] == state}
182
+ when :SSLv2, :SSLv3, :TLSv1
183
+ return @ciphers.select{|cipher| cipher[:status] == state and cipher[:version] == version}
184
+ else
185
+ raise ArgumentError, "Invalid SSL Version Supplied: #{version}"
186
+ end
187
+ when Array
188
+ version = version.reject{|v| !(@supported_versions.include? v)}
189
+ if version.empty?
190
+ return @ciphers.select{|cipher| cipher[:status] == state}
191
+ else
192
+ return @ciphers.select{|cipher| cipher[:status] == state and version.include? cipher[:version]}
193
+ end
194
+ else
195
+ raise ArgumentError, "Was expecting Symbol or Array and got #{version.class}"
196
+ end
197
+ end
198
+
199
+ end
200
+ end
@@ -0,0 +1,205 @@
1
+ require 'rex/socket'
2
+ require 'rex/sslscan/result'
3
+
4
+ module Rex::SSLScan
5
+
6
+ class Scanner
7
+
8
+ attr_accessor :context
9
+ attr_accessor :host
10
+ attr_accessor :port
11
+ attr_accessor :timeout
12
+
13
+ attr_reader :supported_versions
14
+ attr_reader :sslv2
15
+
16
+ # Initializes the scanner object
17
+ # @param host [String] IP address or hostname to scan
18
+ # @param port [Fixnum] Port number to scan, default: 443
19
+ # @param timeout [Fixnum] Timeout for connections, in seconds. default: 5
20
+ # @raise [StandardError] Raised when the configuration is invalid
21
+ def initialize(host,port = 443,context = {},timeout=5)
22
+ @host = host
23
+ @port = port
24
+ @timeout = timeout
25
+ @context = context
26
+ if check_opensslv2 == true
27
+ @supported_versions = [:SSLv2, :SSLv3, :TLSv1]
28
+ @sslv2 = true
29
+ else
30
+ @supported_versions = [:SSLv3, :TLSv1]
31
+ @sslv2 = false
32
+ end
33
+ raise StandardError, "The scanner configuration is invalid" unless valid?
34
+ end
35
+
36
+ # Checks whether the scanner option has a valid configuration
37
+ # @return [Boolean] True or False, the configuration is valid.
38
+ def valid?
39
+ begin
40
+ @host = Rex::Socket.getaddress(@host, true)
41
+ rescue
42
+ return false
43
+ end
44
+ return false unless @port.kind_of? Fixnum
45
+ return false unless @port >= 0 and @port <= 65535
46
+ return false unless @timeout.kind_of? Fixnum
47
+ return true
48
+ end
49
+
50
+ # Initiate the Scan against the target. Will test each cipher one at a time.
51
+ # @return [Result] object containing the details of the scan
52
+ def scan
53
+ scan_result = Rex::SSLScan::Result.new
54
+ scan_result.openssl_sslv2 = sslv2
55
+ # If we can't get any SSL connection, then don't bother testing
56
+ # individual ciphers.
57
+ if test_ssl == :rejected and test_tls == :rejected
58
+ return scan_result
59
+ end
60
+
61
+ @supported_versions.each do |ssl_version|
62
+ sslctx = OpenSSL::SSL::SSLContext.new(ssl_version)
63
+ sslctx.ciphers.each do |cipher_name, ssl_ver, key_length, alg_length|
64
+ status = test_cipher(ssl_version, cipher_name)
65
+ scan_result.add_cipher(ssl_version, cipher_name, key_length, status)
66
+ if status == :accepted and scan_result.cert.nil?
67
+ scan_result.cert = get_cert(ssl_version, cipher_name)
68
+ end
69
+ end
70
+ end
71
+ scan_result
72
+ end
73
+
74
+ def test_ssl
75
+ begin
76
+ scan_client = Rex::Socket::Tcp.create(
77
+ 'Context' => @context,
78
+ 'PeerHost' => @host,
79
+ 'PeerPort' => @port,
80
+ 'SSL' => true,
81
+ 'SSLVersion' => :SSLv23,
82
+ 'Timeout' => @timeout
83
+ )
84
+ rescue ::Exception => e
85
+ return :rejected
86
+ ensure
87
+ if scan_client
88
+ scan_client.close
89
+ end
90
+ end
91
+ return :accepted
92
+ end
93
+
94
+ def test_tls
95
+ begin
96
+ scan_client = Rex::Socket::Tcp.create(
97
+ 'Context' => @context,
98
+ 'PeerHost' => @host,
99
+ 'PeerPort' => @port,
100
+ 'SSL' => true,
101
+ 'SSLVersion' => :TLSv1,
102
+ 'Timeout' => @timeout
103
+ )
104
+ rescue ::Exception => e
105
+ return :rejected
106
+ ensure
107
+ if scan_client
108
+ scan_client.close
109
+ end
110
+ end
111
+ return :accepted
112
+ end
113
+
114
+ # Tests the specified SSL Version and Cipher against the configured target
115
+ # @param ssl_version [Symbol] The SSL version to use (:SSLv2, :SSLv3, :TLSv1)
116
+ # @param cipher [String] The SSL Cipher to use
117
+ # @return [Symbol] Either :accepted or :rejected
118
+ def test_cipher(ssl_version, cipher)
119
+ validate_params(ssl_version,cipher)
120
+ begin
121
+ scan_client = Rex::Socket::Tcp.create(
122
+ 'Context' => @context,
123
+ 'PeerHost' => @host,
124
+ 'PeerPort' => @port,
125
+ 'SSL' => true,
126
+ 'SSLVersion' => ssl_version,
127
+ 'SSLCipher' => cipher,
128
+ 'Timeout' => @timeout
129
+ )
130
+ rescue ::Exception => e
131
+ return :rejected
132
+ ensure
133
+ if scan_client
134
+ scan_client.close
135
+ end
136
+ end
137
+
138
+ return :accepted
139
+ end
140
+
141
+ # Retrieve the X509 Cert from the target service,
142
+ # @param ssl_version [Symbol] The SSL version to use (:SSLv2, :SSLv3, :TLSv1)
143
+ # @param cipher [String] The SSL Cipher to use
144
+ # @return [OpenSSL::X509::Certificate] if the certificate was retrieved
145
+ # @return [Nil] if the cert couldn't be retrieved
146
+ def get_cert(ssl_version, cipher)
147
+ validate_params(ssl_version,cipher)
148
+ begin
149
+ scan_client = Rex::Socket::Tcp.create(
150
+ 'PeerHost' => @host,
151
+ 'PeerPort' => @port,
152
+ 'SSL' => true,
153
+ 'SSLVersion' => ssl_version,
154
+ 'SSLCipher' => cipher,
155
+ 'Timeout' => @timeout
156
+ )
157
+ cert = scan_client.peer_cert
158
+ if cert.kind_of? OpenSSL::X509::Certificate
159
+ return cert
160
+ else
161
+ return nil
162
+ end
163
+ rescue ::Exception => e
164
+ return nil
165
+ ensure
166
+ if scan_client
167
+ scan_client.close
168
+ end
169
+ end
170
+ end
171
+
172
+
173
+ protected
174
+
175
+ # Validates that the SSL Version and Cipher are valid both seperately and
176
+ # together as part of an SSL Context.
177
+ # @param ssl_version [Symbol] The SSL version to use (:SSLv2, :SSLv3, :TLSv1)
178
+ # @param cipher [String] The SSL Cipher to use
179
+ # @raise [StandardError] If an invalid or unsupported SSL Version was supplied
180
+ # @raise [StandardError] If the cipher is not valid for that version of SSL
181
+ def validate_params(ssl_version, cipher)
182
+ raise StandardError, "The scanner configuration is invalid" unless valid?
183
+ unless @supported_versions.include? ssl_version
184
+ raise StandardError, "SSL Version must be one of: #{@supported_versions.to_s}"
185
+ end
186
+ if ssl_version == :SSLv2 and sslv2 == false
187
+ raise StandardError, "Your OS hates freedom! Your OpenSSL libs are compiled without SSLv2 support!"
188
+ else
189
+ unless OpenSSL::SSL::SSLContext.new(ssl_version).ciphers.flatten.include? cipher
190
+ raise StandardError, "Must be a valid SSL Cipher for #{ssl_version}!"
191
+ end
192
+ end
193
+ end
194
+
195
+ def check_opensslv2
196
+ begin
197
+ OpenSSL::SSL::SSLContext.new(:SSLv2)
198
+ rescue
199
+ return false
200
+ end
201
+ return true
202
+ end
203
+
204
+ end
205
+ end
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  # just a shim to load all of the Struct2 libraries
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  # Rex::Struct2
@@ -9,172 +8,172 @@ require 'rex/struct2/s_struct'
9
8
 
10
9
  class CStruct_Values
11
10
 
12
- def initialize(obj)
13
- @obj = obj
14
- end
15
-
16
- def [](*args)
17
- o = @obj[*args]
18
- return if !o
19
- return o.value
20
- end
21
-
22
- def []=(*args)
23
- o = @obj[*args[0 .. -2]]
24
- return if !o
25
- o.value = args[-1]
26
- end
27
-
28
- # this one is for HD, the whiniest girl around...
29
- # allow for like v.field = whatever
30
- def method_missing(sym, *args)
31
- if sym.to_s[-1] == "="[0]
32
- return self[sym.to_s[0 .. -2]] = args[0]
33
- else
34
- return self[sym.to_s]
35
- end
36
- end
11
+ def initialize(obj)
12
+ @obj = obj
13
+ end
14
+
15
+ def [](*args)
16
+ o = @obj[*args]
17
+ return if !o
18
+ return o.value
19
+ end
20
+
21
+ def []=(*args)
22
+ o = @obj[*args[0 .. -2]]
23
+ return if !o
24
+ o.value = args[-1]
25
+ end
26
+
27
+ # this one is for HD, the whiniest girl around...
28
+ # allow for like v.field = whatever
29
+ def method_missing(sym, *args)
30
+ if sym.to_s[-1] == "="[0]
31
+ return self[sym.to_s[0 .. -2]] = args[0]
32
+ else
33
+ return self[sym.to_s]
34
+ end
35
+ end
37
36
  end
38
37
 
39
38
  class CStruct < SStruct
40
39
 
41
- require 'rex/struct2/element'
42
- require 'rex/struct2/generic'
43
- require 'rex/struct2/s_string'
44
- require 'rex/struct2/c_struct_template'
45
- require 'rex/struct2/restraint'
46
-
47
- include Rex::Struct2::Element
48
-
49
- attr_reader :v
50
-
51
- @@dt_table = {
52
- 'int8' => proc { |*a| Rex::Struct2::Generic.new('C', true, *a) },
53
- 'uint8' => proc { |*a| Rex::Struct2::Generic.new('C', false, *a) },
54
- 'int16v' => proc { |*a| Rex::Struct2::Generic.new('v', true, *a) },
55
- 'uint16v' => proc { |*a| Rex::Struct2::Generic.new('v', false, *a) },
56
- 'int32v' => proc { |*a| Rex::Struct2::Generic.new('V', true, *a) },
57
- 'uint32v' => proc { |*a| Rex::Struct2::Generic.new('V', false, *a) },
58
- 'int64v' => proc { |*a| Rex::Struct2::Generic.new('q', true, *a) },
59
- 'uint64v' => proc { |*a| Rex::Struct2::Generic.new('Q', false, *a) },
60
- 'int16n' => proc { |*a| Rex::Struct2::Generic.new('n', true, *a) },
61
- 'uint16n' => proc { |*a| Rex::Struct2::Generic.new('n', false, *a) },
62
- 'int32n' => proc { |*a| Rex::Struct2::Generic.new('N', true, *a) },
63
- 'uint32n' => proc { |*a| Rex::Struct2::Generic.new('N', false, *a) },
64
- 'string' => proc { |*a| Rex::Struct2::SString.new(*a) },
65
- 'sstruct' => proc { |*a| Rex::Struct2::SStruct.new(*a) },
66
- 'object' => proc { |o| o },
67
- 'template' => proc { |o| o.make_struct },
68
- }
69
-
70
- # CStruct.typedef(name, factory, ... )
71
- def CStruct.typedef(*args)
72
- while args.length >= 2
73
- name = args.shift
74
- factory = args.shift
75
- @@dt_table[name] = factory
76
- end
77
- end
78
-
79
- def initialize(*dts)
80
- super()
81
- @name_table = [ ]
82
- @v = Rex::Struct2::CStruct_Values.new(self)
83
-
84
- return self.add_from_dt(*dts)
85
- end
86
-
87
- def add_from_dt(*dts)
88
- dts.each { | dt |
89
- return if !dt.kind_of?(Array) || dt.length < 2
90
-
91
- type = dt[0]
92
- name = dt[1]
93
-
94
- factory = @@dt_table[type]
95
-
96
- return if !factory
97
-
98
- # call with the arguments passed in
99
- obj = factory.call(*(dt[2 .. -1]))
100
-
101
- self.add_object(name, obj)
102
- }
103
-
104
- return dts.length
105
- end
106
-
107
- def add_object(*objs)
108
- while objs.length >= 2
109
- @name_table << objs.shift
110
- self << objs.shift
111
- end
112
- end
113
- # apply_restraint( name, restraint, name2, restraint2 ... )
114
- def apply_restraint(*ress)
115
- while ress.length >= 2
116
- name = ress.shift
117
- res = ress.shift
118
- self[name].restraint = res
119
-
120
- # update the restrainted object, so it will update the value
121
- # of the restrainter, with the initial size. If you don't
122
- # want this behavior, um, you'll have to be careful with what
123
- # you supply as default values...
124
- self[name].update_restraint
125
- end
126
- return self
127
- end
128
-
129
- # create_restraints( [ name, stuff_to_restraint_constructor ] ... )
130
- def create_restraints(*ress)
131
- ress.each { |r|
132
- # make a copy before we modify...
133
- r = r.dup
134
- # resolve names into objects
135
- r[1] = self[r[1]] if r[1]
136
- r[2] = self[r[2]] if r[2]
137
-
138
- # build and apply the restraint
139
- self.apply_restraint(r[0], Rex::Struct2::Restraint.new(*r[1 .. -1]))
140
- }
141
-
142
- return self
143
- end
144
-
145
- # ya ya, I know, these are weird. I'm not sure why I even bothered
146
- # to inherit from array...
147
- def [](index, *other)
148
- if index.kind_of?(String)
149
- i = @name_table.index(index)
150
- return if !i
151
- return super(i)
152
- else
153
- return super(index, *other)
154
- end
155
- end
156
-
157
- def []=(index, *other)
158
- if index.kind_of?(String)
159
- i = @name_table.index(index)
160
- return if !i
161
- return super(i, *other)
162
- else
163
- return super(index, *other)
164
- end
165
- end
166
-
167
- # Produce a list of field names
168
- def keys
169
- @name_table
170
- end
171
-
172
- # Iterate through all fields and values
173
- def each_pair(&block)
174
- @name_table.each do |k|
175
- block.call(k, self.v[k])
176
- end
177
- end
40
+ require 'rex/struct2/element'
41
+ require 'rex/struct2/generic'
42
+ require 'rex/struct2/s_string'
43
+ require 'rex/struct2/c_struct_template'
44
+ require 'rex/struct2/restraint'
45
+
46
+ include Rex::Struct2::Element
47
+
48
+ attr_reader :v
49
+
50
+ @@dt_table = {
51
+ 'int8' => proc { |*a| Rex::Struct2::Generic.new('C', true, *a) },
52
+ 'uint8' => proc { |*a| Rex::Struct2::Generic.new('C', false, *a) },
53
+ 'int16v' => proc { |*a| Rex::Struct2::Generic.new('v', true, *a) },
54
+ 'uint16v' => proc { |*a| Rex::Struct2::Generic.new('v', false, *a) },
55
+ 'int32v' => proc { |*a| Rex::Struct2::Generic.new('V', true, *a) },
56
+ 'uint32v' => proc { |*a| Rex::Struct2::Generic.new('V', false, *a) },
57
+ 'int64v' => proc { |*a| Rex::Struct2::Generic.new('q', true, *a) },
58
+ 'uint64v' => proc { |*a| Rex::Struct2::Generic.new('Q', false, *a) },
59
+ 'int16n' => proc { |*a| Rex::Struct2::Generic.new('n', true, *a) },
60
+ 'uint16n' => proc { |*a| Rex::Struct2::Generic.new('n', false, *a) },
61
+ 'int32n' => proc { |*a| Rex::Struct2::Generic.new('N', true, *a) },
62
+ 'uint32n' => proc { |*a| Rex::Struct2::Generic.new('N', false, *a) },
63
+ 'string' => proc { |*a| Rex::Struct2::SString.new(*a) },
64
+ 'sstruct' => proc { |*a| Rex::Struct2::SStruct.new(*a) },
65
+ 'object' => proc { |o| o },
66
+ 'template' => proc { |o| o.make_struct },
67
+ }
68
+
69
+ # CStruct.typedef(name, factory, ... )
70
+ def CStruct.typedef(*args)
71
+ while args.length >= 2
72
+ name = args.shift
73
+ factory = args.shift
74
+ @@dt_table[name] = factory
75
+ end
76
+ end
77
+
78
+ def initialize(*dts)
79
+ super()
80
+ @name_table = [ ]
81
+ @v = Rex::Struct2::CStruct_Values.new(self)
82
+
83
+ return self.add_from_dt(*dts)
84
+ end
85
+
86
+ def add_from_dt(*dts)
87
+ dts.each { | dt |
88
+ return if !dt.kind_of?(Array) || dt.length < 2
89
+
90
+ type = dt[0]
91
+ name = dt[1]
92
+
93
+ factory = @@dt_table[type]
94
+
95
+ return if !factory
96
+
97
+ # call with the arguments passed in
98
+ obj = factory.call(*(dt[2 .. -1]))
99
+
100
+ self.add_object(name, obj)
101
+ }
102
+
103
+ return dts.length
104
+ end
105
+
106
+ def add_object(*objs)
107
+ while objs.length >= 2
108
+ @name_table << objs.shift
109
+ self << objs.shift
110
+ end
111
+ end
112
+ # apply_restraint( name, restraint, name2, restraint2 ... )
113
+ def apply_restraint(*ress)
114
+ while ress.length >= 2
115
+ name = ress.shift
116
+ res = ress.shift
117
+ self[name].restraint = res
118
+
119
+ # update the restrainted object, so it will update the value
120
+ # of the restrainter, with the initial size. If you don't
121
+ # want this behavior, um, you'll have to be careful with what
122
+ # you supply as default values...
123
+ self[name].update_restraint
124
+ end
125
+ return self
126
+ end
127
+
128
+ # create_restraints( [ name, stuff_to_restraint_constructor ] ... )
129
+ def create_restraints(*ress)
130
+ ress.each { |r|
131
+ # make a copy before we modify...
132
+ r = r.dup
133
+ # resolve names into objects
134
+ r[1] = self[r[1]] if r[1]
135
+ r[2] = self[r[2]] if r[2]
136
+
137
+ # build and apply the restraint
138
+ self.apply_restraint(r[0], Rex::Struct2::Restraint.new(*r[1 .. -1]))
139
+ }
140
+
141
+ return self
142
+ end
143
+
144
+ # ya ya, I know, these are weird. I'm not sure why I even bothered
145
+ # to inherit from array...
146
+ def [](index, *other)
147
+ if index.kind_of?(String)
148
+ i = @name_table.index(index)
149
+ return if !i
150
+ return super(i)
151
+ else
152
+ return super(index, *other)
153
+ end
154
+ end
155
+
156
+ def []=(index, *other)
157
+ if index.kind_of?(String)
158
+ i = @name_table.index(index)
159
+ return if !i
160
+ return super(i, *other)
161
+ else
162
+ return super(index, *other)
163
+ end
164
+ end
165
+
166
+ # Produce a list of field names
167
+ def keys
168
+ @name_table
169
+ end
170
+
171
+ # Iterate through all fields and values
172
+ def each_pair(&block)
173
+ @name_table.each do |k|
174
+ block.call(k, self.v[k])
175
+ end
176
+ end
178
177
  end
179
178
 
180
179
  # end Rex::Struct2