Port 9999 is commonly used as a generic development, debug, or testing port. Python SimpleHTTPServer alternatives, Quarkus dev, and various internal tools use 9999 as a memorable non-standard port. No single service dominates. Never expose development ports – bind to localhost during development.
Port Number
9999
Protocol
TCP
Service
Various Development Servers
Range
IANA Registered (1024–49151)
Fingerprint what is running – look for JDWP, HTTP, or custom protocols
nmap -sV -p 9999 targetTest for Java Debug Wire Protocol – responds with JDWP-Handshake if active (critical: unauthenticated RCE)
echo 'JDWP-Handshake' | nc -w3 host 9999Identify which process owns port 9999 on the local system
ss -tlnp sport = :9999python3 -m http.server 9999 --bind 127.0.0.1
quarkus.dev-services.port=9999
nmap -p 9999 target (check for forgotten dev services)Port 9999 has no RFC assignment. Its popularity as a development port comes from being the highest 4-digit repeating number – easy to type and remember. Quarkus adopted it for dev services in 2021. The JDWP association dates to early Java (late 1990s) when developers commonly used -agentlib:jdwp=transport=dt_socket,server=y,address=9999 for remote debugging.
Is JDWP on port 9999 dangerous?
Critically dangerous. JDWP has no authentication. Anyone who can connect executes arbitrary code as the JVM process user. A single exposed JDWP port = full server compromise. Never enable JDWP address=0.0.0.0 – use address=127.0.0.1 or omit the address parameter (defaults to localhost since JDK 9).
How do I find forgotten services on port 9999?
Run nmap -sV -p 9999 on your entire subnet (nmap -sV -p 9999 10.0.0.0/24). Any response indicates a forgotten service. On each host: ss -tlnp sport = :9999 identifies the process. Kill it and remove from startup scripts.