🔄 Exchanger (exchangertool)
Exchanger is a fast, lightweight, and flexible Python CLI utility designed to streamline file transfers, payload delivery, and data exchange between machines.
Whether you are a system administrator moving files or a security professional leveraging LOLBAS/GTFOBins during an engagement, exchangertool provides a seamless way to host, transfer, and exfiltrate your data.
✨ Features
- Quick Setup: Spin up a file exchange server in seconds.
- Cross-Platform Target Support: Serves files to Windows (
certutil,curl,PowerShell,iwr,bitsadmin,net use) and GNU/Linux (wget,curl,bash) targets. - Obfuscation (
-o): PowerShell-Obfuscation-Bible–style and Bashfuscator-style command obfuscation for authorized testing. - Basic Auth (
--auth): Protect downloads/uploads with HTTP Basic authentication. - One-Shot Mode (
--one-shot): Server exits after completing a single transfer. - Push Mode (
push): Actively push a file to a listening target. - Base64 Encoding (
--encode base64): Auto-encode on push, auto-decode on receive. - Clipboard Copy (
-c): Auto-copy first target command to clipboard. - QR Code (
-q): Display download URL as a QR code for air-gapped transfers. - Checksum Verification: SHA256 verification commands printed alongside downloads.
- DNS Exfil Commands: Ready-to-use DNS exfiltration stagers for Linux and Windows.
- Chunked Transfer Commands: Split large files into chunks for size-limit evasion.
- WebDAV Commands: Windows
net use/copycommands via WebDAV. - Proxy Support (
--proxy): Generate proxy-aware target commands (SOCKS5/HTTP). - Request Logging (
--log): Log all requests to a file (timestamp, IP, method, path, user-agent). - Auto-Rename: Uploads never overwrite — collisions auto-rename to
file.1,file.2, etc. - SMB Serve (
--protocol smb): Serve files over SMB using impacket (optional). - Standalone CLI: Runs smoothly from any terminal.
- Isolated Installation: Compatible with
pipx.
📦 Installation
pipx install exchangertool
Optional extras
# QR code support
pipx install exchangertool[qr]
# SMB support (requires impacket)
pipx install exchangertool[smb]
# Everything
pipx install exchangertool[all]
Using with sudo
pipx installs to your user directory (e.g. ~/.local/bin). For root:
# Option 1: Full path
sudo "$(which exchanger)" serve --port 80
# Option 2: System-wide install
sudo pip install exchangertool
# Option 3: Allow low ports without sudo (Linux)
sudo setcap 'cap_net_bind_service=+ep' "$(which exchanger)"
🚀 Usage
Serve (default)
exchanger # serve current directory on port 80
exchanger serve -d /payloads -p 8080 # serve specific dir on custom port
exchanger serve --auth admin:s3cret # require authentication
exchanger serve --one-shot # exit after first download
exchanger serve -o # obfuscated commands to stdout
exchanger serve -c # copy first command to clipboard
exchanger serve -q # show QR code of download URL
exchanger serve --proxy socks5://127.0.0.1:1080 # proxy-aware commands
exchanger serve --log requests.log # log all requests
Receive (listen for uploads)
exchanger receive # listen for target to POST files
exchanger receive --encode base64 # auto-decode base64 uploads
exchanger receive --one-shot # exit after first upload
exchanger receive --auth user:pass # require auth for uploads
Push (send to target)
exchanger push payload.bin 10.0.0.1:8080 # push file to target
exchanger push payload.bin 10.0.0.1:8080 --encode base64 # base64-encode
SMB (optional)
exchanger serve --protocol smb -d /share -p 445
exchanger serve --protocol smb --auth admin:pass
🛠️ Help menu
usage: exchanger [-h] {serve,receive,push} ...
Serve files or listen to receive (target POSTs to host). Default port 80.
positional arguments:
{serve,receive,push} command (default: serve)
serve serve current directory; others can send/receive
receive listen for target to POST file to you
push push a file to a listening target
common options (serve/receive):
--protocol {http,smb} protocol (default: http)
-p, --port PORT port (default: 80)
-d, --dir DIR directory to serve/save (default: .)
--bind ADDR address to bind (default: 0.0.0.0)
-o, --obfuscate obfuscated commands to stdout
--one-shot exit after first transfer
--auth USER:PASS HTTP Basic auth
--log FILE log requests to file
--proxy PROXY_URL proxy for target commands
-c, --clipboard copy first command to clipboard
-q, --qr show QR code of download URL
receive-only:
--encode base64 decode uploads on the server
push:
exchanger push FILE TARGET [--encode base64]
📋 Generated Target Commands
When you start the server, exchanger prints ready-to-paste commands organized by platform:
| Category | Linux (GTFOBins) | Windows (LOLBAS) |
|---|---|---|
| Download | curl, wget, /dev/tcp |
curl, wget, certutil, iwr, bitsadmin |
| Download LOLBins | python3, perl, ruby, php, nc, socat, openssl, lwp-download, tftp |
DownloadFile, Start-BitsTransfer, mshta, regsvr32, msiexec, hh.exe, esentutl, expand, findstr, replace, cscript |
| In-Memory | curl | bash, wget | bash |
iwr | iex, WebClient.DownloadString |
| In-Memory LOLBins | python exec(), perl eval(), ruby eval(), php eval() |
mshta vbscript, rundll32 javascript, powershell -enc, cscript //e:jscript, Reflection.Assembly.Load |
| Upload | curl -X POST |
curl -X POST |
| Upload LOLBins | nc, python requests, openssl s_client, socat, bash /dev/tcp |
WebClient.UploadFile, WebClient.UploadData, iwr -Method POST |
| Checksum | sha256sum |
Get-FileHash |
| DNS Exfil | xxd | nslookup, base64 | dig |
PowerShell + nslookup |
| Chunked | split + curl loop |
PowerShell byte chunking |
| WebDAV | — | net use, copy |
All commands respect --auth, --proxy, and -o (obfuscation) flags.
🔒 Obfuscation Techniques (-o)
When -o is passed, all target commands are obfuscated and written to stdout (for piping/redirection).
PowerShell obfuscation:
- Quote interruption (
i''ex,i""wr) - Random case (
iNvOkE-wEbReQuEsT) - Backtick insertion (
i`e`x) - Format string iex (
("{0}{1}{2}" -f 'i','e','x')) - Get-Command wildcard (
& (gcm i*e*-E*n)) -EncodedCommand(base64 UTF-16LE full command wrap)[scriptblock]::Create()wrappingSet-Aliasfor cmdlet renaming- URL string concatenation and base64 encoding
$True/$Falseboolean substitution- WebClient variable name randomization
Bash obfuscation:
- Base64 wrap (
echo ... | base64 -d | bash,eval $(...),source <(...)) - Variable expansion (
_var=curl; $_var ...) - Double variable indirection (
a=curl; b=a; ${!b} ...) - Hex command names (
$'\x63\x75\x72\x6c') - Printf command names (
$(printf '\x63\x75\x72\x6c')) - Reverse pipe (
echo '...reversed...' | rev | bash) - IFS substitution (
curl${IFS}-s${IFS}http://...) - Quote tricks (
cu''rl,wg''et)
🧪 Testing
CI runs the test suite on Python 3.10–3.13 with mypy type checking on every push/PR.
pip install -e ".[dev]"
pytest tests/ -v
mypy exchanger/ --ignore-missing-imports
Coverage report: pytest tests/ --cov=exchanger --cov-report=term-missing
🤝 Contributing
Contributions, bug reports, and feature requests are always welcome! Feel free to check out the issues page.
📝 License
This project is licensed under the MIT License.
Metadata
Release files for exchangertool 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| exchangertool-0.3.0.tar.gz | 35.0 kB | With provenance | Details for exchangertool-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| exchangertool-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for exchangertool-0.3.0-py3-none-any.whl |
Total release size: 61.1 kB
Release files / exchangertool-0.3.0.tar.gz
| Download URL | exchangertool-0.3.0.tar.gz |
|---|---|
| Size | 35.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
72d2590d654fc92800bdc27d110cf39b0a98a7cbb570afb83ba869f2f06a8be1
|
|
BLAKE2b-256 checksum How to use checksums |
150a144f5092eaf25119e2891f072d5de932572cadacebd7f31e9fe27cccfcd9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Mar 23, 2026.
Transparency logRelease files / exchangertool-0.3.0-py3-none-any.whl
| Download URL | exchangertool-0.3.0-py3-none-any.whl |
|---|---|
| Size | 26.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d09ed1b8118ec641dee8ff4161336bc67301fa43ba43681bbcf4548845031bcd
|
|
BLAKE2b-256 checksum How to use checksums |
6dedf8c70d02badf48e0c2bb9bab28ef5743797ac5123fd0418e7cc7326b3022
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Mar 23, 2026.
Transparency logSecurity for exchangertool 0.3.0
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.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for exchangertool-0.3.0.tar.gz
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 Mar 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.