--- name: enrich_person_passive kind: function lang: py domain: cybersecurity version: "1.0.0" purity: impure signature: "def enrich_person_passive(nombre: str, apellidos: str, dominios: list | None = None, usernames: list | None = None) -> dict" description: "Orquestador OSINT pasivo: genera candidatos de enriquecimiento de una persona SIN tocar al objetivo. Compone guess_email_formats (emails candidatos por cada dominio dado, o gmail/outlook por defecto), enumerate_username_sites (comprobacion de usernames en servicios publicos) y build_search_dorks (dorks tipo persona, que NO se ejecutan, solo se generan)." tags: [osint-enrich, osint-passive, cybersecurity, person, email, username, dorks] uses_functions: [guess_email_formats_py_cybersecurity, enumerate_username_sites_py_cybersecurity, build_search_dorks_py_cybersecurity] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: nombre desc: "nombre de pila de la persona" - name: apellidos desc: "apellido(s) de la persona. nombre y apellidos no pueden estar ambos vacios (ValueError)" - name: dominios desc: "lista de dominios de correo donde generar formatos de email candidatos. None o vacia => usa los dominios comunes gmail.com/outlook.com" - name: usernames desc: "lista de usernames a comprobar en sitios publicos via enumerate_username_sites. None o vacia => no se comprueba ningun username" output: "dict con email_candidates (lista de emails candidatos NO verificados, deduplicada y ordenada), username_hits (lista de {username, hits} con el resultado de enumerate_username_sites por username) y dorks (lista de dorks de busqueda tipo persona generados pero NO ejecutados)" tested: true tests: ["test_golden_compone_emails_usernames_y_dorks", "test_sin_dominios_usa_comunes", "test_sin_usernames_no_comprueba", "test_nombre_y_apellidos_vacios_lanza", "test_emails_deduplicados"] test_file_path: "python/functions/cybersecurity/enrich_person_passive_test.py" file_path: "python/functions/cybersecurity/enrich_person_passive.py" --- ## Ejemplo ```python import sys, os sys.path.insert(0, os.path.join("python", "functions")) from cybersecurity import enrich_person_passive res = enrich_person_passive( "Juan", "Perez", dominios=["organic-machine.com"], usernames=["jperez", "juanp"], ) print(res["email_candidates"]) # ['juan.perez@organic-machine.com', 'jperez@organic-machine.com', ...] for u in res["username_hits"]: print(u["username"], len(u["hits"])) # sitios publicos donde aparece cada username print(res["dorks"]) # dorks listos para pegar en un buscador (no se ejecutan aqui) ``` ## Cuando usarla - Cuando arrancas la ficha OSINT de una persona y quieres una primera tanda de candidatos (emails probables, presencia de usernames, dorks) sin enviar nada al objetivo ni a su correo. - Antes de verificar manualmente: genera el espacio de candidatos para que despues confirmes cuales son reales. - Como paso pasivo previo a cualquier accion activa (que requeriria otra autorizacion y otras funciones). ## Gotchas - **Uso solo para investigacion autorizada.** Generar candidatos sobre una persona sin base legitima puede vulnerar privacidad/leyes de proteccion de datos. - Los `email_candidates` son **candidatos NO verificados**: son permutaciones plausibles del nombre, NO emails confirmados. No asumas que existen ni los uses para envio. - Funcion IMPURA: `enumerate_username_sites` consulta servicios publicos por red, lo que **deja una huella minima** (requests a esos sitios). `build_search_dorks` y `guess_email_formats` son locales. - Los dorks se **generan pero NO se ejecutan** aqui: ejecutarlos en un buscador es un paso aparte y deja su propia huella. - Si no aportas `dominios`, se usan gmail.com/outlook.com como heuristica; ajusta la lista a los dominios reales del entorno de la persona para candidatos utiles.