查看單個文章
舊 2004-01-28, 03:07 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 用IPTables實現字串串模式匹配

LinuxAid論壇 流雲
--------------------------------------------------------------------------------


自1995年ipfwadm開始進入1.2.1的核心,Linux的防火牆實現有很長的時間了。Ipfwadm實現了標準的tcp/ip包過濾功能,比如過濾源位址與目的位址以及連接埠過濾。


早在1999年第一個穩定的2.2.0核心中防火牆的實現被ipchains替代了,ipchains的新功能包括支持規則鏈,碎片包控制,較好的網路位址翻譯功能(NAT)以及其他一些有用的改進。


我們需要明白Linux防火牆包括核心級程式碼(通常是可載入核心模組或者核心源程序的修正檔)和用戶級程式碼(一個配置的工具,比如/usr/bin/ipchains,這是用來插入包規則到核心空間的)因此無論如何,只要新的linux防火牆程式碼被引入,核心和用戶空間的有關程式碼都要改寫。


2001年2.4的核心完成了,iptables出現了。它引入了很多重要的改進,比如關於狀態的防火牆,關於任何TCP標記和MAC位址的包過濾,更靈活的配置和記錄功能,強大而且簡單的NAT功能和透明代理功能,通過速度限制實現DoS的阻止(更詳細的資料請參看A Comparison of iptables Automation Tools一文)。


然而,最重要變化是引入了模組化的架構方式。

比如,ipchains和ipfwadm相容模式是通過一個核心模組的設定實現的,該模組能夠在執行的核心中插入,以便提供相應的通訊功能。


在附加的變化中,用戶自訂編碼功能已經成為了可能,比如過濾一定範圍的連接埠,根據TTL值和包的到達時間進行判斷,對自訂的傳輸協定進行狀態監視,對隨機的資料包進行監視等,這些目前都還不是iptable的一部分,但是在未來將被實現。很多很有趣的新模組已經完成了。


編寫一個可載入的核心模組來新增核心級程式碼,通過用戶級程式碼實現控制過濾器的行為。參見Rusty Russell's Linux iptables HOWTO
本文主要關注字串串模式匹配的功能,(顯然,是通過模組實現的),該功能可以限制和研究資料包的有效載荷。


這是iptable技術的一個非常有意義的突破,它超越了傳統的包過濾防火牆的標準TCP/IP標誌監視功能。傳統的防火牆可以分為包過濾和套用代理兩種類型,套用代理防火牆可以分別出套用層的傳輸協定比如telnet,HTTP或者SMTP,能夠監視這些傳輸協定的有效載荷和檢查指令,但是套用代理防火牆帶來了巨大的效能缺陷:當通過網路傳輸協定棧處理上層即套用層的資料包。


同時我們需要為每一個要監控的傳輸協定編寫新的代理程序。包過濾防火牆通常只監視源位址和目的位址,源連接埠和目的連接埠,TCP/IP標誌等,而完全忽略了高層傳輸協定的有效載荷。由於上述原因,包過濾防火牆通常比套用代理防火牆的速度快。套用代理提供了更加有力度的安全控制而包過濾可以用於更高的帶寬線路滿足更高的吞吐量。


關於以上的情況,iptables的新增功能提供了跨越兩種防火牆類型的優勢,避免了各自的缺陷,這個功能同時非常清晰的證明了新的模組化的架構較之老的ipchains的優勢,它能夠使得iptables工作在網路層(OSI模型的第三層)不必工作在高層傳輸協定,但是卻可以監視高層傳輸協定的有效載荷,而不必分析套用層的通信結構。

在2001年5月以前,還沒有提出字串串模式匹配模組以前。有一個嘗試增加內容監控的能力給iptables防火牆的工程:Hogwash。該工程結合了Snort IDS規則模式匹配引擎,以便於iptable能夠回應帶有攻擊信號的資料包。


現在我們提供了一個Step-By-Step的指導,以便於在RedHat Linux上實現模式匹配的包監視功能。標準的RH7.2提供了iptables 1.2.3的版本以及1.2.4的可用RPM昇級包。然而,模式匹配功能沒有被包含在標準的發行版中,因為開發人員將它標記為試驗。

如果你使用的是RH7.1-7.2,你就已經使用了2.4的核心。你至少需要2.4.4的核心以便能夠使用iptables 1.2.4的功能。通常推薦你從發行商那裡下載最新的可用的核心。


目前,有一個例外:iptables-1.2.4的字串串模式匹配修正檔不能在2.4.9的核心下工作。你應該安裝核心的源碼RPM包(通常被放在/usr/src/linux-2.4.x的源碼樹內)或者從別處下載的
核心源程序(比如www.kernel.org或者它的一個鏡像)。

