class ScanSSL::ScanHost

I think the best will be to put the result to the hash or array and return it to ScanSLL::Command so we can send it to Colorize method and sort.

Public Instance Methods

detect_vulnerabilites(ssl_version, cipher, bits) click to toggle source
# File lib/scanssl/scanHost.rb, line 114
def detect_vulnerabilites(ssl_version, cipher, bits)
  if ssl_version.match(/SSLv3/).to_s != "" && cipher.match(/RC/i).to_s == ""
    return ssl_version, cipher, bits, "     POODLE (CVE-2014-3566)".colorize(:red)
  elsif cipher.match(/RC2/i)
    return ssl_version, cipher, bits, "     Chosen-Plaintext Attack".colorize(:red)
  elsif cipher.match(/EXP/i)
    return ssl_version, cipher, bits, "     FREAK (CVE-2015-0204)".colorize(:red)
  elsif cipher.match(/RC4/i)
    return ssl_version, cipher, bits, "     Bar-Mitzvah Attack".colorize(:yellow)
  else
    return ssl_version, cipher, bits, ''
  end
end
result_parse(cipher_name, cipher_bits, protocol) click to toggle source
# File lib/scanssl/scanHost.rb, line 90
def result_parse(cipher_name, cipher_bits, protocol)
  ssl_version = PROTOCOL_COLOR_NAME[protocol]
  cipher = case cipher_name
    when /^(RC4|MD5)/
      cipher_name.colorize(:yellow)
    when /^RC2/
      cipher_name.colorize(:red)
    when /^EXP/
      cipher_name.colorize(:red)
    else
      cipher_name.colorize(:gree)
    end

  bits = case cipher_bits
    when 48, 56, 40
      cipher_bits.to_s.colorize(:red)
    when 112
      cipher_bits.to_s.colorize(:yellow)
    else
      cipher_bits.to_s.colorize(:green)
    end
  detect_vulnerabilites(ssl_version, cipher, bits)
end
scan(server, port) click to toggle source
# File lib/scanssl/scanHost.rb, line 7
def scan(server, port)
  ssl2_array = []
  ssl3_array = []
  tls1_array = []
  tls1_1_array = []
  tls1_2_array = []
  threads = []

  c = []
    PROTOCOLS.each do |protocol|
      ssl_context = OpenSSL::SSL::SSLContext.new
      ssl_context.ciphers = CIPHERS
      ssl_context.options = protocol
      threads << Thread.new do
        ssl_context.ciphers.each do |cipher|
        begin
          ssl_context = OpenSSL::SSL::SSLContext.new
          ssl_context.options = protocol
          ssl_context.ciphers = cipher[0].to_s
          begin
            tcp_socket = WEBrick::Utils.timeout(5){
              TCPSocket.new(server, port)
            }
          rescue => e
            puts e.message
            exit 1
          end
          socket_destination = OpenSSL::SSL::SSLSocket.new tcp_socket, ssl_context
          WEBrick::Utils.timeout(5) {
            socket_destination.connect
          }
          if protocol == SSLV3
            ssl_version, cipher, bits, vulnerability = result_parse(cipher[0], cipher[3], protocol)
            result = "Server supports: %-22s %-42s %-10s %s\n"%[ssl_version, cipher, bits, vulnerability]
            ssl3_array << result
          elsif protocol == TLSV1
            ssl_version, cipher, bits, vulnerability = result_parse(cipher[0], cipher[2], protocol)
            result = "Server supports: %-22s %-42s %-10s %s\n"%[ssl_version, cipher, bits, vulnerability]
            tls1_array << result
          elsif protocol == TLSV1_1
            ssl_version, cipher, bits, vulnerability = result_parse(cipher[0], cipher[2], protocol)
            result = "Server supports: %-22s %-42s %-10s %s\n"%[ssl_version, cipher, bits, vulnerability]
            tls1_1_array << result
          elsif protocol == TLSV1_2
            ssl_version, cipher, bits, vulnerability = result_parse(cipher[0], cipher[2], protocol)
            result = "Server supports: %-22s %-42s %-10s %s\n"%[ssl_version, cipher, bits, vulnerability]
            tls1_2_array << result
          elsif protocol == SSLV2
            ssl_version, cipher, bits, vulnerability = result_parse(cipher[0], cipher[2], protocol)
            result = "Server supports: %-22s %-42s %-10s %s\n"%[ssl_version, cipher, bits, vulnerability]
            ssl2_array << result
          end

        rescue Exception => e
          if @debug
            puts e.message
            puts e.backtrace.join "\n"
            if protocol == SSLV2
              puts "Server Don't Supports: SSLv2 #{c[0]} #{c[2]} bits"
            elsif protocol == SSLV3
              puts "Server Don't Supports: SSLv3 #{c[0]} #{c[3]} bits"
            elsif protocol == TLSV1
              puts "Server Don't Supports: TLSv1 #{c[0]} #{c[2]} bits"
            elsif protocol == TLSV1_1
              puts "Server Don't Supports: TLSv1.1 #{c[0]} #{c[2]} bits"
            elsif protocol == TLSV1_2
              puts "Server Don't Supports: TLSv1.2 #{c[0]} #{c[2]} bits"
            end
          end
        ensure
          socket_destination.close if socket_destination rescue nil
          tcp_socket.close if tcp_socket rescue nil
        end
      end
    end
end
  begin    
    threads.map(&:join)
  rescue Interrupt
  end
  return ssl3_array, ssl2_array, tls1_array, tls1_1_array, tls1_2_array
end