当前位置: 首页 > news >正文

远程分析IIS设置(转)

提起微软公司IISweb服务器的安全问题,很多人立刻就会联想到那些为人们所称颂的致命漏洞:UNICODE,CGI解析,.ida,idq,.Printer远程溢出等.这些伟大的漏洞恐怕是我等scriptskidding的最爱了,利用他们可以很轻松的拿到较高的系统权限。但是这篇文章并非是讨论这些致命的漏洞的,只是比较详细的介绍了如何远程判断IIS服务器的各种设置,如目录权限,认证方法等等,文中有些东西已经很老了,但是新的东西还是值得一看的。希望本文能够起到一个抛砖引玉的作用。好了,废话少说,Go~!

远程确定目录权限

让我们打开一个IIS服务器来看看。在IIS服务管理器中,选择一个目录,看他的属性

在目录属性项有有这么一些选项(日志访问和索引此资源不计):

脚本资源访问: 对网站的脚本可以读取原文件。

读取     读取目录里面的静态资源。

写入     用户可以建立以及删除资源

目录浏览   用户可以浏览目录内容。



应用程序设置的执行许可中有三个选项:

无       只能访问静态页面

纯脚本      只允许允许脚本 如ASP脚本

脚本和可执行程序 可以访问和执行各种文件类型

那么,如何确定服务器上面的这些开关设置呢?别着急,一个一个来。


执行权限

 如何确定某个目录是否开了执行权限呢?很简单,向服务器发送一个下面得请求:

http://iis-server/dir/no-such-file.dll

/dir/为要判断得目录,no-such-file.dll是随便取得一个名字,服务器上面没有这个文件。

服务器对我们得请求会返回一个信息。如果返回的是一个500错误:

HTTP500-内部服务器错误(InternalServererror)

那么就说明这个目录的执行权限是开着的。对于服务器,能不开执行权限的就不要开。特别是虚拟目录的执行权限,大家想一想UNICODE和二次解码漏洞的利用过程就明白了。

如果服务器返回的是一个404错误:

HTTP404-未找到文件

那么就说明这个目录的执行权限没有开。


写权限

测试一个目录对于web用户是否具有写权限,采用如下方法:

telnet到服务器的web端口(80)并发送一个如下请求:

  PUT/dir/my_file.txtHTTP/1.1

Host:iis-server

Content-Length:10<enter><enter>

这时服务器会返回一个100(继续)的信息:

HTTP/1.1100Continue
Server:Microsoft-IIS/5.0
Date:Thu,28Feb200215:56:00GMT
接着,我们输入10个字母:
AAAAAAAAAA

送出这个请求后,看服务器的返回信息,如果是一个201Created响应:
HTTP/1.1201Created
Server:Microsoft-IIS/5.0
Date:Thu,28Feb200215:56:08GMT
Location:http://iis-server/dir/my_file.txt
Content-Length:0
Allow:OPTIONS,TRACE,GET,HEAD,DELETE,PUT,COPY,MOVE,PROPFIND,
PROPPATCH,SEARCH,LOCK,UNLOCK

那么就说明这个目录的写权限是开着的,反之,如果返回的是一个403错误,那么写权限就是

没有开起来,如果需要你认证,并且返回一个401(权限禁止)的响应的话,说明是开了写权限,但是匿名用户不允许。如果一个目录同时开了”写”和“脚本和可执行程序”的话,那么web用户就可以上传一个程序并且执行它,恐怖哦%^#$!~


纯脚本执行权限

 这样的目录就太多了。很多不需要给执行权限的目录也被管理员给了脚本执行权限,我记得在

shotgun的一篇文章里面他说过:最小的权限+最少的服务=最大的安全;一点也没有错。给目录任何多余的权限都是没有必要的。判断一个目录是否可以执行纯脚本文件也很简单,发送一个如下一个请求:

http://iis-server/dir/no-such-file.asp

返回404文件不存在说明有执行权限,返回403则是没有开。


浏览目录权限

 判断一个目录是否允许浏览可能需要一点点小技巧,但是,在网站的默认首页(如:default.asp)不存在的话,那么就再简单不过了。在浏览器里面输入:

http://iis-server/dir/

如果权限开着的,那么会返回200响应,并且列出当前目录里面的内容,反之,没有列出目录的话就是关了。但是,如果默认页面default.asp存在呢?敲入上面的地址就直接打开这个页面了。别急,

WebDAV里面有一个请求方法叫:PROFIND。这个方法使得我们可以从服务器资源里面得到一些如文件名,创建时间,最后修改时间等等的信息。利用它我们也可以绕过default.asp来判断目录浏览权限的情况,telnet到IIS-server的web端口,发送如下请求:

PROPFIND/dir/HTTP/1.1
Host:iis-server
Content-Length:0

这时,服务器会送回一个207MultiStatus的响应,如果目录是允许浏览的,那么同时会列出目录里面的资源以及他们的属性。如果目录浏览不允许,返回的信息就会少的多。目录浏览一般来说只能算是一个低危险等级的漏洞,比如一个images目录,里面除了图片没有别的东西了,那对于服务器的安全就没有什么危害,但是,如果目录里面放了一个管理页面adminpage.asp或者一些数据库连接信息文件,可能会导致你的服务器拱手相让给入侵者。


读权限

 判断这点很容易,发一个带txt文件的请求就可以:

http://iis-server/dir/no-such-file.txt

如果返回一个404文件不存在的响应,就说明读权限是开着的,反正,返回403错误则说明都权限没有开。早几年接触安全的人一定知道::$DATA泄露ASP源代码的漏洞,其实如果一个目录里面权势asp脚本的话,那么读权限也可以不用开的,ASP只需要脚本执行权限就可以了。

IIS认证方法的判断

这个漏洞是最近才公布出来的,IIS服务器支持匿名访问,基本认证和使用NTLM方式的windows集成认证,如果客户端发送一个包含认证信息的请求,IIS就会强行的尝试用这些认证信息取认证,并且放回不会的响应。这样我们就能够确定IIS的认证的配置。

要确定IIS是否支持基本认证,可以telnet到服务器的80端口,发送如下请求:
GET/HTTP/1.1
Host:iis-server
Authorization:Basicc3lzdGVtOm1hbmFnZXIA

 这是一个基本认证的请求,里面包含了一个base64编码的用户ID和PASS,Basic后面那串字符经过base64解码以后就是system:manager。如果服务器返回一个401信息,则说明基本认证选项是开着的。如果返回200信息,则有2种可能,基本认证选项没有开或者是服务器存在一个用户名是
system的用户名,并且密码是manager(猜中的话,行大运啦)。
要确定NTLM选项是否开启则可以向IIS发送如下请求
GET/HTTP/1.1
Host:iis-server
Authorization:NegotiateTlRMTVNTUAABAAAAB4IAoAAAAAAAAAAAAAAAAAAAAAA=
同样,如果返回401消息,则说明支持NTLM,返回200说明不NTLM认证选项没有开启。
对于大多数网站来说,这两种认证方式都是不需要开起的来,他们有可能泄露一些服务器的重要信息。
泄露内部IP地址信息
如果IIS服务器在一个使用NAT的防火墙里面的话,通常都有个内部地址如10.x.x.x。
如果IIS开启了基本认证选项,那么发送如下一个简单的请求就可以得到服务器的内部IP:

GET/HTTP/1.1
Host:
Authorization:Basicc3lzdGVtOm1hbmFnZXIA

服务器将返回一个如下响应:
HTTP/1.1401AccessDenied
Server:Microsoft-IIS/5.0
Date:Fri,01Mar200215:45:32GMT
WWW-Authenticate:Basicrealm="10.1.1.2"
Connection:close
Content-Length:3245
Content-Type:text/html

那个10.1.1.2就是机器的内部ip地址,本来realm的值是客户端提供给的一个主机头,但这里它是空的,所以IIS就选择了本机的IP地址来代替。同样的,利用PROPFIND,WRITE,MKCOL等请求的返回信息,也能泄露主机的一些信息,如我们向服务器提请下面这样一个请求:

PROPFIND/HTTP/1.1
Host:
Content-Length:0

在IIS配置成使用主机名(见后)的情况下,则不会暴露主机的IP地址,但是会暴露NetBIOS名。事实上我们可以利用IIS的认证获得更多的信息,如所在域的名字,方法是向服务器发送如下带NTLM认证的请求:

GET/HTTP/1.1
Host:iis-server
Authorization:NegotiateTlRMTVNTUAABAAAAB4IAoAAAAAAAAAAAAAAAAAAAAAA

服务器会返回一个信息:

