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: https://github.com/imnsomia/MiniPentestTool
Uso: python3 mpt.py
Instalar libreria:
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:
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.
Mira, lo reduje un poco y eliminé el bs4 porque realmente no lo necesita ya que la api utiliza texto plano y no html:
https://gist.github.com/WHK102/f2989164a3f62bd64a5895fcf488b685
#!/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.
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:
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