網絡掃描器的設計與實現
發表于:2007-07-14來源:作者:點擊數:
標簽:
摘要:信息安全是為了保障計算機系統軟件、應用軟件及網絡軟件可靠運行;防止信息的非授權訪問、獲取與篡改;保證信息完整性與可用性。本文分析了網絡掃描器在信息安全領域的作用與設計實現思想。 關鍵詞:信息安全,網絡漏洞,套接字,分布式拒絕服務,簡單
摘要:信息安全是為了保障計算機系統軟件、應用軟件及網絡軟件可靠運行;防止信息的非授權訪問、獲取與篡改;保證信息完整性與可用性。本文分析了網絡掃描器在信息安全領域的作用與設計實現思想?! ?br>
關鍵詞:信息安全,網絡漏洞,套接字,分布式拒絕服務,簡單郵件傳輸協議
一 掃描器軟件概述
計算機網絡的迅猛發展引發了人們對
網絡安全的重視,信息安全的目標在于保護信息保密性、完整性以及對合法用戶提供應有服務。網絡漏洞是系統軟、硬件存在安全方面的脆弱性,安全漏洞的存在導致非法用戶入侵系統或未經授權獲得訪問權限,造成信息篡改和泄露、拒絕服務或系統崩潰等問題。系統管理員可根據安全策略,使用網絡工具實現系統安全審計?! ?br>
1.1 掃描器的功能
掃描器是檢測遠程或本地系統安全脆弱性的軟件;通過與目標主機TCP/IP端口建立連接和并請求某些服務(如TELNET、FTP等),記錄目標主機的應答,搜集目標主機相關信息(如匿名用戶是否可以登錄等),從而發現目標主機某些內在的安全弱點。掃描器的重要性在于把極為煩瑣的
安全檢測,通過程序來自動完成,這不僅減輕管理者的工作,而且縮短了檢測時間,使問題發現更快。當然,也可以認為掃描器是一種網絡安全性評估軟件。一般而言,掃描器可以快速、深入地對網絡或目標主機進行評估?! ?br>
1.2 掃描器的分類
從信息流的角度理解信息安全,可劃分為數據存放的安全性與網絡傳輸的安全性(涉及操作系統安全性及應用程序的安全性),網絡中任何一個環節出現不安全因素都會破壞整個信息流的安全性,因此把掃描器分為三類:
數據庫安全掃描器,操作系統安全掃描器和網絡安全掃描器(針對于網絡服務、應用程序、網絡設備、網絡協議等)。對掃描對象的脆弱性進行深入了解,能較好地用運用程序來自動檢測發現其是否存在已有的漏洞;能給掃描時發現的問題提供一個良好的
解決方案;能在系統實現時,提高效率并提供了相應的補救信息?! ?br>
二 網絡掃描器設計方案
網絡掃描器是一個涉及
知識面廣、動態性強的軟件,應具有易于配置、易于擴展、快速掃描、智能報告和深度分析等功能。網絡掃描是對系統脆弱性的分析評估,能夠檢查、分析網絡范圍內的設備、網絡服務、操作系統、數據庫系統等系統的安全性,從而為提高網絡安全的等級提供決策的支持?! ?br>
2.1 基本功能模塊
經過大量的分析與調研,進而設計出由以下幾個模塊組成的網絡掃描器:用戶界面,友好的用戶界面使掃描配置更加簡單有效,結果顯示清楚條理,掃描插件維護功能方便;掃描引擎,檢測目標系統,調度掃描插件模塊,執行
安全測試;掃描插件,主要完成對目標系統的檢查;脆弱性報告,能夠依據不同的
需求,提供不同形式的報表;數據庫,包括系統安全漏洞、告警信息和補救方法?! ?br>
2.2 掃描內容的分類
根據安全漏洞的測試原理,掃描內容可分為:general普通、Microsoft win9x/NT平臺、firewalls防火墻、useless services無用服務、ftp文件傳輸協議、back
doors后門程序、cgi abuses(cgi濫用)、remote file a
clearcase/" target="_blank" >ccess遠端文件獲取、gain root remotely遠端獲得根權限、rpc遠端過程調用、nis網絡信息服務、finger abuses(finger 濫用)、smtp problems簡單郵件傳輸協議的錯誤、virus病毒、DDoS分布式拒絕服務、Router Setting路由器配置等20多種類型,800多個安全漏洞。簡介如下:
(1)ftp文件傳輸協議類
ftp服務廣泛應用于Internet中,同時具有顯著的安全脆弱性。如匿名ftp本身不是安全漏洞,但其提供了訪問遠程系統能力,入侵者可借此獲取系統口令文件并探測系統漏洞,因而通常禁用匿名ftp服務,開放時必須正確配置并進行嚴格管理;此外,建立上傳目錄往往為了便于在Internet上交換文件,而網絡攻擊者則在可寫區域中肆意刪除、修改信息或上傳惡意代碼(如特洛伊木馬、計算機病毒等)?! ?br>
(2) DDoS分布式拒絕服務類
分布式拒絕服務攻擊也是最為常見的網絡攻擊方法,進攻形式多種多樣。從利用網絡協議到針對操作系統平臺的漏洞,都可以發出拒絕服務攻擊,可以說其攻擊手段防不勝防。通過發送連續的字符可以檢測Microsoft SQL Server等數據庫
服務器是否有DDoS漏洞?! ?br>
(3) firewall防火墻類
設置網絡防火墻的目的是在通信網與外界網之間提供一道屏障,以保護網絡中的信息流免受來自外部網絡的各種威脅。防火墻可以是路由器、PC機、主機系統或一批主系統,是硬件和軟件的組合體。由于網絡防火墻自身存在的設計問題和使用配置錯誤,掃描器可以檢測不同類別或版本的網絡防火墻存在的安全漏洞?! ?br>
三 實現中的關鍵問題
網絡掃描器采用B/S模式進行軟件
開發,B/S模式是指軟件的主體部分都在服務器端,用戶只需使用瀏覽器發出掃描服務的請求,由服務器執行對掃描目標的掃描操作,并將最終掃描結果以脆弱性報告形式發送到客戶端。這種模式的優點在于用戶只需通過瀏覽器,就可以對目標進行掃描,操作簡單易學?! ?br>
3.1 Windows Sockets編程
Socket存在于通信區域中是網絡通信基本構件,是可以被命名和尋址的通信端點,網絡編程中各套接字都有相關進程與其類型對應。下面僅就網絡掃描器開發過程中用到的Windows Socket的一些共性操作加以說明?! ?br>
(1) 設置服務器地址和連接端口
struct sockaddr_in sad; // 獲得主機地址的結構
struct hostent *ptrh; // 指向主機入口的指針
ptrh=NULL;
sad.sin_port=htons(21); // 如設定連接端口為21
sad.sin_addr.s_addr=inet_addr(host->ip); //掃描目標主機IP地址
sad.sin_family=AF_INET; // 地址類型規范
(2) 創建Windows Socket套接字
套接字類型可根據通信特征進行分類。Windows Sockets 1.1支持兩種套接字:流套接字SOCK_STREAM和數據報套接字SOCK_DGRAM。具體實現如下:
SOCKET sd; // 定義sd為Socket
sd=socket(PF_INET,SOCK_STREAM,0); //創建TCP Socket套接字
if (sd<0) {return FALSE;} // sd<0表示本地創建Socket失敗,返回值為假
socket(int af, int type, int protocol)指定地址族、數據類型和協議描述符及相關資源?! ?br>
(3)套接字建立連接與數據的收發
connect(SOCKET s, const struct sockaddr FAR * name, int namelen)參數s是套接字描述符,name是套接字地址結構指針,namelen說明套接字地址長度?! ?br>
在TCP協議中數據發送與接收函數為send和recv,UDP協議中為sendto和recvfrom,使用時調用程序要提供超時控制?! ?br>
send ( SOCKET s, const char FAR * buf, int len, int flags );
recv ( SOCKET s, char FAR * buf, int len, int flags );
sendto(SOCKET s,const char FAR * buf,int len,int flags,const struct sockaddr FAR * to, int tolen ); //UDP協議中數據發送函數
recvfrom ( SOCKET s, char FAR * buf,int len, int flags, struct sockaddr FAR * from, int FAR * fromlen ); //UDP協議中數據接受函數
3.2 數據結構
檢測系統存在的安全漏洞是不斷被發現與升級的,這要求網絡掃描器的開發應具有很強擴展性,通過準實時的增加掃描功能或擴展掃描插件可較好解決這一問題,插件的開發利用Microsoft Visual C++ 6.0編譯鏈接后生成DLL文件。為便于統一管理,將文件的擴展名修改為NFS,由NFS的調用模塊調用執行,編寫的插件源代碼包括如下兩個數據結構:
struct RECORD
{ char classname[50]; //插件所屬的類型名
char ID[10]; //標名插件的類及成員關系
char membername[50]; //插件的成員名稱
char filename[50]; //插件對應的文件名(不含路徑)
char risk[10]; //標名風險的等級
char description[300]; //該插件對應的文字描述
char advice[300]; //該插件提供的一些建議
bool mark; //標識該插件是否被某一模板選中
}record; //建立信息說明數據庫,內容包括插件所屬的類型名、插件的類及成員關系、插件對應的文件名、風險的等級、提供的建議等。優點是主調模塊可自動加載插件文字說明部分,存儲到數據庫中,便于主程序快速調用,易于開發人員的管理和配置?! ?br>
struct HOST
{ char ip[15]; //目標主機的IP地址
int mark; //標示buff的類別
char buff[200]; //動態返回信息
int timeout; //超時控制變量
}host; //指定了插件運行的參數,包括目標主機IP地址、動態返回信息及標示類別與超時控制變量,主機IP和超時控制參數由主調模塊傳遞。優點是使插件富有靈活性和擴展性。兩個標準函數:extern"C" __declspec( dllexport )BOOL InitFunc(struct RECORD *record)
和extern "C" __declspec( dllexport ) BOOL ApplFunc(struct HOST *host) 前者便于插件管理和使用,后者根據不同參數實現相關功能?! ?br>
3.3 編程示例
在設計方案中依照掃描內容將插件分為20多類,這里對具有普遍性和代表性的例子加以分析說明(篇幅所限僅列出插件中主要函數部分代碼)?! ?br>
(1)檢測Microsoft SQL Server 是否有DDoS漏洞
extern "C" __declspec( dllexport ) BOOL InitFunc(struct RECORD *record)
{ strcpy(record->advice,"過濾發向端口1433的數據包。"); //建議
strcpy(record->classname,"DDoS"); //類型
strcpy(record->description,"SQL server接收連續0信號TCP包時被非法關閉");
strcpy(record->filename,"ms
sqlserver_dos.nfs");
strcpy(record->ID,"6XX"); //編號
strcpy(record->membername,"ms
sqlserver_dos");
strcpy(record->risk,"嚴重"); //等級
record->mark=true;
return true;}
extern "C" __declspec( dllexport ) BOOL ApplFunc(struct HOST *host)
{ struct sockaddr_in sad; //structure to hold server's address
struct hostent *ptrh; //pointer to host entry
SOCKET sd; char buf[6]; memset(buf,0,6);
memset((char *)&sad,0,sizeof(sad)); //clear sockaddr structure
ptrh=NULL;
sad.sin_port=htons(1433); // SQL通信端口號1433
sad.sin_addr.s_addr=inet_addr(host->ip);
sad.sin_family=AF_INET;
sd=socket(PF_INET,SOCK_STREAM,0); // TCP連接
if (sd<0) {return FALSE;}
if (connect(sd,(struct sockaddr *)&sad,sizeof(sad))<0)
{closesocket(sd); return FALSE;}
buf[0]=0x00; buf[1]=0x00; buf[2]=0x00;
buf[3]=0x00; buf[4]=0x00; buf[5]=0x00;
send(sd,buf,sizeof(buf),0);
closesocket(sd); Sleep(2000); //等待
sd=socket(PF_INET,SOCK_STREAM,0); //再次建立連接
if (sd<0) {return FALSE;}
if (connect(sd,(struct sockaddr *)&sad,sizeof(sad))<0)
{closesocket(sd); return true; }//連接失敗,則發生拒絕服務
closesocket(sd); return FALSE;}
簡要說明:Microsoft SQL Server通信端口為1433,程序首先與SQL Server建立TCP連接并判斷連接是否成功;然后向服務器發送連續字節的0并關閉連接,等待數秒后,再次試圖與服務器建立連接,如果失敗則表明服務器已發生拒絕服務故障?! ?br>
(2)smtp problems簡單郵件傳輸協議漏洞掃描
extern "C" __declspec( dllexport ) BOOL InitFunc(struct RECORD *record)
{ strcpy(record->advice,"升級NT Mail3系統。"); //建議
strcpy(record->classname,"SMTP problems"); //類型
strcpy(record->description," smtp存在非授權郵件收發,可能成為攻擊跳板");
strcpy(record->filename,"nt_spam.nfs");
strcpy(record->ID,"7XX");
strcpy(record->membername,"nt_spam");
strcpy(record->risk,"中");
record->mark=true;
return true;}
extern "C" __declspec( dllexport ) BOOL ApplFunc(struct HOST *host)
{ struct sockaddr_in sad; //structure to hold server's address
struct hostent *ptrh; //pointer to host entry
SOCKET sd; char buf[1024]; memset(buf,0,1024);
memset((char *)&sad,0,sizeof(sad)); //clear sockaddr structure
ptrh=NULL; sad.sin_port=htons(25); // 端口號25
sad.sin_addr.s_addr=inet_addr(host->ip);
sad.sin_family=AF_INET;
sd=socket(PF_INET,SOCK_STREAM,0);
if (sd<0) {return FALSE;}
if (connect(sd,(struct sockaddr *)&sad,sizeof(sad))<0)
{closesocket(sd); return FALSE;}
strcpy(buf,"HELO\n"); //第一步
send(sd,buf,sizeof(buf),0); //發送數據
fd_set rd; //超時控制
FD_ZERO(&rd); FD_SET(sd,&rd);
struct timeval tv={host->timeout,0};
select(sd,&rd,NULL,NULL,&tv);
int n=recv(sd,buf,1024,0); //接收數據
if (n<0) {closesocket(sd);return FALSE;} // 判斷接收是否成功
strcpy(buf,"MAIL FROM:<>\n"); //第二步
send(sd,buf,sizeof(buf),0); //發送數據
FD_ZERO(&rd); //超時控制
FD_SET(sd,&rd); select(sd,&rd,NULL,NULL,&tv);
n=recv(sd,buf,1024,0); // 接收數據
if (n<0) {closesocket(sd);return FALSE;} // 判斷接收是否成功
strcpy(buf,"RCPT TO: nobody@990.net\n"); //第三步
send(sd,buf,sizeof(buf),0); // 發送數據
FD_ZERO(&rd); // 超時控制
FD_SET(sd,&rd); select(sd,&rd,NULL,NULL,&tv);
n=recv(sd,buf,4,0); //接收4字節的字符串
if (n<0) {closesocket(sd);return FALSE;} // 判斷接收是否成功
closesocket(sd); //在字符串中尋找執行成功代碼“250”
if ((buf[0]=='2')&&(buf[1]=='5')&&(buf[2]=='0')) return true;
if ((buf[1]=='2')&&(buf[2]=='5')&&(buf[3]=='0')) return true;
return FALSE;}
簡要說明: SMTP保證高效可靠地傳輸郵件服務器上安裝不同的服務軟件后,可能會因程序錯誤和配置不當引起一些安全漏洞??赡軐е路掌魍V筍MTP服務,也可能使存儲在服務器上的用戶郵件信息泄露、丟失或被篡改。程序分三個步驟執行:首先與目標主機NT Mail3系統25端口建立TCP連接,發送“HELO\n”并在超時時間內判斷有無接收;然后發送“MAIL FROM:<>\n”并在超時時間內判斷有無接收;最后發送“RCPT TO: nobody@990.net\n”,如接收到代碼“250”則存在安全漏洞?! ?br>
(3)gain root remotely(遠端獲得根權限類):這類插件測試的目標主機一般都有操作系統平臺上的漏洞或服務程序配置不當。遠程攻擊者通過向主機發送特定的非法數據,如過長的命令行,可導致主機發生緩沖區溢出、處理器資源耗盡等故障,根據操作系統和服務軟件的不同,有的故障還可能會提高遠程用戶的權限?! ?br>
extern "C" __declspec( dllexport ) BOOL InitFunc(struct RECORD *record)
{strcpy(record->advice,"升級至最新版本或者過濾來自TCP 617端口的數據流");
strcpy(record->classname,"gain root remotely");
strcpy(record->filename,"Arkeia.nfs");
strcpy(record->ID,"4");
strcpy(record->membername,"Arkeia");
strcpy(record->risk,"高");
record->mark=true;return true;} //也可取自數據庫,對漏洞劃分等級提出建議
extern "C" __declspec( dllexport ) BOOL ApplFunc(struct HOST *host)
{ struct sockaddr_in sad; //structure to hold server's address//
struct hostent *ptrh; //pointer to host entry//
SOCKET sd; char buf[10000];
memset(buf, ’a’, 10000); // buf中存儲了10000字節的“a”
memset((char *)&sad,0,sizeof(sad));//clear sockaddr structure//
ptrh=NULL; sad.sin_port=htons(617); // 連接端口設為617
sad.sin_addr.s_addr=inet_addr(host->ip);
sad.sin_family=AF_INET;
sd=socket(PF_INET,SOCK_STREAM,0); //本地創建套接字
if (sd<0) {return FALSE;} //建立套接字連接
if (connect(sd,(struct sockaddr *)&sad,sizeof(sad))<0)
{closesocket(sd);return FALSE;}
send(sd,buf,sizeof(buf),0); //發送buf中的數據
closesocket(sd); sd=socket(PF_INET,SOCK_STREAM,0);
if (sd<0){closesocket(sd);return FALSE;} //再次建立連接
if (connect(sd,(struct sockaddr *)&sad,sizeof(sad))<0)
{closesocket(sd);return FALSE;} closesocket(sd);
return true;}
調試說明:插件調試時由于沒有找到相應的服務程序,服務器只打開了默認通信端口617來模擬服務程序;在與主機建立連接后,向其發送10000個字節數據企圖使服務器緩沖區溢出。關閉這個連接再試圖建立新連接,如失敗則認為達到了預先的攻擊目的?! ?br>
四 結束語
隨著Internet的高速發展,國家社會信息化建設腳步的加快,包括政府機關、軍隊、企業與商業在內的各行各業進入了一個前所未有的網絡建設時代。但由于黑客活動日益猖獗,網絡入侵事件越來越多,網絡系統的安全已經成為網絡建設面臨的一個重大問題:如何能夠有效地防止網絡系統被攻擊,是網絡建設需要首先解決的問題,同時了解網絡安全狀況又是防止網絡被攻擊必須解決的問題;只有發現并填補了網絡系統存在的各種安全漏洞,才能更有效地保護我們自己的網絡,真正將網絡帶來的優勢發揮出來?! ?br>
參 考 文 獻
Andrew S.Tanenbaum.計算機網絡.北京:清華大學出版社,1998
anonymous.網絡最高安全技術指南.北京:機械工業出版社,1998
David A.Solomon. Windows NT技術內幕.北京:清華大學出版社,1999
Douglas E.Comer. TCP/IP網絡互連技術.北京:清華大學出版社,1998
David J.Kruglinski. Visual C++ 技術內幕.北京:清華大學出版社,1999
Chris hare, Karanjit Siyan. Internet防火墻與網絡安全.北京:機械工業出版社,1998
Andrew S.Tanenbaum, Albert S.Woodhull.Operating Systems Design and Implementation.北京:電子工業出版社,1999
原文轉自:http://www.anti-gravitydesign.com