HTTP/1.1401AccessDenied
Server:Microsoft-IIS/5.0
Date:Fri,01Mar200216:24:58GMT
WWW-Authenticate:NegotiateTlRMTVNTUAACAAAADAAMADAAAAAFgoKgeGvyVuvy67U
AAAAAAAAAAEQARAA8AAAAUwBDAFkATABMAEEAAgAMAFMAQwBZAEwATABBAAEA
DABTAEMAWQBMAEwAQQAEAAwAUwBDAFkATABMAEEAAwAMAFMAQwBZAEwATABB
AAAAAAA=
Content-Length:3245
Content-Type:text/html

那一长串字符就包含了主机名和NT所在域的名字的base64编码。

临时解决方法:在cmd下进入c:\inetpub\adminscripts或者是adminiscript所在目录执行一下命令
adsutilsetw3svc/UseHostNameTrue
netstopiisadmin/y
netstartw3svc


默认应用程序映射判断
判断默认映射是否存在比较简单,这里只简单的给出了在映射存在的情况下对于相应请求的响应:

扩展名: .printer
请求:http://iis-server/foo.printer
响应: HTTP500-内部服务器错误

扩展名:.idc
请求: http://iis-server/foo.idc
响应:code500InternalServerError

扩展名:.idq
请求: http://iis-server/foo.idq
响应码:200OK
响应: 找不到IDQ文件D:\dir\\foo.idq

扩展名:.ida
请求:http://iis-server/foo.ida
响应码:200OK
响应:找不到IDQ文件D:\dir\foo.ida

扩展名:.htr
请求:http://iis-server/foo.htr
响应:HTTP404-未找到文件

扩展名:.htw
请求:http://iis-server/foo.htw
响应码:200OK

响应:QUERY_STRING的格式无效

扩展名:.stm
请求:http://iis-server/foo.stm
响应:HTTP404-未找到文件

扩展名:.shtm
请求:http://iis-server/foo.shtm
响应: HTTP404-未找到文件

扩展名:.shtml
请求:http://iis-server/foo.ida
响应: HTTP404-未找到文件

判断操作系统是否为个人版本(Professional/Workstation)

IIS安装在windows2000专业版和NTworkstation上面时候,同时进行的连接数最大为10个,利用这一点我们可以简单判断操作系统版本:创建10个HTTP1.1的持续连接,第11个连接请求将放回403错误信息。

相关文章:

  • C++程序设计:字符图形输出(空白三角形)
  • 规律化生活一周
  • C++程序设计:今夕何夕,见此良人(经典题目)
  • DVBBS7.0变量列表
  • C++程序设计:求n个数的最大值、最小值及其出现的位置
  • C++程序设计:逆序数
  • 思量了许久还是决定做游戏
  • C++程序设计:小数化分数的算法与编程实现(经典问题)
  • 一些游戏开发站点
  • C++程序设计:挑棍子(判断线段是否相交的模板)
  • C++程序设计:月历
  • 春节的安排
  • 保研面试/考研复试:英语口语面试必备话题及常用句型句式整理(一)
  • 安全信息收集
  • 保研面试/考研复试:英语口语面试必备话题及常用句型句式整理(二)
  • Java 内存分配及垃圾回收机制初探
  • JS专题之继承
  • pdf文件如何在线转换为jpg图片
  • unity如何实现一个固定宽度的orthagraphic相机
  • 当SetTimeout遇到了字符串
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 深入浏览器事件循环的本质
  • 学习ES6 变量的解构赋值
  • 7行Python代码的人脸识别
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​LeetCode解法汇总518. 零钱兑换 II
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (附源码)ssm码农论坛 毕业设计 231126
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .describe() python_Python-Win32com-Excel
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • /*在DataTable中更新、删除数据*/
  • @Query中countQuery的介绍
  • @RestControllerAdvice异常统一处理类失效原因
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • []C/C++读取串口接收到的数据程序
  • [CSS]盒子模型
  • [DM复习]关联规则挖掘(下)
  • [go] 迭代器模式
  • [ISCTF 2023]——Web、Misc较全详细Writeup、Re、Crypto部分Writeup
  • [java/jdbc]插入数据时获取自增长主键的值
  • [javaSE] 看知乎学习工厂模式
  • [java面试]宇信易诚 广州分公司 java笔试题目回忆录
  • [LeeCode]—Wildcard Matching 通配符匹配问题
  • [LeetCode] Max Points on a Line
  • [LeetCode]—Add Binary 两个字符串二进制相加
  • [LeetCode]Balanced Binary Tree
  • [linux] GFLOPS和TFLOPS的换算
  • [oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙
  • [python] logging输出到控制台(标准输出)
  • [RN] React Native 常用命令行
  • [SpringBoot]接口的多实现:选择性注入SpringBoot接口的实现类