eb8dbf66a1
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
82 lines
2.8 KiB
Python
82 lines
2.8 KiB
Python
"""Genera consultas (dorks) de motor de busqueda para investigar un target.
|
|
|
|
Funcion pura de OSINT pasivo: a partir de un target y su tipo (persona,
|
|
email, dominio o usuario) produce una lista de cadenas de busqueda listas
|
|
para pegar en un buscador. No toca la red.
|
|
"""
|
|
|
|
|
|
def build_search_dorks(
|
|
target: str,
|
|
tipo: str = "persona",
|
|
extra_domains: list | None = None,
|
|
) -> list:
|
|
"""Genera dorks de motor de busqueda adaptados al tipo de target.
|
|
|
|
Segun el tipo seleccionado produce las consultas mas utiles para
|
|
investigar:
|
|
|
|
- persona: nombre exacto, en linkedin, con cv/curriculum, en ficheros.
|
|
- email: el email entre comillas, en pastebin/breaches, en filetypes.
|
|
- dominio: site:dominio, ficheros expuestos, subdominios, paneles.
|
|
- usuario: el alias en redes sociales y foros.
|
|
|
|
`extra_domains` añade dorks `site:<dominio> "<target>"` para acotar la
|
|
busqueda a dominios concretos, independientemente del tipo.
|
|
|
|
Args:
|
|
target: cadena objetivo (nombre, email, dominio o username).
|
|
tipo: uno de "persona", "email", "dominio", "usuario". Cualquier
|
|
otro valor cae al conjunto generico (solo la frase exacta).
|
|
extra_domains: lista opcional de dominios para acotar via site:.
|
|
|
|
Returns:
|
|
lista de strings de dork en orden de generacion (sin deduplicar
|
|
salvo el dork de frase exacta, que es la base comun).
|
|
"""
|
|
q = f'"{target}"' # frase exacta, base de casi todo dork
|
|
dorks = [q]
|
|
t = tipo.strip().lower()
|
|
|
|
if t == "persona":
|
|
dorks += [
|
|
f"{q} filetype:pdf",
|
|
f'site:linkedin.com/in {q}',
|
|
f'site:twitter.com {q}',
|
|
f'intext:{q} (curriculum OR cv OR resume)',
|
|
f'{q} (email OR correo OR contacto)',
|
|
f'{q} filetype:doc OR {q} filetype:docx',
|
|
]
|
|
elif t == "email":
|
|
dorks += [
|
|
f'{q} site:pastebin.com',
|
|
f'{q} (leak OR breach OR dump OR password)',
|
|
f'{q} filetype:txt',
|
|
f'{q} filetype:csv',
|
|
f'{q} site:github.com',
|
|
]
|
|
elif t == "dominio":
|
|
dorks += [
|
|
f'site:{target}',
|
|
f'site:{target} filetype:pdf',
|
|
f'site:{target} filetype:xlsx',
|
|
f'site:{target} (login OR admin OR dashboard)',
|
|
f'site:{target} intext:(password OR contraseña)',
|
|
f'site:*.{target}',
|
|
f'-www site:{target}',
|
|
]
|
|
elif t == "usuario":
|
|
dorks += [
|
|
f'{q} site:github.com',
|
|
f'{q} site:reddit.com',
|
|
f'{q} (profile OR perfil OR user OR usuario)',
|
|
f'inurl:{target}',
|
|
]
|
|
# Cualquier otro tipo: solo la frase exacta (ya añadida).
|
|
|
|
if extra_domains:
|
|
for dom in extra_domains:
|
|
dorks.append(f'site:{dom} {q}')
|
|
|
|
return dorks
|