logo

Port 8001 – VCOM-Tunnel / Alt-HTTP (kubectl proxy, Dev & API Servers)

Service:

kubectl proxy (Kubernetes API)Node.js/Express dev serversalt-HTTP web apps and admin UIs; IANA vcom-tunnel

Protocol:

TCP

Port:

8001

Used for:

Alternative HTTP for web apps and APIs beside port 8000 — most notably the local Kubernetes API proxy (kubectl proxy), Node.js/Express dev servers, and internal admin interfaces; IANA registers it as vcom-tunnel

Port 8001 is registered with IANA under the name vcom-tunnel, but in the real world you will almost never meet an actual VCOM tunnel on it — an open port 8001 is nearly always a web or API service. It is the web world’s “next port after 8000”: developers reach for it when 8000 or 8080 is already taken, so it commonly carries a secondary web app, a Node.js/Express dev server, a REST API, or an internal admin UI. Its single most dangerous default occupant is kubectl proxy, which serves the Kubernetes API on 127.0.0.1:8001 — harmless on loopback, but a full-cluster takeover if it is ever bound to 0.0.0.0. Because so many unrelated things answer here, the first job on an open port 8001 isn’t to attack a known protocol — it’s to identify what is actually listening, then test it as that service.

Why It’s Open

Port 8001 is open because a web or API service chose it — the IANA “vcom-tunnel” registration is a historical formality you can effectively ignore when you see 8001 answering on the internet. The occupants worth knowing:

  • kubectl proxy — the Kubernetes API proxy. Running kubectl proxy starts a local HTTP server that forwards requests to the cluster’s API server, injecting your kubeconfig credentials automatically. Its default is Starting to serve on 127.0.0.1:8001 — bound to loopback, it’s a developer convenience. The danger is the flags that override that default (--address='0.0.0.0' --accept-hosts='.*'), which turn 8001 into an unauthenticated gateway to the entire Kubernetes control plane.
  • Node.js / Express dev servers. 8001 is a routine pick for a second Node/Express service, an API backend, or a webpack/Vite auxiliary server when 8000 or 3000 is busy.
  • Secondary web apps and APIs beside 8000. A stack that already runs something on 8000 (Django, FastAPI, a reverse proxy) frequently parks a second app, microservice, or REST/GraphQL API on 8001.
  • Admin and management UIs. Internal dashboards and administrative consoles are routinely published on “non-standard” high ports like 8001 to keep them off 80/443.

On a laptop, an open 8001 is usually a dev server or a kubectl proxy bound to 127.0.0.1. On a cloud VM, container, or CI runner with a permissive security group, that same service can be sitting on the public internet — which is where the risk starts.

Common Risks

  • Exposed kubectl proxy → full Kubernetes cluster takeover. If kubectl proxy is bound to 0.0.0.0:8001, anyone who can reach the port talks to the API server with the operator’s credentials already attached — no authentication of their own required. That means reading every Secret (cloud keys, database passwords, service-account tokens), creating privileged/host-mounting pods, and pivoting from a pod to the underlying node. It is one of the most severe misconfigurations in a Kubernetes environment.
  • Unauthenticated admin and API endpoints. Admin UIs and internal APIs shipped on 8001 are often deployed with no login, weak default credentials, or debug endpoints left enabled.
  • Exposed development servers. Node/Express and other dev servers on 8001 ship without hardening — no TLS, no rate limiting, verbose errors — and are meant for localhost, not the public internet.
  • Information disclosure. Server headers, stack traces, API schemas (/openapi.json, /swagger), and version banners on 8001 hand an attacker exactly the fingerprint they need to pick an exploit.
  • No TLS. Services on 8001 almost always speak plaintext HTTP, so credentials, session tokens, and API keys cross the wire in the clear.
  • Web application vulnerabilities. Whatever framework answers on 8001 carries its own bug class — injection, auth bypass, deserialization — that you test as that specific stack.

Want to save time on reporting?

Let PentestPad generate, track, and export your reports - automatically.

logo-cta

Enumeration & Testing

The whole game on 8001 is identifying the service before you test it. Confirm it’s HTTP, fingerprint the stack, and specifically check whether you’re looking at a Kubernetes API proxy.

Confirm the port and detect the service

Terminal window
nmap -sV -p 8001 <target>

Read the HTTP headers and status

Terminal window
curl -sI http://<target>:8001/

The Server header names the stack: Server: Werkzeug/gunicorn/uvicorn for a Python app, an Express app often leaks X-Powered-By: Express, and a bare, header-light HTTP server that answers JSON on API paths is a strong hint you’re in front of a Kubernetes API proxy.

Fingerprint a Kubernetes API (the high-value case)

