A self-hosted web-security range, leveled tutorial-to-impossible — the practice town for wraith and hickok.
Project description
deadwood
A self-hosted web-security range that doubles as a tutorial — graded levels from the first trivial injection to the deliberately near-impossible. It's the practice town for the dead man's hand: scout each room with wraith, take it with hickok, capture the flag, then read the vulnerable source and the fix.
Dependency-free (stdlib + SQLite). Runs on 127.0.0.1 only.
⚠️ deadwood is intentionally vulnerable, by design. It refuses to bind anything but loopback unless you force it. Never expose it to a network, a VM bridge, or the internet. Attack only this app, on your own machine.
Install
pipx install deadwood-sec # gives you the `deadwood` command
Or from a clone: pip install -e . — or run it with no install:
PYTHONPATH=src python3 -m deadwood.
Run it
deadwood serve # http://127.0.0.1:8666 (the town map)
deadwood levels # list the rooms and your progress
deadwood learn first-blood # a level's briefing: objective, hints, source, the fix
deadwood flag first-blood 'DEADWOOD{...}' # submit a captured flag
Open the map in a browser, pick a room, and point your tools at the app URL it
gives you (e.g. http://127.0.0.1:8666/l/first-blood/app?id=1).
How a level works
Every room is the same shape, easy to the hard:
- a realistic app (the fictional Deadwood Telegraph & Trust Co. — employees, customers, accounts, telegrams) with one real flaw;
- a flag to capture (
DEADWOOD{...}, unique to your install); - progressive hints — reveal them one at a time, only if you want them;
- the vulnerable source and how to fix it, once you ask (spoilers).
Play blind for the CTF, or lean on the hints and learn for the tutorial. Your
captures are tracked locally.
The levels
Tutorial → impossible. Each maps to a technique you can practise by hand or drive with hickok/wraith:
| # | Room | Tier | Vector |
|---|---|---|---|
| 1 | First Blood | Tutorial | SQL injection — UNION (in-band) |
| 2 | Whispers | Easy | SQL injection — boolean-blind |
| 3 | The Telegraph | Medium | SQL injection — time-based blind |
| 4 | Back Door | Medium | OS command injection → shell |
| 5 | The Bouncer | Medium | SQL injection — authentication bypass |
| 6 | Sleight of Hand | Hard | UNION behind a quote/catalog filter |
| 7 | The Cipher | Hard | Server-side template injection → RCE |
| 8 | Dead Man's Hand | Brutal | Blind injection behind a WAF denylist |
| 9 | The Vault | Impossible | Second-order (stored) SQL injection |
Pairing with wraith & hickok
deadwood is the range the tools grew up on. A typical run:
deadwood serve & # the town
hickok sql -u 'http://127.0.0.1:8666/l/first-blood/app?id=1' -p id --dump secrets
When a tool can't take a room, that's a bug to fix in the tool; when a room is too easy, that's a room to harden. They sharpen each other.
Tests
pip install -e ".[dev]" && pytest
The suite checks the engine (flags, registry, per-level isolation, the seeded world) and that each level's flaw behaves as taught. See CONTRIBUTING.md to add a room and SECURITY.md for the responsible-use policy.
License
MIT.
Deadwood, 1876 — where the dead man's hand was dealt.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file deadwood_sec-0.3.4.tar.gz.
File metadata
- Download URL: deadwood_sec-0.3.4.tar.gz
- Upload date:
- Size: 29.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
813dbc79bff3305bc8a892f9475535133c77d206833296a60e560e8c348a32a9
|
|
| MD5 |
7158ddf614c8e77ea4c0bc00cfc0b4a5
|
|
| BLAKE2b-256 |
8e007c7eb8802ed0576673db45fd199488f287d9c97b196fadd211cfe9f43287
|
Provenance
The following attestation bundles were made for deadwood_sec-0.3.4.tar.gz:
Publisher:
release.yml on gusta-ve/deadwood
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
deadwood_sec-0.3.4.tar.gz -
Subject digest:
813dbc79bff3305bc8a892f9475535133c77d206833296a60e560e8c348a32a9 - Sigstore transparency entry: 1845055483
- Sigstore integration time:
-
Permalink:
gusta-ve/deadwood@7c7b98843e91d7a57240e629c475bbd194905ae2 -
Branch / Tag:
refs/tags/v0.3.4 - Owner: https://github.com/gusta-ve
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7c7b98843e91d7a57240e629c475bbd194905ae2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file deadwood_sec-0.3.4-py3-none-any.whl.
File metadata
- Download URL: deadwood_sec-0.3.4-py3-none-any.whl
- Upload date:
- Size: 35.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
558d6c35b8079aaa74399c3d747889d6b63f147eb57c07ccf5c1387bd6a75fbe
|
|
| MD5 |
ea380cbc5ef53e0f745e8a3d07e53e1c
|
|
| BLAKE2b-256 |
474ab7c15f09e91df8e26b35b7b47490ad2f2441d997c9b179cb211b15e1638d
|
Provenance
The following attestation bundles were made for deadwood_sec-0.3.4-py3-none-any.whl:
Publisher:
release.yml on gusta-ve/deadwood
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
deadwood_sec-0.3.4-py3-none-any.whl -
Subject digest:
558d6c35b8079aaa74399c3d747889d6b63f147eb57c07ccf5c1387bd6a75fbe - Sigstore transparency entry: 1845055565
- Sigstore integration time:
-
Permalink:
gusta-ve/deadwood@7c7b98843e91d7a57240e629c475bbd194905ae2 -
Branch / Tag:
refs/tags/v0.3.4 - Owner: https://github.com/gusta-ve
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7c7b98843e91d7a57240e629c475bbd194905ae2 -
Trigger Event:
push
-
Statement type: