Persistence and post-exploitation
Выполнение кода — это начало, а не победа. Большую часть времени в системе атакующий тратит на закрепление, латеральное движение и эксфильтрацию — и каждый шаг можно обнаружить.
Red team получает выполнение кода на одном CI-раннере в 02:14. Когда через три недели проводят разбор работы, вопрос, на который синяя команда не может чисто ответить, звучит так: что они делали между 02:14 и сейчас? Шелл был лёгкой частью — минуты работы. Остальные двадцать один день прошли тихо: запланированная задача, перезапускающая имплант при каждой перезагрузке; токен сервисной учётки, переиспользованный для прыжка на билд-сервер; deploy key, скопированный для чтения приватного репозитория; гигабайты исходников, утёкшие по 8 КБ за раз внутри того, что выглядело как обычная HTTPS-телеметрия. Ничто из этого не подняло ни единого алерта. Этот разрыв — минуты на проникновение, недели до обнаружения — и есть настоящая тема урока. Взлом громкий и короткий; всё, что атакующему действительно нужно, происходит после, и почти всё это обнаружимо, если знать, как оно выглядит.
К концу урока ты будешь знать, что делает атакующий после получения шелла — закрепление, латеральное движение и эксфильтрацию — и какой сигнал для обнаружения оставляет каждый шаг защитнику.
Сначала про авторизацию — это карта защитника, а не руководство к действию
Всё ниже описывает жизненный цикл пост-эксплуатации — что делает нарушитель, когда у него уже выполняется код, — и объясняется так, чтобы ты мог это обнаружить и сорвать. Здесь нет атакующего инструментария, и он не нужен для понимания механизма: закрепление, латеральное движение и эксфильтрация — это поведение, оставляющее следы, и весь смысл в том, чтобы научиться распознавать эти следы в своих же логах. Единственное законное место реально отрабатывать эти техники — авторизованная работа с письменным согласованием объёма, CTF или собственноручно собранная лаборатория. В терминах MITRE ATT&CK момент, с которого мы начинаем, — код выполняется на одном хосте — это переход от Execution к длинному хвосту Persistence (TA0003), Lateral Movement, Collection и Exfiltration. Мы изучаем цепочку, чтобы защитник мог разорвать её в любом звене, потому что разрыв в любом одном звене обрушивает всю операцию.
Пробой — это плацдарм, а не цель
Самое частое заблуждение новичка в наступательной безопасности — что «получить шелл» и есть победа. Это не так — это начало работы. Закрепление на одном, часто малоценном хосте (билд-агент, маркетинговая CMS, ноутбук стажёра) почти никогда не находится там, где живёт настоящая цель атакующего. Цель — это база клиентов, ключи подписи, облачная роль администратора, репозиторий исходников. Вся фаза пост-эксплуатации — это разрыв между где ты приземлился и за чем пришёл, и он раскладывается на горстку повторяющихся задач: остаться (пережить перезагрузку, выход из сессии, смену пароля), понять (где я, что может достать эта учётка), распространиться (двигаться к целевому хосту, переиспользуя найденное) и забрать (собрать и вывести данные) — обычно достаточно тихо, чтобы успеть всё это до того, как кто-то заметит.
Именно поэтому dwell time — интервал между первичной компрометацией и обнаружением — это метрика, на которой помешана вся защитная индустрия. Отраслевые отчёты годами измеряют глобальную медиану dwell time в диапазоне примерно от одной до трёх недель — меньше, чем многие месяцы десятилетие назад, но всё равно огромный: недель хватает, чтобы построить карту целой сети, найти «коронные драгоценности» и уйти. Каждый день dwell time — это день, который атакующий проводит в фазе пост-эксплуатации, а значит, каждое обнаружение, которое ты поставишь в этой фазе, — шанс оборвать операцию ещё долго после того, как первичный взлом удался.
Закрепление: сделать плацдарм живучим
Первое, что делает грамотный атакующий после получения выполнения, — покупает живучесть, потому что его первичный доступ хрупок: перезагрузка, упавший процесс, ротированный пароль или закрытая уязвимость могут выселить его в любой момент. Закрепление (persistence) — это любой механизм, автоматически восстанавливающий выполнение кода, чтобы атакующему не пришлось переэксплуатировать исходный баг. Определяющее свойство любой техники закрепления одно: она цепляется за легитимный, автоматический триггер выполнения, так что вредоносный код запускается как побочный эффект нормального поведения системы.
Триггеры обыденны — именно поэтому они работают. Запланированная задача или cron запускает имплант каждые несколько минут или при каждой загрузке. Новый или изменённый сервис / демон стартует его при старте системы. Профиль оболочки или autostart-запись запускает его при каждом входе. В скомпрометированном облаке или CI-окружении закрепление часто выглядит ещё безобиднее: новый deploy key, токен сервисной учётки, лишний IAM-пользователь или access key, вредоносный шаг, тихо добавленный в определение пайплайна — учётные данные и конфигурация, которые переживают любую перезагрузку, потому что им так и положено. Облачная версия «пережить перезагрузку» — это «пережить выселение», и добавленный access key делает это идеально: ротируй скомпрометированный пароль — и атакующий всё равно войдёт через ключ, о существовании которого ты не знал.
Сигнал обнаружения — создание и изменение этих триггеров. Новая cron-запись, новый systemd-юнит, новый IAM access key, новый deploy key, изменение файла пайплайна — каждое из этого есть запись в чувствительную, редко меняющуюся поверхность, и каждое — высокосигнальный алерт. Рычаг защитника здесь в том, что закрепление — одно из немногих действий атакующего, которое обязано оставить долговечный артефакт: весь смысл в том, что что-то сохраняется, а значит, что-то можно найти.
| Этап пост-эксплуатации (тактика ATT&CK) | Что делает атакующий | Сигнал обнаружения для защитника |
|---|---|---|
| Persistence (TA0003) | Новый cron/сервис/login-хук; добавленный IAM- или deploy-ключ | Записи в startup-поверхности; создан новый долгоживущий креденшл |
| Discovery | Перечисление хостов, учёток, шар, облачных ролей | Всплеск enumeration-вызовов API / сканирование с одного хоста |
| Credential access | Сдамп токенов, чтение файлов секретов, скрейп памяти | Чтения хранилищ секретов; доступ к учётному материалу |
| Lateral movement | Переисп. краденых creds для аутентификации на след. хост | Аутентификация с необычной пары источник/идентичность; новый east-west путь |
| Collection / Exfiltration (TA0010) | Staging данных, сжатие, медленная отправка по разрешённому каналу | Аномальный объём/назначение исходящего; egress на новый эндпоинт |
Латеральное движение: распространение переиспользованием, а не переэксплуатацией
Закрепившись, атакующий редко нуждается в новом эксплойте. Доминирующая техника достижения цели — латеральное движение через переиспользование учётных данных: собрать креденшл на хосте, которым владеешь, — кешированный пароль, токен сервисной учётки, SSH-ключ, JWT сервис-аккаунта Kubernetes (K8s), облачный access key в переменной окружения — и использовать его для аутентификации на следующем хосте как легитимный пользователь. В этом суть того, почему один малоценный плацдарм так опасен: сети полны общих и переразрешённых учёток, и одна из них на твоём билд-агенте может оказаться ключом к реестру артефактов, который держит ключ к продакшену.
Механизм, делающий это разрушительным, — топология доверия. Большинство внутренних сетей построены в предположении «внутри безопасно», поэтому, оказавшись внутри, сервисы аутентифицируют друг друга долгоживущими общими секретами при плоской достижимости — любой хост может говорить с любым. Атакующий смотрит на это как на граф: каждый скомпрометированный креденшл — это ребро к новому узлу, и он идёт по графу от одноразового плацдарма к высокоценной цели. Защитные контрмеры структурны: сегментация сети (чтобы CI-хост вообще не мог достучаться до продакшен-базы), ограничение прав по least-privilege (чтобы краденый токен мог одно, а не всё) и короткоживущие / привязанные к нагрузке учётные данные (чтобы собранный секрет стал бесполезен через минуты или вне своего хоста). Сигнал обнаружения — аутентификация, нормальная сама по себе, но аномальная в контексте: эта идентичность, из этого источника, к этому назначению, в это время — такого ещё не было. Эта east-west аутентификация и есть улика, потому что креденшл валиден — нов только путь.
▸Почему это работает
Почему east-west (внутренний, host-to-host) трафик намного труднее мониторить, чем north-south (вход/выход из сети)? Архитектура и объём. North-south трафик стекается через небольшое число узких мест — файрвол, прокси, egress-шлюз, — где можно позволить себе глубокую инспекцию и богатое логирование. East-west трафик повсюду одновременно: тысячи внутренних вызовов сервис-к-сервису, большинство легитимны и используют валидные учётки, без естественного узкого места, чтобы их инспектировать. Исторически команды логировали периметр и доверяли внутренностям — ровно то предположение, которое эксплуатирует латеральное движение. Это и есть ключевая мотивация zero-trust: перестать считать «внутри сети» авторизацией, аутентифицировать и авторизовать каждый прыжок и поставить применение политики на east-west путь, чтобы валидный креденшл на неверном пути всё равно отвергался. Это переносит узкое место с периметра на каждое соединение.
Эксфильтрация: последняя и самая ловимая миля
Собрать целевые данные — одно; вывести их — другое, и именно тут осторожный атакующий наиболее уязвим, потому что покидающие сеть данные — единственное действие, которое по определению обязано пересечь подконтрольную тебе границу. Поэтому ремесло эксфильтрации — это слиться с фоном: вместо того чтобы открыть подозрительное соединение к неизвестному IP и протолкнуть 4 ГБ-архив (что любой egress-монитор мгновенно пометит), атакующий туннелирует данные по уже разрешённому и уже шумному каналу. Классический выбор — HTTPS на безобидно выглядящий домен, DNS-запросы (любая сеть резолвит DNS, и данные едут в метках поддомена) или доверенный SaaS-API, который организация и так использует. Он дросселирует передачу до тонкой струйки и растягивает её на часы или дни, чтобы объём никогда не выскакивал над фоном.
Сигнал обнаружения — статистическая форма egress, а не его содержимое (которое зашифровано): необычный объём исходящих данных, новое или редкое назначение, долгоживущее низко-и-медленное соединение или DNS-трафик с аномально высокой энтропией и объёмом запросов к одному домену. Поэтому egress-фильтрация и DLP — последний рубеж: хосту, который должен говорить только с двумя внутренними сервисами, нечего делать, открывая соединение в открытый интернет, и egress-политика «allowlist по умолчанию» превращает «слиться с разрешённым трафиком» в «нет разрешённого трафика, с которым можно слиться». Структурная победа защитника здесь та же, что появляется на каждом этапе: сделать легитимные пути немногочисленными и явными, чтобы аномальный выделялся, а не прятался в море дозволенного шума.
Red team получил выполнение кода на CI-раннере. Ты можешь профинансировать ровно один структурный контроль в этом квартале, чтобы максимально снизить ущерб от достижения продакшена ЭТИМ классом плацдарма. Выбери.
Как зрелый инженер читает цепочку пост-эксплуатации
Объединяющий урок в том, что обнаружение в глубину зеркалит защиту в глубину: атакующему приходится сцеплять много шагов, и каждый — отдельный шанс его поймать. Зрелый инженер не ставит всё на предотвращение первичного пробоя — пробои случаются, — но инструментирует после: алерты на новые артефакты закрепления, на аномальную east-west аутентификацию, на чтения хранилищ секретов и на статистическую форму egress. Точно так же зрелый инженер структурно сокращает цепочку, чтобы каждый оставшийся шаг был громче: сегментация убирает латеральные рёбра, least-privilege сжимает то, что покупает краденый креденшл, короткоживущие учётки протухают добычу, а allowlist-egress убирает прикрытие, в котором прячется эксфильтрация. Усвоить надо то, что поимка атакующего где угодно в цепочке пост-эксплуатации обрушивает операцию — поэтому dwell time мерит не то, насколько хорош твой периметр, а то, насколько хорошо ты следишь за тем, что происходит после того, как его уже пересекли.
Атакующий компрометирует малоценный CI-билд-агент, у которого нет доступа к данным клиентов. Почему это всё равно серьёзный инцидент?
Защитник хочет единственное самое высокосигнальное место для обнаружения закрепления. Какое это место и почему?
Упорядочь типичную цепочку пост-эксплуатации — от момента, когда код впервые запускается, до выхода данных из сети:
- 1 Выполнение кода на одном первичном, часто малоценном хосте
- 2 Установить закрепление, чтобы плацдарм пережил перезагрузку
- 3 Собрать учётки и двигаться латерально к целевому хосту
- 4 Собрать целевые данные и медленно вывести их по разрешённому каналу
- 01Объясни, почему «получить шелл» — это начало работы, а не победа, и каковы четыре повторяющиеся задачи пост-эксплуатации.
- 02Как работает латеральное движение через переиспользование учётных данных, почему плоская топология доверия делает его разрушительным и каковы структурные защиты?
Выполнение кода — это плацдарм, а не цель: атакующий приземляется на один обычно малоценный хост, и настоящая работа — всё, что после. Пост-эксплуатация раскладывается на повторяющийся набор задач: закрепление (зацепиться за легитимный автоматический триггер выполнения — cron, сервис, login-хук, а в облаке добавленный IAM- или deploy-ключ — чтобы плацдарм пережил перезагрузку или смену пароля), разведка, латеральное движение (собрать креденшл на захваченном хосте и переиспользовать его для аутентификации на следующем, идя по графу доверия от одноразового плацдарма к цели) и сбор плюс эксфильтрация (туннелировать данные наружу низко-и-медленно по уже разрешённому, уже шумному каналу вроде HTTPS, DNS или доверенного SaaS-API, чтобы объём никогда не выскакивал). Всё преимущество защитника в том, что эта цепочка длинна и каждое звено оставляет отдельный наблюдаемый сигнал: запись в редко меняющуюся startup-поверхность, аутентификацию, нормальную саму по себе, но аномальную в контексте, чтение хранилища секретов или необычную статистическую форму исходящего трафика. Поэтому обнаружение в глубину зеркалит защиту в глубину — тебе не нужно ловить первичный эксплойт, ведь поимка закрепления, аномальной east-west аутентификации или медленного egress обрушивает операцию столь же полно. И ты сокращаешь цепочку структурно, чтобы каждый оставшийся шаг был громче: сегментация убирает латеральные рёбра, least-privilege сжимает то, что покупает краденый креденшл, короткоживущие учётки протухают добычу, а allowlist-egress убирает прикрытие, в котором прячется эксфильтрация. Значит, dwell time мерит не то, насколько крепок твой периметр, — а то, насколько хорошо ты следишь за тем, что происходит после того, как его пересекли.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.