Guía rápida para localizar repositorios, historial, documentación técnica y artefactos publicados por una organización o sus empleados. Analiza únicamente contenido accesible legítimamente; no utilices secretos encontrados y conserva la mínima evidencia necesaria.
Flujo rápido
- Confirmar nombres legales, marcas, dominios y perfiles corporativos.
- Localizar organizaciones y repositorios en GitHub, GitLab y Bitbucket.
- Buscar repositorios personales vinculados mediante evidencias profesionales.
- Revisar código actual, ramas, tags, releases y commits históricos.
- Extraer dominios, hostnames, URLs, tecnologías e infraestructura como código.
- Ejecutar detección local de secretos sobre repositorios autorizados.
- Buscar documentación y colecciones públicas en Postman.
- Validar atribución, vigencia y exposición sin usar credenciales.
Repositorio | Plataforma | Propietario | Relación | Visibilidad | Último cambio | Hallazgo | Fuente | Confianza | En alcanceGitHub
Buscar por organización, dominio, marca, productos y direcciones corporativas.
# GitHub CLI
gh search users 'example-corp'
gh search repos 'example-corp' --limit 100
gh search repos 'org:example-corp' --limit 100
gh search code '"example.com"' --limit 100
gh search commits 'author-email:@example.com' --limit 100Revisar:
- Perfil y dominio verificado de la organización.
- Repositorios públicos, forks, mirrors y templates.
- Miembros públicos y contribuidores.
- Topics, descripciones, homepage y releases.
- Ramas, tags, workflows y paquetes publicados.
Un repositorio con el nombre de una marca no demuestra relación oficial.
GitLab
Buscar grupos, proyectos, snippets, usuarios y mirrors públicos.
site:gitlab.com "example.com"
site:gitlab.com "Example Corp"
site:gitlab.com ("api.example.com" OR "@example.com")Con la CLI glab, cuando se disponga de acceso legítimo:
glab repo search example-corp
glab api 'projects?search=example-corp&simple=true&visibility=public'Revisar también instancias GitLab self-hosted descubiertas en DNS, sin intentar acceso a proyectos no públicos.
Bitbucket
Localizar workspaces, repositorios y snippets públicos mediante buscadores y referencias desde documentación.
site:bitbucket.org "Example Corp"
site:bitbucket.org "example.com"
site:bitbucket.org ("api.example.com" OR "@example.com")Buscar mirrors, pipelines, ficheros de configuración y enlaces a Jira o productos Atlassian. Validar el propietario mediante perfil, dominio, commits y enlaces corporativos.
Repositorios personales de empleados
Los repositorios personales pueden contener proyectos corporativos publicados por error, forks, ejemplos o contribuciones legítimas.
Proceso recomendado:
- Partir de una identidad profesional confirmada.
- Correlacionar nombre, alias, bio, empresa y dominio público.
- Buscar menciones a productos, dominios o tecnologías corporativas.
- Distinguir trabajo personal, contribución open source y código empresarial.
- Registrar la relación como confirmada, probable o descartada.
site:github.com "@example.com"
site:github.com "Example Corp" "Nombre Apellido"
site:gitlab.com "@example.com"No atribuir un repositorio personal a la empresa solo porque su autor trabaje allí.
Organizations
Buscar variantes del nombre, marcas, filiales, adquisiciones y nombres históricos.
Indicadores de una organización oficial:
- Dominio verificado o enlazado desde la web corporativa.
- Miembros y commits con identidades corporativas.
- Repositorios de productos conocidos.
- Enlaces desde documentación o paquetes oficiales.
- Avisos legales, copyright y contacto coherentes.
Crear un inventario separado para organizaciones oficiales, probables, históricas y homónimas.
Commits
El historial puede conservar ficheros eliminados, endpoints antiguos, autores y cambios de infraestructura.
# Historial completo y ramas remotas
git log --all --oneline --decorate --graph
# Ficheros modificados en cada commit
git log --all --name-status --oneline
# Buscar una cadena en el historial
git log -S 'api.example.com' --all -p
# Buscar cambios que coincidan con una expresión
git log -G 'https?://|AKIA|BEGIN.*PRIVATE KEY' --all -p
# Mostrar un fichero en un commit concreto
git show COMMIT:path/to/fileLas ramas eliminadas pueden no estar disponibles en un clon normal. Evitar técnicas que alteren o interactúen con el repositorio remoto.
Emails
Los commits públicos pueden exponer direcciones corporativas, personales o generadas por la plataforma.
# Autores únicos del historial
git log --all --format='%aN <%aE>' | sort -fu
# Committers únicos
git log --all --format='%cN <%cE>' | sort -fu
# Direcciones del dominio objetivo
git log --all --format='%aE%n%cE' | grep -Ei '@example\.com$' | sort -fuNo asumir que el autor declarado realizó el commit: nombre y email de Git pueden falsificarse. Correlacionar firma, perfil y actividad.
Secrets
Buscar credenciales incrustadas, ficheros de entorno, claves privadas, tokens y configuración sensible tanto en el estado actual como en el historial.
Indicadores frecuentes:
.env
credentials
secret
token
password
private_key
client_secret
connection_stringAnte un posible secreto:
- No utilizarlo ni intentar validarlo contra el servicio.
- Capturar ubicación, tipo y commit sin copiar el valor completo.
- Redactar el valor en notas e informes.
- Confirmar si el repositorio pertenece al objetivo.
- Notificar mediante el canal definido para la operación.
Tokens
Los tokens pueden aparecer en código, workflows, ejemplos, logs, documentación y colecciones API.
Buscar nombres de variables y formatos conocidos, pero evitar publicar firmas completas:
rg -n -i 'access[_-]?token|auth[_-]?token|bearer|client[_-]?secret' .Clasificar como ejemplo, placeholder, test, posible secreto o confirmado por el propietario. No comprobar permisos ni vigencia mediante peticiones reales.
API keys
rg -n -i 'api[_-]?key|apikey|subscription[_-]?key|x-api-key' .
rg -n -i 'client[_-]?id|client[_-]?secret|tenant[_-]?id' .Algunas API keys identifican un proyecto sin conceder acceso sensible. Evaluar proveedor, restricciones, contexto y exposición sin invocar APIs de terceros.
Internal hostnames
El código puede revelar esquemas de nombres, entornos y dominios internos.
# Hostnames y términos frecuentes
rg -n -i 'localhost|\.local\b|\.internal\b|\.corp\b|intranet|staging|uat|dev\.' .
# FQDN aproximados
rg -o -N '[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)+\.[A-Za-z]{2,}' . \
| sort -u > hostnames.txtUn nombre interno no debe resolverse ni atacarse desde sistemas no autorizados. Úsalo para comprender arquitectura y nomenclatura.
URLs internas
# URLs HTTP/HTTPS encontradas en el repositorio
rg -o -N 'https?://[^[:space:]"<>]+' . | sort -u > urls.txt
# Protocolos y endpoints adicionales
rg -n -i 'jdbc:|mongodb(\+srv)?:|postgres(ql)?:|redis:|amqp(s)?:|grpc' .Separar URLs públicas, internas, locales, históricas y de terceros. No visitar endpoints internos mediante SSRF, proxies o redes ajenas al alcance.
Infrastructure as Code
IaC describe arquitectura, proveedores, nombres, regiones, redes y permisos.
Ficheros habituales:
*.tf / *.tfvars
cloudformation.yml / template.yaml
azuredeploy.json / *.bicep
Pulumi.yaml
kustomization.yaml
Chart.yaml / values.yaml
docker-compose.ymlfind . -type f \( -name '*.tf' -o -name '*.tfvars' -o -name '*.bicep' \
-o -name 'template.yaml' -o -name 'cloudformation.yml' \
-o -name 'Pulumi.yaml' -o -name 'values.yaml' \) -print
rg -n 'resource|provider|region|subscription|project|tenant|bucket|vpc|subnet' \
--glob '*.tf' --glob '*.bicep' --glob '*.yaml' --glob '*.yml'Los ficheros de estado de Terraform pueden contener datos especialmente sensibles. No redistribuirlos ni extraer valores innecesarios.
Dockerfiles
# Localizar artefactos de contenedores
find . -type f \( -iname 'Dockerfile*' -o -iname '*compose*.yml' \
-o -iname '*compose*.yaml' -o -name '.dockerignore' \) -print
# Indicadores relevantes
rg -n -i '^(FROM|USER|EXPOSE|ARG|ENV|COPY|ADD|ENTRYPOINT|CMD)' \
--glob 'Dockerfile*'Revisar imágenes base, registries, puertos, usuarios, argumentos de build, ficheros copiados y endpoints. ARG y ENV no deben usarse para secretos.
CI/CD
Buscar pipelines y configuración de automatización:
.github/workflows/*.yml
.gitlab-ci.yml
bitbucket-pipelines.yml
Jenkinsfile
azure-pipelines.yml
.circleci/config.ymlRevisar:
- Runners, entornos y nombres de despliegue.
- Registries, repositorios de artefactos y cloud.
- Variables referenciadas, nunca sus valores ocultos.
- Permisos declarados y eventos que disparan workflows.
- Scripts descargados y acciones de terceros.
No ejecutar pipelines, abrir pull requests ni modificar ramas durante reconocimiento.
GitHub Actions
# Localizar workflows
find .github/workflows -type f \( -name '*.yml' -o -name '*.yaml' \) -print
# Acciones, permisos, secrets y triggers
rg -n 'uses:|permissions:|secrets\.|pull_request_target|workflow_run|workflow_dispatch' \
.github/workflowsComprobar:
permissionsexplícitos y principio de mínimo privilegio.- Acciones fijadas a versiones o commits confiables.
- Uso de
pull_request_targety código no confiable. - Exposición accidental de secrets en comandos o logs.
- Runners self-hosted y condiciones de ejecución.
Documentar configuraciones potencialmente peligrosas sin intentar activar el workflow.
Gitleaks
Gitleaks analiza el estado actual y el historial de un repositorio local.
# Clonar un repositorio público autorizado
git clone https://github.com/example/project.git
cd project
# Analizar historial Git
gitleaks git . --redact --report-format json --report-path gitleaks.json
# Analizar los ficheros actuales sin historial
gitleaks dir . --redact --report-format json --report-path gitleaks-dir.jsonUsar --redact y proteger el informe. Confirmar manualmente falsos positivos sin utilizar los valores detectados.
TruffleHog
TruffleHog detecta secretos en Git y otros orígenes.
# Repositorio local; omitir verificación activa
trufflehog git file://. --no-verification --json > trufflehog.json
# Directorio local
trufflehog filesystem . --no-verification --json > trufflehog-files.jsonMantener desactivada la verificación de credenciales durante reconocimiento. La verificación puede contactar servicios externos y utilizar el secreto.
GitHub dorks
Combinar dominio, marca, hostname y nombres de variables con filtros de GitHub.
"example.com" org:example-corp
"@example.com" type:code
"api.example.com" type:code
"example.com" path:.github/workflows
"example.com" filename:.env
"example.com" filename:terraform.tfvars
"example.com" extension:tf
"example.com" extension:yaml
"example.com" "client_secret"Con GitHub CLI:
gh search code '"example.com" org:example-corp' --limit 100
gh search code '"api.example.com" extension:yaml' --limit 100
gh search commits 'author-email:@example.com' --limit 100Los resultados dependen de la indexación y los permisos de la cuenta utilizada.
Postman
Postman Public API Network permite buscar workspaces, APIs, documentación y colecciones publicadas.
Buscar por:
- Nombre legal, marca, producto y filial.
- Dominio raíz y hostnames de API.
- Nombres internos observados en código o DNS.
- Paths característicos como
/api/v1o nombres de servicios. - Nombre de empleados o equipos solo cuando exista una relación profesional confirmada.
Revisar en colecciones y environments públicos:
- Base URLs, endpoints, métodos y parámetros.
- Ejemplos de requests y responses.
- Variables como
baseUrl,host,tenantoenvironment. - Documentación de autenticación.
- Referencias a repositorios, dominios internos y entornos.
- Tokens o claves publicados accidentalmente.
example.com
api.example.com
"Example Corp"
"example-api"Las colecciones pueden ser forks, ejemplos de terceros o documentación histórica. Validar autor, workspace, fecha, dominio y relación corporativa. No ejecutar colecciones ni utilizar tokens encontrados.
Si se exporta una colección autorizada, puede revisarse localmente:
# URLs y hosts en una colección Postman
jq -r '.. | .raw? // empty' collection.json | sort -u
# Variables declaradas, sin imprimir valores en informes compartidos
jq -r '.. | objects | select(has("key")) | .key' collection.json | sort -u
# Buscar indicadores sensibles y endpoints
rg -n -i 'token|secret|api[_-]?key|authorization|baseUrl|https?://' collection.jsonRegistros de paquetes y artefactos
Los registros públicos pueden revelar namespaces, organizaciones, mantenedores, repositorios, dominios, pipelines y nombres de paquetes utilizados internamente.
Buscar por:
- Nombre legal, marca, producto y filial.
- Dominio corporativo y correos de mantenedores.
- Namespace de GitHub, GitLab o Bitbucket.
- Nombres encontrados en manifests, lockfiles y CI/CD.
- URLs de repositorio, homepage, documentación y bugs.
No publicar, registrar ni reclamar nombres de paquetes aparentemente internos. Documentar el riesgo de dependency confusion sin ejecutar una toma de control.
PyPI
PyPI publica paquetes Python y metadatos en JSON.
# Versiones disponibles de un paquete exacto
python3 -m pip index versions example-package
# Metadatos públicos mediante API
curl -s https://pypi.org/pypi/example-package/json \
| jq '.info | {name,version,summary,author,maintainer,home_page,project_urls}'
# Descargar artefactos sin instalar
python3 -m pip download --no-deps example-package -d packages/Revisar pyproject.toml, setup.py, setup.cfg, wheel y source distributions. No instalar paquetes desconocidos en el sistema de análisis.
npm
npm permite buscar paquetes, scopes y maintainers públicos.
# Buscar por marca, dominio o keyword
npm search example-corp --json > npm-search.json
# Metadatos sin instalar
npm view @example/package --json
npm view example-package name version description repository homepage maintainers dist-tags
# Descargar el tarball sin ejecutar scripts
npm pack example-package --ignore-scriptsRevisar paquetes con scope @organizacion, repositorio, autores, scripts de lifecycle y dependencias. Evitar npm install durante triage; puede ejecutar scripts del paquete.
Maven Central
Maven Central indexa artefactos Java por groupId y artifactId.
# Buscar groupId o texto mediante la API de Solr
curl -s 'https://search.maven.org/solrsearch/select?q=g:com.example&rows=100&wt=json' \
| jq '.response.docs[] | {g,a,latestVersion,repositoryId}'
curl -s 'https://search.maven.org/solrsearch/select?q=example-corp&rows=100&wt=json' \
| jq '.response.docs[] | {g,a,latestVersion}'El groupId suele revelar dominios invertidos, productos y divisiones. Revisar POM, SCM, developers y repositorios enlazados.
NuGet
NuGet Gallery contiene paquetes .NET y metadatos de propietarios y repositorios.
# Buscar paquetes
dotnet package search example-corp --take 100
# Descargar un paquete sin añadirlo a un proyecto
curl -LO https://www.nuget.org/api/v2/package/Example.Package/1.0.0
# Inspeccionar como ZIP
unzip -l Example.Package.1.0.0.nupkgRevisar .nuspec, repository URL, owners, namespaces .NET y símbolos publicados.
RubyGems
RubyGems.org expone metadatos mediante una API pública.
# Buscar por nombre
gem search -r example
# Metadatos de una gema
curl -s https://rubygems.org/api/v1/gems/example.gem.json \
| jq '{name,version,authors,homepage_uri,source_code_uri,documentation_uri}'
# Descargar sin instalar
gem fetch example --version 1.0.0Revisar gemspec, autores, homepage, repositorio y dependencias.
crates.io
crates.io es el registro público del ecosistema Rust.
# Buscar crates
cargo search example-corp --limit 100
# API pública
curl -s 'https://crates.io/api/v1/crates?page=1&per_page=100&q=example-corp' \
| jq '.crates[] | {id,name,newest_version,repository,homepage}'
# Descargar sin compilar
curl -L -o package.crate https://crates.io/api/v1/crates/example/1.0.0/downloadLos archivos .crate son tarballs. Inspeccionarlos sin ejecutar build.rs ni compilar código desconocido.
Packagist
Packagist indexa paquetes PHP utilizados por Composer.
# Buscar mediante API
curl -s 'https://packagist.org/search.json?q=example-corp' \
| jq '.results[] | {name,description,url,repository}'
# Metadatos de un paquete exacto
curl -s https://repo.packagist.org/p2/vendor/package.json | jq
# Consultar sin instalar
composer show vendor/package --allRevisar vendor namespace, source, dist, maintainers y scripts declarados en composer.json.
Go modules
Los módulos Go suelen utilizar como nombre la URL del repositorio o un dominio corporativo.
# Buscar referencias en código público local
rg -n '^module |^require |^replace ' --glob 'go.mod'
# Consultar versiones conocidas por el proxy público
curl -s https://proxy.golang.org/github.com/example/project/@v/list
# Metadatos de una versión, sin ejecutar el módulo
curl -s https://proxy.golang.org/github.com/example/project/@v/v1.0.0.info | jqBuscar módulos por dominio invertido, repositorio y organización. Las directivas replace pueden revelar nombres o rutas internas.
Docker Hub y registries de contenedores
Las imágenes públicas pueden revelar Dockerfiles, capas, binarios, variables, usuarios y endpoints.
Fuentes habituales:
- Docker Hub.
- GitHub Container Registry:
ghcr.io. - GitLab Container Registry.
- Quay:
quay.io. - Registries públicos enlazados desde documentación.
# Buscar imágenes en Docker Hub
docker search example-corp
# Inspeccionar manifiesto remoto sin ejecutar la imagen
docker buildx imagetools inspect example/image:tag
# Descargar e inspeccionar con Skopeo, sin ejecutar
skopeo inspect docker://docker.io/example/image:tag
skopeo copy docker://docker.io/example/image:tag dir:image-filesNo ejecutar imágenes desconocidas. Revisar repositorio, labels OCI, historial, arquitectura, digest y referencias a pipelines.
Otros ecosistemas
Según las tecnologías observadas, revisar también:
| Ecosistema | Registro o artefacto |
|---|---|
| Dart/Flutter | pub.dev |
| Swift | Swift Package Index y Package.swift |
| CocoaPods | CocoaPods Trunk y .podspec |
| Elixir | Hex.pm |
| Erlang | Hex.pm |
| Haskell | Hackage |
| C/C++ | ConanCenter, vcpkg y GitHub Releases |
| Linux | paquetes Debian/RPM y repositorios del fabricante |
| Helm | Artifact Hub y charts OCI |
| Terraform | Terraform Registry |
Priorizar ecosistemas confirmados por repositorios, ofertas técnicas, JavaScript, binarios, imágenes o documentación.
Manifests y lockfiles
Los manifests relacionan paquetes públicos con nombres privados o registries internos.
find . -type f \( -name 'package.json' -o -name 'package-lock.json' \
-o -name 'requirements*.txt' -o -name 'pyproject.toml' \
-o -name 'Pipfile.lock' -o -name 'pom.xml' -o -name 'build.gradle*' \
-o -name '*.csproj' -o -name 'packages.lock.json' \
-o -name 'Gemfile.lock' -o -name 'Cargo.lock' -o -name 'composer.lock' \
-o -name 'go.mod' \) -print
# Registries y nombres internos
rg -n -i 'registry|repository|packages|artifactory|nexus|devpi|verdaccio|npmrc|pypirc' .Comprobar si un nombre interno aparece también en un registro público. No crear un paquete con ese nombre; registrar namespace, evidencia y posible impacto.
Dependency confusion
Indicadores:
- Dependencia sin scope o namespace corporativo.
- Nombre presente en CI/CD pero ausente del registro público esperado.
- Registry privado combinado con fallback público.
- Versión pública superior a la interna.
- Ficheros
.npmrc,.pypirc, Mavensettings.xmlo NuGet config mal definidos.
La comprobación segura consiste en revisar configuración y disponibilidad del nombre. Publicar un paquete de prueba requiere autorización expresa, coordinación y un procedimiento específico.
Validación y tratamiento de secretos
Para cualquier hallazgo sensible:
- No autenticar, ejecutar ni verificar el valor.
- Redactar todo salvo un prefijo o hash suficiente para correlación.
- Registrar repositorio, ruta, commit y fecha.
- Comprobar si el contenido sigue público.
- Notificar de inmediato por el canal autorizado.
- Evitar incluir el secreto en tickets, capturas o logs.
Plantilla de inventario
Plataforma | Organización/usuario | Repositorio/workspace | Artefacto | Rama/commit | Hallazgo | Vigencia | Fuente | Fecha | Confianza | En alcanceEstados recomendados: oficial, personal relacionado, fork, mirror, histórico, tercero, sensible o pendiente de validar.