在本文中,將採用最新的2.4.16核心作為例子。測試也能執行在使用2.4.7核心的RedHat 7.2上,但是2.4.7的核心並不推薦使用,因為2.4.7的核心有一些小的安全問題,比如SYN-cookie保護和iptables的儲存/恢復功能。


接下來需要從http://netfilter.samba.org/iptables-1.2.4.tar.bz2下載iptables。當對壓縮檔案進行解壓縮之後,需要對iptables進行配置,合併相關的核心源程序樹。


可以使用半自動化的程序來完成這個目的。首先,可能需要執行程序以便包含已經考慮過的穩定的iptables修正檔,但是這個修正檔沒有被包含在kernel的發行版內。

從iptables的解壓目錄(在本例中iptables在/home/anton/iptables-1.2.4,核心源程序在/usr/src/linux-2.4.16)執行:

make pending-patches KERNEL_DIR=/usr/src/linux-2.4.16
這將開始執行交互式的修正檔應用程式,雖然你可以安全套用所有的修正檔,但是沒有一個修正檔是iptables的字串串匹配所必需的。


對任何你認為需要的修正檔都回答y(yes)。如果你希望能夠安全的使用iptables,則選項none。



現在我們將準備套用試驗部分的修正檔,比如字串串模式匹配的支持。執行:
make patch-o-matic KERNEL_DIR=/usr/src/linux-2.4.16
在這個交互式的程序中,回答y(yes)以便套用string.patch。程序將遍歷所有的可用的修正檔,包括那些穩定的。
Testing... string.patch NOT APPLIED ( 2 missing files)
The string patch:

Author: Emmanuel Roger <WINFIELD@FREEGATES.BE>
Status: Working, not with kernel 2.4.9

This patch adds CONFIG_IP_NF_MATCH_STRING which allows you to
match a string in a whole packet.

THIS PATCH DOES NOT WORK WITH KERNEL 2.4.9 !

Do you want to apply this patch [N/y/t/f/q/?] y
其餘的修正檔也許也讓你非常感興趣,不過它們與本文並不相關。如果你選項安裝任何別的修正檔,請注意開發者給出的警告信息,其中包括了修正檔的功能(比如dropped表的修正檔)確定你沒有安裝MAC過濾的修正檔,因為最近發現這個修正檔包含一個漏洞。


現在我們開始編譯用戶空間程序和相關的Libraries:

make KERNEL_DIR=/usr/src/linux-2.4.16
然後我們安裝它們(iptables在/usr/local/user/sbin,libraries在/usr/local/lib/iptables)在root身份下執行以下內容:
make install KERNEL_DIR=/usr/src/linux-2.4.16
緊接著我們配置和編譯核心:
Now we are ready to compile the user-space code and the libraries:
make KERNEL_DIR=/usr/src/linux-2.4.16
and then install them (iptables program goes in /usr/local/user/sbin and libraries go into /usr/local/lib/iptables). As root:

cd /usr/src/linux-2.4.16
可以使用任何的核心配置方法。有關詳細的配置核心的方法,可以查閱Internet資源,Internet上有大量的這方面的我的文件,比如kernel HOWTO等。以下簡要介紹一下:


make xconfig
在GUI界面下,選項Netfilter配置選項,然後在Strings match support前選項m(模組支持),如下圖:


然後執行通常的操作:
make dep;make bzImage;make modules;make modules_install
現在按照你喜歡的方式安裝核心,並重新啟動。


重新啟動系統以後,測試一下iptables是否支持模式匹配功能,在root身份下執行:
/usr/local/sbin/iptables –m string –help
該指令將顯示如上標准的iptables說明 信息:

STRING match v1.2.4 options:
--string [!] string Match a string in a packet
該功能允許你對匹配資料包的內容,我們可以通過netcat或者telnet來測試這一功能,從而確定我們確實可以獲得資料包的內容。
執行:
iptables -A INPUT -m string --string "test" -j LOG --log-level
info --log-prefix "TEST"
然後啟動一個netcat的伺服器:
nc -l -p 3456
然後連接該netcat伺服器:
telnet localhost 3456
然後輸入:
test
whatevertestdoes
這樣將引起iptables產生一個簡單的記錄,我們在記錄文件中將會看到如下的信息(當然你需要設定了記錄信息的級別為info)
Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00

SRC=127.0.0.1 DST=127.0.0.1 LEN=2154 TOS=0x00 PREC=0x00 TTL=64
ID=42880 DF PROTO=TCP SPT=3128 DPT=33018 WINDOW=32767 RES=0x00 ACK PSH URGP=0

Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00

