IDS逃避技術和對策

標題:IDS逃避技術和對策 時間:2004-10-02 來源:www.cexpress.com 文摘內容: -------------------------------------------------------------------------------- http://www.linuxaid.com.cn 1.字符串匹配的弱點 2.多變shell代碼(polymorphic shell code) 3.會話拼接(session splicing,叫會話分割更合適一些) 4.碎片攻擊 4.1.碎片覆蓋 4.2.碎片數據覆蓋 4.3.碎片超時 5.碎片和snort特徵碼 6.拒絕服務 結論 在網絡蓬勃發展的幾天,網絡安全問題日益突出。網絡上的黑、白兩道在網絡安全的各個領域都展開了激烈的競爭。黑帽社團不斷推 出躲避或者越過網絡入侵檢測系統(Network Intrusion Detection System,NIDS)的新技術,而NIDS的開發者不斷地在自己的產品中加入 對這些技術的檢測。但是,由於NIDS本身的侷限性,勝利的天平正在向黑帽子傾斜。本文將討論一些基本的IDS躲避技術,以及如何 識破這些技術。 1.字符串匹配的弱點 針對基本字符串匹配弱點的IDS躲避技術是最早被提出和實現的。一些基於特徵碼的入侵檢測設備幾乎完全依賴於字符串匹配算法, 而對於一個編寫很差的特徵碼,攻擊者可以輕鬆地破壞對其的字符串匹配。雖然不是所有的入侵檢測系統都是純粹基於特徵碼檢測 的,但是絕大多數對字符串匹配算法有很大的依賴。這裏,我們將使用開放源碼工具snort的特徵碼來進行討論。 在UNIX系統中,/etc/passwd是一個重要的文件,它包含用戶名、組成員關係和爲用戶分配的shell等信息。我們就從監視對/etc/passwd 文件的訪問開始,下面是用於檢測的snort檢測規則: alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"WEB-MISC /etc/passwd"; flags: A+; content:"/etc/passwd"; nocase; classtype:attempted-recon; sid:1122;rev:1) snort使用字符串匹配算法對包含特徵碼(/etc/passwd)的HTTP請求進行檢測。但是,這個規則的特徵碼過於簡單了,攻擊者修改攻擊字 符串可以很輕鬆地逃過檢測(我們暫時不考慮攻擊請求是通過HTTP發出的)。例如,把攻擊請求由GET /etc/passwd改爲GET /etc///// passwd,或者GET /etc/rc.d/.././/passwd,修改方式簡直不計其數。這是最基本的娶親檢測逃避技術,對這種技術的檢測也相對容易一 些,只要在編寫特徵碼時能夠仔細考慮一下攻擊可能出現的變體。目前大多數流行入侵檢測系統都有非常強大的字符串匹配能力,足 以檢測此類攻擊的大多數變體。不過,仍然有些編寫不太好的特徵碼可以給攻擊者以可乘之機。 攻擊者還可以在此基礎上再加以變化,幾乎不費吹灰之力就可以加大入侵檢測系統的防禦難度。例如在telnet之類的交互會話中,攻擊 者企圖讀取/etc/passwd文件。通常,入侵檢測系統中存在很多特徵碼一些誤用操作和後門等,但是這些特徵碼一般只包含黑客工具 名、文件名和程序名。在獲得/etc/passwd文件的內容時,我們不直接輸入cat /etc/passwd等命令行,而是通過一個命令解釋器(例 如:perl)來實現我們的目的: badguy@host$ perl -e ‘$foo=pack(“C11”,47,101,116,99,47,112,97,115,115,119,100); @bam=`/bin/cat/ $foo`; print”@bam/n”;’ 從這個命令中,入侵檢測系統根本就不會重組出/etc/passwd這些字符。顯然,防禦這種攻擊就很困難了,因爲這要求入侵檢測系統必 須能夠理解這種解釋器如何收到的命令,這恐怕不太現實。當然,入侵檢測系統也可以對使用解釋器的可疑行爲進行報警,但是它很 難對攻擊行爲進行精確的監視。 通過把字符串處理技術和字符替換技術結合到一起,我們可疑實現更復雜的字符串僞裝。對於WEB請求,我們不必使用命令解釋器, 在我們的請求中使用16進制的URL即可,以下的請求可以被目標WEB服務器解釋爲/etc/passwd: GET %65%74%63/%70%61%73%73%77%64 或者 GET %65%74%63/%70a%73%73%77d 爲了捕獲這一個字符串的所有變體,你可能需要1000個以上的特徵碼進行字符串匹配,這還沒有考慮UNICODE。UNICODE提供了另一 種字符表達方式。有關UNICODE的IDS欺騙技術細節,本文將不多做討論。如果想了解更多細節請參考SecurityFocus的IDS Evasion with Unicode。除此之外,RainForestPuppy在他的HTTP掃描工具Whisker中採用了另外一些IDS欺騙技術:   -I 1 IDS-evasive mode 1 (URL編碼) -I 2 IDS-evasive mode 2 (/./目錄插入) -I 3 IDS-evasive mode 3 (過早結束URL) -I 4 IDS-evasive mode 4 (長URL) -I 5 IDS-evasive mode 5 (僞造參數) -I 6 IDS-evasive mode 6 (TAB分割) (not NT/IIS) -I 7 IDS-evasive mode 7 (大小寫敏感) -I 8 IDS-evasive mode 8 (Windows分割符) -I 9 IDS-evasive mode 9 (會話拼接) (slow) -I 0 IDS-evasive mode 0 (NULL方法) 如果想了解上面這些方法的技術細節,可以參考A Look At Whisker's Anti-IDS Tactics。需要特別說明的是,rfp把whisker採用的anti-ids技術 單獨放到了libwhisker(使用perl編寫的)庫中,爲其它的程序採用這些技術提供了很大的便利。另外,nessus和babelweb等掃描工具都 有自己的應用層入侵檢測躲避技術。 現在,IDS開發人員對各種網絡協議有了更深入的理解,並且入侵檢測設備在對數據包的負載進行字符串匹配之前會進行必要的協議 分析,因此現在的IDS已經能夠很好地處理上述的欺騙技術了。但是多餘的字符轉換又提高了入侵檢測系統的負載,有時是得不償 失。爲了減小這個跗面影響,開發人員可以使入侵檢測系統只在特定的端口進行字符轉換。 2.多變shell代碼(polymorphic shell code) 多變shell代碼(polymorphic shell code)技術由K2開發的,設計思想來源於病毒逃避(virus evasion)技術。使用這種技術重新構造的shell代 碼更爲危險,入侵檢測設備非常難以檢測到。這種技術只用於緩衝區溢出攻擊,對付基於特徵碼的檢測系統非常有效,而對於智能化 的或者基於協議分析的檢測系統的效果要差很多。爲了便於討論,我們以SSH CRC32緩衝區爲例。我們先看以下snort檢測規則: alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg:"EXPLOIT ssh CRC32 overflow /bin/sh"; flags:A+; content:"/bin/sh"; reference:bugtraq,2347; reference:cve,CVE-2001-0144; classtype:shellcode-detect; sid:1324; rev:1;) alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg:"EXPLOIT ssh CRC32 overflow NOOP"; flags:A+; content:"|90 90 90 90 90 90 90 90 90 90 90 90 90 90 90) 上面的第一條規則簡單地檢查從外部到$HOME_NET,目標端口是22的數據包,搜索裏面是否包含字符串/bin/sh。第二條規則是檢查是否 包含x86空操作字符(0x90)。多變shell代碼(polymorphic shell code)使用很多方法逃避字符串匹配系統的檢測。首先(以x86架構爲例), 使用其它的字符代替0x90執行無操作(no-op)指令。對於X86架構,有55種替代方式,其它的要少一些。這些替代方式以一種僞隨機的 方式結合到一塊,建立緩衝區溢出shell代碼包含無操作(no-op)指令的部分。想了解無操作(no-op)指令的所有替代字符可以參考http:// cansecwest.com/noplist-v1-1.txt。除此之外,shell代碼本身也採用XOR機制編碼。通過這種方式建立的緩衝區溢出shell代碼被重組後不會包 含以上的特徵碼,從而能夠逃過字符串匹配檢測。 多變shell代碼檢測對基於特徵碼檢測的IDS是一個很大的挑戰。Next Generation Security Technologie公司的技術白皮書Polymorphic Shellcodes vs. Application IDSs中提出了一些檢測多變shell代碼的設想。通過搜索無操作(no-op)字符的一個特定長度的正則表達式,可以實現對多變 shell代碼的精確檢測。最近,Dragos Ruiu發佈了一個用於檢測多變shell代碼的snort預處理插件spp_fnord,這個插件採用了和上面相似的 檢測技術。這個預處理插件有端口和長度兩個配置選項。例如,如果某個人在配置時設置了80、21、23和53等端口,它就只對這幾個 端口的數據流量進行多變shell代碼的檢測,而不會對其它端口(例如:22)進行檢測。 3.會話拼接(session splicing,叫會話分割更合適一些) 上面討論的這些方法都是屬於攻擊數據在一個數據包中的情況,沒有涉及攻擊數據和會話通過多個數據包投遞的情況。RFP在Whisker 中實現了一種IDS逃避技術叫作會話拼接(session splicing),就是把會話數據放到多個數據包中發出,例如: +-------------------------+ | packet number | content | |---------------+---------| | 1 | G | |---------------+---------| | 2 | E | |---------------+---------| | 3 | T | |---------------+---------| | 4 | 20 | |---------------+---------| | 5 | / | |---------------+---------| | 6 | H | +---------------+---------+ 通過這種方式,每次只投遞幾個字節的數據,就可能避開字符串匹配入侵檢測系統的監視。要監視這種攻擊,需要入侵檢測系統或者 能夠理解、監視網絡會話(即使IDS有這種能力,攻擊者也可以通過其它的凡是避開監視),或者採用其它的技術監視這種攻擊。snort使 用以下規則來監視會話拼接: alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"WEB-MISC whisker space splice attack"; content:"|20|"; flags:A+; dsize:1; reference:arachnids,296; classtype:attempted-recon; reference) 這條規則使snort檢測目標爲$HTTP_SERVERS 80端口的ACK報文的負載長度是否等於1以及是否包含空格(16進制的20)。使用這條規則 可以精確地檢測出whisker,但是攻擊者只要稍加修改就可以避開這個檢測。爲了能夠檢測可能出現的會話拼接攻擊,可以對上面這條 snort規則進行擴展,使其檢查負載很短的HTTP請求。但是,這樣做的副作用是提高了誤報警數量,而且在某些情況下攻擊者還是能 夠避開監視。爲了真正有效地檢測這種攻擊,需要入侵檢測系統能夠完整地理解網絡會話,不過這是非常困難的。應該注意的是目前 大多數系統能夠重組會話,在所有的會話數據到達之前,它們會等待一些時間。而等待時間的長短與程序有關。例如,Apache/RedHat 的會話超時時間是6分鐘,IIS/Win2K等待的時間非常長。因此,攻擊者完全可以每15分鐘發送一個字節的會話數據,而IIS還會認爲是 有效的會話。最新版本的snort能夠監視長期的會話和網絡層欺騙,例如:小TTL值。 4.碎片攻擊 碎片攻擊和會話拼接(session splicing)有點類似。直到最近,很多入侵檢測系統在進行字符串匹配之前不能準確地重組碎片。現在這種 情況有了改觀,所有的入侵檢測系統都能夠進行某些重組。不過,還是有很多方法可以避開入侵檢測系統的監視。碎片重組的問題是 在進行字符串匹配以前,入侵檢測系統必須在內存中緩存所有的碎片,然後進行重組。而且,他還需要直到、碎片在目的主機會如何 重組。Thomas Ptacek and Timoth Newsham於1998年寫的Insertion,Evasion and Denial of Service: Eluding Network Intrusion Detection描述了許多基於 網絡的碎片躲避和其它類型的躲避技術。碎片攻擊包括:碎片覆蓋、碎片重寫、碎片超時和針對網絡拓撲的碎片技術(例如使用小的 TTL)等。下面,我們將詳細討論。 4.1.碎片覆蓋 所謂碎片覆蓋就是發送碎片覆蓋先前碎片中的數據。例如: 碎片1 GET x.idd 碎片2 a.?(緩衝區溢出數據) 第二個碎片的第一個字符覆蓋第一個碎片最後一個字符,這兩個碎片被重組之後就變成了GET x.ida?(緩衝區溢出數據)。實際情況遠 非這麼簡單,更詳細的細節請參考爛文IDS欺騙之Fragroute篇(上)。 4.2.碎片數據覆蓋 這種方法和上面的碎片覆蓋有些類似,只不過是覆蓋全部的碎片數據,例如: 碎片1 GET x.id 碎片2 一些隨機的字符 碎片3 a.?(緩衝區溢出數據) 這些碎片在經過目標系統的重組之後,碎片3將完全覆蓋碎片2,重組之後的數據變成GET x.ida?(緩衝區溢出數據)。如果入侵檢測系 統的重組方式和目標系統不同,就無法重組出“GET x.ida?(緩衝區溢出數據)”,因此就檢測不出這個攻擊。 4.3.碎片超時 這種攻擊依賴於入侵檢測系統在丟棄碎片之前會保存多少時間。大多數系統會在60秒之後將丟棄不完整的碎片流(從收到第一個碎片開 始計時)。如果入侵檢測系統保存碎片的時間小於60秒,就會漏掉某些攻擊。例如: 碎片1(設置了MF位) GET foo.id 碎片2(59秒之後發出) a?(緩衝區溢出數據) 如果IDS保存起始碎片的時間不到60秒,就會漏過攻擊。幸運的是,如果配置沒有錯誤,現在的網絡入侵檢測系統能夠檢測此類攻 擊。 這種技術結合其它的網絡技術(例如:TTL值)將更有威脅。如果入侵檢測系統和被監視的系統不在同一個網段,攻擊者就可以在TTL 上做手腳。有的單位由於經費的限制,不能在自己的每個子網都部署IDS節點,只在網絡的出入口部署一套IDS,監視所有的網絡流 量。這種情況下,如果被攻擊的主機在其它的子網,攻擊數據包到目標系統的跳數就大於到IDS的跳數。攻擊者可以僞造碎片的TTL, 使某些碎片剛好能夠到達,而無法到達目標系統,例如: 碎片序號 負載 TTL(假設攻擊者到目標的跳數是5,到IDS的跳數是3) 1 GET foo.id 5 2 evasion.html 3 3 a?(緩衝區溢出數據) 5 從這些碎片中,IDS重組的數據是“GET foo.idevasion.html a?(緩衝區溢出數據)”或者“GET foo.idevasion.html”(如果IDS的超時 時間小於60秒)。通過這種方式,攻擊者成功地在IDS中插入了垃圾數據。 5.碎片和snort特徵碼 下面我們把上述攻擊和某些snort特徵碼進行比較。對於.ida緩衝區溢出攻擊,默認的snort特徵碼幾乎無法捕獲任何通過碎片發動的攻 擊(如果使用了frag2預處理模塊,snort可以截獲碎片超時攻擊)。下面是針對.ida緩衝區溢出攻擊的snort檢測規則: alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"WEB-IIS ISAPI .ida attempt"; uricontent:".ida?"; nocase; dsize:>239; flags:A+; reference:arachnids,552; classtype:web-application-attack; reference:cve,CAN-2000-0071; sid:1243; rev:2;) 另外,snort還有一條檢測小碎片的規則,一旦發現太小的碎片,就會觸發這條規則: alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:"MISC Tiny Fragments"; fragbits:M; dsize: < 25; classtype:bad-unknown; sid:522) 但是,這樣還是不能檢測某些攻擊。還是以ida緩衝區溢出爲例,這個攻擊實際上和請求的URI無關,因此攻擊者可以在前面加入一些 垃圾數據以避免觸發碎片檢測規則。 碎片1 GET reallylongstringtoevadedetect.i 碎片2 da?(緩衝區溢出數據) 這些技術並非只針對snort。Cisco Secure IDS也能夠進行碎片重組,並且能夠對上述碎片攻擊進行報警。 實際上,碎片攻擊要複雜的多,尤其是涉及到TTL和碎片覆蓋。如果想更爲深入地瞭解這方面技術,請參考Network Intrusion Detection: Evasion, Traffic Normalization, and End-to-End Protocol Semantics。 檢測碎片攻擊也非常困難。使IDS的碎片超時時間至少爲60秒,增加對異常碎片的報警,最重要的是系統管理人員要對碎片攻擊的潛 在威脅有清醒的認識。2002年四月,Dug Song發佈了Fragroute,引發了不小的震動。很快,snort社團發佈了能夠對碎片攻擊進行更好檢 測的snort1.8.6版。 6.拒絕服務 還有一種比較野蠻的方法就是拒絕服務。拒絕服務可以針對檢測設備本身和管理設備。Stick、snot和其它一些測試工具能夠是入侵檢測 設備產生大量的報警。使用這些工具,可以達成如下目標:   消耗檢測設備的處理能力,是真正的攻擊逃過檢測。 塞滿硬盤空間,使檢測設備無法記錄日誌。 使檢測設備產生超出其處理能力的報警。 使系統管理人員無法研究所有的報警。 掛掉檢測設備。 對IDS來說,這類工具無跡可尋,因此非常難以對付。 結論 本文我們討論了一些常用的IDS躲避技術及其對策。其中有些技術需要攻擊者具有熟練的攻擊技巧,而有寫技術卻無需太多的技巧。 而fragroute之類的工具出現,大大降低了攻擊者採用某些技術的難度,使防禦的一方總是處於被動。  
發佈了14 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章