Монолитный имплант всю жизнь носит с собой всё, что может когда-нибудь понадобиться: каждый байт — это след на диске, сигнатура в памяти и поверхность для AV, оплаченные на каждом хосте независимо от того, использовалась ли возможность. Агент C в AXIS выбрал другую сторону сделки. Ядро — 225 КБ, и оно почти ничего не делает — канал, тайминг, диспетчер задач, криптография и загрузчик модулей. Всё, что оператор узнал бы как возможность, релиз за релизом было вынесено в депо.
Что несёт ядро — и чего не несёт
Разделение и есть весь дизайн, так что вот оно в одной таблице:
| Часть | Живёт | Резидентно | Заметки |
|---|---|---|---|
| Ядро агента | артефакт | всегда | ≈ 225 КБ — канал, тайминг, диспетчер, криптография, загрузчик |
| Шеллы и интерактивный PTY | депо | по задаче | загружается по первой команде шелла, встраивается в ядро |
| Файловый менеджер | депо | по задаче | чанкованные передачи стримятся обратно как результаты модуля |
| Туннели и маршрутизация пиров | депо | по задаче | SOCKS, обратные туннели, mesh по именованным каналам |
| Обозреватель SMB | депо | по задаче | доступ к шарам с имперсонацией токена |
| Рантайм BOF | депо | по задаче | с защитой от падений; ошибка возвращает error, а не сессию |
| Учётные данные · LDAP · AD · шары · сканер | депо | по задаче | набор сбора, только в памяти |
| Повышение | депо | по задаче | только агент C на Windows — ограничение по типу агента |
Как прибывает модуль
Депо — под каждую ОС и каждый профиль: Windows получает DLL, Linux — разделяемые объекты по маршруту профиля сборки — сервер, NAS-legacy и embedded берут каждый из своего пула, — macOS получает библиотеки. Сервер ограничивает набор по типу агента и платформе: повышение предлагается только агенту C на Windows, cron-персистентность — только там, где есть cron. Выдача — осознанный, аудируемый момент:
Каждый модуль едет зашифрованным собственным ключом, выведенным из сессии, за одноразовым токеном загрузки; результаты чанками возвращаются по тому же каналу; выгрузка затирает ключевой материал. Операторская запись обо всём этом — строка в журнале аудита: модуль, цель, оператор, метка времени.
{
"module": "filemgr",
"target": "windows-x64",
"pool": "core/win · маршрут по профилю сборки",
"fetch": "одноразовый токен · одно использование",
"key": "на модуль · выведен из сессии",
"results": "чанкованный поток",
"unload": "затирание + освобождение"
}
Что покупает бюджет
Тихий агент почти невесом: 225 КБ на диске, тонкий профиль памяти и ничего резидентного, что сканер мог бы назвать. Возможность прибывает ровно тогда, когда она нужна операции, и уходит, когда не нужна, — а поскольку модули, как и всё, что мы поставляем, собираются под заказчика, депо наследует тот же полиморфизм, что и ядро. Агент Go держит противоположную ставку — широкий резидентный набор команд в бинарнике на 8 МБ, — и оба работают в одном парке, потому что честный ответ на вопрос «какой имплант» — зависит от хоста, и панель не должна наказывать за честный ответ.
Угол защитника
Выдача — громкий момент.
Модульность — это тоже поверхность детекта, и утверждать обратное превратило бы заметку в маркетинг. Загрузка шифрованной полезной нагрузки по одноразовому токену, вскоре после которой в процессе, молчавшем днями, появляется новое поведение. Сканеры памяти зарабатывают свои деньги в окне между загрузкой и затиранием; затирание сужает окно, но не стирает саму выдачу. Если ваша телеметрия умеет соединять «погашен необычный токен загрузки» с «ранее тихий процесс теперь листает файлы», вы нашли шов, который мы тратим инженерные усилия, чтобы сузить. Это повторяющийся урок карты телеметрии: живучие импланты сжимают последовательности; хорошие защитники растягивают их обратно.
Далее в очереди: полевой справочник по техникам обхода — что каждая всё ещё вам стоит и почему импланты с одним трюком быстро стареют.