Wyszukiwanie zagrożeń na urządzeniach, w wiadomościach e-mail, aplikacjach i tożsamościach

Dotyczy:

  • Microsoft Defender XDR

Zaawansowane wyszukiwanie zagrożeń w Microsoft Defender XDR umożliwia aktywne wyszukiwanie zagrożeń w różnych obszarach:

  • Urządzenia zarządzane przez Ochrona punktu końcowego w usłudze Microsoft Defender
  • Wiadomości e-mail przetwarzane przez platformę Microsoft 365
  • Działania aplikacji w chmurze, zdarzenia uwierzytelniania i działania kontrolera domeny śledzone przez Microsoft Defender for Cloud Apps i Microsoft Defender for Identity

Dzięki temu poziomowi widoczności można szybko wyszukiwać zagrożenia, które przechodzą przez sekcje sieci, w tym zaawansowane włamania, które docierają do poczty e-mail lub sieci Web, podnieść poziom uprawnień lokalnych, uzyskać poświadczenia domeny uprzywilejowanej i przenieść się później na urządzenia.

Poniżej przedstawiono ogólne techniki i przykładowe zapytania oparte na różnych scenariuszach wyszukiwania zagrożeń, które mogą pomóc w eksplorowaniu sposobu konstruowania zapytań podczas wyszukiwania takich zaawansowanych zagrożeń.

Pobieranie informacji o jednostce

Skorzystaj z tych zapytań, aby dowiedzieć się, jak szybko uzyskać informacje o kontach użytkowników, urządzeniach i plikach.

Uzyskiwanie kont użytkowników z adresów e-mail

Podczas konstruowania zapytań w tabelach obejmujących urządzenia i wiadomości e-mail prawdopodobnie będzie konieczne uzyskanie nazw kont użytkowników od nadawcy lub adresatów adresów e-mail. Zazwyczaj można to zrobić dla adresu adresata lub nadawcy przy użyciu hosta lokalnego z adresu e-mail .

W poniższym fragmencie kodu użyjemy funkcji Kusto tostring(), aby wyodrębnić hosta lokalnego tuż przed @ adresami e-mail adresatów w kolumnie RecipientEmailAddress.

//Query snippet showing how to extract the account name from an email address
AccountName = tostring(split(RecipientEmailAddress, "@")[0])

Poniższe zapytanie pokazuje, jak można użyć tego fragmentu kodu:

EmailEvents
| where Timestamp > ago(7d)
| project RecipientEmailAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0]);

Scalanie tabeli IdentityInfo

Nazwy kont i inne informacje o koncie można uzyskać, scalając lub dołączając tabelę IdentityInfo. Poniższe zapytanie uzyskuje listę wykrywania wyłudzania informacji i złośliwego oprogramowania z tabeli EmailEvents , a następnie dołącza te informacje do IdentityInfo tabeli, aby uzyskać szczegółowe informacje o każdym adresacie.

EmailEvents
| where Timestamp > ago(7d)
//Get email processing events where the messages were identified as either phishing or malware
| where ThreatTypes has "Malware" or ThreatTypes has "Phish"
//Merge email events with identity info to get recipient details
| join (IdentityInfo | distinct AccountUpn, AccountDisplayName, JobTitle,
Department, City, Country) on $left.RecipientEmailAddress == $right.AccountUpn
//Show important message and recipient details
| project Timestamp, NetworkMessageId, Subject, ThreatTypes,
SenderFromAddress, RecipientEmailAddress, AccountDisplayName, JobTitle,
Department, City, Country

Obejrzyj ten krótki film wideo, aby dowiedzieć się, jak używać język zapytań Kusto do łączenia tabel.

Pobieranie informacji o urządzeniu

Zaawansowany schemat wyszukiwania zagrożeń zawiera obszerne informacje o urządzeniu w różnych tabelach. Na przykład tabela DeviceInfo zawiera kompleksowe informacje o urządzeniu na podstawie regularnie agregowanych danych zdarzeń. To zapytanie używa DeviceInfo tabeli, aby sprawdzić, czy potencjalnie naruszony użytkownik (<account-name>) zalogował się na dowolnych urządzeniach, a następnie wyświetla listę alertów, które zostały wyzwolone na tych urządzeniach.

Porada

To zapytanie służy kind=inner do określania sprzężenia wewnętrznego, co zapobiega deduplikacji wartości po lewej stronie dla DeviceIdelementu .

