频道栏目
首页 > 安全 > 杀毒防毒 > 正文

防火墙 Outpost Firewall Pro评测分析

2011-02-13 10:05:00           
收藏   我要投稿

文/ kumbayo 译/BlackBeast
在本文中,笔者将详细分析著名防火墙Outpost Pro的系统特点,以及该防火墙的优点和缺点,并将详细地展开介绍一些技术细节。
系统保护模式特点
Outpost Pro防火墙的保护方法是丰富多样的,这些主要工作由驱动文件“filtnt.sys”实现,它是防火墙的核心模块。此外,Outpost Pro还提供系统插件程序,这种插件程序可以在不改变系统内核的前提下进行功能扩展。
系统插件程序的扩展名是“.ops”,这可能是从“Outpost firewall Plug-in”缩写来的,在安装该防火墙后,我在系统中发现了此类插件的安装。
该防火墙的一些选项具体包括如下:
Attach Quarantine:过滤邮件,并且自动重新命名潜在的危险文件。
Active Content:允许阻止Web页面上某些动态交互对象,例如ActiveX、scropts、Flash等。
Attack Detection:允许检测并自动终止外来或者内部的攻击行为。
DNS Cache:自动记录常用网站的IP地址。
Content:根据网页内容过滤网页,即关键字过滤。
Anti-Spyware:发现并终止多种间谍软件的威胁,确保计算机使用者个人数据的安全,阻止木马程序,阻止其他未获认可的软件行为。
Ads:阻止网页广告。
为了提供上述功能,防火墙会安装下列动态链接文件,并通过filtnt.sys与之交互完成相应任务。动态链接文件具体包括ablock.dll、arp.dll、content.dll、dnscache.dll、ftpfilt.dll、htmlfilt.dll、httpfilt.dll、imapfilt.dll、mailfilt.dll、nntpfilt.dll、pop3filt.dll、protect.dll、secret.dll和sockfilt.dll。
除此之外,本防火墙还有一个重要的特征。众所周知,HTTP数据报中的数据可能会为了减少体积而压缩,最常用的压缩方式是gzip,具体的数据组织方式由HTTP服务器决定,如果服务器决定这么做,那么数据包就会包含报头“Accept-Encoding: gzip,deflate (null)”,接受端,也就是浏览器在收到报头后会自动解压缩数据。DLL文件urlmon.dll提供了一套操作GZIP的工具函数集合,例如函数“_ReadGzipHeager”,但是这些函数都无法被导出。所以本防火墙改变了传统的HTTP通讯过程,强迫服务端必须发送未加密的原始数据,这会增加服务器工作时间。如果不希望这样的话,可以修改注册表“HKEY_LOCAL_MACHINESOFTWAREAgnitumOutpost Firewall EnableGzipEncoding = 1”,但是必须声明,这样的修改会影响防火墙的过滤效果,某些信息只有在扫描未经加密的原始数据时才能被有效发现并过滤。
防火墙的过滤方法概述
有关系统过滤的详细细节可以参考网站http://ntoskrnl.com的说明,这里只介绍Outpost Firewall Pro 的过滤方式。
驱动FILTNT.SYS附加在tcpip.sys上,可以看到它使用下面的回调函数来获得内核驱动写操作的通知。
 
NTSTATUS PsSetLoadImageNotifyRoutine(
N PLOAD_IMAGE_NOTIFY_ROUTINE
);
 
回调函数必须遵循下面的格式:
 
VOID (*PLOAD_IMAGE_NOTIFY_ROUTINE) (
IN PUNICODE_STRING FullImageName,
IN HANDLE ProcessId,
IN PIMAGE_INFO ImageInfo
);
 
此外,这个驱动必须以SERVICE_BOOT_START方式加载,它对NDIS进行了hook,通过更改其导出表监听了下面的函数:NdisCloseAdapter、NdisDeregisterProtocol、NdisIMRegisterLayeredMiniport、NdisMRegisterMiniport、NdisOpenAdapter、NdisRegisterProtocol。
这个驱动实现了两种监听方式:NDIS过滤钩子和NDIS中间层驱动,有关NDIS的其他相关信息可以在DDK里找到。此外,它还在如下的设备上安装了过滤器:DeviceRawIp、DeviceUdp、DeviceTcp和DeviceIp;并且安装了所谓的TDI 过滤驱动,有关TDI的信息也可以在DDK中找到。著名的开源防火墙项目tdi_fw就是基于该技术的。
对于微软的Windows XP以及更高版本的系统,Outpost Pro的内置过滤接口是由 IP过滤驱动IpFilterDriver.sys实现的,Windows的内建防火墙也是基于这个模块实现的,关于这个驱动模块的更多信息可以在网站http://microsoft.com上获得。
在NDIS发送的数据包和TDI的IRP包之间存在着必然的联系,即使你的驱动可以绕过TDI过滤驱动,你发送给设备“DeviceTcp”的IRP数据包也是不会在网络协议栈中消失的。
除了上面所说的,Outpost Firewall Pro还通过更改Service Descriptor Table的方式HOOK了下面的函数。
 
NTSTATUS ZwWriteVirtualMemory (
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG ReturnLength OPTIONAL
);
 
