Description & Purpose

This shell is the ultimate WinRM shell for hacking/pentesting.

WinRM (Windows Remote Management) is the Microsoft implementation of WS-Management Protocol. A standard SOAP based protocol that allows hardware and operating systems from different vendors to interoperate. Microsoft included it in their Operating Systems in order to make life easier to system administrators.

This program can be used on any Microsoft Windows Servers with this feature enabled (usually at port 5985), of course only if you have credentials and permissions to use it. So we can say that it could be used in a post-exploitation hacking/pentesting phase. The purpose of this program is to provide nice and easy-to-use features for hacking. It can be used with legitimate purposes by system administrators as well but the most of its features are focused on hacking/pentesting stuff.


  • Load in memory Powershell scripts
  • Load in memory dll files bypassing some AVs
  • Load in memory C# (C Sharp) assemblies bypassing some AVs
  • Load x64 payloads generated with awesome donut technique
  • AMSI Bypass
  • Pass-the-hash support
  • Kerberos auth support
  • SSL and certificates support
  • Upload and download files
  • List remote machine services without privileges
  • Command History
  • WinRM command completion
  • Local files completion
  • Colorization on output messages (can be disabled optionally)
  • Docker support (prebuilt images available at Dockerhub)


Usage: evil-winrm -i IP -u USER [-s SCRIPTS_PATH] [-e EXES_PATH] [-P PORT] [-p PASS] [-H HASH] [-U URL] 
-S, --ssl                      Enable ssl 
-c, --pub-key                  PUBLIC_KEY_PATH Local path to public key certificate 
-k, --priv-key                 PRIVATE_KEY_PATH Local path to private key certificate 
-r, --realm                    DOMAIN Kerberos auth, it has to be set also in /etc/krb5.conf file using this format -> CONTOSO.COM = { kdc = } 
-s, --scripts                  PS_SCRIPTS_PATH Powershell scripts local path 
-e, --executables              EXES_PATH C# executables local path 
-i, --ip IP                    Remote host IP or hostname (required) 
-U, --url URL                  Remote url endpoint (default wsman) 
-u, --user                     USER Username (required if not using kerberos) 
-p, --password PASS            Password 
-H, --hash NTHash              NTHash 
-P, --port PORT                Remote host port (default 5985) 
-V, --version                  Show version 
-h, --help                     Display this help message


Ruby 2.3 or higher is needed. Some ruby gems are needed as well: winrm >=2.3.2, winrm-fs >=1.3.2, stringio >=0.0.2 and colorize >=0.8.1. Depending of your installation method (3 availables) the installation of them could be required to be done manually.

Another important requirement only used for Kerberos auth is to install the Kerberos package used for network authentication. For some Linux like Debian based (Kali, Parrot, etc.) it is called krb5-user. For BlackArch it is called krb5 and probably it could be called in a different way for other Linux distributions.

Load powershell scripts

  • To load a ps1 file you just have to type the name (auto-completion usnig tab allowed). The scripts must be in the path set at -s argument. Type menu again and see the loaded functions. Very large files can take a long time to be loaded.

Advanced commands

  • Invoke-Binary: allows exes compiled from c# to be executed in memory. The name can be auto-completed using tab key and allows up to 3 parameters. The executables must be in the path set at -e argument.

  • l04d3r-LoadDll: allows loading dll libraries in memory, it is equivalent to: [Reflection.Assembly]::Load([IO.File]::ReadAllBytes("pwn.dll"))

The dll file can be hosted by smb, http or locally. Once it is loaded type menu, then it is possible to autocomplete all functions.

  • Donut-Loader: allows to inject x64 payloads generated with awesome donut technique. No need to encode the payload.bin, just generate and inject!

You can use this donut-maker to generate the payload.bin if you don’t use Windows. This script use a python module written by Marcello Salvati (byt3bl33d3r). It could be installed using pip:

pip3 install donut-shellcode

  • Bypass-4MSI: patchs AMSI protection.


  • First you have to sync date with the DC: rdate -n <dc_ip>
  • To generate ticket there are many ways:
    • Using from -dc-ip <dc_ip> -nthash <krbtgt_nthash> -domain-sid <domain_sid> -domain <domain_name> <user>
    • If you get a kirbi ticket using Rubeus or Mimikatz you have to convert to ccache using ticket.kirbi ticket.ccache
  • Add ccache ticket. There are 2 ways:export KRB5CCNAME=/foo/var/ticket.ccachecp ticket.ccache /tmp/krb5cc_0
  • Add realm to /etc/krb5.conf (for linux). Use of this format is important:
            kdc = fooserver.contoso.con

  • Check Kerberos tickets with klist
  • To remove ticket use: kdestroy
  • For more information about Kerberos check this cheatsheet

Extra features

  • To disable colors just modify on code this variable $colors_enabled. Set it to false: $colors_enabled = false

  • Alamot for his original code.
  • 3v4Si0N for his awesome dll loader.
  • WinRb All contributors of ruby library.
  • TheWover for his awesome donut tool.
  • byt3bl33d3r for his python library to create donut payloads.
  • Sh11td0wn for inspiration about new features.

Download tool: