高亮,鄭榮鋒
(四川大學網絡空間安全學院,成都610065)
隨著信息化水平的不斷提升,電子信息成為了信息的主要存儲介質。金融、社交、文化、生產力的信息化發展,在網絡上存放的個人數據和企業數據甚至是政府職能部門的數據也越來越多,而信息存放的安全和設備的安全成為了信息儲存首要考慮的問題。
本文主要研究網絡入侵檢測和反制技術,利用OpenWrt 平臺的和編程特性和Snort 的入侵報文檢測系統,結合網絡入侵手段和其反制方法,設計了一個入侵檢測和反制系統,最后以OpenWrt 平臺和Python 編程語言實現該系統。
計算機漏洞的產生方式主要有兩種:第一種是相關編程人員或者網絡協議標準制定小組出現紕漏,設計的程序、協議中出現了明顯的邏輯漏洞,這些漏洞一旦被利用起來,可以達成繞過系統驗證、強行插入修改刪除數據、造成系統崩潰而拒絕服務等效果。第二種漏洞屬于編程內部的漏洞,這種漏洞表現的最為明顯的就是堆棧溢出攻擊,利用了馮·洛伊曼計算機結構的特點,數據程序一起存儲,而且在一定條件下可以進行相互轉換。該種類型的入侵往往可以造成目標計算機系統決絕服務,甚至是奪取目標計算機系統控制權,并于目標計算機上安裝持續化控制后門[7-8]。
計算機病毒作為后門安裝時,存在的行為如下:
(1)收集目標系統的信息。對于服務器而言,主要收集日志,服務器登錄賬戶密碼,服務器上部署的主要系統配置,數據庫內容,管理員操作記錄等信息。對于普通用戶而言,主要收集文檔、圖片、視頻、以及各種對計算機輸入的文本信息[6]。
(2)加深對系統的控制和持久化控制。病毒往往會將自身替換為正常的系統程序或者用戶程序,以達到偽裝,并將自己加入開機項,保證在重啟后仍然可以對系統進行控制。
(3)Shell 后門。病毒制作者為了進行快捷的病毒升級、擴展、并訪問受害者的機器,往往會在后門中加入直接可以操作的Shell 接口,可以提供遠程的命令訪問[1]。
對于計算機病毒的后門特征而言,第一點和第三點可以作為網絡特征而進行檢測,而第一點實現較為復雜,且需要大量時間進行信息收集所需要守護的系統中存在的內容特征。所以本設計選擇以第三點作為網絡特征的檢測的主要出發點,檢測成功率會比較大[9-11]。
Snort 是由Martin Roesch 在1998 年用C 語言開發的入侵檢測系統,并且Snort 代碼開源,屬于開源項目。Snort 經常被用于部署在各種網絡中的關鍵位置,其基本架構如圖1 所示。

圖1 Snort基本框架
圖1 中指出,Snort 的體系結構由四個基本部分組成:
嗅探器:網絡嗅探器將網卡設置為監聽模式,使得Snort 可以監聽所有到達該網卡的網絡流量。
●預處理器:預處理器接收嗅探器傳入的數據包,并分析數據包中的網絡層次和數據內容,再交由相關的插件處理,這些插件是針對數據包中的網絡層次和特征行為的。一旦數據包具有“特征行為”,那么該數據包將被發送到檢測引擎。
●檢測引擎。檢測引擎是Snort 中基于特征的入侵檢測系統的主體。檢測引擎接收來自預處理器的數據,這些數據會通過配置規則中的配置所進行檢測。檢測的方法是先讀入配置規則,再解析內容中的字符串和偏移信息,最后對內容字符串進行正則匹配。如果正則表達式匹配返回成功,則表明規則與數據包中的內容匹配,產生一個警報事件。
●輸出插件。網絡流量數據如果與引擎內的某規則相匹配則觸發警報。警報將通過網絡連接、UNIX 套接字、E-mail、MySQL 數據庫寫入等方式發出,并記錄日志,這些通訊接口即為Snort 系統本身與外部系統進行通訊的主要接口,通過對Snort 輸出進行檢測和編程,即可進行防御操作。
OpenWrt 在產生之初是作為一個嵌入式的Linux發行版而出現的,提供了一個完全可寫的文件系統,并且也具有分支軟件倉庫和管理工具opkg,OpenWrt 倉庫中包含了大量的常用軟件,這使得在OpenWrt 上進行系統部署更加高效。
OpenWrt 基于Linux 內核,所以其內部的網絡轉發由iptables 防火墻和router 路由表項完成。netfilter/iptables 進行源地址偽裝、目的地址修改等數據轉發的最大優點是它可以配置有動態的、有狀態的防火墻,這是許多其他防火墻所不能提供的。在這種防火墻系統下,能夠記住發送或接收信息包所建立的連接的狀態,并給上級內核組件進行通訊[2]。
對于netfilter/iptables 的內部系統而言,其內置表有raw、mangle、nat、filter 四張,如圖2 所示[3]。內置規則鏈有PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD 五條規則鏈[4]。規則鏈是主要的處理數據包流向和執行DNAT、SNAT、過濾的規則,所有經過路由的流量都需要進行規則判斷,并進行一定的規則操作,使得網絡通訊能夠正常、高效地完成。

圖2 iptables的四個表
而數據包進入系統后,iptables 防火墻對數據包轉發的主要流程如圖3 所示,通過該機制與router 路由條例所配合,可以將數據包發送到對應的網絡接口[5]。

圖3 數據包在Linux內部的傳遞過程
首先使用VMware 搭建系統實現所需的網絡環境,再部署OpenWrt 系統與網絡環境進行聯通,于Open-Wrt 上配置Python 與Snort 的運行環境與檢測規則,搭建Windows XP 客戶端虛擬機和病毒特征庫Ubuntu 遠程數據庫系統。最后通過Python 在OpenWrt 上進行編程,解析Snort 的報警文件日志作為主要的消息源,檢測到消息源中產生了報警后,調用郵件客戶端進行郵件預警,并調動iptables 防火墻進行主動防御。
整個實驗環境由VMware 虛擬機進行部署,大致的網絡構思如圖4 和圖5 所示,其中圖4 主要作為正常用戶網絡模擬,圖5 作為模擬各入侵防御系統連入VPN 進而使用病毒特征庫的內部網絡。

圖4 實驗中的網絡架構

圖5 仿VPN的虛擬網絡架構
首先在VMware 中設置兩個虛擬網絡,打開VMware 的虛擬網絡編輯器,設置5 個虛擬網絡,并分別進行網絡設置。其設置羅列如下:
VMnet0,用于接入整個實驗系統的外部Internet,為實驗系統提供SMTP 郵件發送的網絡接口和通過opkg 從源部署Python3、Python 數據庫、郵件服務接口模塊、Snort 系統等。該網絡設置為NAT 模式,通過宿主機進行SNAT 接入外部網絡。
VMnet1,作為接入Router1 與Router2 之間的虛擬網絡,以模擬兩個網絡互訪的情況。該網絡設置為僅主機模式,并取消勾選將主機適配器連接到該虛擬網絡。
VMnet2,作為Router2 給其內部局域網通訊的虛擬網絡,以實現基本的DHCP-client 到路由的通訊功能。該網絡設置為僅主機模式,并取消勾選將主機適配器連接到該虛擬網絡。
VMnet3,作為Router1 給其內部局域網通訊的虛擬網絡,以實現基本的DHCP-client 到路由的通訊功能。該網絡設置為僅主機模式,并取消勾選將主機適配器連接到該虛擬網絡。
VMnet4,作為Router1-1 給其內部局域網通訊的虛擬網絡,以實現一個第三層交換機基本的通訊鏈路。
VMnet5,提供網絡入侵防御系統一個內部通訊局域網,可以快速的進行調試和給網絡入侵防御系統互相通訊與訪問病毒特征流量數據庫一個安全的鏈路。
在整個系統中具有兩種數據庫,一個是本地數據庫,使用Python 自帶的SQLite 數據庫作為實現系統,另一個是搭建在Ubuntu 上的網絡MySQL 數據庫,該數據庫上設定了root 用戶的網絡權限和MySQL 的網絡訪問配置,而且在Linux 防火墻上放行了MySQL 的網絡接口,這樣的設計可以讓系統更具有靈活性。
儲存系統信息的有Filter_IP 表、Filter_MAC 表、Warning 表。對于遠程病毒數據庫而言,儲存系統信息的有IDS_Rule 表和Virus_Data 表。
Filter_IP 表如表1 所示,用來儲存被過濾的IP 地址列表,該表中存放的信息有:IP 地址、被加入該表的原因(INFO)、事件的編號UID。

