见证了传说中的防火墙之神
安装了个传说中神一般的防火墙-ZA,体验了一下,的确很安全,打开个网页都要猛刷F5么,尝试了各种策略,还是要猛刷F5,得出结论-->很暴力很安全
阻止了任何数据流量么,你说安全不安全?
居然和我的杀毒软件不兼容
4个英文字母
...
安装了个传说中神一般的防火墙-ZA,体验了一下,的确很安全,打开个网页都要猛刷F5么,尝试了各种策略,还是要猛刷F5,得出结论-->很暴力很安全
阻止了任何数据流量么,你说安全不安全?
居然和我的杀毒软件不兼容
4个英文字母
...
来源:安全焦点
author : baiyuanfan
mail : baiyuanfan@163.com
July 1st 2006
关键字:
封包过滤技术,NDIS钩子,应用程序访问网络控制,TDI钩子,智能行为监控,反流氓软件,自我保护技术。
本文简要介绍了目前流行的Windows软件防火墙的各个功能组件,及其实现方法。
内容目录:
Windows软件防火墙的发展概况
封包过滤技术
应用程序访问网络控制
智能行为监控
反流氓软件技术
自我保护技术
附录
Windows软件防火墙的发展概况
从Windows软件防火墙的诞生开始,这种安全防护产品就在跟随着不断深入的黑客病毒与反黑反毒之争,不断的进化与升级。从最早期的只能分析来源地址,端口号以及未经处理的报文原文的封包过滤防火墙,后来出现了能对不同的应用程序设置不同的访问网络权限的技术;近年来由ZoneAlarm等国外知名品牌牵头,还开始流行了具有未知攻击拦截能力的智能行为监控防火墙;最后,由于近来垃圾插件和流氓软件的盛行,很多防火墙都在考虑给自己加上拦截流氓软件的功能。综上,Windows软件防火墙从开始的时候单纯的一个截包丢包,堵截IP和端口的工具,发展到了今天功能强大的整体性的安全套件。
接下来本文就对一个Windows软件防火墙应当拥有的这些组件进行一个简要的技术介绍。
封包过滤技术
封包过滤技术是最原始的防火墙所拥有的第一种功能。但是该功能简单强大,直到现在都是任何一个防火墙必不可少的功能。
想要在网络数据包到达应用程序之前拦截之,就要在系统的网络协议栈上面安装过滤钩子。对Windows NT系列内核来说,可能安装过滤钩子的地方大致是这么几个,从高层到底层排序:SPI层(早期的天网防火墙),AFD层(资料缺乏,尚无例子),TDI层(不少国内墙),NDIS层(ZoneAlarm,Outpost等)。越位于高层,则产品开发难度越低,但是功能越弱,越容易被攻击者所穿越。由于NDIS层的防火墙具有功能强大,不易被穿透等优点,近来各大防火墙厂商的趋势是选择NDIS层来做包过滤。
目前比较流行的NDIS钩子技术有两种。一种是挂接ndis.sys模块的导出函数,从而能够在每个ndis protocol注册的时候截获其注册过程,从而替换其send(packets)handler和receive(packet)handler。这个方法的缺点是在第一次安全之后无法立刻生效,必须要重起一次,而且要禁用的话,也必须重起。
2004年12月的时候,www.rootkit.com上面的一名黑客发表了一篇著名的文章:“Hooking into NDIS and TDI, part 1”(http://www.rootkit.com/newsread.php?newsid=219)。这篇文章本意是为rootkit作者们提供一种挂接底层驱动实现端口重用的方法,但是这篇文章揭示了一个全新的技术:通过动态的注册ndis假协议,可以获得ndis protocol的链表地址。得到这个地址之后就能不通过重起,就能替换并监控每个ndis protocol的send(packets)handler和receive(packet)handler,并且可以动态的卸载监控模块不需要重起。在这篇文章出现之后,很多防火墙厂商都悄悄地对自己的产品进行了升级。目前的ZoneAlarm等产品就是使用这种技术,可以在安装后即时发挥作用。这个例子更充分的体现了,黑客和反黑技术本来就是相辅相成的,本源同一的。
这里给出一个寻找该链表头的代码例子:
该函数返回的NDIS_HANDLE就是链表头地址。
NDIS_HANDLE RegisterBogusNDISProtocol(void)
{
NTSTATUS Status = STATUS_SUCCESS;
NDIS_HANDLE hBogusProtocol = NULL;
NDIS_PROTOCOL_CHARACTERISTICS BogusProtocol;
NDIS_STRING ProtocolName;
NdisZeroMemory(&BogusProtocol,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
BogusProtocol.MajorNdisVersion = 0x04;
BogusProtocol.MinorNdisVersion = 0x0;
NdisInitUnicodeString(&ProtocolName,L"BogusProtocol");
BogusProtocol.Name = ProtocolName;
BogusProtocol.ReceiveHandler = DummyNDISProtocolReceive;
BogusProtocol.BindAdapterHandler = dummyptbindadapt;
BogusProtocol.UnbindAdapterHandler = dummyptunbindadapt;
NdisRegisterProtocol(&Status,&hBogusProtocol,&BogusProtocol,
sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
if(Status == STATUS_SUCCESS){ return hBogusProtocol;}
else {
#ifdef bydbg
DbgPrint("ndishook:cannot register bogus protocol:%x\n",Status);
DbgBreakPoint();
#endif
return NULL;
}
}
得到这个ndis protocol的链表后,遍历表中的每一个ndis protocol,对于每一个ndis protocol,又各有一个链表,用来描述和该ndis protocol有联系的所有ndis miniport和该ndis protocol绑定的状态。每个这种状态块,叫做一个ndis open block。每个绑定的send(packets)handler和receive(packet)handler都在这个ndis open block里面。
struct _NDIS_OPEN_BLOCK
{
#ifdef __cplusplus
NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
#else
NDIS_COMMON_OPEN_BLOCK;
#endif
#if defined(NDIS_WRAPPER)
//
// The stuff below is for CO drivers/protocols. This part is not allocated for CL drivers.
//
struct _NDIS_OPEN_CO
{
....
};
#endif
};
typedef struct _NDIS_COMMON_OPEN_BLOCK
{
PVOID MacHandle; // needed for backward compatibility
NDIS_HANDLE BindingHandle; // Miniport's open context
PNDIS_MINIPORT_BLOCK MiniportHandle; // pointer to the miniport
PNDIS_PROTOCOL_BLOCK ProtocolHandle; // pointer to our protocol
NDIS_HANDLE ProtocolBindingContext;// context when calling ProtXX funcs
PNDIS_OPEN_BLOCK MiniportNextOpen; // used by adapter's OpenQueue
PNDIS_OPEN_BLOCK ProtocolNextOpen; // used by protocol's OpenQueue
NDIS_HANDLE MiniportAdapterContext; // context for miniport
BOOLEAN Reserved1;
BOOLEAN Reserved2;
BOOLEAN Reserved3;
BOOLEAN Reserved4;
PNDIS_STRING BindDeviceName;
KSPIN_LOCK Reserved5;
PNDIS_STRING RootDeviceName;
//
// These are referenced by the macros used by protocols to call.
// All of the ones referenced by the macros are internal NDIS handlers for the miniports
//
union
{
SEND_HANDLER SendHandler;
WAN_SEND_HANDLER WanSendHandler;
};
TRANSFER_DATA_HANDLER TransferDataHandler;
//
// These are referenced internally by NDIS
//
SEND_COMPLETE_HANDLER SendCompleteHandler;
TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
RECEIVE_HANDLER ReceiveHandler;
RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;
WAN_RECEIVE_HANDLER WanReceiveHandler;
REQUEST_COMPLETE_HANDLER RequestCompleteHandler;
//
// NDIS 4.0 extensions
//
RECEIVE_PACKET_HANDLER ReceivePacketHandler;
SEND_PACKETS_HANDLER SendPacketsHandler;
//
// More Cached Handlers
//
RESET_HANDLER ResetHandler;
REQUEST_HANDLER RequestHandler;
RESET_COMPLETE_HANDLER ResetCompleteHandler;
STATUS_HANDLER StatusHandler;
STATUS_COMPLETE_HANDLER StatusCompleteHandler;
#if defined(NDIS_WRAPPER)
....
#endif
} NDIS_COMMON_OPEN_BLOCK;
需要处理的,是ndis open block里面的SendHandler,ReceiveHandler,WanReceiveHandler,ReceivePacketHandler和SendPacketsHandler。
一定要注意的是,不同于很多文章中的描述,主要处理SendHandler和ReceiveHandler,正确的应该是主要处理ReceivePacketHandler和SendPacketsHandler,现在的主流网卡和系统驱动,都是使用后面两者。
应用程序访问网络控制
以往的防火墙只能古板的允许或者禁止整个系统去访问网络上的目标,比如允许了系统可以访问外网的http端口,就允许了所有进程,不能只
本文将向你解释你在防火墙的记录(Log)中看到了什么?尤其是那些端口是什么意思?你将能利用这些信息做出判断:我是否受到了Hacker的攻击?他/她到底想要干什么?本文既适用于维护企业级防火墙的安全专家,又适用于使用个人防火墙的家庭用户。
一、目标端口ZZZZ是什么意思
所有穿过防火墙的通讯都是连接的一个部分。一个连接包含一对相互“交谈”的IP地址以及一对与IP地址对应的端口。目标端口通常意味着正被连接的某种服务。当防火墙阻挡(block)某个连接时,它会将目标端口“记录在案”(logfile)。这节将描述这些端口的意义。
端口可分为3大类:
1) 公认端口(Well Known Ports):从0到1023,它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。
2) 注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。
3) 动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始。
从哪里获得更全面的端口信息:
1.ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers
"Assigned Numbers" RFC,端口分配的官方来源。
2.http://advice.networkice.com/advice/Exploits/Ports/
端口数据库,包含许多系统弱点的端口。
3./etc/services
UNIX 系统中文件/etc/services包含通常使用的UNIX端口分配列表。Windows NT中该文件位于%systemroot%/system32/drivers/etc/services。
4.http://www.con.wesleyan.edu/~triemer/network/docservs.html
特定的协议与端口。
5.http://www.chebucto.ns.ca/~rakerman/trojan-port-table.html
描述了许多端口。
6.http://www.tlsecurity.com/trojanh.htm
TLSecurity的Trojan端口列表。与其它人的收藏不同,作者检验了其中的所有端口。
7.http://www.simovits.com/nyheter9902.html
Trojan Horse 探测
二、通常对于防火墙的TCP/UDP端口扫描有哪些?
本节讲述通常TCP/UDP端口扫描在防火墙记录中的信息。记住:并不存在所谓ICMP端口。如果你对解读ICMP数据感兴趣,请参看本文的其它部分。
0 通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用一种通常的闭合端口连接它时将产生不同的结果。一种典型的扫描:使用IP地址为0.0.0.0,设置ACK位并在以太网层广播。
1 tcpmux 这显示有人在寻找SGI Irix机器。Irix是实现tcpmux的主要提供者,缺省情况下tcpmux在这种系统中被打开。Iris机器在发布时含有几个缺省的无密码的帐户,如lp, guest, uucp, nuucp, demos, tutor, diag, EZsetup, OutOfBox, 和4Dgifts。许多管理员安装后忘记删除这些帐户。因此Hacker们在Internet上搜索tcpmux并利用这些帐户。
7 Echo 你能看到许多人们搜索Fraggle放大器时,发送到x.x.x.0和x.x.x.255的信息。
常见的一种DoS攻击是echo循环(echo-loop),攻击者伪造从一个机器发送到另一个机器的UDP数据包,而两个机器分别以它们最快的方式回应这些数据包。(参见Chargen)
另一种东西是由DoubleClick在词端口建立的TCP连接。有一种产品叫做“Resonate Global Dispatch”,它与DNS的这一端口连接以确定最近的路由。
Harvest/squid cache将从3130端口发送UDP echo:“如果将cache的source_ping on选项打开,它将对原始主机的UDP echo端口回应一个HIT reply。”这将会产生许多这类数据包。
11 sysstat 这是一种UNIX服务,它会列出机器上所有正在运行的进程以及是什么启动了这些进程。这为入侵者提供了许多信息而威胁机器的安全,如暴露已知某些弱点或帐户的程序。这与UNIX系统中“ps”命令的结果相似
再说一遍:ICMP没有端口,ICMP port 11通常是ICMP type=11
19 chargen 这是一种仅仅发送字符的服务。UDP版本将会在收到UDP包后回应含有LJ字符的包。TCP连接时,会发送含有LJ字符的数据流知道连接关闭。Hacker利用IP欺骗可以发动DoS攻击。伪造两个chargen服务器之间的UDP包。由于服务器企图回应两个服务器之间的无限的往返数据通讯一个chargen和echo将导致服务器过载。同样fraggle DoS攻击向目标地址的这个端口广播一个带有伪造受害者IP的数据包,受害者为了回应这些数据而过载。
21 ftp 最常见的攻击者用于寻找打开“anonymous”的ftp服务器的方法。这些服务器带有可读写的目录。Hackers或Crackers 利用这些服务器作为传送warez (私有程序) 和pr0n(故意拼错词而避免被搜索引擎分类)的节点。
22 ssh PcAnywhere建立TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点。如果配置成特定的模式,许多使用RSAREF库的版本有不少漏洞。(建议在其它端口运行ssh)
还应该注意的是ssh工具包带有一个称为make-ssh-known-hosts的程序。它会扫描整个域的ssh主机。你有时会被使用这一程序的人无意中扫描到。
UDP(而不是TCP)与另一端的5632端口相连意味着存在搜索pcAnywhere的扫描。5632(十六进制的0x1600)位交换后是0x0016(使进制的22)。
23 Telnet 入侵者在搜索远程登陆UNIX的服务。大多数情况下入侵者扫描这一端口是为了找到机器运行的操作系统。此外使用其它技术,入侵者会找到密码。
25 smtp 攻击者(spammer)寻找SMTP服务器是为了传递他们的spam。入侵者的帐户总被关闭,他们需要拨号连接到高带宽的e-mail服务器上,将简单的信息传递到不同的地址。SMTP服务器(尤其是sendmail)是进入系统的最常用方法之一,因为它们必须完整的暴露于Internet且邮件的路由是复杂的(暴露+复杂=弱点)。
53 DNS Hacker或crackers可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其它通讯。因此防火墙常常过滤或记录53端口。
需要注意的是你常会看到53端口做为UDP源端口。不稳定的防火墙通常允许这种通讯并假设这是对DNS查询的回复。Hacker常使用这种方法穿透防火墙。
67和68 Bootp和DHCP UDP上的Bootp/DHCP:通过DSL和cable-modem的防火墙常会看见大量发送到广播地址255.255.255.255的数据。这些机器在向DHCP服务器请求一个地址分配。Hacker常进入它们分配一个地址把自己作为局部路由器而发起大量的“中间人”(man-in-middle)攻击。客户端向68端口(bootps)广播请求配置,服务器向67端口(bootpc)广播回应请求。这种回应使用广播是因为客户端还不知道可以发送的IP地址。
69 TFTP(UDP) 许多服务器与bootp一起提供这项服务,便于从系统下载启动代码。但是它们常常错误配置而从系统提供任何文件,如密码文件。它们也可用于向系统写入文件。
79 finger Hacker用于获得用户信息,查询操作系统,探测已知的缓冲区溢出错误,回应从自己机器到其它机器finger扫
黑客们发布了一种新的攻击代码,它能够使某些安装了XP系统的计算机的Windows防火墙失效。
黑客们在上周六早上在网络上发布了该代码,它可使打了完全补丁的、正在运行 Windows互联网连接服务(ICS)的Windows XP计算机的防火墙失效。ICS使用户可以把自己的计算机转化为一台路由器,从而与同一局域网(LAN)内的用户共享网络连接。该服务经常被家庭或小企业使用。
nCircle网络安全公司的一名研究工程师Tyler Reguly在他的blog中描述了如下细节:攻击者可以发送恶意数据包给使用ICS的另一台计算机,这将导致ICS服务中止。由于该服务与Windows的防火墙连接着,因此这个数据包也导致防火墙停止工作。
“一旦防火墙停止工作,你拿什么保护你的电脑?”周一的一次采访中,他说。
Reguly说,关闭Windows防火墙后,犯罪分子可以继续进行新的攻击,但是种种原因使他们不大可能这样做。
例如,为了使攻击有效,攻击者不得不在互联网内,而且,该代码只在使用ICS的系统上才能起作用,系统默认情况下,ICS是处于关闭状态的。另外,该攻击对计算机上运行的第三方防火墙也无效。
用户可以通过关闭ICS功能来避免被攻击,Reguly说。但是这同样会切断共享的网络连接。
安全网络SRL的CTO Stefano Zanero说,ICS用户可采用的更简单的解决方案可能是,就将他们的网络移到路由器或者NAT(网址解析)装置上。他通过即时消息说,现在这些装置很便宜,很多情况下用他们更安全并且更容易管理你的LAN。
Reguly说,XP系统似乎是该攻击影响的唯一平台,它对Windows Server 2003就没有效。
微软初步调查了这个问题,“已经得出结论,该攻击只会影响XP用户,”微软公共关系代理机构周一在一次声明中表示。“这次,微软没有发现任何企图利用该漏洞的攻击,也没有用户受到影响。”
=============================================
原文链接:http://www.networkworld.com/news/2006/103006-new-windows-attack-can-kill.html
原文作者:Robert McMillan
近期评论