一直認(rèn)為日志分析的最終奧義是取證與預(yù)測——講述完整的已發(fā)生,、正在發(fā)生的,、將來會發(fā)生的攻擊故事(何時(shí).何地.何人.何事.何故)。 SUPort=43958&SUUser=LocalAdministrator&SUPass=xxx&SUCommand=net user spider spider %2Fadd %26 net localgroup administrators spider %2Fadd&user=spider&password=spider&part=C%3A%5C%5C whirlwind=%40eval%01%28base64_decode%28%24_POST%5Bz0%5D%29%29%3B&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw%3D%3
n3b31d1=cGhwaW5mbygpOw== getpwd=admin&go=edit&godir=%2Fhtdocs%2Fbbs%2Fconfig%2F&govar=config_global.php senv=eval(\'Ex\'%26cHr(101)%26\'cute(\'\'Server.ScriptTimeout%3D3600:On Error Resume Next:Function bd%28byVal s%29%3AFor i%3D1 To Len%28s%29 Step 2%3Ac%3DMid%28s%2Ci%2C2%29%3AIf IsNumeric%28Mid%28s%2Ci%2C1%29%29 Then%3AExecute%28%22%22%22%22bd%3Dbd%26chr%28%26H%22%22%22%22%26c%26%22%22%22%22%29%22%22%22%22%29%3AElse%3AExecute%28%22%22%22%22bd%3Dbd%26chr%28%26H%22%22%22%22%26c%26Mid%28s%2Ci%2B2%2C2%29%26%22%22%22%22%29%22%22%22%22%29%3Ai%3Di%2B2%3AEnd If%22%22%26chr%2810%29%26%22%22Next%3AEnd Function:Response.Write(\'\'\'\'->|\'\'\'\'):Ex\'%26cHr(101)%26\'cute(\'\'\'\'On Error Resume Next:\'\'\'\'%26bd(\'\'\'\'526573706F6E73652E5772697465282268616F72656E2229\'\'\'\')):Response.Write(\'\'\'\'|<-\'\'\'\'):Response.End\'\')\')'
但在日志分析中只能當(dāng)成輔助特征,有兩個(gè)原因: a. 日志字段不全的問題,,無法使用payload b. 攻擊者很多時(shí)候只是在做webshell存活性探測,,不會產(chǎn)生攻擊特征,或者將會攻擊payload進(jìn)行加密處理來繞過特征檢測 如下例wso 2.5.1 的payload為a=RC 但也不要輕視了這種直觀的特征,,常規(guī)webshell是占較大比例的,,并且在webshell特別是只有回顯信息無GUI的小馬而言,確認(rèn)上也能起到不容忽視的作用,。 2,、webshell確認(rèn) 想想磚家們們?nèi)绾未_認(rèn)一個(gè)頁面是不是webshell的,打開ta,,看看頁面長啥樣,,也就是請求回放。在進(jìn)行請求回放的時(shí)候,,有兩類問題需要考慮 (1)回放是否會造成破壞性操作,,例如造成站點(diǎn)壓力,(好心辦壞事的例子也是有的,,例如網(wǎng)站速度監(jiān)測應(yīng)用,,cc防御應(yīng)用就會把帶寬小性能小的站點(diǎn)打趴),還有刪除文件,、重置賬戶,、系統(tǒng)重裝(e.g. /setup-config.php)等操作,這也是為啥不直接回放每條訪問日志的原因之一(當(dāng)然整體日志量的大小也是原因之一) (2)回放是否侵犯用戶隱私,,嚴(yán)格的日志存儲規(guī)定不能存儲cookie,,post等會涉及用戶敏感數(shù)據(jù)的字段,或必須做脫敏處理再存儲,,然后由用戶授權(quán)再查看,,當(dāng)然不存儲的更重要的原因是存儲資源的巨大耗費(fèi),。 (p.s.有時(shí)候我會想如何防止安全人員監(jiān)守自盜呢,做掃描器(漏洞識別)的,,特別是全網(wǎng)性質(zhì)的,,有自己的社工庫,有自己的弱點(diǎn)地圖等,,扯遠(yuǎn)了) 對于情況(1)采用限速,,加上回放內(nèi)容過濾,cookie認(rèn)證信息消除,,威脅操作過濾,,對于情況(2)有點(diǎn)微妙 回放的問題解決了,接下來就是根據(jù)回放的響應(yīng)頁面判斷是否是webshell了,。我們先看看響應(yīng)頁面的類型 (1)響應(yīng)頁面不為空(對URL發(fā)起GET請求后,,為一個(gè)有內(nèi)容的頁面) 實(shí)例1 webshell登陸口 align=center> method=post>Password: type=password name=pass> type=submit value='>>'> 登陸框非常非常見(登陸框集錦) 實(shí)例2 上傳文件型webshell <form action='?cmd=up' method='post' enctype='multipart/form-data' name='form1'>
<input type='file' name='file' size='17' class='Input'>
<input type='submit' name='Submit' value='提交' class='Input'>
</form>
實(shí)例3 不需要認(rèn)證的野馬 實(shí)例4 wso webshell a:4:{s:5:'uname';s:81:'Linux li676-178 3.19.1-x86_64-linode53 #1 SMP Tue Mar 10 15:30:28 EDT 2015 x86_64';s:11:'php_version';s:5:'5.6.9';s:11:'wso_version';s:5:'2.5.1';s:8:'safemode';b:0;} (2)響應(yīng)頁面為空 對URL發(fā)起GET請求后,響應(yīng)為空白頁面,,帶payload回放(脫敏處理后的) 檢測方案如下圖所示,,用到了兩個(gè)特征 (5)webshell 行為特征 抽象webshell形成攻擊的關(guān)鍵路徑,將其抽象為數(shù)學(xué)描述的策略庫,,來提取異常 (6)webshell 網(wǎng)頁特征:內(nèi)容/結(jié)構(gòu)/視覺簽名 (更多內(nèi)容可從網(wǎng)頁相似性開始了解) 本人的webshell樣本庫: https://github.com/tanjiti/webshellSample 回顧一下,,我們是根據(jù)特征來檢測webshell,已提到的特征有 (1)webshell 訪問特征(主要特征) ——webshell提取階段 (2)webshell path特征(輔助特征)——webshell提取階段 (3)webshell 時(shí)間特征(輔助特征)——webshell提取階段 (4)webshell Payload特征(輔助特征)——webshell提取階段 (5) webshell 行為特征 ——webshell提取階段 (6)webshell Reponse網(wǎng)頁特征(內(nèi)容特征/結(jié)構(gòu)特征/視覺特征) ——webshell確認(rèn) 最后還有一個(gè)特征——(7)webshell 攻擊關(guān)聯(lián)特征 '如果發(fā)現(xiàn)一個(gè)站點(diǎn)植入webshell,,那遠(yuǎn)遠(yuǎn)不只一個(gè)站點(diǎn)被植入' “如果發(fā)現(xiàn)一個(gè)站點(diǎn)被植入一個(gè)webshell,,那遠(yuǎn)遠(yuǎn)不只一個(gè)webshell被植入” 搜索的優(yōu)勢在這個(gè)時(shí)候就可以發(fā)揮了,用確認(rèn)webshell的訪問者特征(IP/UA/Cookie),,Payload特征,,時(shí)間特征進(jìn)行關(guān)聯(lián)搜索,像這次xcode事件,,360在構(gòu)建了基礎(chǔ)數(shù)據(jù)后(這里引用我非常崇拜的楚安一段話“永遠(yuǎn)記得,,數(shù)據(jù)基礎(chǔ)設(shè)施不是采一堆垃圾進(jìn)來存下就完了,這背后是完善的數(shù)據(jù)生命周期解決方案,。采集,,etl,數(shù)據(jù)質(zhì)量,,快捷的數(shù)據(jù)交互這些才是最重要的,。)利用搜索將數(shù)據(jù)關(guān)聯(lián)起來,按時(shí)間線進(jìn)行還原,,講述了個(gè)有意思的故事,。 補(bǔ)充20151103:講到搜索,有兩個(gè)難點(diǎn): (1)如何將結(jié)果按時(shí)間線與行為關(guān)聯(lián)展示 (2)基礎(chǔ)數(shù)據(jù)設(shè)施建設(shè)的如何,比如說使用elasticsearch,,保留多久的數(shù)據(jù)量,,索引如何建立,集群的負(fù)載均衡等 (說到基礎(chǔ)數(shù)據(jù)設(shè)施建設(shè),,超級心塞,先是hadoop碎片化導(dǎo)致的數(shù)據(jù)傳輸坑,,然后再是日志字段飄逸變更的坑,,還有不可解釋靠重啟解決了的集群莫名掛掉的坑,所幸身邊有不少朋友提供幫助,,特別感謝hadoop小王子) 二,、實(shí)現(xiàn) 1. 數(shù)據(jù)獲取 數(shù)據(jù)源:web訪問日志 獲取方式:如果存儲在hdfs里,采用distcp的方式拷貝到模型計(jì)算集群上 p.s. 光數(shù)據(jù)的獲取,,就遇到了很多坑,,不同版本的hadoop之間的數(shù)據(jù)傳輸(hadoop碎片化的問題,也是工程師文化導(dǎo)向的產(chǎn)物之一,,都愛用開源的東西去組裝一套單獨(dú)的完整的系統(tǒng),,當(dāng)然也因此培養(yǎng)出了不少全棧工程師) 2.feature提取 http_host root_domain url path query 查詢字符串 referer ip timestamp http_response_code http_method request_body 請求體 非必要字段 cookie 非必要字段 user_agent 3.預(yù)處理 在統(tǒng)計(jì)之前我們需要對數(shù)據(jù)做預(yù)處理 預(yù)處理1:按小時(shí)切割日志(切割主要是為了避免日志量大的情況下計(jì)算時(shí)間過長) 預(yù)處理2: 提取響應(yīng)碼為2xx,3xx的日志 預(yù)處理3: 特征規(guī)范化處理,,非常重要,,如果不做預(yù)處理,將會形成一個(gè)超級大的有向圖,,mapreduce這種批處理會處理不過來 Host規(guī)范化: 將*.xxx.com或.xxx.com 變成 www.xxx.com Path規(guī)范化:歸并多個(gè)/,替換\為/ referer規(guī)范化: (1)將相對地址還原為絕對地址,,e.g. /a.php => www.xxx.com/a.php (2)將host部分非本域(不在根域名內(nèi))、空字段,、不符合referer規(guī)范的referer字段皆設(shè)置為空 (3)去除query部分 4.模型建立 1)webshell提?。ㄈ詣樱?br> 第一步:建立(path,referer)有向圖,提取孤立頁面(入度為0,,出度為0 )與自回路頁面( 入度為1,,出度為1,自己指向自己)webshell 的訪問特征 第二步:去除不符合規(guī)范的path( 是否符合(?:https?://)?[-./\\w] ) 第三步:去除靜態(tài)path(例如jpeg,jpg,gif,png,bmp,css,js,xls,xlsx,doc,xml,wav,tar.gz,zip,swf,mp3,ico,pidf,torrent) 第四步:去除白名單path (例如主頁index.php,index.asp,index.aspx,index.ashx,index.html) 第五步:去除非webshell后綴的path (例如asp,aspx,php,jsp,py,cgi,pl,java,sh,war,cfm,phtml) 第六步:去除掃描器造成的path(按掃描器IP信譽(yù)庫(云掃描器IP信譽(yù)庫與時(shí)效性掃描器IP信譽(yù)庫)與掃描器行為(可以簡單的按ip host聚類,,將單位時(shí)間內(nèi)請求數(shù)超過M,,獨(dú)立路徑數(shù)超過N的請求視為掃描器)來去除) 第七步:去除響應(yīng)碼非200的path 第八步:按path特征定義webshell的可信度,符合特征的標(biāo)記為1(例如常見的上傳文件目錄,,隨機(jī)文件名)webshell 的path特征 第九步:按webshell payload特征定義webshell的可信度,,符合特征的標(biāo)記為1,等同于WAF中的webshell檢測規(guī)則(但要更寬松些,,因?yàn)椴慌抡`報(bào)),,如果日志中有WAF檢測結(jié)果標(biāo)記字段,可以直接用該字段來標(biāo)記webshell可信度 (例如envlpass=) webshell Payload特征 第十步:去除獨(dú)立IP訪問數(shù)與path訪問請求總數(shù)超過閾值的path 2)webshell確認(rèn) 第一步:對webshell 提取的path進(jìn)行GET回放(限速),若有參數(shù),,帶參數(shù)回放 (p.s.有些小狡猾的webshell不帶參數(shù)回放會顯示頁面不存在) 第二步:去除響應(yīng)碼非200的path 補(bǔ)充:修改為保留401的請求,,避免漏掉通過http basic認(rèn)證的webshell 第三步:去除404重寫path 方法一:隨機(jī)生成2個(gè)文件名,回放,,看response body的大小是否一樣,,若一樣,則存在重寫 方法二:神奇的fuzz hashing又要發(fā)揮作用了,,可以對重寫的response content求fuzz hashing值,,設(shè)置相似度閾值,在閾值范圍內(nèi)的判定為404,例下圖所示,,將安全狗重寫頁面剔出
第四步:對空白響應(yīng)頁面,,進(jìn)行帶payload的回放(限速與脫敏) 第五步:對響應(yīng)頁面計(jì)算fuzz hashing值,并做聚類處理 第六步:讀取weshell fuzz hashing特征值庫,將相似度在閾值范圍內(nèi)的path判定為webshell webshell Reponse網(wǎng)頁相似性特征 第五步:網(wǎng)頁信息提取,,分為靜態(tài)提取,,動態(tài)提取,提取title,,表單,,Link,Image信息(全自動) 第六步:抽象webshell行為的關(guān)鍵路徑,,制定策略,,基于策略庫進(jìn)行webshell異常提取 第七步:基于webshell樣本簽名(網(wǎng)頁的內(nèi)容/結(jié)構(gòu)、視覺)的自動化攻擊確認(rèn),,與人工干涉的對屬于異常但不符合樣本簽名的攻擊確認(rèn)補(bǔ)漏 第八步:提取確認(rèn)webshell的訪問者特征(IP/UA/Cookie),,Payload特征,時(shí)間特征,,關(guān)聯(lián)搜索,,將搜索結(jié)果按時(shí)間排序,還原事件 webshell 攻擊關(guān)聯(lián)特征 5. 模型評估 一般會用召回率,,準(zhǔn)確率來評估,。但如何確認(rèn)所有的webshell已檢出呢,我采用在自己站點(diǎn)植入webshell,,然后看是否能全部檢出,,但這種方式有明顯問題——站點(diǎn)的訪問流量非常態(tài)的,待解決,。 三,、模型缺陷 模型待改善的地方 問題一:referer偽造 問題二:圖片webshell(因?yàn)殪o態(tài)文件的放行) 問題三:已有文件植入后門(因?yàn)椴还铝⒘耍?br> 四、其他檢測方法 上文介紹了如何通過web日志分析來查找webshell,,現(xiàn)在來回顧一下傳統(tǒng)的webshell檢測產(chǎn)品 (p.s.從商品化的檢測技術(shù)中總能獲得不少檢測靈感,,他們的方法雖然土但有效) WAF/IDS/IPS:檢測HTTP請求是否符合webshell通信特征(被動檢測) 漏洞掃描器:掃描是否存在已知后門植入漏洞,,例如常見webshell路徑,菜刀連接(主動檢測) 后門檢測查殺工具:檢查文件系統(tǒng)中是否存在webshell惡意文件 目錄監(jiān)控工具:文件完整性監(jiān)控,、關(guān)注文件的修改時(shí)間,、所有者,權(quán)限(增加的webshell文件,,被植入webshell的已存在文件時(shí)間都會發(fā)生變化) SIEM日志分析(取證)工具:檢查是否有webshell的訪問事件 (現(xiàn)有的一般是基于特征與簡單關(guān)聯(lián),,非常少的用到機(jī)器學(xué)習(xí)方法) 而這些產(chǎn)品用到的技術(shù)劃分為靜態(tài)檢測方法與動態(tài)檢測方法,其實(shí)也是反病毒領(lǐng)域采用的方法,。 1. 靜態(tài)檢測 (1) 文件內(nèi)容檢測,,檢測是否包含webshell特征,例如webshell常用函數(shù) 缺點(diǎn): webshell 花式混淆繞過 花式混淆參見: http://www.bitsCN.com/Article/201509/443305.html 檢測方法參見: PHP Shell Detector (2)文件內(nèi)容檢測,,檢測是否加密(混淆處理) 吸取上面的經(jīng)驗(yàn),增加了通過檢測是否加密來判斷webshell(1,2,3,4都是) 1,、重合指數(shù)(Index of Coincidence):本質(zhì)是概率,,簡單的說,有意義的詞匯重合指數(shù)高,,被加密或混淆的字符串的重合指數(shù)低 2,、信息熵(Entropy):本質(zhì)還是概率,簡單的說,,有意義的詞匯熵值小,,被加密或混淆的字符串的熵值大 3、最長單詞(LongestWord):比較粗暴的假設(shè),,字符串越長被加密或混淆的可能性越大 4,、壓縮(Compression):非常有趣的想法,盡然能想到利用壓縮的原理來描述混淆或加密字符串與常規(guī)字符串的區(qū)別 5,、簽名(Signature):特征匹配,,屬于傳統(tǒng)方法 檢測方法參見: NeoPi方法 缺點(diǎn): 第一篇文章下的吐槽能說明一些問題,第二篇文章正好證明了這個(gè)問題 數(shù)據(jù)分析方法特別是機(jī)器學(xué)習(xí),,更多的時(shí)候考慮的是大數(shù)據(jù)量下的概率指向,,對特殊情況的覆蓋率低,但優(yōu)勢也是很明顯的,,只是不能單獨(dú)使用,。 (3)文件Hash檢測,創(chuàng)建webshell樣本hashing庫,,將待檢測文件與之對比,,在閾值范圍內(nèi)的判定為可疑文件 ssdeep檢測webshell (fuzzy hashing檢測) (4)文件完整性檢測 文件的創(chuàng)建時(shí)間(新增文件(新增webshell),修改時(shí)間(原有文件注入webshell)),,文件權(quán)限,,所有者 缺點(diǎn):更新頻繁的站點(diǎn)無法運(yùn)維 2. 動態(tài)檢測 沙箱技術(shù),根據(jù)動態(tài)語言沙箱運(yùn)行時(shí)的行為特征來判斷 缺點(diǎn): 加密文件無法執(zhí)行,寫的很挫(本身有語法錯(cuò)誤)的文件無法執(zhí)行 檢測產(chǎn)品參加: 百度的webshell檢測服務(wù) webdir 五,、結(jié)語 這篇文章寫了快半個(gè)月了,,本人是個(gè)收集狂魔,喜歡收集資料,,也喜歡收集方法,,收集了需要驗(yàn)證,因此花了不少時(shí)間,,但這個(gè)過程還是蠻有趣的,,玩過界(匯集不同領(lǐng)域的特長)的感覺真好。同時(shí)歡迎交流,,把我罵成狗也沒得關(guān)系 后記: 結(jié)果真的被人罵了,,但罵的原因不是預(yù)料的文章寫的渣,技術(shù)方案存在問題,,而是涉及抄襲的人身攻擊,,本人除了寫技術(shù)博客,寫讀書筆記,,推送我發(fā)現(xiàn)的好資料,,并未混進(jìn)安全圈內(nèi)過,會議不曾參加,,聚會更是沒有,,著實(shí)封閉,也不能自證,,于是只能忍了,。 |
|