說起攻防對抗,大家很熟悉的一句話是 “攻擊只需一點即可得手,而防守必須全面設防”。可見多數時候,防守方很被動。當攻防雙方在同一維度活動時,攻擊者會有很多途徑實現攻擊,而防守策略必須不斷的疊加來封堵,往往疲于奔命。在互聯網公司安全團隊有限的人力資源條件下,像殺毒軟件或各色ipsids那樣不斷累加特征碼的方式,需長年累月投入人力且收效未必很好,因此是非常不可取的。
其實,防守方也是有他的優勢的。舉例來說,目前常見的攻擊手法都是針對目標的web或主機系統層面。而整個戰場所在的操作系統以及網絡設備均是防守方的,那么理論上防守方可以在任意維度構建安全產品和制定安全策略,相對來說攻擊行為則處在一個較低維度領域內活動。
常常看到yuange提到安全策略(體系)的完備性,通常安全策略被繞過是由于不夠完備。如何讓策略足夠完備呢,筆者認為基于系統的機制、CGI和協議規范較為有效,比不斷用新規則新策略去為之前的策略打“補丁”靠譜的多。因為一切攻擊與防守所需的基本功能/基本邏輯均來源于此。
從圖1可以看到無論什么入侵行為,其實都對應著更高一維度的系統功能和能力支持。在防守方的主場,不要放著這些有利的條件不用,與攻擊者針尖對麥芒的在低維度對抗,猶如遭受了《三體》中的“降維攻擊”是不明智的。
梳理清楚了“webshell上傳”這個場景在各維度的技術細節,如何制定不易繞過的策略就相對容易了。
◆網絡層:檢測符合RFC1867標準的上傳CGI行為
無論什么漏洞和那種猥瑣的攻擊,他總是要符合HTTP協議的。那從高維度的HTTP協議入手,便不用去考慮諸如”XXeditor上傳漏洞”、“XXCMS上傳漏洞“的防護規則了。
◆CGI層面:檢測fopen等API事件是否在創建CGI文件
無論什么CGI漏洞導致的上傳,漏洞代碼幾乎都用有fopen等寫文件的操作。
◆系統用戶態:檢測系統層面的API調用行為是否在創建CGI文件
除非websvr直接是root啟動且能加載任意代碼,否則攻擊者幾乎很難繞過檢測了。
◆系統內核態:通過內核inotify事件來發現CGI創建行為
在這一層我們甚至不擔心root啟動的websvr加載惡意代碼帶來的可能的逃逸行為,至少在完成后續的攻擊之前,創建CGI文件的可疑行為必定被發現。
越高維度的策略,越不易被繞過,聯動起來,則更為精準。以上策略檢測模型匯總起來。
2個木馬檢測案例
前面看到,通常供攻擊者施展的漏洞利用或攻擊渠道能做的事情通常畢竟有限,在防守方在高一維度對事件的觀察與檢測讓攻擊方很難逃逸。而對入侵漏洞場景的細致分析,以及入侵場景關鍵環節的提煉則是策略制定的關鍵,否則同樣會陷入不斷為舊策略打補丁的尷尬境地。
要解決一個入侵場景,在制定策略之前需要做好足夠的分析并提煉其最核心的技術點,貼近此特征制定策略效果就非常好,且不易被繞過。下面選擇2個linux系統常見的木馬場景和案例來說明。
熟悉惡意代碼取證的同學應該清楚常見的反連木馬,‘核心’代碼部分一般是這樣的:
connect(sockfd, (struct sockaddr *)&cliaddr, sizeof(struct sockaddr));
dup2(sockfd, 1);
dup2(sockfd, 2);
execve("/bin/sh","sh",envp);
那防守方的檢測就十分簡單,通常一個bash進程是不會有網絡連接的,所以檢測策略是bash的 STDIN/STDOUT綁定了socket則為木馬。
有一些老練的木馬代碼則不會那么偷懶,譬如mod_rootme。為了復用apache的監聽端口以及獲得root權限的shell,mod_rootme在代碼邏輯上作了很多精巧的變換組合,使得檢測不能像普通木馬一樣方便。TSRC官微曾經有分享過如何發現mod_rootme這類極為隱蔽的后門(http://t.qq.com/p/t/330573116082464)。
但是,再狡猾的后門,他也有異于系統正常行為的地方,比如mod_rootme會存在多于2個root權限的httpd進程、apache進程開啟多個管道并且使用了偽終端(詳見微博),根據異常行為建立策略是相比簽名特征更為靠譜的檢測手段。
總結
安全設備與檢測系統布置在合適的維度可以使得防守處于非常有利的位置,同時盡可能的提煉入侵場景的關鍵環節,則是檢測思想的精髓。
筆者認為甲方安全團隊應該盡量避免針對每一個漏洞和黑客攻擊手法制定個性化防護的策略,那樣看似大而全,實際卻難以窮舉同類場景并難以維護。
針對自身業務特點,分析其主要風險,針對性的制定策略。將有限的資源用于對抗清晰的風險場景,才是更為可取且有效率的事。