很多文章介绍了如何通过建立,改善,以及分析服务器日记文件的种种方式,监测出来黑客入侵行为,但这些都是过去式,都是在入侵发生后你才知道存在这种行为而加以防范。最好的方法是能够在当场就能监测出恶意的网络入侵行为,并且马上采取防范反击措施加以纠正。 1、何谓IDS? 简单的说,设立IDS的唯一目的就是当场监测到网络入侵事件的发生。IDS就是一个网络上的系统,这个系统包含了下面三个组件: (1)网络监测组件,用以捕捉在网络线上传递的封包。 (2)接口组件,用以决定监测中的资料传递是否属于恶意行为或恶意的使用。在网络传递时,用来比较的资料样式 (pattern),以监测恶意网络活动。 (3)响应组件,针对当时的事件予以适当的响应。这个响应可以是简单的,例如寄发一个电子邮件讯息给系统管理者,或者是复杂的,例如暂时将违规者的IP地址过滤掉,不要让他连到这个网络来。 2、IDS如何通过网页监测网络入侵事件 IDS系统不只必须监测各式各样,从大到小,以及各种系列的系统上的网络攻击事件,它还必须能够快速及时地的在第一时间内监测到入侵事件的发生。因此,IDS的数据库以及式样比对(pattern-matching)机制是复杂到令人难以置信的。 要使IDS能够监测通过网页的入侵事件,其中的网络监测组件就必须要能够捕捉所有通过网页通讯端口上,借着HTTP 通讯协议传递的网络资料往来。(注意,SSL的网络交通是完全绕过IDS的网络监测的,因为这些网络交换资料都是经过加密的。)式样比对组件在这里,主要是用于比较URL解析的结果,看看是否符合数据库中的恶意的HTTP回询(request)。 接下来,我介绍如何制作两个快速而简易的IDS,用来监测可疑的网页回询活动。这些解决方案的目的是在于提供系统管理者,让他们拥有一个特别针对他们网络而设计的监测/响应系统。 3、制作快速而简易的IDS (1)Network Grep 工具 我们先从一个简单的网络监视程序开始,这个程序是用来监测 HTTP 通讯协议的网络资料往来。HTTP回询的特色是,它使用以下的语法: 〈HTTP-Request-Method〉 〈URL〉 HTTP/〈version〉 这个可在Packetfactory入口网站寻获的程序ngrep针对在网络上传递往来的资料,执行正则表示法(regular expression)式样比对。我们可以用以下的指令来利用ngrep拦截并显示所有纯文字形式的 HTTP 资料往来: #ngrep-iqt“^GET|^HEAD|^TRACE|^POST|^PUT and HTTP” 以上指令中,-iqt 选项是指示ngrep不要区分资料中的大小写,并且只有显示封包中有符合式样比对的资料,以及在显示资料时加上日期以及时间的标题。(注:比对的式样,是基于 GET,HEAD,TRACE,POST,PUT,以及 HTTP 等关键词。欲知更多有关如何在ngrep使用正则表示法,你可以到http://www.packetfactory.net/Projects/Ngrep/查看相关资料。) 以上面我们建议的方式使用ngrep再加上运行越来越受欢迎的 Whisker程序,监测地址为 10.1.1.2 的IIS5.0 服务器平台,我们得到了以下的结果: T 03:37:30.041739 10.1.1.21:2425 -> 10.1.1.2:80 [AP] T 2001/01/16 03:37:30.108630 10.1.1.21:2426 -> 10.1.1.2:80 [AP] T 2001/01/16 03:37:31.842452 10.1.1.21:2427 -> 10.1.1.2:80 [AP] T 2001/01/16 03:37:31.854206 10.1.1.21:2428 -> 10.1.1.2:80 [AP] T 2001/01/16 03:37:33.644534 10.1.1.21:2429 -> 10.1.1.2:80 [AP] 现在你就可以采取行动了。 (2)执行式样比对 使用ngrep拦截网络资料往来很简单。然而,分析捕捉到的资料并从中抽取URL则略具难度。因为ngrep将资料输出拆成一行一行的,所以我们必须额外耗费很多精力,去重组输出的资料,并将该资料中的URL与已知的网络攻击行为模式做比对。 此时,我向大家介绍另一个用来监测网页传送的犀利工具软件了。这个软件就叫做urlsnarf,它是由Dug Song写成的dsniff工具软件套件的一部份。urlsnarf 从所拦截的网络资料传送中,捕捉所有的 HTTP 回询,并且将结果以共享日记文件格式(Common Log Format ,CLF)显示出来,这种格式就跟市面上的网页服务器,诸如Apache或者是IIS所用的格式一样。 跟当初我们用ngrep的方式一样,我们使用urlsnarf并且在 10.1.1.2 的服务器上执行Whisker,所得到的结果如下: # urlsnarf 10.1.1.21 - - [16/02/2001:03:58:43 +0530] "GET http://10.1.1.2/cfdocs/ HTTP/1.0" - - "http://10.1.1.2/" "Mozilla/5.0 [en] (Win95; U)" 10.1.1.21 - - [16/02/2001:03:58:45 +0530] "GET http://10.1.1.2/scripts/ HTTP/1.0" - - "http://10.1.1.2/" "Mozilla/5.0 [en] (Win95; U)" 10.1.1.21 - - [16/02/2001:03:58:45 +0530] "GET http://10.1.1.2/scripts/cfcache.map HTTP/1.0" - - "http://10.1.1.2/" "Mozilla/5.0 [en] (Win95; U)" 10.1.1.21 - - [16/02/2001:03:58:48 +0530] "GET http://10.1.1.2/cfcache.map HTTP/1.0" - - "http://10.1.1.2/" "Mozilla/5.0 [en] (Win95; U)" 10.1.1.21 - - [16/02/2001:03:58:50+0530]"GET 10.1.1.21 - - [16/02/2001:03:58:52 +0530] "GET http://10.1.1.2/cfappman/index.cfm HTTP/1.0" - - "http://10.1.1.2/" "Mozilla/5.0 [en] (Win95; U)" 使用urlsnarf唯一的缺点是,它现在的程序是写死的,只监听TCP通讯端口80(纯文字HTTP),3128(MS-proxy)以及8080(generic/squid proxy)。从其它通讯端口传输的HTTP协议资料则完全被忽略。要想改变这种限制,你必须在urlsnarf的原始程序代码中做一些小小的改变。然而,光是urlsnarf所提供的功能,就已经远远的超过它所给我们的限制了。 因为urlsnarf以CLF格式产生日记,我们可以将它的输出结果,转送到任何在网页服务器上使用CLF格式分析日记的日记分析软件。 4、监测恶性入侵性网页浏览行为 通过urlsnarf的输出,我们可以开始建立式样比对程序,以寻找网络入侵事件。在这里我利用一个简单的Perl程序来跟urlsnarf一起监测一些基本的网络入侵行为。我们会把urlsnarf的执行结果转传给这个式样比对程序,通过式样比对的方法监测网络入侵行为。 式样比对程序的第一步是,定义一连串入侵性的URL查询。为了简单起见,我们只列出某些URL如下: %cgis = ("/msadc/msadcs.dll" => "mdac", 我们使用了%cg集中储存所有我们需要的恶意URL查询式样。在这里,我们也可以从一个含有这些“特征”的档案,动态建立这个查询式样库。 注意,以上的URL本身并无害;然而,它们通常被黑客利用来做恶意的网页攻击的基础。(例如:msdacs.dll就可以被用来破坏 MDAC/RDS)。 下一步,是设定容忍的最低程度,即:如果某个访客查询某个URL超过三次的话,这个访客的IP地址就会被列在黑名单中。在我们的程序里,定义如下: $threshold = 3; 下一段重要的程序代码,是一个以while叙述开始的循环,这个循环会从urlsnarf读取每一个CLF纪录,并且做分析。为了避免谈到太多Perl程序语言的细节,有关 while 循环的说明就像以下这样: while(〈 〉) { # # pick out the IP,timestamp andURLfrom theCLFline # # select the resource from the URL # check if there is a match with theURL 变量$resource的值为URL回询中的resource字符串。例如,如果URL为 http://10.1.1.2/msadc/msadcs.dll,那么 resource 字符串的值就是 /msadcs/msadcs.dll。 接着是,寻找我们的URL“特征”库,看看所查询的URL字符串是否符合其中的一个特征。如果式样符合,我们找出这个查询出处的IP地址, 然后将它的访客指数加一。如果访客观存在指数超过了我们的容忍底线,那么我们将这个IP地址标为黑客地址。 下面是式样比对部分的程序代码: # check if there is a match with the URL 将这个程序取名为pattern_match.pl。开始使用urlsnarf以及 pattern_match.pl,urlsnarf 以及pattern_match.pl 得出来的结果应该是如下所示: #urlsnarf| pattern_match.pl 一个Whisker扫描范例,执行urlsnarf以及pattern_match.pl,监测地址为 10.1.1.2 的IIS5.0 服务器平台,我们得到了以下的结果: ** 10.1.1.21 webhits ism showcode newdsn 这些结果告诉我们,来自IP地址 10.1.1.21 的访客为恶意访客,并且也列出了一连串针对 10.1.1.2 的相关可疑的URL回询。黑客回报系统是在“特征 URL”已经被查询三次了以后,第四次类似的查询又发生(newdsn)才被激活的。 5、小结 在这里,我向大家介绍了如何利用IDS系统监测以网页为媒介的网络入侵活动以及示范如何让各式各样的工具以及script在很短的时间内组织起来,以形成功能强大的工具。但由于本人的知识及经验有限,难免存在不足之处,希望大家验给予指正,谢谢!在以后在篇章中,我将会大家介绍网络入侵监测软件如何抵挡黑客们使用的IDS躲避技术。
因此即时监测黑客入侵行为并以程序自动产生响应的网络入侵监测系统(又称IDS)产生了。
HEAD / HTTP/1.0..User-Agent: Mozilla/5.0 [en] (Win95; U)..Referer: http://10.1.1.2/..Connection: close....
GET /cfdocs/ HTTP/1.0..User-Agent: Mozilla/5.0 [en] (Win95; U)..Cookie: ASPSESSIONIDGQGQGLAC=HDJNBOGBIPOCPNCKOJOPBCFD;path=
/..Referer:http://10.1.1.2/..Connection: close....
GET /scripts/ HTTP/1.0..User-Agent: Mozilla/5.0 [en] (Win95; U)..Cookie: ASPSESSIONIDGQGQGLAC=HDJNBOGBIPOCPNCKOJOPBCFD;path=
/..Referer:http://10.1.1.2/..Connection: close....
GET /scripts/cfcache.map HTTP/1.0..User-Agent: Mozilla/5.0 [en]
(Win95; U)..Cookie: ASPSESSIONIDGQGQGLAC=HDJNBOGBIPOCPNCKOJOPBCFD;
path=/..Referer: http://10.1.1.2/..Connection: close....
GET /cfcache.map HTTP/1.0..User-Agent: Mozilla/5.0 [en] (Win95; U)..Cookie: ASPSESSIONIDGQGQGLAC=HDJNBOGBIPOCPNCKOJOPBCFD;path=
/..Referer:http://10.1.1.2/..Connection: close....
urlsnarf: listening on eth0
10.1.1.21 - - [16/02/2001:03:58:43 +0530] "HEAD http://10.1.1.2/ HTTP/1.0" - - "http://10.1.1.2/" "Mozilla/5.0 [en] (Win95; U)"
http://10.1.1.2/cfide/Administrator/startstop.html HTTP/1.0" - - "http://10.1.1.2/" "Mozilla/5.0 [en] (Win95; U)"
"/msadc/Samples/selector/showcode.asp" => "showcode",
"/cgi-bin/guestbook.cgi" => "guestbook",
"/cgi-bin/test-cgi" => "test-cgi",
"/cgi-bin/finger" => "finger",
"/cfdocs/expelval/exprcalc.cfm" => "exprcalc",
"/cgi-bin/phf" => "phf",
"/scripts/samples/search/webhits.exe" => "webhits",
"/scripts/iisadmin/ism.dll" => "ism",
"/scripts/tools/newdsn.exe" => "newdsn",
"/scripts/perl.exe" => "perl_exe",
"/scripts/proxy/w3proxy.dll" => "w3proxy"
);
# # parse incoming log line
# $logline = $_;
# $logline =~ /(S+).+?([.+]).+?(".+?").+/;
# $ip = $1;
# $time = $2;
# $url = $3;
# $url =~ /w+s+.*//.+?(/.*)s+.*/;
# $resource = $1;
if($cgis{$resource} ne "") {
push(@{ $offender_list{$ip} }, $cgis{$resource});
# check if the threshold count is crossed
if($offence_count{$ip}++ > $threshold) {
# response to intrusion detected
print STDERR "** $ip " . join(" ",@{ $offender_list{$ip} }) . "n";
} }
** 10.1.1.21 webhits ism showcode newdsn mdac
** 10.1.1.21 webhits ism showcode newdsn mdac w3proxy
** 10.1.1.21 webhits ism showcode newdsn mdac w3proxy perl_exe