Ejemplo n.º 1
0
    def load_lang(self, langpath):
        h = Helper()

        if not h.langexists(langpath):
            Logging.log('Can\'t define language to show, exiting...',
                        LogLevel.DANGER)
            exit(-1)
        else:
            self.langbuf = lang_from_path(langpath)
            if not isinstance(self.langbuf, dict):
                Logging.log('- Error loading language file', LogLevel.DANGER)
                exit(-1)

        Logging.log(
            h.formatter(h.getlang(self.langbuf, 'header', None),
                        [h.version(), h.gettime()]), LogLevel.CLI)
Ejemplo n.º 2
0
    def find(self, hostname):
        h = Helper()
        # Uso del crawler
        crawler = WCrawler()
        crawler.defaultTimeout = 60

        # El resultado es de tipo json
        result = None

        req = h.formatter('https://crt.sh/?q=%.{}&output=json', [hostname])

        try:
            result = crawler.httpRequest(req)

            # Libera la memoria (no es necesario un contexto de navegación)
            crawler.clearContext()

        except Exception as e:
            return []

        # ¿La respuesta HTTP es OK?
        if (result['status-code'] != 200):
            return []

        try:
            # Convierte el resultado en un objeto de tipo json
            result = json.loads(result['response-content'])

        except Exception as e:
            return []

        if ((not isinstance(result, list)) or (len(result) == 0)):
            return []

        hostnames = []
        # Procesa cada nombre de dominio encontrado
        for item in result:

            # Evita los resultados duplicados utilizando la pila local
            if (item['name_value'] in hostnames):
                continue

            # Agrega el subdominio encontrado a la pila local
            hostnames.append(item['name_value'])

        return hostnames
Ejemplo n.º 3
0
    def find(self, hostname):
        h = Helper()
        # Uso del crawler
        crawler = WCrawler()
        crawler.defaultTimeout = 30

        # Resultado de tipo HTML
        result = None
        req = h.formatter('https://www.robtex.com/dns-lookup/{}', [hostname])
        try:
            result = crawler.httpRequest(req)

            # Libera la memoria (no es necesario un contexto de navegación)
            crawler.clearContext()

        except Exception as e:
            return []

        # ¿La respuesta HTTP es OK?
        if (result['status-code'] != 200):
            return []

        # Elimina las etiquetas de negritas del resultado: foo.<b>domain.com</b>
        result['response-content'] = result['response-content'].replace(
            b'<b>', b'').replace(b'</b>', b'')

        # Busca todos los posibles subdominios
        matches = re.findall(
            br'>([\w\.\-\_\$]+?\.' + re.escape(hostname).encode() + br')<',
            result['response-content'])

        # ¿Hay resultados?
        if (len(matches) == 0):
            return []

        result = []
        # Procesa todos los resultados
        for item in matches:
            result.append(item.decode())

        return result
Ejemplo n.º 4
0
    def find(self, hostname):

        h = Helper()

        # Uso del crawler
        crawler = WCrawler()

        # El resultado es de tipo json
        result = None
        req = h.formatter('https://certificatedetails.com/api/list/{}',
                          [hostname])
        try:
            result = crawler.httpRequest(req)
            # Libera la memoria (no es necesario un contexto de navegación)
            crawler.clearContext()

        except Exception as e:
            return []

        # ¿La respuesta HTTP es OK?
        if (result['status-code'] != 200):
            return []

        try:
            # Convierte el resultado en un objeto de tipo json
            result = json.loads(result['response-content'])

        except Exception as e:
            return []

        if ((not isinstance(result, list)) or (len(result) == 0)):
            return []

        # Procesa cada nombre de dominio encontrado
        items = []
        for item in result:
            subdomain = h.formatter('.{}', [hostname])
            # ¿Es un subdominio válido?
            if (not item['CommonName'].endswith(subdomain)):
                continue

            # Evita los resultados duplicados utilizando la pila local
            if (item['CommonName'] in items):
                continue

            # Agrega el subdominio encontrado a la pila local
            items.append(item['CommonName'])

        self.hostnames.append({'subdomains': list(set(items))})

        # Identificador actual del enlace
        linkId = 0

        # Procesa cada enlace
        # Precaución: Un mismo nombre de dominio repetido puede contener uno o
        #             más certificados diferentes.
        linkres = []
        for item in result:

            linkId += 1
            req = h.formatter('https://certificatedetails.com{}',
                              [item['Link']])
            linkres += self.findInLink(url=req,
                                       linkId=linkId,
                                       totalLinks=len(result),
                                       hostname=hostname)
        self.hostnames.append({'links': list(set(linkres))})
        return self.hostnames
Ejemplo n.º 5
0
    def find(self, hostname):
        h = Helper()
        # ¿La llave de la API de Google existe?
        if (not self.googleApiKey.strip()):
            return []

        q = h.formatter('site:{}', [hostname])
        hostnames = []

        for i in range(1, 16):
            # ¿Hay resultados del método actual?
            if (hostnames):
                # Excluye los subdominios ya conocidos
                q += h.formatter('-site:{}', [' -site:'.join(hostnames)])
            # Uso del crawler
            crawler = WCrawler()

            # El resultado es de tipo json
            result = None
            req = h.formatter(
                'https://www.googleapis.com/customsearch/v1?cx={}&key={}&q={}&start={}&filter=1&safe=off&num={}',
                [self.googleCx, self.googleApiKey, q, i, 10])
            try:
                # Navega
                result = crawler.httpRequest(req)

                # Libera la memoria (no es necesario un contexto de navegación)
                crawler.clearContext()

            except Exception as e:
                break

            # Los estados 403 y 400 indican que no hay más resultados o que la API
            # está saturada con solicitudes.
            if (result['status-code'] in [403, 400]):
                break

            # ¿La respuesta HTTP es OK?
            if (result['status-code'] != 200):
                break

            try:
                # Convierte el resultado en un objeto de tipo json
                result = json.loads(result['response-content'])
            except Exception as e:
                break

            # ¿Hay resultados procesables?
            if ((not 'items' in result) or (len(result['items']) == 0)):
                break

            # Procesa cada resultado
            for item in result['items']:

                f = h.formatter('.{}', [hostname])
                # ¿El resultado es un subdominio inválido?
                if (not item['displayLink'].endswith(f)):
                    continue

                # Evita los resultados duplicados utilizando la pila local
                if (item['displayLink'] in hostnames):
                    continue

                # Agrega el subdominio encontrado a la pila local
                hostnames.append(item['displayLink'])

        return hostnames
Ejemplo n.º 6
0
def render_tree(tree):
    h = Helper()
    for pre, fill, node in RenderTree(tree):
        Logging.log(h.formatter("{}{}", [pre, node.name]), LogLevel.CLI)