TGViewer
DFIR Father DFIR Father @dfirfather · 503 subscribers
Post #63 1.55K
yoprst_Грищенко_16777216.pdf7.1 MB
🔍 ::%16777216 — это не ngrok-артефакт. Это баг Windows.

Если ты занимаешься DFIR или threat hunting'ом - ты наверняка встречал в логах Windows Event ID 1149 (TerminalServices-RemoteConnectionManager) адрес источника вида ::% 16777216 и думал, что это след ngrok или другого туннелирующего инструмента. Так вот - это не так. Точнее, не совсем так.

🐛 Что происходит на самом деле
Это баг в Windows, существующий как минимум с Windows 8 / Server 2012 и не исправленный вплоть до Windows 11 24H2 build 26100.8457.
Суть: при RDP-подключении через IPv6 termsrv.dll передаёт в GetNameInfoW (ws2_32.dll) указатель на структуру WTS_SOCKADDR - но читает её как sockaddr_in6. Проблема в несоответствии: WTS_SOCKADDR содержит 4 байта паддинга после sin_family, из-за чего IPv6-адрес клиента сдвигается на 4 байта вправо. В результате вместо реального адреса в лог пишется ::% 16777216, где 16777216 = 0x01000000 - это значение sin6_scope_id, которое интерпретируется как zone index от сдвинутого ::1 (localhost IPv6).

⚙️ Структуры для понимания
WTS_SOCKADDR:
USHORT sin_family;   // 2 байта
// padding // 2 байта ← вот виновник
union { ... } // от offset 4

sockaddr_in6:
short  sin6_family;  // 2 байта
u_short sin6_port; // 2 байта
u_long sin6_flowinfo;// 4 байта
struct in6_addr ... // 16 байт
u_long sin6_scope_id;// 4 байта

rdpcorets.dll записывает IPv6-адрес клиента в WTS_SOCKADDR с одной структурой. termsrv.dll читает это как sockaddr_in6 с другой - смещение на 4 байта, адрес уезжает в sin6_scope_id, который и попадает в лог как % 16777216.

🧪 Как воспроизвести
Любой туннелинг через IPv6 на localhost (ssh -L, devtunnel, ngrok, localtunnel) → RDP-подключение → в Event ID 1149 будет ::% 16777216.
Это происходит не только с ngrok. Любое RDP-подключение через IPv6 localhost даст этот артефакт.

📋 Где проявляется
Event IDs: 1149, 4778, 4779 Журналы: TerminalServices-RemoteConnectionManager\Operational, Windows Logs\Security

🔧 Как восстановить реальный IPv6-адрес
Если в логе: 0:0:fe80::6e1d:980d%2607874452
Берём число после %: 2607874452
Конвертируем в HEX: 9B 71 01 94
Разворачиваем (little-endian): 94 01 71 9B
Дописываем к адресу справа: fe80::6e1d:980d:9401:719b
Реализуемо в любом SIEM через enrichment-правило.

📌 Выводы для DFIR
::% 16777216 - всегда признак RDP-подключения по IPv6 через туннель (localhost → порт 3389). Это остаётся валидным IoC для детекта reverse tunnel, независимо от того, ngrok это или ssh -L.
Значение само по себе не несёт информации о реальном клиенте - адрес нужно восстанавливать по алгоритму выше.
Microsoft квалифицировал как Moderate / Tampering, CVE не присвоен, патч не обещан (ответ от 08.11.2025). Исправлено тихо в Windows 11 24H2 build 26100.8457+ и 26H1.

🔗 Слайды: ёPRSTCON 2026, автор - Константин Грищенко, Positive Technologies.

🐦‍⬛ DFIR Father
  • ❤ 3
  • 👍 2
More from @dfirfather
  1. Aug 21, 2026Форензики есть? Вышла таблица сравнения инструментов форензики за 2026 - тринадцать продук…
  2. Jul 31, 2026🇨🇳 Кибершпионаж в государственных органах Центральной Азии. Новые бэкдоры OctLurk и Silk…
  3. Jul 7, 2026Обнаружены подозрительные домены в зоне home[.]kg 🇰🇬 Домены - auth.home[.]kg 🇰🇬 - vsco…
  4. Jul 7, 2026Поддержим первую и, наверное, единственную подобную некоммерческую CSIRT инициативу! 🤝
  5. Jun 26, 2026A localhost digital-forensics / incident-response companion. A browser extension captures…
  6. Jun 11, 2026❗️❗️❗️ GreatXML - второй 0-day за месяц от Nightmare Eclipse. На этот раз BitLocker "I may…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →