在本系列文章的第一篇,我們介紹了如何監控和分析全網(wǎng)環(huán)境的網(wǎng)絡(luò )日志,并借助網(wǎng)絡(luò )觀(guān)察程序搜集到的各個(gè)網(wǎng)絡(luò )安全組上的日志,再利用日志分析工具(Log Analytics)從諸如可疑 IP 的訪(fǎng)問(wèn)、每日流量的觀(guān)察、內部網(wǎng)段互訪(fǎng)等維度來(lái)幫助企業(yè)的安全團隊定位存在風(fēng)險的虛擬機。錯過(guò)這篇文章的同學(xué),可以這里回看。

本篇將在此基礎上深入一步,在利用第一篇所介紹方法找出的高危虛擬機為目標的基礎上,我們將通過(guò)終端服務(wù)器日志的具體行為,利用 Azure Defender(原名 Azure Security Center)或Microsoft Defender for Endpoint(原名 Microsoft Defender ATP),根據 MITRE ATT&CK 所定義的,以及微軟安全團隊總結的一些與當年威脅相關(guān)的動(dòng)作,對應到具體的 SysLog 或 Windows Events 中的日志,從而監控異常情況,并最終確定機器是否存在安全隱患。
云端萬(wàn)事通—掌控全局動(dòng)態(tài)

首先我們從第一個(gè)開(kāi)箱即用的維度出發(fā),通過(guò) Denied Flow 可以看到,在業(yè)務(wù)低谷時(shí)段,也會(huì )觸發(fā)很高的 Denied Flows。隨后點(diǎn)擊右上角,可以查看當前所用的查詢(xún)語(yǔ)句,并在此基礎上做進(jìn)一步的篩選和深入調查。

AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog"
| summarize TotalFlows = count() by bin(TimeGenerated, 1h), FlowStatus_s
| extend FlowStatus=iff(FlowStatus_s == 'D', 'Denied Flows', 'Allowed Flows')
| project TimeGenerated, FlowStatus, TotalFlows
可以看到上述維度就是將表“AzureNetworkAnalytics_CL”按每一個(gè)小時(shí)為單位,加總了 FlowStatus,然后按照時(shí)間、流量狀態(tài)和總數繪制了上述圖表。
按照上述圖表我們想查看拒絕流量頂峰的那一個(gè)小時(shí)的流量具體情況,既在 UTC 2021-01-31T01:00:00Z 這個(gè)小時(shí)中,這些 Deny Flow 和 Allow Flow 具體落在了哪些服務(wù)器上。
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog"
| where FlowStatus_s == "D"
| where TimeGenerated between (todatetime('2021-01-31T00:59:00Z') todatetime('2021-01-31T02:00:00Z'))
| summarize TotalFlows = count() by bin(TimeGenerated,1h), VM_s, FlowStatus_s
//| extend FlowStatus=iff(FlowStatus_s == 'D', 'Denied Flows', 'Allowed Flows')
| project TimeGenerated, TotalFlows, VM_s, FlowStatus_s
因此我們在上層篩選維度上增加了一個(gè)流量為拒絕流量以及高峰期的那一個(gè)小時(shí)的兩條命令,而在加總的維度中,進(jìn)一步擴充了一個(gè)服務(wù)器的維度,最后我們用時(shí)2秒就得到了在高峰期那個(gè)小時(shí)內,按照拒絕流量總和排序的每臺服務(wù)器的排名表。

由此可以定義上述四臺為高風(fēng)險服務(wù)器,當然從網(wǎng)絡(luò )端還可以進(jìn)一步看下這些流量具體落到了哪幾個(gè)端口,這些流量從何而來(lái),是否存在來(lái)自于可疑 IP 的流量訪(fǎng)問(wèn)。
只需要在上述的搜索語(yǔ)句中,篩選到對應的虛擬機(用 VM_s,DestIP_s),然后添加 DestPort_d 字段的呈現,就可以按照時(shí)間逐次查看或加總查看端口在給定時(shí)間內被攻擊的密度。
在模擬環(huán)境中,即可根據模型默認給出的一個(gè)攻擊量變化,即在11月3號的到4號幾乎翻倍的攻擊數量,進(jìn)行進(jìn)一步分析:

利用上述查詢(xún)語(yǔ)句,找到攻擊者的攻擊目標和方式的變化,攻擊者從原先的平均攻擊的方式,在四號把攻擊資源集中起來(lái),針對兩臺機器 middleware2 datahub 兩臺機器,進(jìn)行1秒100次的攻擊。

之后對這兩臺機器做深入調查,看攻擊的落點(diǎn)在哪些端口上,是什么密度,Allow Flow 在發(fā)生問(wèn)題的時(shí)間段有沒(méi)有上升,Allow Flow 去了哪些端口等:


江湖神算子—全面剖析局勢
從上述攻擊中可以看到,可疑 IP 也有攻擊的參與,而這些 IP 的參與可能蘊含著(zhù)更強大的攻擊手段或者更高級的攻擊方式,所以第二個(gè)維度上,我們就需要從可疑 IP 出發(fā),來(lái)看他的攻擊落點(diǎn)在哪些地方:

還是點(diǎn)擊面板上的查詢(xún)語(yǔ)句的按鈕,進(jìn)入到查詢(xún)頁(yè),具體來(lái)看受到可疑 IP 攻擊的機器的落點(diǎn)在哪里:

從被攻擊最多的資源里,選擇某臺機器的 IP,進(jìn)行深入調查,這里添加一個(gè)篩選字段 AllowedInFlow,來(lái)看 IP 是否有攻入的痕跡,可以看到有6臺機器都與可疑 IP 有1000+以上的流量條目。這里在查詢(xún)語(yǔ)句的顯示上,利用 extend 定義了一個(gè)新參數 CountryOrRegion,并和 SrcIP_s 合并成了一個(gè)新的參數 IPAdress:
AzureNetworkAnalytics_CL
| where SubType_s == 'FlowLog' and FASchemaVersion_s == '2' FlowType_s == 'MaliciousFlow'
| extend CountryOrRegion = iif(FlowType_s == 'AzurePublic', AzureRegion_s, Country_s)
| where FlowDirection_s == "I"
| summarize FlowCount = sum(FlowCount_d), AllowedInFlows = sum(AllowedInFlows_d), DeniedInFlows = sum(DeniedInFlows_d) by IPAdress = strcat(SrcIP_s, ' (', CountryOrRegion, ')'), DestIP_s, VM_s
| sort by AllowedInFlows desc

這里選擇10.195.12.17,查看具體攻擊的落點(diǎn)到了哪個(gè)端口上,這里選取攻擊相對集中的時(shí)間段,按照 DestPort_d 做匯總,考慮到攻擊的僵尸網(wǎng)絡(luò )不一定全被定義成可疑 IP,所以去掉了 FlowType_s 的篩選:

可以看到10.195.12.17這臺機器的5432端口收到了短時(shí)間內的集中攻擊,推測是 PostgreSQL 的注入攻擊方式在嘗試弱口令的爆破方式。之后的進(jìn)一步分析就需要開(kāi)啟安全中心,來(lái)搜集虛擬機上的 Syslog 或者 Windows Events 是否有相應的入侵痕跡來(lái)診斷機器是否被攻破。
懸絲診脈—定位感染面
從可疑 IP 的動(dòng)向其實(shí)就很容易想到一個(gè)極具危險性的表現,就是如果環(huán)境中的機器存在出站到可疑 IP 的 Flow,那就很能說(shuō)明機器存在問(wèn)題,這時(shí)候根據常規的攻擊鏈,我們就還勢必要考慮這些機器在內部的橫向移動(dòng)的痕跡。

首先我們先來(lái)發(fā)現環(huán)境內的機器出站到可疑 IP 的痕跡:
//list all the activities of malicioius IPs
AzureNetworkAnalytics_CL
| where SubType_s == 'FlowLog' and FASchemaVersion_s == '2' and FlowType_s == 'MaliciousFlow' and FlowDirection_s == 'O'
| project TimeGenerated, SrcIP_s, VM_s, SourcePortRange_s, DestIP_s, DestPort_d, FlowDirection_s, AllowedOutFlows_d, DeniedOutFlows_d

這里就抓到的內部的10.195.5.4這臺機器到很多可疑 IP 的出站流量痕跡,很明顯,這臺虛擬機我們需要開(kāi)啟安全中心進(jìn)行保護,鑒于這臺機器是 Windows 機器,也建議從安全角度安裝一個(gè)叫做 Microsoft Antimalware 的擴展:

可以看到,這臺虛擬機要去不同的可疑 IP 下載 vercheck.ps1 這個(gè)腳本,由于一直失敗(Antimalware攔截),所以會(huì )同時(shí)發(fā)起去不同 IP 的下載動(dòng)作(會(huì )在后續的單機調查中具體展開(kāi)),于此同時(shí),我們也可以從網(wǎng)絡(luò )端,從時(shí)間維度或者 IP 維度來(lái)查看一些內部橫向調查和移動(dòng)的痕跡:
// see all related activity to a certain malicious IP
AzureNetworkAnalytics_CL
//| where FlowType_s in ('ExternalPublic', 'AzurePublic')
| where * has "124.127.40.202"
| extend Flowtype = FlowType_s, Direction = iff(FlowDirection_s == 'I', 'In', 'Out'), Result = iff(FlowDirection_s == 'I', iff(AllowedInFlows_d > 0, 'Allowed', 'Denied'),iff(AllowedOutFlows_d > 0, 'Allowed', 'Denied')), ['Source IP'] = SrcIP_s, ['Source Public IP'] = split(SrcPublicIPs_s, '|')[0], ['Destination IP'] = DestIP_s, ['Destination Port'] = DestPort_d
| project TimeGenerated, Flowtype, Direction, Result, ['Source IP'], ['Source Public IP'], ['Destination IP'], ['Destination Port']
| sort by TimeGenerated asc
從 IP 維度可以查看當前可疑 IP 在環(huán)境內的移動(dòng)情況。但考慮到可能是一個(gè)網(wǎng)絡(luò )的整體行動(dòng),也可以從時(shí)間維度出發(fā),查看攻擊前后環(huán)境里的波動(dòng)有哪些。例如上述事件的發(fā)生時(shí)間是2020/11/9下午3點(diǎn)的這個(gè)時(shí)間段內,那我們就可以查看2點(diǎn)、3點(diǎn)、4點(diǎn)的時(shí)間內,從我們已經(jīng)定位的暴露的 IP 出去的,所有的 Flow 有哪些,從而對比出正常業(yè)務(wù)運作的動(dòng)態(tài)和被攻擊后的變化。

統計發(fā)現,1點(diǎn)時(shí)共19條出站,2點(diǎn)時(shí)共21條出站,其中內網(wǎng)之間的流量 IntraVNet 各為7、8條。

但到了3點(diǎn),總共的條目就上升到了500多條,主要的增長(cháng)是到 ExternalPublic 的流量。而在 IntraVNet 方面的端口除了上述規律的到達某些 IP 的某些端口外,增加了到某 IP 的3306端口(2次),某 IP 的22端口(2次),共13條。之后4點(diǎn),5點(diǎn)又恢復了20條左右的流量。這些信息都需要進(jìn)一步跟業(yè)務(wù)部門(mén)溝通核對,來(lái)判定這些流量是正常業(yè)務(wù)流量,還是攻擊者留下的痕跡。
總結
以上就是我們從網(wǎng)絡(luò )端對流量深入調查一些維度,通過(guò)從異常流量的起伏,可疑 IP 的流量勘察,以及橫向移動(dòng)的情況,我們可以動(dòng)態(tài)的定位出疑似的暴露機器,從而加入到安全中心的觀(guān)察中,來(lái)判定在當前的幾個(gè)月中是否有被潛伏或者被攻擊的痕跡。更好的對我們的環(huán)境有整體的安全可見(jiàn)性和掌控度。