class Aquatone::Collectors::Censys

Constants

API_BASE_URI
API_RESULTS_PER_PAGE
DEFAULT_PAGES_TO_PROCESS

Public Instance Methods

next_page?(page, body) click to toggle source
# File lib/aquatone/collectors/censys.rb, line 80
def next_page?(page, body)
    page <= pages_to_process && body["metadata"]["pages"] && API_RESULTS_PER_PAGE * page < body["metadata"]["count"].to_i
end
pages_to_process() click to toggle source
# File lib/aquatone/collectors/censys.rb, line 84
def pages_to_process
  if has_cli_option?("censys-pages")
    return get_cli_option("censys-pages").to_i
  end
  DEFAULT_PAGES_TO_PROCESS
end
request_censys_page(page=1) click to toggle source
# File lib/aquatone/collectors/censys.rb, line 22
def request_censys_page(page=1)
    # Initial version only supporting Censys Certificates API

    # Censys expects Basic Auth for requests.
    auth = {
        :username => get_key('censys_id'),
        :password => get_key('censys_secret')
    }

    # Define this is JSON content
    headers = {
      'Content-Type' => 'application/json',
      'Accept' => 'application/json'
    }

    # The post body itself, as JSON
    query = {
        'query'   => url_escape("#{domain.name}"),
        'page'    => page,
        'fields'  => [ "parsed.names", "parsed.extensions.subject_alt_name.dns_names" ],
        'flatten' => true
    }

    # Search API documented at https://censys.io/api/v1/docs/search
    response = post_request(
        "#{API_BASE_URI}/search/certificates",
        query.to_json,
        {
            :basic_auth => auth,
            :headers => headers
        }
    )

    if response.code != 200
        failure(response.parsed_response["error"] || "Censys API encountered error: #{response.code}")
    end

    # If nothing returned from Censys, return:
    return unless response.parsed_response["results"]

    response.parsed_response["results"].each do |result|

      next unless result["parsed.extensions.subject_alt_name.dns_names"]
      result["parsed.extensions.subject_alt_name.dns_names"].each do |altdns|
          add_host(altdns) if altdns.end_with?(".#{domain.name}")
      end

      next unless result["parsed.names"]
      result["parsed.names"].each do |parsedname|
          add_host(parsedname) if parsedname.end_with?(".#{domain.name}")
      end
    end

    # Get the next page of results
    request_censys_page(page + 1) if next_page?(page, response.parsed_response)

end
run() click to toggle source
# File lib/aquatone/collectors/censys.rb, line 18
def run
  request_censys_page
end