0x00 IIS短文件名
为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成了对应的DOS 8.3 短文件名。
Windows下查看对应的短文件名,可以使用命令 dir /x
对应短文件名的规律是:
- 前六位保留
- 所有小写字母均转换成大写字母
- 后续字符用~1表示
- 后缀最多显示三位,其余的被截断
- 长文件名前缀/文件夹名字符长度符合0-9和Aa-Zz范围且需要大于等于9位才会生成短文件名,如果包含空格或者其他部分特殊字符,不论长度均会生成短文件
0x01 IIS短文件名漏洞
在IIS的web服务中,有时无法直接访问一些文件,但是我们发送一个存在通配符* 和?的请求,当IIS接收到一个文件路径中包含~的请求时,根据文件是否存在返回值是不同的,我们可以利用这个方法猜解本来无法得到的文件名。
- 访问构造的某个存在的短文件名,会返回404
- 访问构造的某个不存在的短文件名,会返回400
0x02 影响版本
本来受到IIS短文件名漏洞影响的版本如下:
1 | IIS 1.0,Windows NT 3.51 |
以上受影响范围主要是针对HTTP GET方法,且需要同时安装ASP.NET应用程序。
但是漏洞发现者Soroush Dalili之后再次在IIS7.5和IIS8.0的版本中发现,当使用OPTIONS来代替GET 方法时,如果请求中的短文件名是存在的,IIS会返回一个不一样的错误信息。
而且在之后的版本中此漏洞也都成功验证。
所以影响的版本又加上了:
1 | IIS 8.0,Windows 8, Windows Server 2012 |
所以,短文件名漏洞存在于目前IIS的所有版本中。
0x03 漏洞复现
在windows10下打开IIS服务
开始—–>控制面板—->程序—->启用或关闭windows功能,勾选以下选项,安装IIS。
在浏览器访问ip地址,如果发现IIS windows信息说明安装成功。
IIS 安装成功以后,会默认在C盘目录下生成intpub目录,网站的根目录位于C:\inetpub\wwwroot,此时我们创建几个asp文件之后,再使用dir /x查看下根目录是否存在短文件名
我们可以看到,有的文件有短文件名,有的文件没有,这是因为之前提到的,长文件名前缀/文件夹名字符长度符合0-9和Aa-Zz范围且需要大于等于9位才会生成短文件名,如果包含空格或者其他部分特殊字符,不论长度均会生成短文件。
0x04 漏洞利用
常用的利用方式有以下几种
短文件名泄露
我们可以写python脚本通过HTTP的OPTIONS方法爆破文件名,也可以下载专用的爆破工具来扫描。
apache下通过短文件名下载
当Apache运行在windows下,如果创建了一个长文件,那么无需猜解长文件,直接用短文件就可以下载了。
Net Framework的拒绝服务攻击
当请求文件夹名称包含~1的请求,会导致不存在该文件的.Net framework去递归所有根目录。特别是第一次请求时,会造成的文件读取特别多。用僵尸网络不断向服务器发送此类请求,很容易耗尽对方服务器资源。
0x05 局限性
- 1.此漏洞只能确定前6个字符,如果后面的字符太长、包含特殊字符,很难猜解
- 2.如果文件名本身太短(无短文件名)也是无法猜解的
- 3.如果文件名前6位带空格,8.3格式的短文件名会补进,和真实文件名不匹配
- 4.如果文件夹名前6位字符带点“.”,扫描程序会认为是文件而不是文件夹,最终出现误报
- 5.不支持中文文件名,包括中文文件和中文文件夹。一个中文相当于两个英文字符,故超过4个中文字会产生短文件名,但是IIS不支持中文猜测
0x06 应对
禁止url中使用“~”或它的Unicode编码
关闭windows的8.3格式功能
- 命令行中关闭:
1
fsutil 8dot3name set 1
- 注册表中禁用:
在注册表中找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,将其中的 NtfsDisable8dot3NameCreation这一项的值设为 1,代表不创建短文件名格式
升级netFramework至4.0以上版本
修改注册表禁用短文件名功能
0x07 利用
1. 猜解后台地址
2. 猜解敏感文件,例如备份的rar、zip、.bak、.SQL文件等。
3. 在某些情形下,甚至可以通过短文件名web直接下载对应的文件。比如下载备份SQL文件。
该短文件名有以下特征:
1. 只有前六位字符直接显示,后续字符用~1指代。其中数字1还可以递增,如果存在多个文件名类似的文件(名称前6位必须相同,且后缀名前3位必须相同)。
2. 后缀名最长只有3位,多余的被截断。
我们可以在启用.net的IIS下暴力列举短文件名,原因是:
3. 访问构造的某个存在的短文件名,会返回404
4. 访问构造的某个不存在的短文件名,会返回400
利用
1、 测试环境为windows server 2003 r2,开启webdav服务和net服务。
2、使用payload验证目标是否存在IIS短文件名漏洞,下图显示的404,说明目标存在该短文件名
Payload: http://192.168.10.130 /*~1*/a.aspx
http://192.168.10.130/ttt*~1*/a.aspx
注:*可以匹配n个字符,n可以为0
3、浏览器访问一个不存在的短文件名,返回”Bad Request(400)”,说明目标不存在该短文件名
4、通过浏览器访问上面两个payload,根据返回的结果,可以说明目标存在IIS短文件漏洞
5、判断漏洞存在后,接下来手工详细分析猜解IIS短文件名原理
5.1、在网站根目录(C:\Inetpub\wwwroot)下创建一个abcdef123456.txt文件
5.2、浏览器分别访问http://192.168.10.130/a*~1*/a.aspx, http://192.168.10.130/b*~1*/a.aspx
5.3、通过以上两个图片,可以看出存在一个以a开头的短文件名
5.4、按照上面的方法依次猜解可以得到http://192.168.10.130/abcdef*~1*/a.aspx,到此,已经猜解出来短文件名,到了这一步,需要考虑两种情况,以abcdef开头的是一个文件夹还是一个文件。
如果以abcdef开头的是一个文件夹,那么浏览器访问http://192.168.10.130/abcdef*~1/a.aspx,将返回404,如果abcdef开头的是一个文件,需要猜解后缀名
5.5、浏览器访问http://192.168.10.130/abcdef*~1/a.aspx,根据下图返回结果说明以abcdef开头的不是一个文件夹,而是一个文件
5.6、浏览器访问http://192.168.10.130/abcdef*~1.a*/a.aspx,根据下图返回说明该短文件后缀的第一位不是a
5.7、用a-z的26个字母依次替换上述a的位置,当替换成t时,返回404页面,说明该短文件的第一位后缀是t
5.8、按照上面的方法依次猜解得到该短文件名的后缀是txt
5.9、到此为止,已经猜解出该短文件名为abcdef~1.txt
6、根据已经猜解出来的短文件名abcdef~1.txt,继续猜解出该短文件名的完全文件名为abcdef123456.txt
7、使用IIS短文件名扫描软件,获取目标存在哪些短文件名
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一个站,密码不是弱口令,还有验证码,自然不好爆破之类
扫描后台结果显示
访问/test.aspx
????
云悉信息搜集显示
Iis7.5和.net都具备了可以考虑一波是否存在iis短文件名漏洞
我使用的是李劼杰的工具:
https://github.com/lijiejie/IIS_shortname_Scanner
扫描结果如下
4个目录,共找到6个文件,现在开始猜解文件名
最后猜到/rninde~1.asp*应该是/rnindex.aspx,访问该页面
发现没有了验证码,我们便可以尝试爆破登录等。
0x08 总结
IIS短文件名泄漏漏洞局限性
这个漏洞的局限有几点:
1) 只能猜解前六位,以及扩展名的前3位。
2) 名称较短的文件是没有相应的短文件名的。
3)需要IIS和.net两个条件都满足
IIS短文件名泄漏漏洞危害:
Microsoft IIS在实现上存在文件枚举漏洞,***者可利用此漏洞枚举网络服务器根目录中的文件。
危害:***者可以利用“~”字符猜解或遍历服务器中的文件名,或对IIS服务器中的.Net Framework进行拒绝服务***。
相对来说这个漏洞比较鸡肋,微软也表示IIS短文件漏洞未达到安全更新标准,需要确定何时在下一个逻辑版本中解决它。
虽然漏洞的威胁不大,但是正因不严重导致微软没有更新,现在所有版本都存在这个问题,当有人将其与其他漏洞配合起来使用时,也是有可能造成很严重的后果。