Cliente muy simple para HackerTarget (MiniPentestTool)

Iniciado por insomnia, Agosto 24, 2020, 11:39:46 AM

Tema anterior - Siguiente tema

0 Miembros y 8 Visitantes están viendo este tema.

Hola dejo esto aca para alguien que le guste el Pentesting es un cliente para no usar HackerTarget desde la pagina web, para alguno que quiera ver el codigo o lo quiera modificar a su gusto o agregarle cosas

Github: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Uso:
Código: text
python3 mpt.py


Instalar libreria:
Código: text
pip3 install beatifulsoup4


si quieren en los comentarios dejenmen algo para programar y lo cuelgo en Github relacionado al pentesting nivel web o tambien al hacking en gral saludos!

Gracias por compartir, la probaré compañero y veré si se puede agregar algo más  ;D ;D

Saludos!
-Kirari

Hola, podrías reemplazar todas tus funciones de la clase con una sola más genérica, por ejemplo:

Código: php
def req(self, service):
        target = input("Target IP/Domain: ")
        r = requests.get("https://api.hackertarget.com/%s/?q=%s" % (service, target))
        soup = BeautifulSoup(r.text, 'lxml')
        funcion = soup.find_all('body')
        print(funcion[0].text)


Saludos.
- No tienes permitido ver los links. Registrarse o Entrar a mi cuenta - No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Agosto 24, 2020, 02:00:30 PM #3 Ultima modificación: Agosto 24, 2020, 02:17:47 PM por WHK
Mira, lo reduje un poco y eliminé el bs4 porque realmente no lo necesita ya que la api utiliza texto plano y no html:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import banner, requests


class HackerTargetIntegration():

    def __init__(self):

        banner.banner()

        methods = [
            'mtr',
            'nping',
            'dnslookup',
            'reversedns',
            'hostsearch',
            'findshareddns',
            'zonetransfer',
            'whois',
            'geoip',
            'reverseiplookup',
            'nmap',
            'subnetcalc',
            'httpheaders',
            'pagelinks'
        ]

        while(True):

            id = 0
            for method in methods:
                print('%d -> %s' % (id, method))
                id += 1

            method = input('>> ').strip()
            if(method and (int(method) <= len(methods))):
                self.req(methods[int(method)])
            else:
                print('El método no existe. Intente nuevamente.')


    def req(self, method):

        target = input('IP/Dominio objetivo: ')
        response = requests.get('https://api.hackertarget.com/%s/?q=%s' % (method, target))
        print(('-' * 20) + '\n' + response.text + '\n' + ('-' * 20) + '\n')



if __name__ == '__main__':

    try:
        HackerTargetIntegration()
   
    except KeyboardInterrupt as e:
        pass

    except Exception as e:
        raise e


A demás te voy a comentar algo para que lo apliques en tus futuros proyectos. Si te fijas, tu hiciste una separación distinta a la mia, tu hiciste una clase donde cada función se encarga de una tarea distinta (repetitiva pero distinta), esto te permitía ser utilizado por otras clases, pero yo en mi caso eliminé esa arquitectura por un código mas simple tomando en cuenta de que solo el usuario interactua con esa clase y no otros módulos o scripts. Tu concepto y el mio son dos conceptos totalmente diferentes y eso se debe a la separación por capas.

En tu caso, si querías hacer una clase modular tenías que haber separado la lógica de la clase con el script que lo ejecuta, en otras palabras, tu clase que hace todo el trabajo se llama capa de servicio y tu script principal tu controlador. Como vi que tu script completo era un controlador entonces lo resumí como controlador y no como módulo.

Si quieres puedes volver a crear las funciones y que estas funciones llamen a una única función encargada de hacer las solicitudes y luego la guardas como módulo y desde tu script principal que es el controlador haces la solicitud del input y llamas a la función de la clase por cada método disponible, y este listado de métodos debes obtenerlo desde el mismo array de la clase de servicio. Esto quiere decir: Que tendrás que crear una función por cada método a demás de tener una lista de métodos permitidos, de esta manera el controlador sabrá cuales métodos existen y evitarás tener que usar refracción para obtener el listado de funciones (algo inseguro y de no muy buena práctica) o mantener la función req con el método de manera dinámca más el listado de métodos permitidos. En este caso tendrás que hacer una validación antes de llamar al sitio web para preveer que el método no sea algo que el servcio web no soporte, crear excepciones tipo MethodNotFoundException, etc.

Saludos.
- No tienes permitido ver los links. Registrarse o Entrar a mi cuenta - No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Wow gracias por el feedback, si es que en realidad lo hice asi nomas era un repositorio que tenia hace 3 años y queria recodearlo asi que si lo hice asi nomas, pero voy a tomar lo que me dijiste y lo voy actualizar gracias!

Bueno ahi updatie el Github de paso agregue el archivo del banner, al final quedo asi:

Código: python
import banner, requests

class HackerTargetAPI():
    def __init__(self):
        self.methods = [
            'mtr',
            'nping',
            'dnslookup',
            'reversedns',
            'hostsearch',
            'findshareddns',
            'zonetransfer',
            'whois',
            'geoip',
            'reverseiplookup',
            'nmap',
            'subnetcalc',
            'httpheaders',
            'pagelinks'
        ]

    def req(self, opcion):
        try:
            i = input("[Target]: ")
            r = requests.get(f"https://api.hackertarget.com/{self.methods[int(opcion)]}/?q={i}")
            print(f"""
Resultados:
{r.text}""")
        except IndexError:
            print("No existe ese method")

if __name__ == '__main__':
    c = HackerTargetAPI()
    banner.banner()
    opcion = input(">> ")
    c.req(opcion)


Gracias por responder y para los que vean esto dejenmen abajo ideas para hacer relacionados a esto