The unglamorous truth about footholds
If you remember one thing about how attackers actually get in, make it this: the vast majority of breaches exploit vulnerabilities that already had a patch available. Not a secret flaw the vendor never knew about, but a documented weakness with a published fix — one the target organization simply never applied. The exotic zero-day exists, but it is rare, expensive, and hoarded for high-value targets. The everyday foothold is a forgotten server running software that went out of date and stayed that way.
This reframes the whole task. You are not usually inventing an exploit; you are recognizing one. A version banner says a service is three years behind. Three years is a long time in security — long enough for someone to have found a serious flaw, for the vendor to have shipped a fix, and for a reliable public exploit to exist. Your work is to connect those dots faster than the defender patched, which, on an unpatched box, they never did.
The repeatable pattern
Attacking an unpatched service is not improvisation — it is a loop you run over and over until something lands. The same four steps apply whether the target is a web server, a file share, a database, or a mail daemon. Master the loop once and every new service is just another pass through it.
- Enumerate the exact version. This comes straight out of the scanning phase — a service banner, an HTTP header, an SMB dialect, a login splash that gives away "Apache 2.4.49" or "vsftpd 2.3.4." Precision matters: a vulnerability that affects 2.4.49 may not touch 2.4.50, so the version string is the whole game.
- Look up known CVEs for it. Take that exact product and version to a vulnerability database — the CVE list, the vendor's advisories, or a search engine. You are asking one question: what is publicly known to be broken in this version?
- Find an exploit. A documented vulnerability is not yet a working attack. Search for a ready-made implementation: a Metasploit module, a proof-of-concept on Exploit-DB, or published exploit code. If a reliable one exists, most of your work is already done.
- Validate and run. Confirm the target really is the affected version, read what the exploit actually does before you fire it, set your options, and run it in scope. Then verify the result — a shell, a leaked secret, a crashed service — and document exactly what happened.
That is the entire method. Enumerate → look up → find → validate and run. The skill is not memorizing exploits; it is running this loop quickly, accurately, and without breaking things you were not authorized to break.
Famous worked examples
A handful of vulnerabilities show up again and again because they were widespread, devastating, and well documented — which is exactly why they are studied. Each one is a textbook case of the loop above: a specific service, a known flaw, a public exploit. Knowing them by name lets you recognize the shape of the next one.
| Vulnerability | Service | Why it matters |
|---|---|---|
| EternalBlue · MS17-010 | SMBv1 | A flaw in the SMBv1 file-sharing protocol allowed remote code execution with no credentials, and it powered the global WannaCry ransomware outbreak that hit hundreds of thousands of unpatched Windows machines. |
| Log4Shell · CVE-2021-44228 | Log4j | A logging library used everywhere could be tricked into fetching and executing attacker-controlled code through a crafted JNDI lookup, turning a simple log message into remote code execution across countless Java applications. |
| Path traversal & RCE · CVE-2021-41773 | Apache HTTP Server | A botched fix in Apache 2.4.49 let an attacker walk outside the web root and, on some configurations, read sensitive files or achieve remote code execution with a single crafted request. |
| Backdoored release | vsftpd 2.3.4 | A tampered copy of the vsftpd FTP server shipped with a hidden backdoor that opened a root shell when a username ending in a smiley was supplied — a stark lesson in supply-chain trust and running outdated software. |
| Heartbleed · CVE-2014-0160 | OpenSSL | A missing bounds check in OpenSSL's TLS heartbeat let an attacker read chunks of server memory — including private keys, session tokens, and passwords — without leaving a trace, exposing huge swaths of the encrypted web. |
These are presented for understanding and defense, not as a checklist to point at strangers. The pattern is the lesson: a known flaw in an unpatched service, an exploit anyone can find, and an organization that simply never updated. Internalize that shape and you will spot the next "famous" vulnerability while it is still fresh.
Why unpatched services persist
It is tempting to assume that anyone running years-old vulnerable software is simply careless. Sometimes they are — but more often the unpatched service is the result of real, rational constraints that defenders live with every day. Understanding why patches do not get applied tells you where to look, and tells you what a good remediation actually has to overcome.
- Legacy systems that can't be touched. An old application may depend on a specific, vulnerable component, and updating it breaks the thing the business actually runs on. So the box stays as-is, frozen in time.
- Change-freeze fear of breaking production. Patching a live, revenue-generating system carries risk. When the cost of an outage feels more certain than the cost of a breach, the patch gets deferred — sometimes indefinitely.
- Missing asset inventory. You cannot patch a server you have forgotten you own. Shadow IT, old test boxes, and acquired infrastructure quietly run vulnerable services that no one is tracking.
- End-of-life software. Some products no longer receive patches at all because the vendor stopped supporting them. The vulnerability is permanent, and the only real fix is to replace the system — which costs money and time the organization may not have spent.
Every one of these is why the low-hanging fruit from earlier exists in the first place. The forgotten box, the frozen legacy app, the end-of-life appliance — these are the easy wins both attackers and testers find first, precisely because the organization had a reason, good or bad, to leave them alone.
The defensive flip
Knowing how this attack works is only half the value — the other half is knowing how to shut it down. Because the root cause is so consistent (a known flaw left unpatched), the defenses are well understood. They are not glamorous, but they are exactly what closes the easy path you just learned to walk.
- Patch and vulnerability management. A real program that finds what is out of date, prioritizes by risk, and ships fixes on a schedule. This is the direct counter: if the patch is applied, the public exploit simply does not work.
- Accurate asset inventory. You can only manage what you can see. Knowing every host and the version of every service it runs turns "we think we patched everything" into something you can actually verify.
- Network segmentation. Assume one box will eventually fall and design so it does not take the whole network with it. Segmentation limits the blast radius, so a single compromised service becomes a contained incident rather than a foothold into everything.
- Compensating controls. When patching truly is not possible — a frozen legacy app, an end-of-life system — you wrap the service in protection it cannot get from a patch: virtual patching, a web application firewall, or an intrusion prevention system that blocks the known exploit at the network edge.
The throughline of this lesson is that the most common way in is also the most preventable. An attacker matches a version to a CVE to an exploit; a defender breaks that chain at any link. Once a service is compromised, though, the exploit is only the entry — what runs after the door opens is the next question. That is where we turn next: the payloads that ride in on an exploit, and the encoders that help them survive the trip.