[ << ALL_FEED ]

Где искать сетевые индикаторы компрометации на Windows?

Ещё в группе «Общее»

Где искать сетевые индикаторы компрометации на Windows? Например, в кэше DNS 💡

Кэш DNS — механизм кэширования записей соответствия доменных имен IP-адресам (и не только). Он нужен для того, чтобы система каждый раз не обращалась к DNS-серверам за этой информацией. Посмотреть содержимое кэша можно с помощью команды ipconfig /displaydns, но не спешите это делать.

У каждой DNS-записи есть параметр TTL (time to live), который определяет, как долго запись остается действительной. По истечении TTL запись «протухает» — и система вновь вынуждена запрашивать данные у DNS-сервера.

Windows хранит перечень кэшированных доменов в виде связного списка, а запрос содержимого кэша состоит из двух этапов: на первом этапе с помощью системного вызова DnsGetCacheDataTable формируется полный список кэшированных доменов, затем для каждого домена из списка происходит резолв из кэша с помощью системного вызова DnsQuery с флагом DNS_QUERY_NO_WIRE_QUERY. Таким образом для каждого кэшированного домена из кэша извлекаются соответствующие ресурсные записи: A, AAAA, TXT и так далее.

😐 Здесь-то и кроется подвох. Если домен содержится в списке кэшированных, а его TTL истекло, то команда ipconfig /displaydns не только не покажет такой домен в списке, но и удалит его из списка кэшированных доменов, тем самым уничтожив потенциальные улики.

Чтобы получить полный список кэшированных доменов (даже «протухших»), можно использовать вызов DnsGetCacheDataTable. Ниже приведен скрипт для PowerShell, реализующий эту функцию:


Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;

namespace DnsCache
{
    [StructLayout(LayoutKind.Sequential)]
    public struct DnsCacheEntry
    {
        public IntPtr PNext;
        public IntPtr Name;
        public ushort Type;
        public ushort DataLength;
        public uint Flags;
    }

    public class Program
    {

        [DllImport("dnsapi.dll")]
        public static extern void DnsGetCacheDataTable(ref DnsCacheEntry entry);
        public static void GetCache()
        {
            DnsCacheEntry a = new DnsCacheEntry();
            DnsGetCacheDataTable(ref a);
            while (true)
            {
                Console.WriteLine("RR name: {0}", Marshal.PtrToStringAuto(a.Name));
                if (a.PNext == IntPtr.Zero) break;
                a = Marshal.PtrToStructure<DnsCacheEntry>(a.PNext);
            }

        }
    }
}
"@
[DnsCache.Program]::GetCache()
Code language: PowerShell (powershell)

Попробуйте выполнить этот скрипт, а потом сравните с результатами вызова ipconfig /displaydns (именно в таком порядке).

Happy hunting!

#tips #hunting #win #dfir #dotnet #triage
@ptescalator

Ещё от oUth0R

Ещё от oUth0R

Ещё в группе «Общее»