Terminal window
curl -s http://<target>:8001/version
curl -s http://<target>:8001/api

/version returning JSON with gitVersion, major, and minor fields, and /api returning an APIVersions list, are the signature of an exposed Kubernetes API server (via kubectl proxy or a misconfigured apiserver). If those respond without credentials, escalate to enumerating cluster objects:

Terminal window
curl -s http://<target>:8001/api/v1/namespaces
curl -s http://<target>:8001/api/v1/pods
curl -s http://<target>:8001/api/v1/namespaces/kube-system/secrets

A secrets list returned here means unauthenticated access to every credential in the cluster. kube-hunter (Aqua Security) automates this class of check against a remote host:

Terminal window
kube-hunter --remote <target>

Fingerprint and enumerate a generic web app / API

Terminal window
whatweb http://<target>:8001/
gobuster dir -u http://<target>:8001/ -w /usr/share/wordlists/dirb/common.txt

Look for /api, /docs, /openapi.json, /swagger, /admin, and /debug.

Log every open port 8001, the exact service you fingerprinted, and any unauthenticated Kubernetes API, admin route, or exposed endpoint straight into the pentest report instead of a scratch terminal you’ll lose.

What to Look For

Checkpoint What it means
/version returns JSON with gitVersion/major/minor A Kubernetes API server is reachable — likely an exposed kubectl proxy
/api/v1/... answers without credentials Unauthenticated Kubernetes API — read Secrets, create pods, take the cluster
X-Powered-By: Express or a Node banner A Node.js/Express dev or API server — test that stack
Other Server: header (Werkzeug, gunicorn, nginx) A generic web app/API on an alt-HTTP port — fingerprint and test as that app
Admin/login page with default or no credentials Management console takeover
/docs, /openapi.json, /swagger reachable API schema exposed — map every endpoint
Plaintext HTTP only (no TLS) Credentials and tokens sniffable on the wire
Reachable from the internet A localhost-intended dev server or proxy exposed beyond its scope

Known CVEs and Exploits

There is no generic “port 8001” CVE — 8001 is just an alt-HTTP port number, and the flaws that matter belong to whatever software is listening. The single biggest risk on this port is not a CVE at all but a design/misconfiguration issue: an exposed kubectl proxy (or an API server with anonymous auth enabled) bound to 0.0.0.0:8001 gives unauthenticated access to the Kubernetes control plane. No exploit code is needed — a curl to /api/v1/.../secrets is the whole attack. The honest first step on any open 8001 is to fingerprint the exact service and version, then check that product’s advisories.

The previous version of this page listed three CVEs as “port 8001” vulnerabilities. All three were mislabeled — they are widely-known bugs in Java software that does not default to port 8001 — and have been removed. CVE-2021-44228 is the Apache Log4j2 (“Log4Shell”) remote code execution flaw in a logging library, not a service tied to any port. CVE-2020-9484 is an Apache Tomcat session-deserialization RCE, and Tomcat defaults to 8080/8005, not 8001. CVE-2018-1000861 is a Jenkins Stapler RCE, and Jenkins defaults to 8080. Any of these could theoretically be reached if that product happened to be bound to 8001, but none is a “port 8001” vulnerability — always verify a CVE against its NVD record and scope it to the actual service and version before trusting it.

Mitigation

  • Never expose kubectl proxy beyond loopback. Leave it on its 127.0.0.1:8001 default; never pass --address='0.0.0.0' with a permissive --accept-hosts. If remote API access is genuinely needed, front the API server with proper authentication and RBAC rather than a wide-open proxy.
  • Lock down the Kubernetes API server itself. Disable anonymous auth (--anonymous-auth=false), enforce RBAC, and firewall the API server so only the control-plane and authorised operators can reach it. Remember it has neighbours — the etcd datastore on 2379, the kubelet API on 10250, and the Docker Engine API on 2375 — each a full-cluster or host compromise on its own if left exposed.
  • Identify the real service first. You can’t secure “port 8001” generically — fingerprint whether it’s a Kubernetes proxy, a Node/Express app, or another web stack, then harden that specific thing.
  • Bind dev servers to localhost, not 0.0.0.0. Keep Node/Express and other development servers on 127.0.0.1; if remote access is required, put them behind a reverse proxy that adds authentication and TLS on 443 or 8443.
  • Require auth on every API and admin route, disable verbose/debug error output on anything internet-facing, and gate API docs (/docs, /openapi.json) behind authentication.
  • Firewall 8001 to the clients that actually need it, and audit cloud security groups and container port mappings for an accidental 0.0.0.0:8001. The sibling alt-HTTP ports 8000, 8080, and 8443 deserve the same review, and confirmed findings belong in your pentest report.

Real-World Example