DeviceInfo
//Query for devices that the potentially compromised account has logged onto
| where LoggedOnUsers contains '<account-name>'
| distinct DeviceId
//Crosscheck devices against alert records in AlertEvidence and AlertInfo tables
| join kind=inner AlertEvidence on DeviceId
| project AlertId
//List all alerts on devices that user has logged on to
| join AlertInfo on AlertId
| project AlertId, Timestamp, Title, Severity, Category

Pobieranie informacji o zdarzeniu pliku

Użyj następującego zapytania, aby uzyskać informacje o zdarzeniach związanych z plikami.

DeviceInfo
| where Timestamp > ago(1d)
| where ClientVersion startswith "20.1"
| summarize by DeviceId
| join kind=inner (
    DeviceFileEvents
    | where Timestamp > ago(1d)
) on DeviceId
| take 10

Uzyskiwanie informacji o zdarzeniach sieciowych

Użyj następującego zapytania, aby uzyskać informacje o zdarzeniach związanych z siecią.

DeviceInfo
| where Timestamp > ago(1d)
| where ClientVersion startswith "20.1"
| summarize by DeviceId
| join kind=inner (
    DeviceNetworkEvents
    | where Timestamp > ago(1d)
) on DeviceId
| take 10

Pobieranie informacji o wersji agenta urządzenia

Użyj następującego zapytania, aby pobrać wersję agenta uruchomioną na urządzeniu.

DeviceInfo
| where Timestamp > ago(1d)
| where ClientVersion startswith "20.1"
| summarize by DeviceId
| join kind=inner (
    DeviceNetworkEvents
    | where Timestamp > ago(1d)
) on DeviceId
| take 10

Przykładowe zapytanie dotyczące urządzeń z systemem macOS

Użyj następującego przykładowego zapytania, aby wyświetlić wszystkie urządzenia z systemem macOS w wersji starszej niż Catalina.

DeviceInfo
| where Timestamp > ago(1d)
| where OSPlatform == "macOS" and  OSVersion !contains "10.15" and OSVersion !contains "11."
| summarize by DeviceId
| join kind=inner (
    DeviceInfo
    | where Timestamp > ago(1d)
) on DeviceId
| take 10

Pobieranie informacji o stanie urządzenia

Użyj następującego zapytania, aby uzyskać stan urządzenia. W poniższym przykładzie zapytanie sprawdza, czy urządzenie jest dołączone.

DeviceInfo
| where Timestamp > ago(1d)
| where OnboardingStatus != "Onboarded"
| summarize by DeviceId
| join kind=inner (
    DeviceInfo
    | where Timestamp > ago(1d)
) on DeviceId
| take 10

Scenariusze wyszukiwania zagrożeń

Wyświetlanie listy działań logowania użytkowników, którzy otrzymali wiadomości e-mail, które nie zostały pomyślnie zamapowane

Automatyczne przeczyszczanie o wartości zero godzin (ZAP) adresuje złośliwe wiadomości e-mail po ich otrzymaniu. Jeśli zap nie powiedzie się, złośliwy kod może ostatecznie uruchomić na urządzeniu i pozostawić konta naruszone. To zapytanie sprawdza działanie logowania wykonane przez adresatów wiadomości e-mail, które nie zostały pomyślnie rozwiązane przez zap.

EmailPostDeliveryEvents
| where Timestamp > ago(7d)
//List malicious emails that were not zapped successfully
| where ActionType has "ZAP" and ActionResult == "Error"
| project ZapTime = Timestamp, ActionType, NetworkMessageId , RecipientEmailAddress
//Get logon activity of recipients using RecipientEmailAddress and AccountUpn
| join kind=inner IdentityLogonEvents on $left.RecipientEmailAddress == $right.AccountUpn
| where Timestamp between ((ZapTime-24h) .. (ZapTime+24h))
//Show only pertinent info, such as account name, the app or service, protocol, the target device, and type of logon
| project ZapTime, ActionType, NetworkMessageId , RecipientEmailAddress, AccountUpn,
LogonTime = Timestamp, AccountDisplayName, Application, Protocol, DeviceName, LogonType

Pobieranie prób logowania przez konta domeny objęte kradzieżą poświadczeń

To zapytanie najpierw identyfikuje wszystkie alerty dostępu do poświadczeń w AlertInfo tabeli. Następnie scala lub łączy tabelę AlertEvidence , która analizuje nazwy kont docelowych i filtry tylko dla kont przyłączonych do domeny. Na koniec sprawdza tabelę IdentityLogonEvents , aby uzyskać wszystkie działania logowania przez przyłączone do domeny konta docelowe.

