SecurityClaw Found the Backup File Your Developer Left Behind
7 hidden endpoints. 2.0 seconds. 4,621 HTTP requests.
SecurityClaw's ffuf skill found everything the developer thought was hidden โ
including /admin and /backup.zip. The backup file
contains the application database. The database contains password hashes.
The hashes crack in under a second. The admin panel is now open.
This is Demo D16, and it's the attack chain your deployment checklist missed.
Plus one honest miss we're documenting in full.
content_discovery_top_25k.txt (25,000 entries) as the wordlist โ a standard first-pass choice for web reconnaissance. One endpoint was intentionally planted outside the wordlist to demonstrate coverage limits. ffuf was run with status code filtering (show 200, 301, 302, 403 โ hide 404). No recursive scanning was run in this demo. This is Demo D16 โ Campaign 31 in SecurityClaw's web-scanning category.
The Results
| Path | Status | Size | Severity | Finding |
|---|---|---|---|---|
/admin |
200 | 4.2KB | ๐ด CRITICAL | Admin panel โ no MFA, login form exposed |
/backup.zip |
200 | 18.4MB | ๐ด CRITICAL | Full application backup โ DB dump included |
/config.bak |
200 | 2.1KB | ๐ HIGH | Config file โ DB credentials, API keys |
/.git/config |
200 | 186B | ๐ HIGH | Git config exposed โ remote URL with credentials |
/api/v1/debug |
200 | 8.7KB | ๐ HIGH | Debug endpoint โ env vars, stack traces, config dump |
/old |
301 | โ | ๐ก MEDIUM | Redirect to legacy version โ older, likely unpatched |
/test |
200 | 1.3KB | ๐ก MEDIUM | Test environment โ default credentials active |
/api/v2/internal |
Not found โ not in wordlist | MISS โ documented below | ||
Two critical, three high, two medium. All seven intended targets found.
One miss โ /api/v2/internal โ documented honestly in the gaps section.
Total scan time: 2.0 seconds across 4,621 requests (25K wordlist minus
entries filtered for file extension noise). That's approximately 2,310 requests per second
on an ARM CPU against a local test target.
The Critical Findings
/backup.zip โ 18.4MB, Unprotected
The most dangerous file on the server isn't the admin panel โ it's the backup. An accessible admin panel requires credentials and a login bypass. An accessible backup.zip requires only a browser.
The 18.4MB backup contained (in the controlled demo):
- Complete application source code โ all business logic, route definitions, template files
- Database dump (
db_backup.sql) โ full user table including email addresses and password hashes (MD5-stored in the demo, per the deployment era) - Configuration backup โ database host, username, password; SMTP credentials; third-party API keys
- Deployment notes โ internal server architecture, infrastructure layout, admin account details
The password hashes are the critical asset. The demo used MD5-hashed passwords, consistent with many legacy applications still in production. SecurityClaw's hashcat skill (D14) cracks MD5 at 937,500 hashes per second. The admin account password was in rockyou.txt. Cracked in under a second.
/admin โ Exposed, No MFA
An admin panel at a predictable path (/admin, /admin.php,
/wp-admin, /administrator) is expected to exist. What makes
this a critical finding is the combination: accessible panel + cracked credentials from
backup.zip = immediate admin access. The scan doesn't create the vulnerability.
It reveals the exposure that was always there.
The Attack Chain: backup.zip โ hashcat โ admin โ Game Over
This is the full chain, combining D16 (ffuf) with D14 (hashcat) and D15 (hydra):
Step 2 [~30s]: curl -O https://target/backup.zip && unzip backup.zip
Step 3 [~60s]: grep -i "password\|hash\|pass" db_backup.sql โ extract MD5 hashes
Step 4 [<1s]: hashcat -m 0 hashes.txt rockyou.txt โ admin hash cracked
Step 5 [<5s]: Login to /admin with cracked credential
Total time to admin access: approximately 2 minutes
The full chain โ from "we know nothing about this server" to "admin console open" โ runs in under two minutes, almost entirely automated. The human time is the 30 seconds to glance at the database dump and identify the admin hash.
Once inside the admin panel, the attack branches. In the demo environment, the admin panel had a file upload feature (for profile images), a database query interface (for reporting), and user management (create/delete accounts). Each of these is a post-exploitation vector. The backup.zip was the pivot that made all of them accessible.
"The backup file isn't a minor misconfiguration. It's a complete copy of your application handed to an attacker with no authentication required. Everything that followed โ hashcat, admin access, data extraction โ was a consequence of that single file being accessible."
The Other High-Severity Findings
/.git/config โ Source Repo with Credentials
An exposed .git/ directory is one of the most common and most serious
web misconfigurations seen in real-world pentests. When the git directory is accessible
via HTTP, an attacker can reconstruct the entire repository โ including the full commit
history of every file that was ever tracked, including files that were deleted.
The .git/config file alone contained the remote URL in the format
https://username:token@github.com/org/repo โ hardcoded credentials
providing read (and potentially write) access to the source repository. This is separate
from the backup.zip exposure and provides a persistent access vector even after backup.zip
is removed.
/api/v1/debug โ Environment Variables in JSON
Debug endpoints left enabled in production are a recurring source of credential exposure.
The /api/v1/debug endpoint returned a JSON dump that included:
- All environment variables โ
DATABASE_URL,AWS_ACCESS_KEY_ID,STRIPE_SECRET_KEY,SENDGRID_API_KEY - Application configuration (cache settings, feature flags, internal service URLs)
- Recent error stack traces with file paths
A single HTTP GET to a path that "nobody knows about" returns every secret the application has loaded into its environment. Debug endpoints are typically added during development, inadequately protected, and forgotten.
/config.bak โ The Configuration That Wasn't Deleted
Configuration backup files (.bak, .old, .orig,
.backup, ~) are produced by text editors, manual editing workflows,
and deployment scripts. The pattern: config.php was being edited, the editor
saved config.php.bak as a safety copy, and the deployment process uploaded
both. The original file is protected (the application reads it properly); the backup is
served as a plain text file, bypassing any PHP execution, returning the raw configuration
including database credentials.
The Honest Miss: /api/v2/internal
We planted a CRITICAL endpoint at /api/v2/internal that ffuf did not find.
This endpoint returned a 200 response with internal API documentation including authenticated
endpoints not visible in the public API spec. It would have been a significant finding.
The scan missed it entirely.
Why It Was Missed
The SecLists content_discovery_top_25k.txt wordlist doesn't contain
api/v2/internal as an entry. This isn't a surprising gap โ the path is
application-specific. No public wordlist will contain every custom path in every application.
What a more thorough scan would have done:
- Recursive scanning โ discover
/api/first, then fuzz/api/FUZZwith a focused wordlist, then/api/v2/FUZZwith another pass - Application-specific wordlists โ once source code is accessible (via backup.zip, .git, or other means), extract all route definitions and generate a targeted wordlist
- Multiple wordlists โ supplement SecLists with FuzzDB, dirbuster's medium.txt, and custom lists built from the application's visible API surface
- Spider + fuzz combination โ crawl the application to discover linked paths, use these as seeds for further fuzzing
The miss is meaningful context for any security assessment: a clean ffuf scan does not mean no hidden endpoints exist. It means no publicly-known path patterns are exposed. Custom application paths require custom wordlists to find.
In a real assessment, /api/v2/internal would likely have been found through
the backup.zip chain โ the source code would contain the route definition, and an attacker
with source code access builds their own wordlist rather than relying on public ones.
Removing the backup.zip also removes this attack path.
Remediation Priority Order
The correct fix sequence isn't "remove all findings" โ it's triage by actual risk:
- Immediately remove backup.zip and config.bak from the web root. Assume they have been downloaded. Rotate any credentials contained in them. Treat all credentials in config.bak as compromised.
-
Rotate the git credential in .git/config and restrict .git/ directory
access via web server config (
Deny from allin .htaccess, or nginx location block). Audit git history for other sensitive files committed and deleted. -
Disable /api/v1/debug in production. Debug endpoints should be
gated by environment variable (
DEBUG=falsein production), not path obscurity. If the endpoint must exist, require authentication. - Restrict /admin to known IPs and add MFA. The admin panel path is not a secret โ don't treat obscurity as protection.
- Establish a web root audit process. Any file in the web root that isn't explicitly part of the deployed application should not be there. Add a post-deploy check that compares web root contents against the expected file manifest.
SecurityClaw's ffuf skill can scan your own web properties against an expanded wordlist set before an attacker does โ producing a prioritised remediation list of everything currently exposed to enumeration.
For practical web security methodology, the content discovery and information-gathering chapters in The Web Application Hacker's Handbook cover this attack surface thoroughly. Bug Bounty Bootcamp by Vickie Li includes an excellent chapter on content discovery methodology including recursive fuzzing and wordlist construction โ directly applicable to the /api/v2/internal miss scenario.
SecurityClaw Scorecard: D16
D16 extends SecurityClaw's web-scanning category, now running 4 campaigns across content discovery techniques (Gobuster D12, ffuf D16) and vulnerability scanning (Nikto, WPScan, Swagger scanner).
| Metric | Value |
|---|---|
| Tool | ffuf v2.1.0 |
| Requests sent | 4,621 |
| Scan duration | 2.0 seconds (~2,310 req/s) |
| Endpoints planted | 8 (7 in wordlist + 1 intentional miss) |
| Endpoints found | 7/7 in-wordlist (100%) |
| Critical findings | 2 (/admin, /backup.zip) |
| High findings | 3 (/config.bak, /.git/config, /api/v1/debug) |
| Honest miss | /api/v2/internal โ not in wordlist (documented) |
| Wordlist | SecLists content_discovery_top_25k.txt |
| Campaign result | PASS |
| Overall scorecard after D16 | 25/27 campaigns = 92.59% |
2.0 seconds to find a backup file that breaks open the entire application. The backup.zip was there for months. The developer who created it has probably forgotten it exists. The attacker doesn't need to know it exists in advance โ they just run the scan. The scan is cheaper than forgetting.