表1 Filter_IP 表
Filter_MAC 表如表2 所示,用來儲存被過濾的MAC 地址列表,該表中存放的信息有:MAC 地址、被加入該表的原因(INFO)、事件的編號UID。

表2 Filter_MAC 表
Warning 表如表3 所示,該表中存放的信息有:入侵者的IP 地址,入侵IP 的源端口、入侵事件中被害者的IP 地址,入侵事件中被害者IP 的源端口、入侵事件的時間、事件的編號UID、病毒編號SID、觸發事件額外信息INFO。

表3 Warning 表
Virus_Data 表如表4 所示,用來儲存病毒的信息,該表中存放的信息有:病毒的編號UID、病毒的名稱Name、病毒的版本Ver、病毒的危害等級Level、病毒的額外說明信息INFO。

表4 Virus_Data 表
IDS_Rule 表如5 所示,用來存儲IDS 規則信息,在該表中存放的信息有:IDS 額外規則、IDS 額外規則編號。

表5 IDS_Rule 表
郵件客戶端是通過Python 的SMTP 庫實現的,使用163 的郵箱賬戶作為系統的郵件發送者賬號,使用QQ 郵箱作為管理員郵箱,并進行消息推送。
SMTP/POP3 郵件客戶端的核心代碼如下:
email_client=smtplib.SMTP("smtp.163.com")
email_client.login(from_account,from_passwd)
msg=MIMEText(content,'plain','utf-8')
msg['Subject']=Header(subject,'utf-8')
msg['From']=from_account
msg['To']=to_account
email_client.sendmail(from_account, to_account, msg.as_string())
email_client.quit()
其中content 是消息內容,subject 鍵值是郵件的標題,From 是郵件中發信人的賬戶名稱,To 是郵件中接收人的賬戶名稱。通過設置郵件消息編碼、郵件服務器通訊地址、郵件內容,最后調用發送郵件函數和退出發信函數,即可完成郵件的發送。
Server 醬的API 接口代碼如下:
url='https://sc.ftqq.com/
SCU46567T452503e152853ef807fa65ebe08ce1eb5c8dbac14d2f
d.send'
data['text']='IDS Warning From%s'%Router_name
data['desp']=Message
req=requests.post(url,data=data)
其中,url 是Server 醬的API 通訊地址,data 作為HTTP 請求中POST 方法的傳遞參數進行數據傳輸,包含了微信消息的標題和內容,requests.post 向指定URL發送帶POST 參數的數據,使用Server 醬的微信通訊API 進行微信推送,所以管理員也能很快得知網絡內發生的安全事件。
運行虛擬機,開啟OpenWrt 路由系統和Windows XP 操作系統,如圖6、圖7 所示,并開啟OpenWrt 中的Python 程序和Snort 系統,并確認網絡通路正常和系統正常運行,記錄其IP 地址。

圖6 開啟虛擬環境

圖7 測試通訊程序
在xshell 中連入OpenWrt 路由器,并輸入指令
snort-c"snort.conf"-i"eth0"--daq-dir/usr/lib/daq-l./
和指令python3 main_program.py 來執行程序
命令結果如圖8 所示。

圖8 Snort運行圖
分別在兩臺系統上執行測試程序,代碼和運行截圖如圖9、圖10 所示。

圖9 通訊程序運行截圖
可以看到通訊程序已經可以成功連接了服務器,收到了來自服務器端的消息提示,這表明各虛擬網絡之間可以相互通信,網絡路由協議配置無誤,可以開始進行下一步操作。

圖10 服務端通訊程序響應圖
在OpenWrt 路由器的IPS 防御系統中,也出現了警報數據,并輸出了病毒ID 為10000001,警告信息warning report,警告時間,還有源和目的IP 信息,以及流量中的報文特征,如圖11 所示。

圖11 Python代碼輸出獲取到Snort的輸出日志
防御系統也已經對其進行了網絡封鎖,使得三層通訊中斷,數據會在經過路由時被丟棄,無法繼續進行網絡通訊,如圖12 所示。微信客戶端收到了通知信息,如圖13 所示。
本文主要針對入侵檢測與入侵防御進行研究,在研究了相關技術之后使用開源的Snort 入侵檢測系統作為整個系統的檢測引擎,配合開源的OpenWrt 路由系統作為整個入侵防御系統的基本運行平臺,實現了一個安全的網絡系統,并且通過實驗證明該系統的有效性。

圖12 連接被截斷圖

圖13 郵件通知圖