The canonical port-8001 incident is an exposed kubectl proxy. A developer runs kubectl proxy to poke at a cluster from a browser, then — needing to reach it from another machine or from inside a container — restarts it as kubectl proxy --address='0.0.0.0' --accept-hosts='.*' --port=8001. That one change strips away the only thing protecting the API: the loopback binding. The proxy still attaches the operator’s full-admin kubeconfig credentials to every request, so anyone who can reach <host>:8001 is now an unauthenticated cluster admin. A single curl http://<host>:8001/api/v1/namespaces/kube-system/secrets dumps every Secret in the cluster — cloud provider keys, database passwords, and service-account tokens — and a follow-up POST to /api/v1/namespaces/default/pods can schedule a privileged, host-mounting pod that reads the node’s filesystem and escapes to the underlying host.

This is not hypothetical: internet-exposed, unauthenticated Kubernetes control planes are a well-documented attack class. The 2018 Tesla cloud breach, disclosed by RedLock, began with an exposed Kubernetes administrative console left open without password protection; attackers walked in, found AWS credentials inside, and ran a cryptomining operation on Tesla’s infrastructure. The mechanism there was the Kubernetes dashboard rather than a proxy on 8001 specifically, but the lesson is identical — an unauthenticated door into the Kubernetes control plane, whatever port it happens to sit on, is a full-environment compromise. On 8001, that door is most often an over-permissive kubectl proxy.

FAQ

What is port 8001 used for?

IANA registers port 8001 under the name “vcom-tunnel,” but in practice an open 8001 is almost always a web or API service, not a VCOM tunnel. It’s the common “next port after 8000” — used for secondary web apps, Node.js/Express dev servers, REST/GraphQL APIs, and internal admin UIs. Its most notable default occupant is kubectl proxy, which serves the Kubernetes API on 127.0.0.1:8001.

Why is port 8001 open on my computer?

Usually because a web or API server is running. On a developer machine it’s frequently kubectl proxy (a local proxy to a Kubernetes cluster) or a Node/Express dev server that picked 8001 because 8000 or 3000 was busy. It’s normally meant to be reachable only from your own machine (127.0.0.1) — if it’s bound to 0.0.0.0 and your firewall allows it, it may be exposed to the whole network.

Is an exposed kubectl proxy on 8001 dangerous?

Extremely. kubectl proxy forwards requests to the Kubernetes API server with your credentials already attached. Bound to loopback it’s safe, but bound to 0.0.0.0:8001 (via --address and a permissive --accept-hosts) it becomes an unauthenticated gateway to the entire cluster — anyone who reaches the port can read all Secrets, create privileged pods, and take over the nodes. Never expose it beyond 127.0.0.1.

Does port 8001 run VCOM tunnel software?

Rarely, if ever, on real-world internet hosts. “vcom-tunnel” is the name IANA assigned to the port, but the registration is largely historical. When you find 8001 open during a pentest, assume it’s a web/API service and fingerprint it — treat the VCOM label as a footnote, not a conclusion.

How do I find out what’s running on my port 8001?

Fingerprint it: curl -sI http://<host>:8001/ to read the Server header, nmap -sV -p 8001 <host> for a version scan, and whatweb http://<host>:8001/ to identify the stack. Critically, test curl -s http://<host>:8001/version — JSON with gitVersion/major/minor fields means a Kubernetes API is exposed and needs immediate attention.

How do I secure or close port 8001?

Identify the real service first. If it’s kubectl proxy, keep it on 127.0.0.1 and never bind 0.0.0.0; lock down the API server with RBAC and --anonymous-auth=false. If it’s a dev or admin app, bind it to localhost or put it behind a reverse proxy with authentication and TLS, require auth on all routes, and disable debug output. Firewall 8001 to the clients that need it, and if nothing needs it, stop the service and confirm with nmap -p 8001 <host>.

TL;DR

  • Service: no single standard — an alt-HTTP / API port (IANA “vcom-tunnel” in name only). Most notably kubectl proxy (Kubernetes API on 127.0.0.1:8001), Node.js/Express dev servers, secondary web apps beside 8000, and admin UIs
  • Default port: 8001/TCP (plaintext HTTP; sibling alt-HTTP ports 8000, 8080, 8443)
  • Biggest risk: an exposed kubectl proxy bound to 0.0.0.0:8001 — an unauthenticated gateway to the Kubernetes control plane that leaks every Secret and allows full cluster takeover. It’s a misconfiguration, not a CVE
  • Mitigation: keep kubectl proxy on loopback, lock down the API server with RBAC and no anonymous auth, bind dev/admin apps to localhost or a reverse proxy with auth and TLS, and firewall 8001 to the clients that need it