WIKI / FIELD NOTE

Repositorios y código público

Localización de repositorios, fragmentos de código y artefactos de desarrollo expuestos públicamente.

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

  1. Confirmar nombres legales, marcas, dominios y perfiles corporativos.
  2. Localizar organizaciones y repositorios en GitHub, GitLab y Bitbucket.
  3. Buscar repositorios personales vinculados mediante evidencias profesionales.
  4. Revisar código actual, ramas, tags, releases y commits históricos.
  5. Extraer dominios, hostnames, URLs, tecnologías e infraestructura como código.
  6. Ejecutar detección local de secretos sobre repositorios autorizados.
  7. Buscar documentación y colecciones públicas en Postman.
  8. Validar atribución, vigencia y exposición sin usar credenciales.
Repositorio | Plataforma | Propietario | Relación | Visibilidad | Último cambio | Hallazgo | Fuente | Confianza | En alcance

GitHub

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 100

Revisar:

  • 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:

  1. Partir de una identidad profesional confirmada.
  2. Correlacionar nombre, alias, bio, empresa y dominio público.
  3. Buscar menciones a productos, dominios o tecnologías corporativas.
  4. Distinguir trabajo personal, contribución open source y código empresarial.
  5. 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/file

Las 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 -fu

No 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_string

Ante un posible secreto:

  1. No utilizarlo ni intentar validarlo contra el servicio.
  2. Capturar ubicación, tipo y commit sin copiar el valor completo.
  3. Redactar el valor en notas e informes.
  4. Confirmar si el repositorio pertenece al objetivo.
  5. 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.txt

Un 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.yml
find . -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.yml

Revisar:

  • 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/workflows

Comprobar:

  • permissions explícitos y principio de mínimo privilegio.
  • Acciones fijadas a versiones o commits confiables.
  • Uso de pull_request_target y 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.json

Usar --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.json

Mantener 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 100

Los 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/v1 o 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, tenant o environment.
  • 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.json

Registros 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-scripts

Revisar 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.nupkg

Revisar .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.0

Revisar 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/download

Los 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 --all

Revisar 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 | jq

Buscar 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-files

No 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:

EcosistemaRegistro o artefacto
Dart/Flutterpub.dev
SwiftSwift Package Index y Package.swift
CocoaPodsCocoaPods Trunk y .podspec
ElixirHex.pm
ErlangHex.pm
HaskellHackage
C/C++ConanCenter, vcpkg y GitHub Releases
Linuxpaquetes Debian/RPM y repositorios del fabricante
HelmArtifact Hub y charts OCI
TerraformTerraform 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, Maven settings.xml o 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 alcance

Estados recomendados: oficial, personal relacionado, fork, mirror, histórico, tercero, sensible o pendiente de validar.