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 DeviceId
elementu .
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)
Tematy pokrewne
- Omówienie zaawansowanego wyszukiwania zagrożeń
- Nauka języka zapytań
- Praca z wynikami zapytań
- Używanie zapytań udostępnionych
- Analiza schematu
- Stosowanie najlepszych rozwiązań dla zapytań
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.