예제 #1
0
 def collect_api(self, domain: str, output_directory: str = None) -> None:
     """
     This method collects information from the Censys Certificate API
     :param domain: The query in Censys syntax to collect the desired information from Censys
     :param output_directory: The directory where Censys results are stored
     :return:
     """
     query_results = []
     print("[*] querying censys API")
     api = censys.certificates.CensysCertificates(api_id=self._api_uid,
                                                  api_secret=self._api_key)
     try:
         for overview in api.search("parsed.names.raw:{}".format(domain),
                                    fields=["parsed.fingerprint_sha256"]):
             details = api.view(overview["parsed.fingerprint_sha256"])
             query_results.append(
                 {overview["parsed.fingerprint_sha256"]: details})
     except Exception as ex:
         print(
             "[E]   the following error occurred while searching the censys API: {}"
             .format(ex))
     BaseUtils.add_json_results(self._command, query_results)
     self.write_filesystem(query_results=query_results,
                           item=domain,
                           output_directory=output_directory)
예제 #2
0
 def collect_api(self, domain: str, output_directory: str = None) -> None:
     """
     This method collects information from the host.io API
     :param domain: The domain to collect information for
     :param output_directory: The directory where the results are stored
     :return:
     """
     if not output_directory or not os.path.isdir(output_directory):
         raise NotADirectoryError(
             "output directory '{}' does not exist".format(
                 output_directory))
     print("[*] querying certspotter.com API")
     url = self._api_url if self._api_url[-1] != "/" else self._api_url[:-1]
     response = self._get_request_info(api_url=url,
                                       params={
                                           "include_subdomains": True,
                                           "expand": "cert",
                                           "domain": domain
                                       })
     if response.status_code == 200:
         query_results = json.loads(response.content)
         BaseUtils.add_json_results(self._command, query_results)
         self.write_filesystem(query_results=query_results,
                               item=domain,
                               output_directory=output_directory)
     else:
         raise ApiCollectionFailed("failed with status code: {}".format(
             response.status_code))
예제 #3
0
 def collect_api(self, query: str, output_directory: str = None) -> None:
     """
     This method collects information from the Censys IPv4 API
     :param query: The query in Censys syntax to collect the desired information from Censys
     :param output_directory: The directory where Censys results are stored
     :return:
     """
     query_results = []
     if not output_directory or not os.path.isdir(output_directory):
         raise NotADirectoryError(
             "output directory '{}' does not exist".format(
                 output_directory))
     print("[*] querying censys API")
     api = censys.ipv4.CensysIPv4(api_id=self._api_uid,
                                  api_secret=self._api_key)
     try:
         for overview in api.search(query, fields=["ip"]):
             details = api.view(overview["ip"])
             query_results.append(details)
     except Exception as ex:
         print(
             "  [E] The following error occurred while searching the censys API: {}"
             .format(ex))
     BaseUtils.add_json_results(self._command, query_results)
     self.write_filesystem(query_results=query_results,
                           item=query,
                           output_directory=output_directory)
예제 #4
0
 def collect_api(self, host: str, output_directory: str = None) -> None:
     """
     This method collects information from the Shodan API
     :param host: The IP address for which information shall be obtained from Shodan
     :param output_directory: The directory where Shodan results are stored
     :return:
     """
     if not output_directory or not os.path.isdir(output_directory):
         raise NotADirectoryError(
             "output directory '{}' does not exist".format(
                 output_directory))
     print("[*] querying shodan API")
     api = shodan.Shodan(self._api_key)
     query_results = api.host(host)
     BaseUtils.add_json_results(self._command, query_results)
     self.write_filesystem(query_results=query_results,
                           item=host,
                           output_directory=output_directory)
예제 #5
0
 def collect_api(self, query: str, output_directory: str = None) -> None:
     """
     This method collects information from the Shodan API
     :param query: The query in Shodan syntax to collect the desired information from Shodan
     :param output_directory: The directory where Shodan results are stored
     :return:
     """
     if not output_directory or not os.path.isdir(output_directory):
         raise NotADirectoryError(
             "output directory '{}' does not exist".format(
                 output_directory))
     print("[*] querying shodan API")
     api = shodan.Shodan(self._api_key)
     query_results = api.search(query)
     BaseUtils.add_json_results(self._command, query_results)
     self.write_filesystem(query_results=query_results,
                           item=query,
                           output_directory=output_directory)
 def collect_api(self, domain: str, output_directory: str = None) -> None:
     """
     This method collects information from the host.io API
     :param domain: The domain to collect information for
     :param output_directory: The directory where the results are stored
     :return:
     """
     if not output_directory or not os.path.isdir(output_directory):
         raise NotADirectoryError(
             "output directory '{}' does not exist".format(
                 output_directory))
     print("[*] querying virustotal.com API")
     url = self._api_domain_url if self._api_domain_url[
         -1] != "/" else self._api_domain_url[:-1]
     response = self._get_request_info(api_url=url,
                                       params={
                                           "apikey": self._api_key,
                                           "domain": domain
                                       })
     if response.status_code == 200:
         query_results = json.loads(response.content)
         BaseUtils.add_json_results(self._command, query_results)
         self.write_filesystem(query_results=query_results,
                               item=domain,
                               output_directory=output_directory)
     elif response.status_code == 204:
         raise ApiCollectionFailed(
             "too many requests ({}) - the rate limit has "
             "been exceeded".format(response.status_code))
     elif response.status_code == 400:
         raise ApiCollectionFailed(
             "bad request ({}) - the request was somehow "
             "incorrect".format(response.status_code))
     elif response.status_code == 403:
         raise ApiCollectionFailed(
             "forbidden ({}) - not enough privileges to make "
             "the request".format(response.status_code))
     elif response.status_code == 404:
         raise ApiCollectionFailed(
             "not found ({}) - the resource could not be found".format(
                 response.status_code))
     else:
         raise ApiCollectionFailed("failed with status code: {}".format(
             response.status_code))
