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$Content$nbsp;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)進行檢測。
| 共2頁: 1 [2] 下一頁 | ||
|


