Berburu ancaman di seluruh perangkat, email, aplikasi, dan identitas

Perburuan tingkat lanjut di Microsoft Defender memungkinkan Anda untuk secara proaktif berburu ancaman di:

  • Perangkat yang dikelola oleh Microsoft Defender untuk Titik Akhir
  • Email yang diproses oleh Microsoft 365
  • Aktivitas aplikasi cloud, peristiwa autentikasi, dan aktivitas pengontrol domain yang dilacak oleh Microsoft Defender for Cloud Apps dan Microsoft Defender untuk Identitas

Dengan visibilitas di seluruh perangkat, email, aplikasi cloud, peristiwa autentikasi, dan aktivitas pengendali domain, Anda dapat dengan cepat memburu ancaman yang melintasi bagian jaringan Anda, termasuk gangguan canggih yang tiba di email atau web, meningkatkan hak istimewa lokal, memperoleh kredensial domain istimewa, dan bergerak secara lateral di seluruh perangkat Anda.

Berikut adalah teknik umum dan kueri sampel berdasarkan berbagai skenario perburuan yang dapat membantu Anda menjelajahi bagaimana Anda dapat membuat kueri saat berburu ancaman canggih tersebut.

Dapatkan informasi entitas

Gunakan kueri ini untuk mempelajari bagaimana Anda bisa dengan cepat mendapatkan informasi tentang akun pengguna, perangkat, dan file.

Mendapatkan akun pengguna dari alamat email

Saat membuat kueri di seluruh tabel yang mencakup perangkat dan email, Anda mungkin perlu mendapatkan nama akun pengguna dari alamat email pengirim atau penerima. Anda umumnya dapat melakukan ini untuk alamat penerima atau pengirim menggunakan host lokal dari alamat email.

Dalam cuplikan di bawah ini, kami menggunakan fungsi kusto tostring() untuk mengekstrak host lokal tepat sebelum @ dari alamat email penerima di kolom RecipientEmailAddress. Cuplikan ini mengekstrak nama akun agar RecipientEmailAddress Anda dapat menggunakannya kembali dalam gabungan dengan data identitas atau perangkat:

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

Contoh kueri berikut menggunakan cuplikan ekstraksi nama akun ini dalam EmailEvents kueri:

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

Menggabungkan tabel IdentityInfo

Anda bisa mendapatkan nama akun dan informasi akun lainnya dengan menggabungkan atau bergabung dengan tabel IdentityInfo. Kueri di bawah ini mendapatkan daftar deteksi pengelabuan dan malware dari tabel EmailEvents lalu menggabungkan informasi tersebut IdentityInfo dengan tabel untuk mendapatkan informasi terperinci tentang setiap penerima.

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

Tonton video ini tentang menggabungkan tabel dengan Bahasa Kueri Kusto untuk mempelajari lebih lanjut.

Mendapatkan informasi perangkat

Skema perburuan tingkat lanjut menyediakan informasi perangkat yang luas dalam berbagai tabel. Misalnya, tabel DeviceInfo menyediakan informasi perangkat yang komprehensif berdasarkan data peristiwa yang dikumpulkan secara teratur. Kueri ini menggunakan DeviceInfo tabel untuk memeriksa apakah pengguna yang berpotensi terkompromi (<account-name>) telah masuk ke perangkat mana pun dan kemudian mencantumkan peringatan yang telah dipicu pada perangkat yang telah diakses oleh pengguna.

Tip

Kueri ini menggunakan kind=inner untuk menetapkan inner join, yang mencegah deduplikasi nilai di sisi kiri untuk DeviceId.

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

Dapatkan informasi kejadian file

Gunakan kueri berikut untuk mendapatkan informasi tentang peristiwa terkait file.

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

Mendapatkan informasi peristiwa jaringan

Gunakan kueri berikut untuk mendapatkan informasi tentang peristiwa terkait jaringan.

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

Dapatkan informasi versi agen perangkat

Gunakan kueri berikut untuk mendapatkan versi agen yang berjalan di perangkat.

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

Contoh kueri untuk perangkat macOS

Gunakan contoh kueri berikut untuk melihat semua perangkat yang menjalankan macOS dengan versi yang lebih lama dari 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

Mendapatkan info status perangkat

Gunakan kueri berikut untuk memeriksa apakah perangkat sudah melalui proses onboarding dengan mengkueri tabel DeviceInfo dan memfilter berdasarkan OnboardingStatus.

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

Skenario berburu

Contoh kueri berikut membahas investigasi perburuan ancaman umum yang mencakup email, identitas, dan data perangkat.

Mencantumkan aktivitas masuk pengguna yang menerima email yang tidak berhasil di-zapp

Penghapusan otomatis zero-hour (ZAP) menangani email berbahaya setelah diterima. Jika ZAP gagal, kode berbahaya mungkin akan berjalan di perangkat penerima dan meninggalkan akun yang terbocor. Kueri ini memeriksa aktivitas masuk yang dibuat oleh penerima email yang tidak berhasil ditangani oleh 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

Dapatkan upaya log masuk oleh akun domain yang ditargetkan oleh pencurian kredensial

Kueri ini pertama-tama mengidentifikasi semua pemberitahuan akses kredensial dalam AlertInfo tabel. Kemudian, sistem menggabungkan atau mengaitkan tabel AlertEvidence, yang diurai untuk mendapatkan nama akun yang ditargetkan dan difilter hanya untuk akun yang tergabung ke domain. Terakhir, memeriksa tabel IdentityLogonEvents untuk mendapatkan semua aktivitas logon oleh akun target yang tergabung ke domain.

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

Periksa apakah file dari pengirim berbahaya yang diketahui ada di perangkat Anda

Dengan asumsi Anda mengetahui alamat email yang mengirim file berbahaya (MaliciousSender@example.com), Anda dapat menjalankan kueri ini untuk menentukan apakah file dari pengirim ini ada di perangkat Anda. Anda dapat menggunakan kueri ini, misalnya, untuk mengidentifikasi perangkat yang terpengaruh oleh kampanye distribusi malware.

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

Tinjau upaya masuk setelah menerima email berbahaya

Kueri ini menemukan 10 logon terbaru yang dilakukan oleh penerima email dalam waktu 30 menit setelah mereka menerima email berbahaya yang diketahui. Anda dapat menggunakan kueri ini untuk memeriksa apakah akun penerima email telah disusupi.

//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

Tinjau aktivitas PowerShell setelah menerima email dari pengirim berbahaya yang diketahui

Email berbahaya sering berisi dokumen dan lampiran khusus lainnya yang menjalankan perintah PowerShell untuk mengirimkan payload tambahan. Jika Anda mengetahui email yang berasal dari pengirim berbahaya yang diketahui (MaliciousSender@example.com), Anda dapat menggunakan kueri ini untuk mencantumkan dan meninjau aktivitas PowerShell yang terjadi dalam waktu 30 menit setelah email diterima dari pengirim.

//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)

Tip

Apakah Anda ingin mempelajari lebih lanjut? Terlibatlah dengan komunitas Microsoft Security di Komunitas Teknologi kami: Microsoft Defender XDR Tech Community.