SRC=127.0.0.1 DST=127.0.0.1LEN=1830 TOS=0x00 PREC=0x00 TTL=64
ID=17451 DF PROTO=TCP SPT=8000 DPT=33017 WINDOW=32767 RES=0x00 ACK PSH URGP=0
在tcp/ip資料包中只要出現test字串串,以上的信息就會產生。這有什麼好處呢?太多了。正如Filtering packets based on string matching這篇文章所建議的那樣,該文章可以在linuxguru.net的sysctl內找到。它能夠用來阻止那些討厭的IIS蠕蟲造成得Unix web伺服器記錄文件記錄大量的對cmd.exe的請求,這些蠕蟲將不再干擾你,但是如果你的/var分區(通常是記錄文件存放的分區)不夠大,那麼這一功能將有一定的說明 。


只要靜靜地丟棄蠕蟲對80連接埠的請求或者使用記錄限制功能,對這些信息進行記錄,丟棄這些包的操作如下:
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"
每小時只記錄一條這樣的信息:
iptables -I INPUT -j LOG -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe" -m limit
--limit 1/hour
Bill Steams(Mason firewall building script的作者)提供了一個極好的建議----轉換網路IDS Snort的規則成為iptables字串串模式匹配的規則。


Snort的攻擊信號資料庫中包含了大約1200種信號and appears to be the biggest publicly available attack database suitable for instant deployment。在iptables上使用現成的信號是合理的一種方式。

http://www.strearns.org/snort2iptables 是Bill Stearm提供的試驗性的軟體。在這裡你可以找到shell指令碼以便將標準的Snort規則轉換為iptables的規則。下面是一個將snort關於Linux下針對mountd的攻擊和bind的攻擊轉化為iptables的規則的例子:
Snort 規則:
1. alert udp $EXTERNAL_NET any -> $HOME_NET 518
(msg:"EXPLOIT ntalkd x86 linux overflow";
content:"|0103 0000 000 0 0001 0002 02e8|";
reference:bugtraq,210; classtype:attempted-admin; sid:313; rev:2

2. alert tcp $EXTERNAL_NET any -> $HOME_NET 53
(msg:"EXPLOIT named tsig infoleak";
content: "|AB CD 09 80 00 00 00 01 00 00 00 00 00 00 01 00 01 20 20 20 20 02 61|";
reference:cve,CAN-2000-0010; reference:bugtraq,2302; reference:arachnids,482;
classtype:attempted-admin; sid:303; rev:3

3. alert udp $EXTERNAL_NET any -> $HOME_NET 635
(msg:"EXPLOIT x86 linux mountd overflow";
content:"|5eb0 0289 06fe c889 4604 b006 8946|";
reference:cve,CVE-1999-0002; classtype:attempted-admin; sid:315; rev:1
轉化的iptables規則:
1. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 518 -m
string --string " &egrave;" -j LOG --log-prefix "SID313 " # "EXPLOIT ntalkd x86
linux overflow" bugtraq,210 classtype:
attempted-admin sid:313
2. iptables -A SnortRules -p tcp -s $EXTERNAL_NET -d $HOME_NET --dport 53 -m
string --string "&laquo;&Iacute; .a" -j LOG --log-prefix "
SID303 " # "EXPLOIT named tsig infoleak" cve,CAN-2000-0010 bugtraq,2302
arachnids,482 classtype:attempted-admin sid:303
3. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 635 -m
string --string "^° ‰ t&Egrave;‰F ° ‰F" -j LOG --log-prefix " cve-CVE-1999-0002
" # "EXPLOIT x86 linux mountd overflow" classtype:attempted-admin sid:315
顯而易見,上面的轉化使用了針對漏洞所使用的緩衝區溢出字串串作為捕獲攻擊的方式,有些規則不便於轉化主要是因為在楨的控制方面snort比iptables要強大一點。


總之,iptables的字串串模式匹配功能能夠被用來保護那些開放了易受攻擊的而一般的包過濾又無法保護的網路服務(如WWW服務,mail服務,DNS服務,FTP服務等)的組織的網路(如果將它佈置在組織的網關上)和單個的主機(使iptables成為主機的一部分),另外,iptables的字串串模式匹配功能還能夠說明 實現強制安全原則,即通過關鍵字來阻止訪問非法的內容。這樣的方式比內容掃瞄要好一點,but another layer of protection never hurts


這個功能在 SuSE 8 上面有提供...
但 RH8 卻沒有... 正好作為 patch 的參考...
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次