AlertInfo
| where Timestamp > ago(30d)
//Get all credential access alerts
| where Category == "CredentialAccess"
//Get more info from AlertEvidence table to get the SID of the target accounts
| join AlertEvidence on AlertId
| extend IsJoined=(parse_json(AdditionalFields).Account.IsDomainJoined)
| extend TargetAccountSid=tostring(parse_json(AdditionalFields).Account.Sid)
//Filter for domain-joined accounts only
| where IsJoined has "true"
//Merge with IdentityLogonEvents to get all logon attempts by the potentially compromised target accounts
| join kind=inner IdentityLogonEvents on $left.TargetAccountSid == $right.AccountSid
//Show only pertinent info, such as account name, the app or service, protocol, the accessed device, and type of logon
| project AccountDisplayName, TargetAccountSid, Application, Protocol, DeviceName, LogonType

Sprawdzanie, czy na urządzeniach znajdują się pliki od znanego złośliwego nadawcy

Zakładając, że znasz adres e-mail wysyłający złośliwe pliki (MaliciousSender@example.com), możesz uruchomić to zapytanie, aby ustalić, czy pliki tego nadawcy istnieją na urządzeniach. Za pomocą tego zapytania możesz na przykład zidentyfikować urządzenia, których dotyczy kampania dystrybucji złośliwego oprogramowania.

EmailAttachmentInfo
| where SenderFromAddress =~ "MaliciousSender@example.com"
//Get emails with attachments identified by a SHA-256
| where isnotempty(SHA256)
| join (
//Check devices for any activity involving the attachments
DeviceFileEvents
| project FileName, SHA256, DeviceName, DeviceId
) on SHA256
| project Timestamp, FileName , SHA256, DeviceName, DeviceId,  NetworkMessageId, SenderFromAddress, RecipientEmailAddress

Przeglądanie prób logowania po otrzymaniu złośliwych wiadomości e-mail

To zapytanie znajduje 10 najnowszych logów wykonywanych przez adresatów wiadomości e-mail w ciągu 30 minut od otrzymania znanych złośliwych wiadomości e-mail. To zapytanie umożliwia sprawdzenie, czy konta adresatów wiadomości e-mail zostały naruszone.

//Define new table for malicious emails
let MaliciousEmails=EmailEvents
//List emails detected as malware, getting only pertinent columns
| where ThreatTypes has "Malware"
| project TimeEmail = Timestamp, Subject, SenderFromAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0]);
MaliciousEmails
| join (
//Merge malicious emails with logon events to find logons by recipients
IdentityLogonEvents
| project LogonTime = Timestamp, AccountName, DeviceName
) on AccountName
//Check only logons within 30 minutes of receipt of an email
| where (LogonTime - TimeEmail) between (0min.. 30min)
| take 10

Przejrzyj działania programu PowerShell po otrzymaniu wiadomości e-mail od znanego złośliwego nadawcy

Złośliwe wiadomości e-mail często zawierają dokumenty i inne specjalnie spreparowane załączniki, które uruchamiają polecenia programu PowerShell w celu dostarczenia dodatkowych ładunków. Jeśli wiesz, że wiadomości e-mail pochodzą od znanego złośliwego nadawcy (MaliciousSender@example.com), możesz użyć tego zapytania do wyświetlenia listy i przejrzenia działań programu PowerShell, które wystąpiły w ciągu 30 minut po odebraniu wiadomości e-mail od nadawcy.

//Define new table for emails from specific sender
let EmailsFromBadSender=EmailEvents
| where SenderFromAddress =~ "MaliciousSender@example.com"
| project TimeEmail = Timestamp, Subject, SenderFromAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0]);
//Merge emails from sender with process-related events on devices
EmailsFromBadSender
| join (
DeviceProcessEvents
//Look for PowerShell activity
| where FileName =~ "powershell.exe"
//Add line below to check only events initiated by Outlook
//| where InitiatingProcessParentFileName =~ "outlook.exe"
| project TimeProc = Timestamp, AccountName, DeviceName, InitiatingProcessParentFileName, InitiatingProcessFileName, FileName, ProcessCommandLine
) on AccountName
//Check only PowerShell activities within 30 minutes of receipt of an email
| where (TimeProc - TimeEmail) between (0min.. 30min)

Porada

Chcesz dowiedzieć się więcej? Zaangażuj się w społeczność rozwiązań zabezpieczających firmy Microsoft w naszej społeczności technicznej Społeczność techniczna usługi Microsoft Defender XDR.