共用方式為


惡意交換連接器的警示分類

適用於:

  • Microsoft Defender XDR

威脅執行者會使用遭入侵的交換連接器,藉由偽裝合法的電子郵件,大量傳送垃圾郵件和網路釣魚電子郵件給不知情的收件者。 由於連接器遭到入侵,因此收件者通常會信任電子郵件。 這類網路釣魚電子郵件是網路釣魚活動的常見媒介,而商務電子郵件入侵 (BEC) 案例。 因此,這類電子郵件必須受到高度監視,因為收件者成功入侵的可能性很高。

此劇本有助於調查惡意執行者設定/部署惡意連接器的實例。 因此,他們會採取必要的步驟來補救攻擊,並降低其所造成的安全性風險。 劇本有助於將警示分類為真 (TP) 或誤判 (FP) 。 如果警示為 TP,劇本會列出補救攻擊所需的建議動作。 此劇本適用於檢閱、處理/管理及評分警示的安全性小組。

以下是使用劇本的結果:

  • 判斷警示為惡意 (TP) 或良性 (FP) 。
  • 如果為惡意,請從環境中補救/移除惡意連接器。

Exchange 連接器

Exchange 連接器是自訂電子郵件流向 Microsoft 365 或 Office 365 組織的指示集合。 通常大部分的 Microsoft 365 和 Office 365 組織都不需要一般郵件流程的連接器。

