Windows 2000 Server、Windows 2000 Advanced Server 以及 Windows 2000 Professional 的默认安装都带有 IIS ,也可以在 Windows 2000 安装完毕后加装 IIS。
IIS 是微软出品的架设 WEB、FTP、SMTP 服务器的一套整合软件,捆绑在 Windows2000/NT 中,可以在控制面板的添加/删除程序中选择添加删除 Windows 组件中选择添加 IIS 服务。如下图:
IIS 默认的 WEB (主页)文件存放于系统根区中的 %system%\Inetpub\wwwroot 中,主页文件就放在这个目录下;出于安全考虑,因此微软建议用 NTFS 格式化使用 IIS 的所有驱动器。
一、快速配置好默认的 WEB 站点
打开 IIS 管理器,在开始菜单的管理工具中选择 Internet 信息服务或直接在运行中输入 %SystemRoot%\System32\Inetsrv\iis.msc
安装好后的 IIS 已经自动建立了管理和默认两个站点,其中管理 WEB 站点用于站点远程管理,可以暂时停止运行,但最好不要删除,否则重建时会很麻烦的。
马上在浏览器中输入这个地址,微软已经预先把详尽的帮助资料放到 IIS 里面了:http://localhost/iishelp/iis/misc/default.asp
右击已存在的“默认 WEB 站点”,选择属性,现在开始配置 IIS 的 WEB 站点。
每个 Web 站点都具有唯一的、由三个部分组成的标识,用来接收和响应请求的分别是端口号、IP 地址和主机头名。
浏览器访问 IIS 的时候是这样的: IP -> 端口 -> 主机头 -> 该站点主目录 -> 该站点的默认首文档。
所以 IIS 的整个配置流程应该按照访问顺序进行设置:
这里可以指定 WEB 站点的 IP,如没有特别需要,则选择全部未分配。
如指定了多个主机头,则 IP 一定要选为全部未分配,否则访问者会访问不了的。
如果 IIS 只有一个站点,则无需写入主机头标识。
然后配置好端口,WEB 站点的默认访问端口是 TCP 80,如果修改了站点端口,则访问者需要输入 http://yourip:端口 才能够进行正常访问。
主目录用来存放站点文件的位置,默认是 %system%\Inetpub\wwwroot 。
可以选择其他目录作为存放站点文件的位置,点击浏览后选择好路经就可以了。
这里还可以赋予访问者一些权限,例如目录浏览等。
基于安全考虑,微软建议在 NTFS 磁盘格式下使用 IIS。
每个网站都会有默认文档,默认文档就是访问者访问站点时首先要访问的那个文件;例如 index.htm index.asp default.asp 等等。
这里需要指定默认的文档名称和顺序。
注意,这里的默认文档是按照从上到下的顺序读取的。
一般赋予访问者有匿名访问的权限,其实IIS 默认已经在系统中建立了 IUSR_机器名 这种匿名用户了。
二、按照向导建立新站点
如果想建立新的站点,可以按照 IIS 的向导进行设置:
在 IP 地址这一下拉菜单中可以选择你的 WEB 服务器 IP,缺省情况下应该选择 (全部未分配)。[TIPS: 通过这个下拉菜单可以查看你是否有公网 IP] TCP 默认端口是 80,如修改了端口,则需要用 http://ip:端口 这种格式进行浏览。
站点主机头使该站点指定一个域名,如 http://abc.vicp.net。可以在一个相同的 IP 下指定多个主机头。默认为 “无”。
你可以选择 WEB 站点主目录,该目录用于存放主页文件;选中允许匿名访问此站点则其任何人都可以通过网络访问你 WEB 站点。
WEB 站点的访问权限可以设定允许或禁止读取、运行脚本等权限设置。
三、WEB 站点的常规设置
选中刚建立的站点,右击后选择属性,出现站点设置界面:
1. 说明:站点的说明,这将出现在 IIS 管理界面中的站点名称
2. IP 地址:常规情况下可选择全部未分配。高级选项中可设定主机头高级 WEB 站点标识等设置。
3. TCP 端口:指定该站点的访问端口,浏览器访问 WEB 的默认端口是 80。
4. 连接: 选择无限选项允许同时发生的连接数不受限制。选择限制同时连接到该站点的连接数。在该对话框中,键入允许连接的最大数目。设定连接超时;如选择无限,则不会断开访问者的连接。
5. HTTP激活: 允许客户保持与服务器的开放连接,而不是使用新请求逐个重新打开客户连接。禁用保持 HTTP 激活会降低服务器性能。默认情况下启用保持 HTTP 激活。
6. 日志记录:可选择日志格式:IIS 、ODBC 或 W3C 扩充格式,并可定义记录选项如访问者 IP、连接时间等。
操作员: 设定操作 IIS 管理的用户,默认情况只允许管理员权限可操作和管理 IIS。
也可以添加多个用户或用户组别参加 IIS 的管理和操作。
主目录用于设定该站点的文件目录,可以选择本地目录或另一台计算机的共享位置。
本地路径中可以设定站点目录的存放位置,请确保你要有该目录的控制管理权限。
访问设置中可指定那些资源可访问那些资源不可访问,要注意的是目录浏览和日志访问;选择日志访问,IIS 会记录该站点的访问记录,你可以选择记录那些资料,如: 访问者 IP 时间等等。
应用程序设置中配置访问者能否执行程序和执行那些程序。
主文档: 设定该站点的首页文件名,访问者会按照默认文档的顺序访问该站点。
要在浏览器请求指定文档名的任何时候提供一默认文档,请选择该复选框。默认文档可以是目录的主页或包含站点文档目录列表的索引页。
要添加一个新的默认文档,请单击“添加”。可以使用该特性指定多个默认文档。按出现在列表中的名称顺序提供默认文档。服务器将返回所找到的第一个文档。
要更改搜索顺序,请选择一个文档并单击箭头按钮。
要从列表中删除默认文档,请单击“删除”。
注意: 如果在主目录中没有该首页文件,请马上建立或者进行相关设置。
要自动将一个 HTML 格式的页脚附加到 Web 服务器所发送的每个文档中,请选择该选项。页脚文件不应是一个完整的 HTML 文档。而应该只包括需用于格式化页脚内容外观和功能的 HTML 标签。要指定页脚文件的完整路径和文件名,请单击“浏览”。
目录安全性
匿名访问和验证控制:
要配置 Web 服务器的验证和匿名访问功能,请单击“编辑”。使用该功能配置 Web 服务器在授权访问受限制内容之前确认用户的身份。但是,首先必须创建有效的 Windows 用户帐户,然后配置这些帐户的 Windows 文件系统 (NTFS) 目录和文件访问权限,服务器才能验证用户的身份。请打开 [计算机管理] 进行查看。
IP 地址及域名限制(该功能仅在安装有 Windows 2000 Server 的设备中可用。):
要允许或阻止特定用户、计算机、计算机组或域访问该 Web 站点、目录或文件,请单击“编辑”。
四、用 IIS 建立多个站点
主机头的使用
新建两个 WEB 站点,分别在主机头中指定两个不同的域名: test-user1.vicp.net 和 test-user2.vicp.net
可在该站点属性的 WEB站点 -> WEB 站点标识 -> IP 地址 -> 高级中随意修改该主机头标识。
使用 nslookup 命令指定用广州电信 ADSL 默认的 DNS 服务器检测出:
tset-user1.vicp.net 和 test-user2.vicp.net IP 是一样的。但浏览时显示的确是两个不同的页面。
注意:使用主机头建立多个不同域名的站点时,也需要注意主文档等设置。
使用端口配置建立多站点
您可以使用不同的端口来设置多个站点,但访问者的浏览器的默认访问端口是 80,所以您必须告诉访问者您的站点使用的 TCP 端口是什么。
访问格式:
http://url:port
本文的内容是如何利用IIS本身的一些特性建立后门。当然,这主要是一份供网络管理员和网络安全工作人员参考的“Know Your Enemy”类文档,作者希望这篇文章能够对检查和清除后门有所帮助,而并不鼓励或赞同利用本文的技巧进行违法活动。
首先简单介绍一下IIS的配置文件MetaBase.bin。这个文件位于%SystemRoot%system32inetsrvMetaBase.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中有一个WINNTSystem32msw3prt.dll,是.printer的映射,一般用不上。我们可以删掉D:WINNTSystem32msw3prt.dll的值,换上WINNTSystem32inetsrvmsw3prt.dll。
美中不足的是HTTP请求会留下痕迹,但是HTTP也有好处,那就是可以随便用一个代理服务器做跳板。另外,也可以用插入0x0D 0x0A来伪造日志的方法,(详见《Apache,IIS等多种http服务器允许通过发送回车符伪造日志》一文)这就是构造目录的技巧了。
具体实现:
当然可以用adsutil.vbs手工来加。不过需要注意,adsutil.vbs只能设,不能改,所以用adsutil.vbs的时候一定要把原先的也加上,否则原先的就会丢失。不同条目之间用空格分开。
先用下面命令取得当前的InProcessIsapiApps列表: adsutil.vbs get /W3SVC/InProcessIsapiApps
取到之后把自己的ISAPI路径也加进去。 adsutil.vbs set /W3SVC/InProcessIsapiApps "C:WINNTSystem32idq.dll" "C:WINNTSystem32inetsrvhttpext.dll" ………………
ScriptMaps的设定同InProcessIsapiApps。
当然这样比较麻烦,也无法写入0x08这样的键值,所以我干脆自己写个VBS一次性搞定。至于那个做后门的ISAPI,能实现的功能就完全取决于想象力了。这里是一个简单例子的屏幕拷贝:
# nc 10.11.0.26 80
POST /%08/anything.tom
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-1998 Microsoft Corp.
C:WINNTsystem32>whoami
NT AUTHORITYSYSTEM
C:WINNTsystem32>exit
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 08 Jan 2003 06:49:37 GMT
更隐蔽的方法是写一个特殊的ISAPI,并注册为解析asp的。通常情况下,该程序把收到的请求转给系统原来的asp.dll,并把结果返回,当收到一个特殊POST请求时就启动自己的后门代码,这样日志里面也不会有什么显示。审核时也很难发现。
除了上面所述利用脚本映射的方法外,还可以赋予某个虚拟目录AccessWrite和AccessExecute权限。需要运行后门的时候利用WEBDAV上载ISAPI,然后运行,使用完了再删除。(是否能删除?还是需要restart W3SVC ?我没有试验。)如果上载的不是DLL而是EXE文件,那么把该目录下的CreateProcessAsUser设为0也可以获得local system权限,这个方法早有人撰文论述。但AccessWrite和AccessExecute的改变都可以在“intenet服务管理器”中看出来,隐蔽性就差了。
把日志存在sqlserver里比较方便查询.
1 建立一个iis的数据库,添加InetAdmin用户,指定该用户为iis数据库的所有者,并设置好相关权限。
2 执行logtemp.sql查询文件,建立表。其内容如下:
create table inetlog (
ClientHost varchar(255),
username varchar(255),
LogTime datetime,
service varchar( 255),
machine varchar( 255),
serverip varchar( 50),
processingtime int,
bytesrecvd int,
bytessent int,
servicestatus int,
win32status int,
operation varchar( 255),
target varchar(255),
parameters varchar(255) )
3 根据IIS5的ODBC日志默认值,进入ODBC数据源管理器建立一个名为“HTTPLOG”的“系统DSN”与iis数据库连接,建立时使用InetAdmin帐号。
4 将“活动日志格式(V)”改为“ODBC Logging ”。
然后就可以自己根据需要查询了.