[摘要]1. 前言 3 2. 报警信息 3 3. NFR的检测 4 4. 协议分析 8 5. 漏洞说明 15 6. 漏洞分析 18 7. 小结 20 1. 前言 NFR(Net...
1. 前言 3
2. 报警信息 3
3. NFR的检测 4
4. 协议分析 8
5. 漏洞说明 15
6. 漏洞分析 18
7. 小结 20
1. 前言
NFR(Network Flight Recorder)是一个老牌的商业网络IDS产品,最初由Firewall的牛人Marcus J. Ranum创建,是作为一个通用的网络流量分析和记录软件来实现的,为了最大限度地发挥分析工具的灵活性,NFR提供了完善强大的N-Code脚本语言,在很多的评测中表现出色。虽然L0pht为NFR提供过数百个签名库,但是缺乏一个可靠的签名集一直是他的软肋。
使用NFR有一段时间后,发现NFR存在着不少问题。且不说AI对中文的兼容性差而经常退出,也不说NFR版本升级而攻击事件说明却一直用旧版本的说明,单是IDS中最关键的攻击签名库,却让我大跌眼镜。除了升级缓慢以外,甚至还存在不少错误的签名。本系列文章针对其中我发现的部分问题进行分析和阐述,以便各位更好地利用NFR产品,同时也想和各位同仁讨论IDS中攻击签名库的编写。由于知识和时间的限制,错误之处在所难免,还希望得到各位的指教,任何意见或建议请发至:benjurry@xfocus.org
SQL Server是微软为对抗Oracle推出的数据库, 占领的市场份额已经仅次于Oracle,居世界第二,但是其安全性也一直受到用户的置疑。从1996年,Microsoft公司推出的SQL Server 6.5版本到1998年推出的SQL Server 7.0,以及到2000年8月推出了SQL Server 2000,在版本和功能不断升级的情况下,安全问题却没有得到很好地改善,不断发布针对SQL Server的安全公告和补丁。在2003年1月24日,针对SQL Server的“Slammer”蠕虫在Internet上肆虐,导致网络流量激增,严重影响了世界范围内的计算机和网络系统。SQL Server的漏洞引起了各大安全公司和厂商的重视,因此NFR也立即发布了多个针对SQL Server的攻击签名,其中包括了2002年8月7日Immunity公司Dave Aitel发现的Hello Buffer Overflow漏洞。但是在使用过程中,我发现NFR针对该漏洞的报警非常多,于是我对此进行了分析,于是写成了这个文章,以做记录。
2. 报警信息
下面是NFR针对MS SQL Hello Buffer Overflow的报警信息:
Severity: Attack
Time: 13:54:21 15-Jul-2003
Source File: packages/mssql/sql2k.nfr
Line: 226
Host: benjurry-xfocus
Alert ID: mssql_sql2k:buffered_hello
Source ID: mssql_sql2k:source_me
Source: mssql_sql2k:source_me
Source Description: Sqlserver 2k overflow detector
Source PID: 36531
Alert Message: Saw 8 Mssql HELLO overflows from 192.168
0.110 in 900 seconds
: 3
Source IP: 192.168.0.110
Destination IP: --
其中包括了事件的严重等级、时间、NFR Sensor名字、攻击源IP、目的IP和一些其他报警信息。
在实际的使用中,一天产生了几百条这种报警,看来这是个误报,我们可以好好的分析一下了。
3. NFR的检测
我们首先打开NFR发布的签名库 MSSQL.fp(或者也可以在AI的package中查看) 看一下NFR的针对这个漏洞的攻击签名:
<snip>
…..
变量定义等…
…
<snip>
sqlserv_schema = library_schema:new(1, ["time","ip","int","ip","int", "str"],
scope());
sqlserv_rec = recorder("bin/list %c", "sqlserv_schema");
HELLO_SIG = "\x12\x01\x00\x34\x00\x00\x00\x00\x00\x00\x15";
MIN_LEN = strlen(HELLO_SIG);
…….
<snip>
filter hello tcp (client, dport: 1433) {
declare $Blob inside tcp.connsym;
if ($Blob == NULL) {
$Blob = tcp.blob;
} else {
$Blob = cat($Blob, tcp.blob);
}
if (strlen($Blob) < MIN_LEN)
return;
if (prefix($Blob, HELLO_SIG)) {
if (COUNTHELLO[tcp.connsrc]) {
COUNTHELLO[tcp.connsrc] = COUNTHELLO[tcp.connsrc] + 1;
} else {
COUNTHELLO[tcp.connsrc] = 1;
}
if (do_alert(hello_overflow_alert, tcp.connsrc)) {
alert(source_me, hello_overflow_alert, tcp.connsrc,
tcp.connsport, tcp.conndst, tcp.conndport,
"--AlertDetails",
"ALERT_ID", "40-8",
"ALERT_CONFIDENCE", 60,
"ALERT_SEVERITY", "medium",
"ALERT_IMPACT", "unknown",
"ALERT_EVENT_TYPE", "attack",
"ALERT_ASSESSMENT", "unknown",
"IP_ADDR_SRC", tcp.connsrc,
"PORT_SRC", tcp.connsport,
"IP_ADDR_DST", tcp.conndst,
"PORT_DST", tcp.conndport,
"IP_PROTO_NUM", 6);
}
record packet.sec, tcp.conndst, tcp.conndport, tcp.connsrc,
tcp.connsport, $Blob to sqlserv_rec;
misc_attacks:rec(packet.sec, scope(),
"Mssql HELLO overflow!", tcp.connsrc, tcp.conndst);
}
}
从上面的N-CODE中我们可以看到,NFR在做这个检测的时候步骤如下:
1、定义了一个攻击特征码:
HELLO_SIG = "\x12\x01\x00\x34\x00\x00\x00\x00\x00\x00\x15";
和攻击特征码的长度:
MIN_LEN = strlen(HELLO_SIG);
2、从TCP的载荷数据中取出数据,把这个数据的长度和特征码长度比较,如果这个数据长度小于攻击特征码的长度,那么就不再进行下一步的检测;
3、否则,把这个数据和特征码进行字符串匹配,如果一致则认为是攻击行为,然后进行阻止或者报警。
接下来我们分析一下NFR IDS Record的数据,在AI中选择package->Query->MSSQL->MSSQL Server 200,定好条件,按Table查到数据,随便选取一条,copy出来得到如下内容:
Time: 15-Jul-2003 13:54:21
NFR: benjurry-xfocus
Destination Address:192.168.0.135
Destination Port: 1433
Source Address: 192.168.0.110
Source Port: 1391
Payload:
\x12\x01\x004\x00\x00\x00\x00\x00\x00\x15\x00\x06\x01\x00\x1b\x00
\x01\x02\x00\x1c\x00\x0c\x03\x00(\x00\x04\xff\x08\x00\x00\xc2\x00
\x00\x00MSSQLServer\x00x\x03\x00\x00
上面这条记录包含了攻击的时间,报告攻击行为的NIDS sessor名字,目的IP、目的端口、源ip和源端口,而我们关心的是有效载荷Payload,因为它是NIDS用来和攻击签名库比较的数据。但是NFR在这里有几个小问题:
1. 会把payload中的能转换成ASCII字符的16进制数转换成ASCII码;
2. 不能处理Unicode的字符,这个将在以后的分析中可以看到。
在这个例子中为了分析方便,我们把上面的payload中的字符特征码部分转换成16进制数:
\x12\x01\x00\x34\x00\x00\x00\x00\x00\x00\x15\x00\x06\x01\x00\x1b
\x00\x01\x02\x00\x1c\x00\x0c\x03\x00\x28\x00\x04\xff\x08\x00\x00
\xc2\x00\x00\x00MSSQLServer\x00x\x03\x00\x00
NFR抓到数据组包后,发现是SQL Server包,便把里面的内容和SQL Server的攻击库进行比较,很明显,上面所列的数据和攻击库是相符合的,因此一个报警便产生了,但是这真是一个攻击行为吗?我们继续看下面的分析。
4. 协议分析
根据Xfocus的协议分析项目(将会在近期公布项目成果),MS SQL 2000用的是TDS8.0,它的格式如下:
-------------------------------------------------
关键词:优化NFR之一 --MSSQL Hello Buffer Overflow