連接器可用來在遠端電子郵件系統與 O365) 或 O365 Office 365 (與內部部署電子郵件系統之間路由傳送郵件流量。

惡意 Exchange 連接器

攻擊者可能會入侵現有的交換連接器或危害系統管理員,並藉由傳送網路釣魚或垃圾郵件/大量電子郵件來設定新的連接器。

查看電子郵件流量及其標頭時,可以找到惡意連接器的一般指標。 例如,從 P1 中的連接器節點觀察到電子郵件流量時, (標頭髮件人) 和 P2 (信封寄件者) 寄件者位址,以及寄件者的 AccountObjectId 上沒有任何資訊。

此警示會嘗試識別這類郵件流程實例,其中郵件傳送活動似乎可疑,因此無法在寄件者上新增相關信息。

劇本工作流程

您必須遵循順序來識別惡意交換連接器:

  • 識別哪些帳戶正在傳送電子郵件:
    • 帳戶是否似乎遭到入侵?
  • 識別要檢查的電子郵件上的連接器轉送:
    • 連接器是否應該傳送大量電子郵件?
    • 連接器是最近修改或建立的嗎?
  • 電子郵件是否會傳送至內部電子郵件位址?
    • 電子郵件是否會傳送到外部位址 (噴水和垃圾郵件) ?
    • 電子郵件是否流向屬於客戶或廠商的外部位址, (供應鏈類型攻擊) ?
  • 檢查FROM標頭和信封寄件者網域是否相同或不同。

調查惡意連接器

本節說明調查警示並補救因此事件而造成的安全性風險的步驟。

  • 判斷連接器是否示範惡意 (惡意) 行為。
    • 尋找指出異常郵件流量的事件,並識別最近是否新增了任何新的 Exchange 連接器。
      • 針對觀察到的郵件流量,請檢查帳戶是否要對不尋常的郵件流量負責,以判斷電子郵件帳戶是否遭到入侵。
    • 尋找包含惡意構件的郵件內容 (不正確的連結/附件) 。
    • 尋找不屬於您環境的網域。
  • 判斷電子郵件帳戶未遭入侵。 識別最近在環境中新增或修改的連接器。
  • 尋找:
    • P1 寄件者中的域值 (電子郵件頭髮件人) 和 P2 寄件者 (信封寄件者) ,並檢查是否有不相符的情況。
    • SenderObjectId 欄位中的空白值。
  • 使用遙測數據來注意:
    • NetworkMessageId (從惡意連接器傳送的電子郵件訊息識別碼) 。
    • 連接器建立日期、上次修改日期和上次修改日期。
    • 從中觀察到電子郵件流量之連接器的IP位址。

進階搜捕查詢

您可以使用 進階搜捕 查詢來收集警示的相關信息,並判斷活動是否可疑。

請確定您可以存取下列資料表:

資料表名稱 描述
EmailEvents 包含與電子郵件流程相關的資訊。
CloudAppEvents 包含用戶活動的稽核記錄。
IdentityLogonEvents 包含所有使用者的登入資訊。

參考

要參考的 AHQs 範例:

  • 執行此 KQL 以檢查新連接器的建立。

    //modify timeWindow to modify the lookback.
    let timeWindow = now(-7d); let timeNow = now();
    CloudAppEvents
    | where Timestamp between (timeWindow .. timeNow)
    | where isnotempty(AccountObjectId)
    | where ActionType == "New-InboundConnector"
    | mvexpand property = RawEventData.Parameters
    | extend ConnectorName = iff(property.Name == "Name", property.Value, ""), 
    IsEnabled = iff((property.Name == "Enabled" and property.Value == "True"), 
    true, false)
    | where isnotempty( ConnectorName) or IsEnabled
    | project-reorder ConnectorName, IsEnabled
    
  • 執行此 KQL,以檢查警示連接器中警示前後時間範圍的事件量。

    //modify timeWindow to modify the lookback.
    let timeWindow = now(-7d); let timeNow = now();
    let connectorOperations = pack_array("Set-OutboundConnector", 
    "New-OutboundConnector", "Set-InboundConnector", "New-InboundConnector");
    let mailThreshold = 100; //define threshold for inspection and filtering
    let myConnector= //use this code block to specify relevant connector(s)
    CloudAppEvents
    | where Timestamp between (timeWindow .. timeNow)
    | where ActionType has_any (connectorOperations)
    | mv-expand property = RawEventData.Parameters
    | where property.Name == "Name"
    | summarize by ConnectorName=tostring(property.Value)
    ;
    EmailEvents
    | where isnotempty( toscalar (myConnector))
    | where Timestamp between (timeWindow .. timeNow)
    | where isnotempty( SenderObjectId) and isnotempty( Connectors)
    | where Connectors in (toscalar (myConnector))
    | summarize MailCount = dcount(NetworkMessageId) by Connectors, 
    SenderObjectId, bin(Timestamp, 1h)
    | where MailCount >= mailThreshold
    
  • 執行此 KQL 以檢查是否要將電子郵件傳送至外部網域。

    //modify timeWindow to modify the lookback.
    let timeWindow = now(-7d); let timeNow = now();
    EmailEvents
    | where Timestamp between (timeWindow .. timeNow)
    | where isnotempty( SenderObjectId)
    | extend RecipientDomain= split(RecipientEmailAddress, "@")[1]
    | where (SenderFromDomain != RecipientDomain) or (SenderMailFromDomain 
    != RecipientDomain)
    | where EmailDirection !in ("Intra-org" , "Inbound") //comment this line to 
    look across all mailflow directions
    
    • 如果傳送至外部網域,則環境中的其他人員會傳送類似的電子郵件 (如果收件者是未知的網域) ,則可能表示遭入侵的使用者。

      //modify timeWindow to modify the lookback.
      let timeWindow = now(-7d); let timeNow = now();
      let countThreshold= 100; //modify count threshold accordingly 
      EmailEvents
      | where Timestamp between (timeWindow .. timeNow)
      | where isnotempty( SenderObjectId)
      | extend RecipientDomain= split(RecipientEmailAddress, "@")[1]
      | where (SenderFromDomain != RecipientDomain) or (SenderMailFromDomain 
      != RecipientDomain)
      | where EmailDirection !in ("Intra-org" , "Inbound")
      | summarize MailCount= dcount(NetworkMessageId) by SenderObjectId, 
      SenderFromAddress, SenderMailFromAddress , bin(Timestamp, 1h)
      | where MailCount > countThreshold
      
      • 檢查郵件內容是否有不良行為
      • 查看電子郵件中的 URL 或具有附件的電子郵件。

AHQ 考慮

以下是保護收件者免於遭受惡意攻擊的 AHQ 考慮。

  • 檢查經常從不尋常的位置管理連接器的系統管理員登入 (產生統計數據,並排除) 觀察到最成功登入的位置。

  • 尋找來自異常位置的登入失敗。

    //modify timeWindow to modify the lookback.
    let timeWindow = now(-7d); let timeNow = now();
    let logonFail= materialize (
    IdentityLogonEvents
    | where Timestamp between (timeWindow .. timeNow)
    | where isnotempty(AccountObjectId)
    | where Application != "Active Directory"
    | where ActionType == "LogonFailed"
    | where ISP != "Microsoft Azure"
    | summarize failedLogonCount=count(), LatestTime = max(Timestamp), 
    EarliestTime = min(Timestamp) by AccountObjectId, Application, ISP, 
    CountryCode, bin(Timestamp, 60s)
    | where failedLogonCount > 100);
    // let hasLogonFails = isnotempty(toscalar (logonFail));
    let logonFailUsers = materialize ( logonFail | distinct AccountObjectId | 
    take 100);
    let hasLogonFails = isnotempty(toscalar (logonFailUsers));
    let logonSuccess=
    IdentityLogonEvents
    | where hasLogonFails
    | where Timestamp between (timeWindow .. timeNow)
    | where AccountObjectId in (logonFailUsers)
    | where Application != "Active Directory"
    | where ISP != "Microsoft Azure"
    | where ActionType == "LogonSuccess"
    | project SuccessTime= Timestamp, ReportId, AccountUpn, AccountObjectId, 
    ISP, CountryCode, Application;
    logonFail
    | join kind = innerunique logonSuccess on AccountObjectId, ISP, Application
    | where SuccessTime between (LatestTime .. (LatestTime + 10s))
    | summarize arg_min(SuccessTime, ReportId), EarliestFailedTime=min
    (EarliestTime), LatestFailedTime=max(LatestTime), failedLogonCount=
    take_any(failedLogonCount), SuccessLogonCount=count(), ISPSet=
    make_set(ISP), CountrySet=make_set(CountryCode), AppSet=make_set
    (Application) by AccountObjectId, AccountUpn
    | project-rename Timestamp=SuccessTime
    

一旦判斷觀察到的警示活動是 TP 的一部分,請分類這些警示並執行下列動作:

  • 停用或移除發現為惡意的連接器。
  • 如果系統管理員帳戶遭到入侵,請重設系統管理員的帳戶認證。 此外,針對遭入侵的系統管理員帳戶停用/撤銷令牌,併為所有系統管理員帳戶啟用多重要素驗證。
  • 尋找系統管理員所執行的可疑活動。
  • 檢查環境中其他連接器的其他可疑活動。

另請參閱

提示

想要深入了解? Engage 技術社群中的 Microsoft 安全性社群:Microsoft Defender 全面偵測回應 技術社群。