Kairos попал в поле зрения Nozomi Networks после того, как ханипоты зафиксировали три разных IP-адреса с образцами. Все три оказались одной программой, собранной Go 1.27.0 и 1.27.1; отличались только жёстко прописанный адрес C2 и патч-версия компилятора. Похоже, оператор пересобирает одну кодовую базу под каждый сервер управления.
Как проходит заражение
Всё начинается с Telnet, который принимает root с пустым паролем. Дальше идёт короткий набор shell-команд: uname -m определяет архитектуру, файлы переносятся в /tmp, старые остатки удаляются, загружается полезная нагрузка. Доставка перебирает методы — wget, curl, BusyBox wget, затем TFTP. Каждой копии выдаются права chmod 777, запуск — в фоне. Fallback на BusyBox и TFTP нужен для embedded-систем, где нет обычных инструментов.
После запуска бот подключается к единственному IP и отправляет открытым текстом REGISTER linux amd64 <NumCPU>, а затем пустую строку каждые две секунды, чтобы держать сессию. При обрыве — повтор каждые пять секунд без ограничения. C2 умеет только три команды: hold запускает flood, !ka останавливает атаки и ставит бота на паузу, !ku снова разрешает.
Как он атакует
Kairos не заливает жертву трафиком. Он открывает сотни или тысячи настоящих TCP-соединений и держит их. На каждое ядро — 128 воркеров, минимум 256: 16-ядерное устройство открывает 2048 соединений. Воркер завершает обычный handshake и отправляет один пробел каждые пять секунд. Если соединение отклоняют, повтор идёт каждые 100 мс — получается «connect storm», и сервис постепенно перестаёт принимать реальных пользователей.
Слабые места и защита
У бота нет persistence, самораспространения, выполнения команд и антианализа. Он маскируется под [kworker/0:1], но ps и /proc показывают настоящее имя, а источник виден жертве. Помогают отключение Telnet, нормальные пароли, блокировка C2 на 9999 и 8080, IDS-правило на REGISTER linux и опубликованное YARA-правило.
Kairos came to Nozomi Networks’ attention after honeypots recorded three different IP addresses delivering samples. All three turned out to be the same program, compiled with Go 1.27.0 and 1.27.1; only the hardcoded C2 address and the compiler patch level differed. The operator appears to rebuild one codebase per command-and-control server.
How infection works
It starts with Telnet accepting root and an empty password. A short shell sequence follows: uname -m checks the architecture, files move to /tmp, leftovers are deleted, and the payload is downloaded. Delivery tries several methods in turn — wget, curl, BusyBox wget, then TFTP. Each copy gets chmod 777 and runs in the background. The BusyBox and TFTP fallbacks keep the loader working on embedded systems without the usual tools.
Once running, the bot connects to a single IP and sends a plaintext REGISTER linux amd64 <NumCPU>, then a blank line every two seconds to keep the session alive. If the link drops, it retries every five seconds with no limit. The C2 supports only three commands: hold starts a flood, !ka stops attacks and pauses the bot, and !ku lets it accept attacks again.
How it attacks
Kairos does not flood a victim with traffic. It opens hundreds or thousands of real TCP connections and holds them. Each CPU core gets 128 workers, with a minimum of 256: a 16-core device opens 2,048 connections. A worker completes a normal handshake and sends a single space every five seconds. If the target refuses, it retries every 100 ms, creating a connect storm until the service runs out of room for real users.
Weaknesses and defence
The bot has no persistence, self-spreading, command execution or anti-analysis. It masquerades as [kworker/0:1], but ps and /proc show the real name, and the victim can see the source IP. Defence means disabling Telnet, setting real passwords, blocking known C2s on 9999 and 8080, and deploying an IDS rule for the REGISTER linux beacon plus the published YARA rule.