예제 #7
0
 def collect_api(self, domain: str, output_directory: str = None) -> None:
     """This method collects information from the API"""
     if not output_directory or not os.path.isdir(output_directory):
         raise NotADirectoryError(
             "output directory '{}' does not exist".format(
                 output_directory))
     print("[*] querying securitytrails API")
     response = self._get_request_info(
         api_url=self._api_url,
         url_extension="{}/subdomains".format(domain))
     if response.status_code == 200:
         query_results = json.loads(response.content)
         BaseUtils.add_json_results(self._command, query_results)
         self.write_filesystem(query_results=query_results,
                               item=domain,
                               output_directory=output_directory)
     else:
         raise ApiCollectionFailed("failed with status code: {}".format(
             response.status_code))
 def collect_api(self,
                 email: str,
                 output_directory: str = None,
                 offset: int = 0,
                 limit: int = 1000) -> None:
     """This method collects information from the API"""
     if not output_directory or not os.path.isdir(output_directory):
         raise NotADirectoryError(
             "output directory '{}' does not exist".format(
                 output_directory))
     if not offset:
         print("[*] querying haveibeenpwned.com API")
     response = self._get_request_info(api_url=self._api_url,
                                       url_extension=quote(email),
                                       params={"truncateResponse": "true"})
     if response.status_code == 200:
         query_results = json.loads(response.content)
         BaseUtils.add_json_results(self._command, query_results)
         self.write_filesystem(query_results=query_results,
                               item=email,
                               output_directory=output_directory)
     elif response.status_code == 400:
         raise ApiCollectionFailed(
             "Bad request ({}) - the account does not comply with an acceptable format "
             "(i.e. it's an empty string)".format(response.status_code))
     elif response.status_code == 403:
         raise ApiCollectionFailed(
             "Forbidden ({}) - no user agent has been specified "
             "in the request".format(response.status_code))
     elif response.status_code == 404:
         raise ApiCollectionFailed(
             "Not found ({}) - the account could not be found and has therefore "
             "not been pwned".format(response.status_code))
     elif response.status_code == 429:
         raise ApiCollectionFailed(
             "Too many requests ({}) - the rate limit has been "
             "exceeded".format(response.status_code))
     else:
         raise ApiCollectionFailed("failed with status code: {}".format(
             response.status_code))
 def collect_api(self, domain: str, output_directory: str=None) -> None:
     """
     This method collects information from the builtwith.com API
     :param domain: The domain to collect information for
     :param output_directory: The directory where the results are stored
     :return:
     """
     if not output_directory or not os.path.isdir(output_directory):
         raise NotADirectoryError("output directory '{}' does not exist".format(output_directory))
     print("[*] querying builtwith.com API")
     response = self._get_request_info(api_url=self._api_url,
                                       params={"KEY": self._api_key,
                                               "api_key": self._api_key,
                                               "LOOKUP": domain})
     if response.status_code == 200:
         query_results = json.loads(response.content)
         BaseUtils.add_json_results(self._command, query_results)
         self.write_filesystem(query_results=query_results,
                               item=domain,
                               output_directory=output_directory)
     else:
         raise ApiCollectionFailed("failed with status code: {}".format(response.status_code))
예제 #10
0
 def collect_api(self,
                 domain: str,
                 output_directory: str = None,
                 offset: int = 0,
                 limit: int = 1000) -> None:
     """This method collects information from the API"""
     if not output_directory or not os.path.isdir(output_directory):
         raise NotADirectoryError(
             "output directory '{}' does not exist".format(
                 output_directory))
     if not offset:
         print("[*] querying hunger.io API")
     response = self._get_request_info(api_url=self._api_url,
                                       params={
                                           "domain": domain,
                                           "api_key": self._api_key,
                                           "limit": limit,
                                           "offset": (offset * limit)
                                       })
     if response.status_code == 200:
         query_results = json.loads(response.content)
         BaseUtils.add_json_results(self._command, query_results)
         self.write_filesystem(query_results=query_results,
                               item=domain,
                               number=offset,
                               output_directory=output_directory)
         results = query_results["meta"]["results"]
         offset += 1
         if (offset * limit) <= results:
             self.collect_api(domain=domain,
                              output_directory=output_directory,
                              offset=offset,
                              limit=limit)
     else:
         raise ApiCollectionFailed("failed with status code: {}".format(
             response.status_code))