这个函数是用来对内存进行写操作的,通过监控这个函数可以确保信任程序的地址空间受到保护。如果想对此进行更加深入地了解,可以访问:http://www.sysinternals.com获得更多的信息。
事实上这样的保护力度是远远不够的,例如ZoneLab公司生产的防火墙ZoneAlarm就额外对下列潜在的危险函数进行了监控:ZwConnectPort、ZwCreateFile、ZwCreateKey、ZwCreateProcess、ZwCreateProcessEx、ZwCreateSection、ZwDeleteFile、ZwDeleteKey、ZwDeleteValueKey、ZwDuplicateObject、ZwLoadDriver、ZwLoadKey、ZwMapViewOfSection、ZwOpenFile、ZwOpenProcess、ZwOpenThread、ZwReplaceKey、ZwRequestWaitReplyPort、ZwRestoreKey、ZwSecureConnectPort、ZwSetInformationFile、ZwSetSystemInformation、ZwSetValueKey、ZwTerminateProcess、ZwUnloadDriver。
防火墙漏洞分析及利用
Outpost Firewall Pro监控是通过注册回调函数的方式进行的。
 
NTSTATUS PsSetCreateProcessNotifyRoutine(
IN PCREATE_PROCESS_NOTIFY_ROUTINE
IN BOOLEAN
);
 
回调函数格式如下:
 
VOID (*PCREATE_PROCESS_NOTIFY_ROUTINE) (
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
);
 
我们发现,驱动文件filtnt.sys用来完成关于创建和终止进程的工作,根据分析,该驱动使用PsSetCreateProcessNotifyRoutine对进程创建进行监控,如果我们能够得到其代码,我想我们大概能够找到如下内容:
 
for (i=0; i < PSP_MAX_CREATE_PROCESS_NOTIFY; i++) {
if (Remove) {
if (PspCreateProcessNotifyRoutine[i] == NotifyRoutine) {
PspCreateProcessNotifyRoutine[i] = NULL;
PspCreateProcessNotifyRoutineCount -= 1;
return STATUS_SUCCESS;
}
} else {
if (PspCreateProcessNotifyRoutine[i] == NULL) {
PspCreateProcessNotifyRoutine[i] = NotifyRoutine;
PspCreateProcessNotifyRoutineCount += 1;
return STATUS_SUCCESS;
}
}
}

可见,PspCreateProcessNotifyRoutine保存了在进程创建或终止是调用的回调函数的地址,这种特性在Windows 2000及其以前版本是一致的,在后期版本中有所不同,但是其核心思想一致。
下面我们站在进攻者的角度分析,如果清空这个数组会发生什么呢?例如将该数组全部元素置零?答案是“完全的自由”,防火墙无法区别进程的创建和终止,更无法根据“信任程序列表”限制相关程序的行为。在系统内存中进行如下更改之后,所有程序的全部数据包将会在网络上畅通无阻,防火墙将对这一切视而不见。
为什么会这样呢?这是Windows程序设计的一个战术错误还是一个致命的疏忽呢?我们无法获知确定的答案,唯一确定的就是Agnitum不会通过这个漏洞获得任何好处。
为了证明上述分析,我编写了一个驱动进行试验,其中最困难的部分是获得该数组的地址,这个数组并非导出变量,且地址在Windows家族的各个版本中有所不同,所以我的驱动不打算运行于全部的Windows版本中,我计划针对Windows XP进行开发,因为这版Windows是全部系统中使用最为广泛的一个。此外,我们需要一款反汇编工具,可以工作于内核模式,我选择了LDasm,它可以胜任全部的工作。
这个数组最多有8个元素,其中不一定只包含Outpost Firewall Pro的回调函数地址,还可能包括其他杀毒软件、间谍程序防御软件等等的回调函数。
在此我提醒各位读者,使用其他人编写的驱动必须非常小心,因为这些驱动可能包含潜在的漏洞并被恶意软件编写者加以利用。
最终我们获得了PsSetCreateProcessNotifyRoutine的反汇编代码,如图1所示。标记部分就是我们需要的内存地址,也就是存入寄存器EDI的地址值。其二进制代码为 0xBF00E0548057,其中0x57是操作码,用来向EDI填入数据,0x80540E00就是对应数据的地址。根据这些分析我们就可以编程获得该地址了。
 


图1
获得地址的过程在getPspCreateProcessNotifyRoutine()中实现,具体代码如下。
 
PVOID getPspCreateProcessNotifyRoutine( )
{
PUCHAR _ptr;
PUCHAR cPtr, pOpcode;
ULONG Length;
__asm {
pushad
mov eax, PsSetCreateProcessNotifyRoutine
mov eax, [eax+2]
mov eax, [eax]
mov _ptr, eax
popad
}
for (cPtr = (PUCHAR)_ptr;
cPtr < (PUCHAR)_ptr + PAGE_SIZE;
cPtr += Length)
{
Length = SizeOfCode(cPtr, &pOpcode);
if (!Length) break;
if (*(PUSHORT)cPtr == 0xBF && *(pOpcode + 5) == 0x57)
{
return *(PVOID **)(pOpcode + 1);
}
}
return NULL;
}

程序首先获得函数PsSetCreateProcessNotifyRoutine的地址,然后对函数地址空间进行搜索,寻找特定的操作数0x57,可以使用这个操作数作为判断所需数据位置的标志,找到后,获取该操作数后面的内存内容

相关TAG标签 防火墙
上一篇:巧抓罪魁ARP病毒 局域网不再频繁断
下一篇:微软免费杀毒软件MSE自动更新设置方法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站