
本文的内容是怎样利用IIS本身的一些特性建立后门。当然,这主要是一份供网络管理员和网络安全工作人员参考的“Know Your Enemy”类文档,作者希望这篇文章能够对检查和清除后门有所帮助,而并不鼓励或赞同利用本文的技巧进行违法活动。
首先简单介绍一下IIS的配置文档MetaBase.bin。这个文档位于%SystemRoot%\system32\inetsrv\MetaBase.bin,包含了几乎任何IIS的配置信息,是很重要的系统文档。简单的说,我们在“intenet服务管理器”中所作的一切配置最终都会被保存在MetaBase.bin中。在日常的系统管理中除了通过“intenet服务管理器”来对MetaBase.bin进行操作外,Windows还提供了一个脚本adsutil.vbs能够对MetaBase.bin进行操作。
MetaBase的结构类似于注册表,也是树形结构,有类似键、值、项的概念。事实上在IIS3和PWS中,MetaBase的内容就是存储在注册表中的。MetaBase有两个主键:LM和Schema。其中,Schema保存了系统默认的一些配置,通常无需修改,一旦改错也很危险,所以无论是“intenet服务管理器”还是adsutil.vbs都没有提供修改Schema的机制。LM中包含了IIS的HTTP服务,FTP服务,SMTP服务等的配置信息。其中,LM/W3SVC/下是我们要用到的HTTP服务的配置信息。
几个下面会提到的值:
LM/W3SVC/InProcessIsapiApps,进程内启动ISAPI。这是个数组,里面包含的是一组指向一些ISAPI的路径。在这个数组里面的ISAPI运行的时候都是由inetinfo.exe直接启动的,继承inetinfo.exe的local system权限;而不在其中的ISAPI则是由svchost.exe派生的dllhost.exe进程启动的,运行的身份是IWAM_NAME,当然,这是IIS默认的安全级别“中”的情况下,假如设为低,那么任何ISAPI都会由inetinfo.exe直接派生。另外,假如设定的时候不指定路径,而是仅指定一个扩展名,那么任何路径下的同名ISAPI在被调用的时候都会以system权限执行。
ScriptMaps,脚本映射。在某个目录下设定该值后,则向该目录请求的特定扩展名的文档会交给指定的ISAPI执行。需要强调的是,设定ScriptMaps的目录并不一定要真实存在的,只要在MetaBase中某个HTTP实例的root键下建了一个子键,对该字键同名目录的HTTP请求IIS会认为是合法的,并会交由映射的ISAPI处理。这也算是IIS的一个问题吧。
CreateProcessAsUser,在某个目录下指定改值为0,则该目录下的应用程式会继承inetinfo.exe的local system权限。
AccessWrite,决定某个目录是否允许写入,也就是WEBDAV的PUT方法。
AccessExecute,决定某个目录是否允许执行应用程式。
后门思路:
创建一个特定扩展名的脚本映射,指向我们的ISAPI,并把该ISAPI添加到InProcessIsapiApps列表中。那么我们向服务器请求该扩展名类型文档时就会在服务器上以local system权限执行该ISAPI,且所请求的文档并无需是真实存在的。
技巧:
1、既然并无需真的建一个目录来设定ScriptMaps,那么就能够只写一个键,并给这个键加上ScriptMaps。这样,从“intenet服务管理器”里是看不出这个目录的,更看不到这个ScriptMaps。
2、虽然“intenet服务管理器”里面看不出来,但是有经验的管理员可能习惯于偶尔用adsutil.vbs enum /p来看一下:
# adsutil.vbs enum /p /w3svc/1/root Microsoft (R) Windows Script Host Version 5.6 版权任何(C) Microsoft Corporation 1996-2001。保留任何权利。
[/w3svc/1/root/_vti_bin] [/w3svc/1/root/evildir]
这样就暴露了。
因为我们设的那个键并不是真实存在的虚拟目录,只是配置文档中的一个字符串,所以能够使用0x08这样的字符来做键值。0x08是Backspace键对应的16进制值,控制台上显示的效果是向左边删除一个字符,其实就是把“/”给删了:
# adsutil.vbs enum /p /w3svc/1/root Microsoft (R) Windows Script Host Version 5.6 版权任何(C) Microsoft Corporation 1996-2001。保留任何权利。
[/w3svc/1/root/_vti_bin] [/w3svc/1/root]
面对这种输出,一般人是不会留意的。
当然也能够设为类似_vti_script,_vti_bin这样的名字,只要不设KeyType,在“intenet服务管理器”中是看不见的。
因为系统中本身InProcessIsapiApps中有一个\WINNT\System32\msw3prt.dll,是.printer的映射,一般用不上。我们能够删掉D:\WINNT\System32\msw3prt.dll的值,换上\WINNT\System32\inetsrv\msw3prt.dll。
3、美中不足的是HTTP请求会留下痕迹,但是HTTP也有好处,那就是能够随便用一个代理服务器做跳板。另外,也能够用插入0x0D 0x0A来伪造日志的方法,(详见《Apache,IIS等多种http服务器允许通过发送回车符伪造日志》一文)这就是构造目录的技巧了。
[1][2]
|