IoT и DNS-туннели: как закрепляются атакующие
👋 Приветствую в мире цифровой безопасности!
Сегодня посмотрим, как хакеры юзают IoT-устройства для входа в сеть и закрепляются через DNS-туннели.
⏺Как ломают:
1️⃣Сначала ищут потенциальные цели через открытые источники (ripe.net, passive DNS) и сканят сеть с помощью masscan или Angry IP Scanner.
2️⃣Находят уязвимый роутер, L3-коммутатор или камеру и запускают routersploit autopwn - перебор эксплойтов и брутфорс.
3️⃣Дальше небольшой трюк: скомпрометированное устройство тянет пейлоад с VPS через встроенный wget и запускает его. Архитектуры любые: ARM, x86, MIPS и т.д.
4️⃣Готово - IoT превращается в точку входа внутрь сети, через которую можно прокинуть SOCKS proxy и атаковать уже корпоративный сегмент.
⏺В чем плюсы: на IoT нет антивирусов и EDR, системные вызовы никто не мониторит, логи не собирают. А значит, команда exec проходит беспрепятственно.
⏺Где появляется DNS-туннелирование: даже если сеть сегментирована и фильтруется, малварь может «стучаться» на C2-панель через Do53/DoT/DoH, пряча команды в битах DNS-заголовков. Да, ответ на условный ls может идти сутки, но для хакера то главное - это закрепление в сети.
Пример из PoC:
unsigned short __do53_query(char *_qname, __do53_type _qtype, unsigned char *_wire)
{
_wire[0] = // Вот здесь пейлоад
_wire[1] = // Вот здесь пейлоад
_wire[2] = 0x01;
_wire[3] = 0x00;
_wire[4] = 0x00;
_wire[5] = 0x01;
_wire[6] = 0x00;
_wire[7] = 0x00;
_wire[8] = 0x00;
_wire[9] = 0x00;
_wire[10] = 0x00;
_wire[11] = 0x00;
int query_lenght = __ascii_convertation_to_wire(_qname, &(_wire[12]));
int nextLoc = 12 + query_lenght + 1;
_wire[nextLoc] = 0x00;
_wire[++nextLoc] = 0x01;
_wire[++nextLoc] = 0x00;
_wire[++nextLoc] = 0x01;
return nextLoc + 1;
}
⏺В итоге у нас подломленное устройство раз в час резолвит «невинный» домен вроде metrics-cisco.com и получает команды в Additional-/Authority-секциях. Для NTA-систем это выглядит просто как обычный DNS-запрос.
ZeroDay | #IoT