原文地址:http://drops.wooyun.org/papers/1019

0x00 测试环境


操作系统:Windows Server 2008 R2 Enterprise Service Pack 1 x64 IIS版本:IIS7.5 程序:asp.net

0x01 IIS7.5的安装


2014030611270847744.jpg

http 常见功能:开启静态内容,默认文档,HTTP错误;目录浏览,WebDAV发布如无特殊要求,不要开启;HTTP重定向可根据需要开启。

应用程序开发:这个可根据实际情况开启,如为asp.net的开启ASP.NET,.NET扩展性,ISAPI扩展,ISAPI筛选;在服务器端的包含文件根据需要开启。

健康和诊断:建议开启HTTP日志记录,日志记录工具,请求监视;其他可根据需要开启。

安全性:建议开启URL授权,请求筛选,IP和域限制;其他根据需要开启。

性能,管理工具,ftp服务器,IIS可承载的Web核心可根据开启。

0x02 IIS7.5权限配置介绍


IIS7.5涉及两个账户,一个为匿名账户,一个为应用程序池账户。在磁盘的NTFS权限设置中,匿名账户只需要拥有对网站目录的读取权限即可;而应用程序池账户需要根据程序实际情况给予相应权限,比如:需要去写文件,则要给予写权限,需要去调用一个程序(如cmd.exe)则需要给予执行权限。总之,对文件的访问,首先需要有匿名账户的访问权限,然后再根据程序的操作需要什么样的权限给予应用程序池账户相应的权限。

研究发现的几个基本问题:

1. 上传目录的写入权限由应用程序池账户决定;
2. 应用程序池默认对于的账户为IIS APPPOOL\{app pool name},且属于IIS_IUSRS组;
3. 默认的匿名账户为IUSR账户,且属于authenticated users 组;
4. 任何用户都属于USERS组,且手工删除后仍然属于USERS组;
5. 上传木马之后,能够看到的目录是由应用程序池账户决定的;
6. 在此测试环境下,USERS组默认拥有网站目录的写入权限;
7. 一个aspx文件的运行跟NTFS的运行权限无关;
8. 对于网站的匿名账户只需要对网站目录有读取权限;
9. 应用程序池账户运行aspx也只需要读取权限,但是如果要写文件需则写权限,要执行其他程序则需要执行权限;

0x03 常见服务器被入侵威胁及解决措施


常见服务器入侵威胁:

1. webdav直接上传webshell
2. 通过程序文件上传漏洞上传webshell
3. webshell的权限过高导致被提权

解决常见问题措施:

1. 解决webdav问题

在安装的时候直接不安装webdav组件

2.防止上传的木马文件执行

可以在IIS中设置需要上传文件的目录,处理程序映射中的编辑功能权限中的脚本去掉,这样即使上传了木马文件在此目录,也是无法执行的。

2014030611273098478.jpg

上传目录取消应用程序池账户的执行权限

2014030611274922035.png

3. 防止木马执行后看到网站目录之外的文件

可以设置进程池账户对其他文件夹无读取权限。

4. 防止木马执行后可执行cmd

取消进程池账户的NTFS执行权限。

5. 防止木马执行后运行cmd权限过高

进程池账户选择权限较低的账户,最好就是默认的账户。

0x04 推荐安全配置方案


安全配置简单配置:

1. 匿名账户使用默认的IUSR。

2014030611280328764.jpg

2. 应用程序池使用默认的标识,对于的账户为IIS AppPool\应用程序池名称。

2014030611281563141.jpg

3.IIS中对上传目录设置为脚本不可执行

2014030611282823501.png

加强安全配置:

1. 匿名账户使用默认的“应用程序用户”也就是对应的IUSR。
2. 应用程序池账户使用默认的IIS AppPool\应用程序池名称。
3. 删除everyone,users在所有磁盘上的权限。
4. 删除users在system32上的所有权限(需要先修改所有者为administrator)。
5. 在网站目录下给予IUSR读取权限。
6. 在网站目录下给予IIS AppPool\应用程序池名称读取权限,如果程序中有特殊要求的权限,如写入文件等,则再对应的目录下给予相应的权限,如写入权限。
7. 在网站要求的上传目录给予IIS AppPool\应用程序池名称写入权限,但是不给予执行权限。
8. 在IIS中取消上传目录的脚本执行权限。

注意:

  1. 以上两种配置均使用默认的应用程序池账户,如果自定义,最好是将自定义加入IIS_IUSRS组。
  2. IIS7.5中建立多个站点的时候,如果使用默认的应用程序池账户,系统会默认产生如IIS AppPool\各个不同的应用程序池名称。
  3. Asp.net程序在第一次访问编译的时候,应用程序池账户需要拥有system32文件夹的读取和执行权限

0x05 疑问


  1. 在测试过程中发现,访问aspx程序,如果匿名账户为自定义的账户,则需要给自定义的匿名账户在文件夹C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files上的写入权限;但是,如果使用默认的匿名账户,也就是IUSR时,需要给予应用程序池账户在此文件夹上的写入权限。疑问点在于此文件夹到底是需要哪个账户的写入权限,因为选择默认的匿名账户时,即时禁止IUSR在此文件的写入权限,只要应用程序池账户在此文件夹有写权限,一样运行正常?

  2. 当匿名用户为程序默认的时候,应该就是IUSR,但为什么又传递的进程池账户?